commit
27bcfd999d
@ -0,0 +1,66 @@ |
||||
package io.legado.app.utils |
||||
|
||||
import org.jsoup.internal.StringUtil |
||||
import org.jsoup.nodes.CDataNode |
||||
import org.jsoup.nodes.Element |
||||
import org.jsoup.nodes.Node |
||||
import org.jsoup.nodes.TextNode |
||||
import org.jsoup.select.NodeTraversor |
||||
import org.jsoup.select.NodeVisitor |
||||
|
||||
|
||||
fun Element.textArray(): Array<String> { |
||||
val accum = StringUtil.borrowBuilder() |
||||
NodeTraversor.traverse(object : NodeVisitor { |
||||
override fun head(node: Node, depth: Int) { |
||||
if (node is TextNode) { |
||||
appendNormalisedText(accum, node) |
||||
} else if (node is Element) { |
||||
if (accum.isNotEmpty() && |
||||
(node.isBlock || node.tag().name == "br") && |
||||
!lastCharIsWhitespace(accum) |
||||
) accum.append("\n") |
||||
} |
||||
} |
||||
|
||||
override fun tail(node: Node, depth: Int) { |
||||
if (node is Element) { |
||||
if (node.isBlock && node.nextSibling() is TextNode && !lastCharIsWhitespace( |
||||
accum |
||||
) |
||||
) accum.append("\n") |
||||
} |
||||
} |
||||
}, this) |
||||
val text = StringUtil.releaseBuilder(accum).trim { it <= ' ' } |
||||
return text.splitNotBlank("\n") |
||||
} |
||||
|
||||
private fun appendNormalisedText(accum: StringBuilder, textNode: TextNode) { |
||||
val text = textNode.wholeText |
||||
if (preserveWhitespace(textNode.parentNode()) || textNode is CDataNode) |
||||
accum.append(text) |
||||
else StringUtil.appendNormalisedWhitespace( |
||||
accum, |
||||
text, |
||||
lastCharIsWhitespace(accum) |
||||
) |
||||
} |
||||
|
||||
private fun preserveWhitespace(node: Node?): Boolean { |
||||
if (node is Element) { |
||||
var el = node as Element? |
||||
var i = 0 |
||||
do { |
||||
if (el!!.tag().preserveWhitespace()) return true |
||||
el = el.parent() |
||||
i++ |
||||
} while (i < 6 && el != null) |
||||
} |
||||
return false |
||||
} |
||||
|
||||
private fun lastCharIsWhitespace(sb: java.lang.StringBuilder): Boolean { |
||||
return sb.isNotEmpty() && sb[sb.length - 1] == ' ' |
||||
} |
||||
|
Loading…
Reference in new issue