我正在编写处理 html 的自定义 TagHandler:
<p style="font-weight:bold">
<span style="font-weight:normal">Chapter 2.</span>
<span style="font-size:14.0pt;font-weight:bold">Some Title</span>
</p>
在处理这个 html 时,我将 'p' tagName 更改为 'styledParagraph' 并添加 StyleSpan(Typeface.BOLD) 和 'span' 到 'styledSpan'。根据解析的内联样式到第一个跨度,我添加 StyleSpan(Typeface.NORMAL) 但我收到 PARAGRAPH 边界错误。
我的 tagHandler 的源代码如下:
class StyledTagHandler(val tagName: String) : Html.TagHandler {
private var startIndex = 0
private var endIndex = 0
val attributes: HashMap<String, String> = HashMap()
override fun handleTag(opening: Boolean, tag: String, output: Editable, xmlReader: XMLReader)
{
if (tag.equals("styled", true) || tag.equals("styledinline", true)) {
// parse all property values
parseAttributes(xmlReader)
if (opening) {
startHandleTag(tag, output, xmlReader);
} else {
endEndHandleTag(tag, output, xmlReader);
}
}
}
fun startHandleTag(tag: String, output: Editable, xmlReader: XMLReader) {
startIndex = output.length
}
fun endEndHandleTag(tag: String, output: Editable, xmlReader: XMLReader) {
endIndex = output.length
val inlineStyles = attributes.get("style")
val styles = StyleParser.formatCssBlock(inlineStyles)
// FONT STYLE
var fontStyle = -1
if (styles.containsKey("font-weight")) {
val fontWeight = styles["font-weight"]
fontWeight?.let {
fontStyle = when (fontWeight) {
"bold" -> Typeface.BOLD
"bolder" -> Typeface.BOLD
"600" -> Typeface.BOLD
"700" -> Typeface.BOLD
"normal" -> Typeface.NORMAL
else -> -1
}
}
if (fontStyle != -1)
output.setSpan(StyleSpan(fontStyle), startIndex, endIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
}
}
@Suppress("UNCHECKED_CAST")
private fun parseAttributes(xmlReader: XMLReader) {
try {
val elementField = xmlReader.javaClass.getDeclaredField("theNewElement")
elementField.isAccessible = true
val element: Any = elementField.get(xmlReader)
val attsField = element.javaClass.getDeclaredField("theAtts")
attsField.isAccessible = true
val atts: Any = attsField.get(element)
val dataField = atts.javaClass.getDeclaredField("data")
dataField.isAccessible = true
val data = dataField.get(atts) as Array<String>
val lengthField = atts.javaClass.getDeclaredField("length")
lengthField.isAccessible = true
val len = lengthField.getInt(atts)
for (i in 0 until len) {
attributes.put(data[i * 5 + 1], data[i * 5 + 4])
}
} catch (e: Exception) {
e.printStackTrace()
}
}
}
任何人都可以解释一下是否可以使用 TagHandler 在一个段落中设置不同的跨度。
谢谢!