diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a09a0e4..9350d8ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ * `MarkwonEditor` to highlight markdown input whilst editing (new module: `markwon-editor`) * `Markwon#configuration` method to expose `MarkwonConfiguration` via public API * `HeadingSpan#getLevel` getter +* Add `SvgPictureMediaDecoder` in `image` module to deal with SVG without dimensions ([#165]) + +[#165]: https://github.com/noties/Markwon/issues/165 # 4.1.2 * Do not re-use RenderProps when creating a new visitor (fixes [#171]) diff --git a/markwon-image/src/main/java/io/noties/markwon/image/svg/SvgPictureMediaDecoder.java b/markwon-image/src/main/java/io/noties/markwon/image/svg/SvgPictureMediaDecoder.java new file mode 100644 index 00000000..bc35a76f --- /dev/null +++ b/markwon-image/src/main/java/io/noties/markwon/image/svg/SvgPictureMediaDecoder.java @@ -0,0 +1,51 @@ +package io.noties.markwon.image.svg; + +import android.graphics.Picture; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.PictureDrawable; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.caverock.androidsvg.SVG; +import com.caverock.androidsvg.SVGParseException; + +import java.io.InputStream; +import java.util.Collection; +import java.util.Collections; + +import io.noties.markwon.image.MediaDecoder; + +/** + * @since 4.2.0-SNAPSHOT + */ +public class SvgPictureMediaDecoder extends MediaDecoder { + + public static final String CONTENT_TYPE = "image/svg+xml"; + + @NonNull + public static SvgPictureMediaDecoder create() { + return new SvgPictureMediaDecoder(); + } + + @NonNull + @Override + public Drawable decode(@Nullable String contentType, @NonNull InputStream inputStream) { + + final SVG svg; + try { + svg = SVG.getFromInputStream(inputStream); + } catch (SVGParseException e) { + throw new IllegalStateException("Exception decoding SVG", e); + } + + final Picture picture = svg.renderToPicture(); + return new PictureDrawable(picture); + } + + @NonNull + @Override + public Collection supportedTypes() { + return Collections.singleton(CONTENT_TYPE); + } +}