scour-project / scour

Scour - An SVG Optimizer / Cleaner
Apache License 2.0
757 stars 61 forks source link

Unknown attribute cleaning. #300

Open kevincox opened 2 years ago

kevincox commented 2 years ago

It would be useful to have an option to remove attributes that aren't part of the SVG spec as they are added by many tools and editors.

Possible configurations would be:

  1. Remove anything not part of the SVG specs.
  2. Remove anything matching a pattern (ex: data-.*)
  3. Remove a specific list of attributes.
JoKalliauer commented 2 years ago

@kevincox

  1. Is implemented in (i) for SVG1.1: https://github.com/RazrFalcon/svgcleaner/ --remove-nonsvg-attributes yes --remove-nonsvg-elements yes or (ii) for SVG2.0 simplification: https://github.com/RazrFalcon/resvg/tree/master/usvg or (iii) for file-size-reduction: https://github.com/svg/svgo or (iv) if you just want default settings: https://vecta.io/nano
  2. (a) Use a basic texteditor or (b) since data-* is not part of SVG1.1 specs, it would get removed in https://github.com/RazrFalcon/svgcleaner/ or (c) since it does not influence rendering https://github.com/RazrFalcon/resvg/tree/master/usvg will remove it.
  3. E.g. if you would like to remove all SystemLanguage=", search for this attribute in a texteditor and replace it by e.g. SystemLanguageDELETE=", then apply https://github.com/RazrFalcon/svgcleaner/ or https://github.com/RazrFalcon/resvg/tree/master/usvg and everything unknown is removed.

I think all three options might be dangerous breaking specific SVG-files. The first for example needs to know which element may have which attributes. e.g. writing-mode= is allowed in <text but not in <tspan, however most renderer (Chromium, Firefox, librsvg,...) apply it even if it is in tspan. Or flowRoot of SVG1.2, which is used by Inkscape, is not in SVG1.1 nor will it be in SVG2.0. So removing everything unknown is a SVG-version-dependent question.

Why do you want those features? Validating of the file? Reduction of File-size? Better source-code-readable? No private metadata? Reducing of rendering-errors? (Maybe provide an example, with input and desired output.)

@Developers: Sorry for pointing user to competitors, but I'm also recommending scour in other projects. Scour is imho the one with fewest bugs. I try to help Users with their problems.

kevincox commented 2 years ago

I think all three options might be dangerous breaking specific SVG-files.

It can be opt-in. For some people the risk of breakage is worth it.

however most renderer .. apply it even if it is in tspan

For cases like this I would recommend that option 1 from the original request keeps them as "defacto standards". But I'm not too bothered either way.

Why do you want those features?

For me I want reduction of file-size and no private metadata.

JoKalliauer commented 2 years ago

It can be opt-in. For some people the risk of breakage is worth it.

I agree on that (implementing unstable beta-featurs as opt-in), however developers generally don't implement it. Maybe because that will lead to many bug-reports. And your feature-request is imho not something easy to implement.

For me I want reduction of file-size and no private metadata.

Scour is imho more the conservative approach if you want to minimize file-size I recommend to use -https://github.com/RazrFalcon/svgcleaner/ -https://github.com/svg/svgo or https://jakearchibald.github.io/svgomg/ serial.