Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions .devcontainer/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.187.0/containers/python-3/.devcontainer/base.Dockerfile

# [Choice] Python version: 3, 3.9, 3.8, 3.7, 3.6
ARG VARIANT="3"
FROM mcr.microsoft.com/vscode/devcontainers/python:0-${VARIANT}

# [Option] Install Node.js
# ARG INSTALL_NODE="true"
# ARG NODE_VERSION="lts/*"
# RUN if [ "${INSTALL_NODE}" = "true" ]; then su vscode -c "umask 0002 && . /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"; fi

# [Optional] If your pip requirements rarely change, uncomment this section to add them to the image.
COPY requirements.txt /tmp/pip-tmp/
RUN pip3 --disable-pip-version-check --no-cache-dir install -r /tmp/pip-tmp/requirements.txt \
&& rm -rf /tmp/pip-tmp

# [Optional] Uncomment this section to install additional OS packages.
RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
&& apt-get -y install --no-install-recommends libxml2-dev libxslt-dev python-dev

# [Optional] Uncomment this line to install global node packages.
# RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && npm install -g <your-package-here>" 2>&1
48 changes: 48 additions & 0 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at:
// https://github.com/microsoft/vscode-dev-containers/tree/v0.187.0/containers/python-3
{
"name": "Python 3",
"build": {
"dockerfile": "Dockerfile",
"context": "..",
"args": {
// Update 'VARIANT' to pick a Python version: 3, 3.6, 3.7, 3.8, 3.9
"VARIANT": "3",
// Options
"INSTALL_NODE": "false",
"NODE_VERSION": "lts/*"
}
},

// Set *default* container specific settings.json values on container create.
"settings": {
"python.pythonPath": "/usr/local/bin/python",
"python.languageServer": "Pylance",
"python.linting.enabled": true,
"python.linting.pylintEnabled": true,
"python.formatting.autopep8Path": "/usr/local/py-utils/bin/autopep8",
"python.formatting.blackPath": "/usr/local/py-utils/bin/black",
"python.formatting.yapfPath": "/usr/local/py-utils/bin/yapf",
"python.linting.banditPath": "/usr/local/py-utils/bin/bandit",
"python.linting.flake8Path": "/usr/local/py-utils/bin/flake8",
"python.linting.mypyPath": "/usr/local/py-utils/bin/mypy",
"python.linting.pycodestylePath": "/usr/local/py-utils/bin/pycodestyle",
"python.linting.pydocstylePath": "/usr/local/py-utils/bin/pydocstyle",
"python.linting.pylintPath": "/usr/local/py-utils/bin/pylint"
},

// Add the IDs of extensions you want installed when the container is created.
"extensions": [
"ms-python.python",
"ms-python.vscode-pylance"
],

// Use 'forwardPorts' to make a list of ports inside the container available locally.
// "forwardPorts": [],

// Use 'postCreateCommand' to run commands after the container is created.
"postCreateCommand": "pip3 install --user -r requirements.txt",

// Comment out connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
"remoteUser": "vscode"
}
6 changes: 3 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
compiled files #
##################
# Compiled files #
*.pyc
venv

# OS generated files #
*~

