The SVG spec allows paths to omit whitespace in some cases and expect parsers to gracefully handle this. In particularly, the parsers must greedly match as much of the token required as possible but stop as soon the token no longer matches. The latter bit is where the SVG standard gets interesting. An Elliptical command (i.e. A or a) will accept among other: ..., number, flag, flag, number, ... Where flag is defined as "0" or "1" (exactly one character). Given those tokens and the following input: 1 010 The spec requires scour to parse that as: "1" (number), "0" (flag), "1" (flag) and "0" (number). It might be tempting to just include "flag" in the default tokenization. Unfortunately this falls apart pretty quickly if you want to follow the spec. E.g. if you have 100 as input and the lexer has no hint about the next token then it can now parse it as: * Three flags * Two flags and a one-digit number (in that order) * A flag and a two-digit number (in that order) * A three-digit number Therefore, to support this, the SVGPathParser must provide the Lexer with a hint about what it is expecting in some cases. This turns out to be trivially possible by exploiting the fact that "lex" is a generator function and can trivially be converted to a "coroutine" (by replacing "next(x)" with "x.send(value)"). Signed-off-by: Niels Thykier <niels@thykier.net> |
||
|---|---|---|
| scour | ||
| unittests | ||
| .gitignore | ||
| .travis.yml | ||
| CONTRIBUTING.md | ||
| HISTORY.md | ||
| LICENSE | ||
| Makefile | ||
| README.md | ||
| scour.sublime-project | ||
| setup.py | ||
| testcss.py | ||
| testscour.py | ||
| tox.ini | ||
Scour
Scour is an SVG optimizer/cleaner that reduces the size of scalable vector graphics by optimizing structure and removing unnecessary data written in Python.
It can be used to create streamlined vector graphics suitable for web deployment, publishing/sharing or further processing.
The goal of Scour is to output a file that renderes identically at a fraction of the size by removing a lot of redundant information created by most SVG editors. Optimization options are typically lossless but can be tweaked for more agressive cleaning.
Scour is open-source and licensed under Apache License 2.0.
Scour was originally developed by Jeff "codedread" Schiller and Louis Simard in in 2010. The project moved to GitLab in 2013 an is now maintained by Tobias "oberstet" Oberstein and Eduard "Ede_123" Braun.
Installation
Scour requires Python 2.7 or 3.3+. Further, for installation, pip should be used.
To install the latest release of Scour from PyPI:
pip install scour
To install the latest trunk version (which might be broken!) from GitHub:
pip install https://github.com/codedread/scour/archive/master.zip
Usage
Standard:
scour -i input.svg -o output.svg
Better (for older versions of Internet Explorer):
scour -i input.svg -o output.svg --enable-viewboxing
Maximum scrubbing:
scour -i input.svg -o output.svg --enable-viewboxing --enable-id-stripping \
--enable-comment-stripping --shorten-ids --indent=none
Maximum scrubbing and a compressed SVGZ file:
scour -i input.svg -o output.svgz --enable-viewboxing --enable-id-stripping \
--enable-comment-stripping --shorten-ids --indent=none