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