# Examples
/examples/*
/examples/
.venv/
6 changes: 3 additions & 3 deletions Javascript/main.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

<head>
<title>Simplify an SVG</title>
<script type="text/javascript" src="jquery.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js" integrity="sha512-894YE6QWD5I59HgZOGReFYm4dnWc1Qt5NtvYSaNcOP+u1T9qYdvdihz0PPSiiqn/+/3e7Jo4EaG7TubfWGUrMQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script type='text/javascript' src='svg-optimiser.js'></script>
<script type='text/javascript' src='optimiser_tests.js'></script>
<link type="text/css" rel="stylesheet" href="main.css" />
Expand Down Expand Up @@ -39,7 +39,7 @@ <h2>Currently implemented</h2>
Note that not all transformations can be applied to every element.
For example, scaling a circle differently in two dimensions will not result in a circle so has not been implemented.
At present, only one transformation can be applied at a time.
You can apply it to multiple SVG elements as long as they are not nested (so no <g> elements).
You can apply it to multiple SVG elements as long as they are not nested (so no &lt;g&gt; elements).
Scaling an element will not effect its stroke width.
</p>

Expand Down Expand Up @@ -94,7 +94,7 @@ <h3>Matrix transformations</h3>
<div id="run-tests-button" class="text-button">Run Tests</div>
</div>

<div class="footer">This website was created by <a href="http://www.petercollingridge.co.uk">Peter Collingridge</a>.</div>
<div class="footer">This website was created by <a href="https://www.petercollingridge.co.uk">Peter Collingridge</a>.</div>

</body>
</html>
1 change: 0 additions & 1 deletion Javascript/optimiser_tests.js
Original file line number Diff line number Diff line change
Expand Up @@ -222,5 +222,4 @@ var runTests = function() {
testElementParsing();
testTransformationParsing();
testTransformations();

}
124 changes: 124 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
Python program to clean up SVG files, particularly those created by Inkscape or Illustrator.

# Use

## Python
1. `python example.py` OR `python cleanSVG.py`

## Javascript
1. `cd Javascript/`
1. `python3 -m http.server`
1. http://localhost:8000/

# Current Functionality

## Remove attributes
- Remove attributes with a given name, e.g. remove 'id' attributes, which often aren't used.

## Remove comments
- Removes all comments.

## Remove elements
- Remove elements by their tag name.

## Remove namespaces
- Remove all attributes associated with a given namespace, e.g. remove 'sodipodi' attributes created by Inkscape.

## Remove redundant groups
- Move child elements outdside of group with no attributes, then delete group.

## Set decimal places
- Rewrite attributes to a given number of decimal places.
- Strip out unnecessary trailing zeros.

## Attributes
- `x`, `y`, `x1`, `y2`, `x2`, `y2`
- `cx`, `cy`
- `r`, `rx`, `ry`
- `width`, `height`
- `points`
- `d`

## Apply transformations
- Applies transformations to elements so the attribute can be removed.

* Translation
- In the form
- comma: (`12,34`)
- space(s): (`12 34`)
- comma and space(s): (`12, 34`), (`12 ,34`), (`12 , 34`)
- decimal: (`1.2, 3.4`)
- negative: (`-1.2, -3.4`)

- Shapes
- `line`
- `rect`
- `circle`, `ellipse`
- `polyline`, `polygon`
- `path` (not fully tested)
- `g` (not fully tested)

* Scale
- Shapes
- `path`
- `rect`

## CSS stlying
- Convert individual style attributes to CSS styling.
- Remove default styles.

# To Do

## Remove namespaces
- [ ] Remove xml namespace if possible

## Groups
- [ ] Remove unnecessary groups
- [ ] Remove unnecessary text groups
- [ ] Add groups in make styling and transforms more efficient

## Transformations

* Translation
- In the form
- single: (`12`)

- Shapes
- `text`
- `tspan`

* Rotation
- Shapes
- `path`
- `polyline/polygon`
- `line`
- `circle`
- `rect` -> `polygon`/`path`?

* Scale
- Shapes
- `polyline`/`polygon`
- `line`
- `circle` -> `ellipse`?

* SkewX and SkewY
- Shapes
- `line`
- `path`
- `polyline`/`polygon`
- `rect` -> `polygon`/`path`?
- `circle` -> `path arc`?

* Matrix
- Shapes
- `line`
- `path`
- `polyline`/`polygon`
- `rect` -> `polygon`/`path`?

## CSS styling
- [ ] Need to check whether style element already exists and whether class names already exist.
- [ ] Ideally find most efficient way to class elements for styling.

# License
- [CREATIVE COMMONS PUBLIC LICENSE](./LICENSE)
Loading