aboutsummaryrefslogtreecommitdiff
path: root/tools/_clean_style_attr.sed
diff options
context:
space:
mode:
Diffstat (limited to 'tools/_clean_style_attr.sed')
-rw-r--r--tools/_clean_style_attr.sed217
1 files changed, 217 insertions, 0 deletions
diff --git a/tools/_clean_style_attr.sed b/tools/_clean_style_attr.sed
new file mode 100644
index 000000000..85483a510
--- /dev/null
+++ b/tools/_clean_style_attr.sed
@@ -0,0 +1,217 @@
+#!/bin/sed -rf
+#
+# Written in 2016 by Sergei Eremenko <https://github.com/SmartFinn>
+#
+# To the extent possible under law, the author(s) have dedicated all copyright
+# and related and neighboring rights to this software to the public domain
+# worldwide. This software is distributed without any warranty.
+#
+# You should have received a copy of the CC0 Public Domain Dedication along
+# with this software. If not, see
+# <http://creativecommons.org/publicdomain/zero/1.0/>.
+#
+# Description:
+# This script removes unused properties and removes properties with default
+# values from style attributes.
+# Details https://www.w3.org/TR/SVG/styling.html
+#
+# Get CSS defaults from Inkscape:
+# sed -e '/^$/d' -e '/NO.DEFAULT/d' -e 's/"//g' \
+# /usr/share/inkscape/attributes/css_defaults \
+# | awk -F" - " '{printf "s/%s:%s;//gI\n", $1,$2}'
+#
+# Usage:
+# sed -r -i -f _clean_style_attr.sed FILE...
+
+/style=/ {
+
+ # add a trailing semicolon for secure matching
+ s/style="([^"]+[^;])"/style="\1;"/gI
+
+ # delete properties with default values
+ s/alignment-baseline:auto;//gI
+ s/backface-visibility:visible;//gI
+ s/baseline-shift:baseline;//gI
+ s/block-progression:tb;//gI
+ s/clip:auto;//gI
+ s/clip-path:none;//gI
+ s/clip-rule:nonzero;//gI
+ s/color-interpolation:sRGB;//gI
+ s/color-interpolation-filters:linearRGB;//gI
+ s/color-profile:auto;//gI
+ s/color-rendering:auto;//gI
+ s/cursor:auto;//gI
+ s/direction:ltr;//gI
+ s/display:inline;//gI
+ s/dominant-baseline:auto;//gI
+ s/enable-background:accumulate;//gI
+ s/fill:black;//gI
+ s/fill-opacity:1;//gI
+ s/fill-rule:nonzero;//gI
+ s/filter:none;//gI
+ s/flood-color:black;//gI
+ s/flood-opacity:1;//gI
+ s/font-feature-settings:normal;//gI
+ s/font-size:medium;//gI
+ s/font-size-adjust:none;//gI
+ s/font-stretch:normal;//gI
+ s/font-style:normal;//gI
+ s/font-variant:normal;//gI
+ s/font-variant-alternates:normal;//gI
+ s/font-variant-caps:normal;//gI
+ s/font-variant-east-asian:normal;//gI
+ s/font-variant-ligatures:normal;//gI
+ s/font-variant-numeric:normal;//gI
+ s/font-variant-position:normal;//gI
+ s/font-weight:normal;//gI
+ s/glyph-orientation-horizontal:0deg;//gI
+ s/glyph-orientation-vertical:auto;//gI
+ s/image-rendering:auto;//gI
+ s/isolation:auto;//gI
+ s/kerning:auto;//gI
+ s/letter-spacing:normal;//gI
+ s/lighting-color:white;//gI
+ s/marker:none;//gI
+ s/marker-end:none;//gI
+ s/marker-mid:none;//gI
+ s/marker-start:none;//gI
+ s/mask:none;//gI
+ s/mix-blend-mode:normal;//gI
+ s/([^-])opacity:1;/\1/gI
+ s/overflow:hidden;//gI
+ s/paint-order:normal;//gI
+ s/perspective:none;//gI
+ s/pointer-events:visiblePainted;//gI
+ s/shape-inside:auto;//gI
+ s/shape-margin:0;//gI
+ s/shape-outside:auto;//gI
+ s/shape-padding:none;//gI
+ s/shape-rendering:auto;//gI
+ s/solid-color:#000000;//gI
+ s/solid-opacity:1;//gI
+ s/stop-color:black;//gI
+ s/stop-opacity:1;//gI
+ s/stroke:none;//gI
+ s/stroke-dasharray:none;//gI
+ s/stroke-dashoffset:0;//gI
+ s/stroke-linecap:butt;//gI
+ s/stroke-linejoin:miter;//gI
+ s/stroke-miterlimit:4;//gI
+ s/stroke-opacity:1;//gI
+ s/stroke-width:1;//gI
+ s/text-align:start;//gI
+ s/text-anchor:start;//gI
+ s/text-decoration-line:none;//gI
+ s/text-decoration-style:solid;//gI
+ s/text-decoration:none;//gI
+ s/text-indent:0;//gI
+ s/text-orientation:mixed;//gI
+ s/text-rendering:auto;//gI
+ s/text-transform:none;//gI
+ s/transform:none;//gI
+ s/transform-style:flat;//gI
+ s/unicode-bidi:normal;//gI
+ s/vector-effect:none;//gI
+ s/visibility:visible;//gI
+ s/white-space:normal;//gI
+ s/word-spacing:normal;//gI
+ s/writing-mode:lr-tb;//gI
+
+ # delete properties with nonsense values
+ s/fill-opacity:[1-9][0-9.]*;//gI
+ s/font-family:(sans|sans-serif);//gI
+ s/line-height:normal;//gI
+ s/([^-])opacity:[1-9][0-9.]*;/\1/gI
+ s/overflow:visible;//gI
+ s/shape-padding:0;//gI
+ s/solid-color:(#000|#000000|black);//gI
+ s/solid-opacity:[1-9][0-9.]*;//gI
+ s/stroke-opacity:[1-9][0-9.]*;//gI
+ s/text-decoration-color:(#000|#000000|black|currentColor);//gI
+
+ # delete Inkscape properties
+ /-inkscape-/ {
+ s/-inkscape-[^;"]+;//gI
+ }
+
+ # delete 'fill- *' properties if fill equal none
+ /fill[:=]"?none/ {
+ s/fill-rule:[^;"]+;//gI
+ s/fill-opacity:[^;"]+;//gI
+ }
+
+ # delete a fill property if it has the default value and fill attribute not exist
+ /fill="[^"]/! {
+ s/fill:(#000|#000000|black);//gI
+ }
+
+ # delete a color property if currentColor not exists and fill has a value
+ /currentColor/! {
+ s/([^-])color:[^;"]+;/\1/gI
+ }
+
+ # delete 'stroke- *' properties if an object doesn't have a stroke
+ /stroke[:=]/! {
+ s/stroke-width:[^;"]+;//gI
+ s/stroke-linecap:[^;"]+;//gI
+ s/stroke-linejoin:[^;"]+;//gI
+ s/stroke-miterlimit:[^;"]+;//gI
+ s/stroke-dasharray:[^;"]+;//gI
+ s/stroke-dashoffset:[^;"]+;//gI
+ s/stroke-opacity:[^;"]+;//gI
+ }
+
+ # delete unused properties from non-container elements
+ /<(a|defs|glyph|g|marker|mask|missing-glyph|pattern|svg|switch|symbol|use)/! {
+ s/enable-background:[^;"]+;//gI
+ }
+
+ # delete unused properties from non-text content elements
+ /<(altGlyph|textPath|text|tref|tspan|flowRoot|flowPara|flowSpan|a|defs|glyph|g|marker|mask|missing-glyph|pattern|svg|switch|symbol|use)/! {
+ s/alignment-baseline:[^;"]+;//gI
+ s/baseline-shift:[^;"]+;//gI
+ s/block-progression:[^;"]+;//gI
+ s/direction:[^;"]+;//gI
+ s/dominant-baseline:[^;"]+;//gI
+ s/font:[^;"]+;//gI
+ s/font-family:[^;"]+;//gI
+ s/font-feature-settings:[^;"]+;//gI
+ s/font-size-adjust:[^;"]+;//gI
+ s/font-size:[^;"]+;//gI
+ s/font-stretch:[^;"]+;//gI
+ s/font-style:[^;"]+;//gI
+ s/font-variant-alternates:[^;"]+;//gI
+ s/font-variant-caps:[^;"]+;//gI
+ s/font-variant-ligatures:[^;"]+;//gI
+ s/font-variant-numeric:[^;"]+;//gI
+ s/font-variant-position:[^;"]+;//gI
+ s/font-variant:[^;"]+;//gI
+ s/font-weight:[^;"]+;//gI
+ s/glyph-orientation-horizontal:[^;"]+;//gI
+ s/glyph-orientation-vertical:[^;"]+;//gI
+ s/kerning:[^;"]+;//gI
+ s/letter-spacing:[^;"]+;//gI
+ s/line-height:[^;"]+;//gI
+ s/text-align:[^;"]+;//gI
+ s/text-anchor:[^;"]+;//gI
+ s/text-decoration-color:[^;"]+;//gI
+ s/text-decoration-line:[^;"]+;//gI
+ s/text-decoration-style:[^;"]+;//gI
+ s/text-decoration:[^;"]+;//gI
+ s/text-indent:[^;"]+;//gI
+ s/text-orientation:[^;"]+;//gI
+ s/text-transform:[^;"]+;//gI
+ s/unicode-bidi:[^;"]+;//gI
+ s/word-spacing:[^;"]+;//gI
+ s/writing-mode:[^;"]+;//gI
+ }
+
+ # replace 2 and more semicolons by one
+ s/;{2,}/;/g
+
+ # delete trailing semicolon
+ s/;+"/"/g
+
+ # delete style attribute if it's empty
+ s/[[:space:]]?style=""//g
+}