From 06c2763ac6cf2b29dadbfc123a43e5db6cecad34 Mon Sep 17 00:00:00 2001 From: Dimitry Ivanov Date: Wed, 26 Jun 2019 12:57:34 +0300 Subject: [PATCH] Add LastLineSpacingSpan --- .../core/spans/LastLineSpacingSpan.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 markwon-core/src/main/java/io/noties/markwon/core/spans/LastLineSpacingSpan.java diff --git a/markwon-core/src/main/java/io/noties/markwon/core/spans/LastLineSpacingSpan.java b/markwon-core/src/main/java/io/noties/markwon/core/spans/LastLineSpacingSpan.java new file mode 100644 index 00000000..560e3026 --- /dev/null +++ b/markwon-core/src/main/java/io/noties/markwon/core/spans/LastLineSpacingSpan.java @@ -0,0 +1,43 @@ +package io.noties.markwon.core.spans; + +import android.graphics.Paint; +import android.text.Spanned; +import android.text.style.LineHeightSpan; + +import androidx.annotation.NonNull; +import androidx.annotation.Px; + +/** + * @since 4.0.0-SNAPSHOT + */ +public class LastLineSpacingSpan implements LineHeightSpan { + + @NonNull + public static LastLineSpacingSpan create(@Px int spacing) { + return new LastLineSpacingSpan(spacing); + } + + private final int spacing; + + public LastLineSpacingSpan(@Px int spacing) { + this.spacing = spacing; + } + + @Override + public void chooseHeight(CharSequence text, int start, int end, int spanstartv, int v, Paint.FontMetricsInt fm) { + if (selfEnd(end, text, this)) { + // let's just add what we want + fm.descent += spacing; + fm.bottom += spacing; + } + } + + private static boolean selfEnd(int end, CharSequence text, Object span) { + // this is some kind of interesting magic here... only the last + // span will receive correct _end_ argument, but previous spans + // receive it tilted by one (1). Most likely it's just a new-line character... and + // if needed we could check for that + final int spanEnd = ((Spanned) text).getSpanEnd(span); + return spanEnd == end || spanEnd == end - 1; + } +}