A manipulation and optimization library for Scalable Vector Graphics
Project description
svglab
A manipulation and optimization library for Scalable Vector Graphics
Table of Contents
About The Project
Features
- SVG parsing, manipulation, and writing
- Support for all SVG 1.1 elements and attributes
- Partial support for SVG 2
- Support for special XML entities (
CDATA, comments, text) - Attributes are parsed into native Python types for easy manipulation
- Highly configurable formatting options:
- indentation level
- maximum precision for floating-point numbers
- color mode (
rgb,rgba,hsl,hex,named) - relative/absolute path commands
- scientific notation for small/large numbers
- and many more...
- Strong type safety:
- one class per distinct SVG element
- typed attributes
- runtime validation thanks to pydantic
- Support for all beautifulsoup4 parsers (e.g.,
html.parser,lxml,html5lib) - SVG can be rendered into a raster image using resvg
- Support for calculating the bounding box and mask of an element
- Support for applying transformations in the
transformattribute ("reification")
---
title: Entity hierarchy
---
graph TD
Entity:::abc --> CharacterData
Entity --> Element
Element:::abc --> G
Element --> Svg
Element --> Rect
Element --> Circle
Element --> etc1[...]
CharacterData:::abc --> RawText
CharacterData --> Comment
CharacterData --> CData
etc1:::etc
classDef abc stroke:white,stroke-width:2px;
classDef etc stroke:gray,stroke-width:2px;
classDef default stroke:orange,stroke-width:2px;
Getting Started
Prerequisites
Installation
From PyPi:
pip install svglab
From source:
# Via HTTPS
pip install git+https://github.com/reznakt/svglab.git
# Via SSH
pip install git+ssh://git@github.com/reznakt/svglab.git
Usage
# Parse an existing SVG file
svg = parse_svg(
"""
<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
<g>
<rect
id="background"
width="100cm"
height="100%"
transform="rotate(45)"
stroke="red"
/>
<rect color="hsl(0, 100%, 100%)"/>
<!-- This is a comment -->
<![CDATA[.background { fill: blue; }]]>
Hello SVG!
<path d="M 10,10 H 10 L 100,100 Q 100,100 50,50 v 100 Z"/>
<path d="M0,0 10,10 20,20 S 100,100 50,50 t 100,100 M 50,50 z"/>
<path d="M0,0A50,50 90 1 0 100,100v100h-10z"/>
<polygon points="0,0 100,0 100,100 0,100"/>
</g>
</svg>
"""
)
print(svg)
# Create an element programmatically
group = G().add_children(
Rect(
width=Length(15, "px"),
height=Length(20),
transform=[SkewX(45.123), Translate(10, 20)],
color=Color("#ff0000"),
),
Comment("This is a comment"),
CData(".background { fill: blue; }"),
RawText("Hello SVG!"),
Path(
d=PathData()
.move_to(Point(10, 10))
.line_to(Point(100, 100))
.quadratic_bezier_to(Point(100, 100), Point(50, 50))
.smooth_quadratic_bezier_to(Point(100, 100))
.move_to(Point(50, 50))
.cubic_bezier_to(
Point(100, 100), Point(100, 100), Point(10, 10)
)
.smooth_cubic_bezier_to(Point(100, 100), Point(50, 50))
.arc_to(
Point(50, 50), 90, Point(100, 100), large=True, sweep=False
)
.vertical_line_to(100)
.horizontal_line_to(-10, relative=True)
.close()
),
Polyline(
points=[
Point(0, 0),
Point(100, 0),
Point(100, 100),
Point(0, 100),
],
stroke_linecap="square",
opacity=0.5,
),
)
# Add the element to the SVG
svg.add_child(group)
# Manipulate attributes
print(svg.xmlns) # http://www.w3.org/2000/svg
svg.x = Length(10, "px")
# Save to a file
svg.save(sys.stdout)
# Search the entity tree
print(*svg.find_all(Rect), sep="\n")
rect = svg.find(G).find(Rect)
# Compute the bounding box and mask of an element
print(rect.get_bbox())
print(rect.get_mask())
# Render the SVG to an image
image = svg.render()
print(image)
# Apply transformations in the transform attribute
svg.reify()
print(svg.to_xml())
# Change the view box
svg.set_viewbox((0, 0, 50, 50))
print(svg.to_xml())
Development
Setup
# Install dependencies
poetry install
# Activate the virtual environment
poetry shell
# Optional: Install pre-commit hooks
pre-commit install
Common tasks
# Run tests
poe test
# Run type checker
poe typecheck
# Run linter
poe lint
# Fix linting errors
poe lint-fix
# Run formatter
poe format
# Fix formatting errors
poe format-fix
License
This software is distributed under the MIT License. See LICENSE for more information.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
svglab-0.14.0.tar.gz
(81.1 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
svglab-0.14.0-py3-none-any.whl
(94.1 kB
view details)
File details
Details for the file svglab-0.14.0.tar.gz.
File metadata
- Download URL: svglab-0.14.0.tar.gz
- Upload date:
- Size: 81.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.3.2 CPython/3.14.3 Linux/6.12.67
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4c4da77e11ebd9cc534c4fe22e64a3950ad26bb45acda9dff5aa3303f297503c
|
|
| MD5 |
4a13e63a0dba4fef7765dca0039bd9a9
|
|
| BLAKE2b-256 |
2f86a29b6cb21bceb407d2fb620e4bb0ea3999e973b4dcc5f937261c0708df22
|
File details
Details for the file svglab-0.14.0-py3-none-any.whl.
File metadata
- Download URL: svglab-0.14.0-py3-none-any.whl
- Upload date:
- Size: 94.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.3.2 CPython/3.14.3 Linux/6.12.67
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6fe56a433032f273ff7188863c6458539de48311cf777a10d492c66e10668946
|
|
| MD5 |
a1093ab46b06196919f6c813031e86a2
|
|
| BLAKE2b-256 |
2a4347dd2c2d0e69e872798d37507b275f20f15a0dc0091f68db9aa462674041
|