Skip to content

Instantly share code, notes, and snippets.

@hypest
Created May 8, 2018 08:04
Show Gist options
  • Save hypest/a949f42c167a7ce4884067ace57a51ed to your computer and use it in GitHub Desktop.
Save hypest/a949f42c167a7ce4884067ace57a51ed to your computer and use it in GitHub Desktop.
custom data view renderer to visualize the spans structure
package org.wordpress.aztec
import android.text.Spanned
import android.text.TextUtils
import java.util.*
/**
* Created by hypest on 11/01/17.
*/
object SpanLogger {
private fun spaces(count: Int, char: String = " "): String {
return TextUtils.join("", Collections.nCopies(count, char))
}
val MARK = 1
val POINT = 2
val PARAGRAPH = 3
@JvmStatic fun logSpans(text: Spanned): String {
val spans = text.getSpans(0, 9999999, Any::class.java)
val spansList = Arrays.asList<Any>(*spans)
val sb = StringBuilder()
sb.append('\n').append(text.toString().replace('\n', '¶').replace('\u200B', '¬')) // ␤↵↭
sb.append(" length = " + text.length)
for (span in spansList) {
val start = text.getSpanStart(span)
val end = text.getSpanEnd(span)
var gap = text.length + 5
sb.append('\n')
if (start > 0) {
sb.append(spaces(start))
gap -= start
}
val spanMode = text.getSpanFlags(span) and Spanned.SPAN_POINT_MARK_MASK
val leftMode = (spanMode and 0x30) ushr 4
val rightMode = spanMode and 0x03
if (end - start > 0) {
when (leftMode) {
MARK -> sb.append('>')
POINT -> sb.append('<')
PARAGRAPH -> sb.append(if (start == 0) '<' else '>')
}
gap--
} else {
if (spanMode == Spanned.SPAN_INCLUSIVE_INCLUSIVE) {
sb.append('x')
} else if (spanMode == Spanned.SPAN_INCLUSIVE_EXCLUSIVE) {
sb.append('>')
} else if (spanMode == Spanned.SPAN_EXCLUSIVE_INCLUSIVE) {
sb.append('<')
} else if (spanMode == Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) {
sb.append('!')
} else if (spanMode == Spanned.SPAN_PARAGRAPH) {
if (start == 0) {
sb.append('!')
} else if (start == text.length) {
sb.append('<')
} else {
sb.append('>')
}
}
}
if (end - start - 1 > 0) {
sb.append(spaces(end - start - 1, "-"))
gap -= end - start - 1
}
if (end - start > 0) {
when (rightMode) {
MARK -> sb.append('>')
POINT -> sb.append('<')
PARAGRAPH -> sb.append(if (end == text.length) '<' else '>')
}
gap--
}
sb.append(spaces(gap))
sb.append(" ")
.append(String.format("%03d", start))
.append(" -> ")
.append(String.format("%03d", end))
.append(" : ")
.append(span.javaClass.simpleName)
}
return sb.toString()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment