Пользовательский Html.TagHandler и стиль двух внутренних промежутков в абзаце
Я пишу собственный TagHandler, который обрабатывает html:
<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 я меняю tagName 'p' на 'styledParagraph' и добавляю StyleSpan(Typeface.BOLD), а 'span' на 'styledSpan'. В соответствии с проанализированными встроенными стилями для первого диапазона я добавляю StyleSpan(Typeface.NORMAL), но получаю ошибку границ PARAGRAPH.
Исходный код My 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.
Спасибо!