Scour - An SVG Optimizer / Cleaner
Find a file
Niels Thykier 2f0b3ea362 Rewrite redundant codepatterns introduced by py2 -> py3 conversion
The automated python2 -> python3 converter creates some suboptimal
code patterns in some cases, notably in its handling of dicts.

This commit handles the following cases:

  * "if x in list(y.keys()):" => "if x in y:"

    The original code is neuters the O(1) lookup effeciency of a dict
    by turning it into a list.  This occurs a O(n) in converting it to
    a list and then another O(n) for the lookup.  When done in a loop,
    this becomes O(n * m) rather than the optimal O(m).

  * "for x in list(y.keys()):" => "for x in y:" OR "for x in list(y):"

    A dict (y in these cases) operates as an iterator over keys in the
    dict by default.  This makes the entire "list(y.keys())" dance
    redundant _in most cases_.  In a some cases, scour modifies the
    dict while iterating over it and in those cases, we need a
    "list(y)" (but not a "y.keys()").

    The benefit of this differs between python2 and python3.  In
    python3, we basically "only" avoid function call.  In python2,
    y.keys() generates a list, so here we avoid generating a
    "throw-away list".

The test suite succeed both with "python testscour.py" and "python3
testscour.py" (used 2.7.14+ and 3.6.4 from Debian testing).

On a 341kB flame-graph generated by "nytprof" (a perl profiler), this
commit changes the runtimes of scour from the range 3.39s - 3.45s to
3.27s - 3.35s making it roughly 3% faster in this case (YMMV,
particularly with different input).  The timings were recorded using
the following command line:

  time PYTHONPATH=. python3 -m scour.scour --enable-id-stripping  \
     --shorten-ids --indent=none  --enable-comment-stripping
     -i input.svg -o output.svg

This was used 5 times with and 5 times without the patch picking the
worst and best time to define the range.  The runtime test was only
preformed on python3.

All changed lines where found with:
  grep -rE ' in list[(].*[.]keys[(][)][)]:'

Signed-off-by: Niels Thykier <niels@thykier.net>
2018-02-17 15:55:40 +01:00
scour Rewrite redundant codepatterns introduced by py2 -> py3 conversion 2018-02-17 15:55:40 +01:00
unittests tests: Add unit tests for preservation of quotes in CSS styles 2017-09-03 18:07:27 +02:00
.gitignore initial source import (v0.26) and packaging 2013-10-22 16:31:42 +02:00
.travis.yml Add sudo: false to .travis.yml for faster execution of jobs 2017-02-19 18:06:57 +01:00
CONTRIBUTING.md Add CONTRIBUTING.md with some (hopefully) useful pointers 2016-09-18 22:36:21 +02:00
HISTORY.md Scour v0.36 2017-08-06 04:55:59 +02:00
LICENSE initial source import (v0.26) and packaging 2013-10-22 16:31:42 +02:00
Makefile Update Makefile 2016-09-17 17:09:35 +02:00
README.md Update project description and use in both, README.md and setup.py 2017-08-06 04:38:33 +02:00
scour.sublime-project initial source import (v0.26) and packaging 2013-10-22 16:31:42 +02:00
setup.py make flake8 happier 2017-08-06 04:55:43 +02:00
testcss.py Some whitespace fixes to make newer versions of flake8 happy 2016-11-27 18:52:39 +01:00
testscour.py Catch specific exception rather than anything 2018-02-17 11:47:36 +01:00
tox.ini Add Python 3.6 to tests and simplify .travis.yml by using 'tox-travis' 2017-02-19 18:04:36 +01:00

Scour

PyPI Build status Codecov


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