0

我正在编写处理 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 在一个段落中设置不同的跨度。

谢谢!

4

0 回答 0