Skip to content
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import com.swmansion.enriched.spans.interfaces.EnrichedSpan
import com.swmansion.enriched.utils.areInlineSpansTouchingOrOverlapping
import com.swmansion.enriched.utils.getSafeSpanBoundaries
import com.swmansion.enriched.utils.isTheSameInlineSpan
import com.swmansion.enriched.utils.removeSpans
import com.swmansion.enriched.watchers.TextChangedEvent

class InlineStyles(
Expand Down Expand Up @@ -48,10 +49,7 @@ class InlineStyles(
maximum = spanEnd.coerceAtLeast(maximum)
}

val spans = editable.getSpans(minimum, maximum, type)
for (span in spans) {
editable.removeSpan(span)
}
editable.removeSpans(minimum, maximum, type)

val span = createSpan(styleName)
val (safeStart, safeEnd) = editable.getSafeSpanBoundaries(minimum, maximum)
Expand Down Expand Up @@ -445,7 +443,7 @@ class InlineStyles(
val spans = editable.getSpans(start, end, config.clazz)
if (spans.isEmpty()) return false

spans.forEach { it -> editable.removeSpan(it) }
editable.removeSpans(spans)

view.spanState.setStart(name, null)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import com.swmansion.enriched.utils.ParagraphUtils.findPreviousAlignmentSpan
import com.swmansion.enriched.utils.ParagraphUtils.getPreviousParagraphSpan
import com.swmansion.enriched.utils.getParagraphBounds
import com.swmansion.enriched.utils.getSafeSpanBoundaries
import com.swmansion.enriched.utils.removeSpans
import com.swmansion.enriched.utils.removeZWS
import com.swmansion.enriched.watchers.TextChangedEvent

Expand Down Expand Up @@ -199,7 +200,7 @@ class ListStyles(
val spans = editable.getSpans(start, end, EnrichedAlignmentSpan::class.java)
if (spans.isEmpty()) return

spans.forEach { editable.removeSpan(it) }
editable.removeSpans(spans)

editable.setSpan(
spans.first().copy(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import com.swmansion.enriched.utils.getListRange
import com.swmansion.enriched.utils.getParagraphBounds
import com.swmansion.enriched.utils.getParagraphsBounds
import com.swmansion.enriched.utils.isTheSameParagraphInSelection
import com.swmansion.enriched.utils.removeSpans
import com.swmansion.enriched.utils.removeZWS
import com.swmansion.enriched.watchers.TextChangedEvent

Expand Down Expand Up @@ -293,9 +294,7 @@ class ParagraphStyles(
val (listStart, listEnd) =
editable.getListRange(paragraphStart, paragraphEnd, listSpan)

editable
.getSpans(listStart, listEnd, EnrichedAlignmentSpan::class.java)
.forEach { editable.removeSpan(it) }
editable.removeSpans(listStart, listEnd, EnrichedAlignmentSpan::class.java)

editable.setSpan(
EnrichedAlignmentSpan(alignment),
Expand All @@ -304,9 +303,7 @@ class ParagraphStyles(
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE,
)
} else {
editable.getSpans(paragraphStart, paragraphEnd, EnrichedAlignmentSpan::class.java).forEach {
editable.removeSpan(it)
}
editable.removeSpans(paragraphStart, paragraphEnd, EnrichedAlignmentSpan::class.java)
editable.setSpan(EnrichedAlignmentSpan(alignment), paragraphStart, paragraphEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import com.swmansion.enriched.spans.EnrichedSpans
import com.swmansion.enriched.spans.TextStyle
import com.swmansion.enriched.spans.interfaces.EnrichedSpan
import com.swmansion.enriched.utils.getSafeSpanBoundaries
import com.swmansion.enriched.utils.removeSpans
import com.swmansion.enriched.utils.removeZWS
import com.swmansion.enriched.watchers.TextChangedEvent
import kotlin.math.max
Expand All @@ -25,20 +26,18 @@ class ParametrizedStyles(

var mentionIndicators: Array<String> = emptyArray<String>()

fun <T> removeSpansForRange(
fun removeSpansForRange(
editable: Editable,
start: Int,
end: Int,
clazz: Class<T>,
clazz: Class<out EnrichedSpan>,
): Boolean {
val spans = editable.getSpans(start, end, clazz)
if (spans.isEmpty()) return false

editable.removeZWS(start, end)

for (span in spans) {
editable.removeSpan(span)
}
editable.removeSpans(spans)

return true
}
Expand Down Expand Up @@ -71,13 +70,7 @@ class ParametrizedStyles(
fun removeLinkSpan(
start: Int,
end: Int,
) {
val editable = view.editableText
val spans = editable.getSpans(start, end, EnrichedLinkSpan::class.java)
for (span in spans) {
editable.removeSpan(span)
}
}
) = view.editableText.removeSpans(start, end, EnrichedLinkSpan::class.java)

// After editing text we want to automatically detect links in the affected range
// Affected range is range + previous word + next word
Expand Down Expand Up @@ -107,15 +100,7 @@ class ParametrizedStyles(
val text = editable.toString()

// Remove existing link spans
val existingSpans =
editable.getSpans(
0,
editable.length,
EnrichedLinkSpan::class.java,
)
for (span in existingSpans) {
editable.removeSpan(span)
}
editable.removeSpans(0, editable.length, EnrichedLinkSpan::class.java)

// Detect links using our URL_REGEX
for (match in URL_REGEX.findAll(text)) {
Expand Down Expand Up @@ -200,9 +185,7 @@ class ParametrizedStyles(
).filter {
!it.isManual
}
for (span in spans) {
editable.removeSpan(span)
}
editable.removeSpans(spans)

// Split into words and detect links
for (wordMatch in wordsRegex.findAll(contextText)) {
Expand Down Expand Up @@ -252,10 +235,7 @@ class ParametrizedStyles(
val mentionIndicatorRegex = Regex("^($indicatorsPattern)")
val mentionRegex = Regex("^($indicatorsPattern)\\w*")

val spans = editable.getSpans(currentWord.start, currentWord.end, EnrichedMentionSpan::class.java)
for (span in spans) {
editable.removeSpan(span)
}
editable.removeSpans(currentWord.start, currentWord.end, EnrichedMentionSpan::class.java)

var indicator: String
var finalStart: Int
Expand Down Expand Up @@ -334,10 +314,7 @@ class ParametrizedStyles(
if (start == originalEnd) {
editable.insert(start, "\uFFFC")
} else {
val spans = editable.getSpans(start, originalEnd, EnrichedImageSpan::class.java)
for (s in spans) {
editable.removeSpan(s)
}
editable.removeSpans(start, originalEnd, EnrichedImageSpan::class.java)

editable.replace(start, originalEnd, "\uFFFC")
}
Expand Down Expand Up @@ -367,9 +344,7 @@ class ParametrizedStyles(
start: Int,
end: Int,
) {
editable
.getSpans(start, end, EnrichedMentionSpan::class.java)
.forEach(editable::removeSpan)
editable.removeSpans(start, end, EnrichedMentionSpan::class.java)
}

private fun insertMentionAtSelection(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,7 @@ object ParagraphUtils {

if (hasMatchingSpan) return

spans.forEach {
spannable.removeSpan(it)
}

spannable.removeSpans(spans)
spannable.setSpan(span, pStart, pEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.swmansion.enriched.utils

import android.text.Spannable
import com.swmansion.enriched.spans.interfaces.EnrichedParagraphSpan
import com.swmansion.enriched.spans.interfaces.EnrichedSpan

fun Spannable.getListRange(
paragraphStart: Int,
Expand Down Expand Up @@ -56,3 +57,13 @@ fun Spannable.isTheSameParagraphInSelection(selection: EnrichedSelection): Boole

return startParagraphBounds.first == endParagraphBounds.first
}

fun Spannable.removeSpans(
start: Int,
end: Int,
clazz: Class<out EnrichedSpan>,
) = removeSpans(getSpans(start, end, clazz))

fun Spannable.removeSpans(spans: Array<out EnrichedSpan>) = spans.forEach(::removeSpan)

fun Spannable.removeSpans(spans: List<EnrichedSpan>) = spans.forEach(::removeSpan)
12 changes: 3 additions & 9 deletions android/src/main/java/com/swmansion/enriched/utils/Utils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -246,13 +246,8 @@ private fun cleanInsertedFromParagraphSpansIfNeeded(

val (pStart, pEnd) = inserted.getParagraphBounds(0, 0)

inserted
.getSpans(pStart, pEnd, EnrichedParagraphSpan::class.java)
.forEach { inserted.removeSpan(it) }

inserted
.getSpans(pStart, pEnd, EnrichedBlockSpan::class.java)
.forEach { inserted.removeSpan(it) }
inserted.removeSpans(pStart, pEnd, EnrichedParagraphSpan::class.java)
inserted.removeSpans(pStart, pEnd, EnrichedBlockSpan::class.java)
}

private fun SpannableStringBuilder.maybeInsertNewLine(
Expand Down Expand Up @@ -293,8 +288,7 @@ private fun SpannableStringBuilder.applyParagraphSpans(
) {
val (pStart, pEnd) = getParagraphBounds(at, at)

getSpans(pStart, pEnd, EnrichedParagraphSpan::class.java)
.forEach { removeSpan(it) }
removeSpans(pStart, pEnd, EnrichedParagraphSpan::class.java)

spans.forEach { span ->
setSpan(
Expand Down