11package com.richtext.renderer
22
33import android.text.SpannableStringBuilder
4- import android.text.style.UnderlineSpan
54import com.richtext.spans.RichTextLinkSpan
65import com.richtext.spans.RichTextHeadingSpan
76import com.richtext.spans.RichTextParagraphSpan
87import com.richtext.spans.RichTextTextSpan
8+ import com.richtext.styles.RichTextStyle
99import com.richtext.utils.addSpacing
1010import org.commonmark.node.*
1111
@@ -17,7 +17,13 @@ interface NodeRenderer {
1717 )
1818}
1919
20- class DocumentRenderer : NodeRenderer {
20+ data class RendererConfig (
21+ val style : RichTextStyle
22+ )
23+
24+ class DocumentRenderer (
25+ private val config : RendererConfig ? = null
26+ ) : NodeRenderer {
2127 override fun render (
2228 node : Node ,
2329 builder : SpannableStringBuilder ,
@@ -26,13 +32,15 @@ class DocumentRenderer : NodeRenderer {
2632 val document = node as Document
2733 var child = document.firstChild
2834 while (child != null ) {
29- NodeRendererFactory .getRenderer(child).render(child, builder, onLinkPress)
35+ NodeRendererFactory .getRenderer(child, config ).render(child, builder, onLinkPress)
3036 child = child.next
3137 }
3238 }
3339}
3440
35- class ParagraphRenderer : NodeRenderer {
41+ class ParagraphRenderer (
42+ private val config : RendererConfig ? = null
43+ ) : NodeRenderer {
3644 override fun render (
3745 node : Node ,
3846 builder : SpannableStringBuilder ,
@@ -43,7 +51,7 @@ class ParagraphRenderer : NodeRenderer {
4351
4452 var child = paragraph.firstChild
4553 while (child != null ) {
46- NodeRendererFactory .getRenderer(child).render(child, builder, onLinkPress)
54+ NodeRendererFactory .getRenderer(child, config ).render(child, builder, onLinkPress)
4755 child = child.next
4856 }
4957
@@ -61,7 +69,9 @@ class ParagraphRenderer : NodeRenderer {
6169 }
6270}
6371
64- class HeadingRenderer : NodeRenderer {
72+ class HeadingRenderer (
73+ private val config : RendererConfig ? = null
74+ ) : NodeRenderer {
6575 override fun render (
6676 node : Node ,
6777 builder : SpannableStringBuilder ,
@@ -72,14 +82,17 @@ class HeadingRenderer : NodeRenderer {
7282
7383 var child = heading.firstChild
7484 while (child != null ) {
75- NodeRendererFactory .getRenderer(child).render(child, builder, onLinkPress)
85+ NodeRendererFactory .getRenderer(child, config ).render(child, builder, onLinkPress)
7686 child = child.next
7787 }
7888
7989 val contentLength = builder.length - start
80- if (contentLength > 0 ) {
90+ if (contentLength > 0 && config != null ) {
8191 builder.setSpan(
82- RichTextHeadingSpan (heading.level),
92+ RichTextHeadingSpan (
93+ heading.level,
94+ config.style
95+ ),
8396 start,
8497 start + contentLength,
8598 android.text.SpannableString .SPAN_EXCLUSIVE_EXCLUSIVE
@@ -114,7 +127,9 @@ class TextRenderer : NodeRenderer {
114127 }
115128}
116129
117- class LinkRenderer : NodeRenderer {
130+ class LinkRenderer (
131+ private val config : RendererConfig ? = null
132+ ) : NodeRenderer {
118133 override fun render (
119134 node : Node ,
120135 builder : SpannableStringBuilder ,
@@ -126,21 +141,14 @@ class LinkRenderer : NodeRenderer {
126141
127142 var child = link.firstChild
128143 while (child != null ) {
129- NodeRendererFactory .getRenderer(child).render(child, builder, onLinkPress)
144+ NodeRendererFactory .getRenderer(child, config ).render(child, builder, onLinkPress)
130145 child = child.next
131146 }
132147
133148 val contentLength = builder.length - start
134- if (contentLength > 0 ) {
135- builder.setSpan(
136- RichTextLinkSpan (url, onLinkPress),
137- start,
138- start + contentLength,
139- android.text.SpannableString .SPAN_EXCLUSIVE_EXCLUSIVE
140- )
141-
149+ if (contentLength > 0 && config != null ) {
142150 builder.setSpan(
143- UnderlineSpan ( ),
151+ RichTextLinkSpan (url, onLinkPress, config.style ),
144152 start,
145153 start + contentLength,
146154 android.text.SpannableString .SPAN_EXCLUSIVE_EXCLUSIVE
@@ -160,13 +168,13 @@ class LineBreakRenderer : NodeRenderer {
160168}
161169
162170object NodeRendererFactory {
163- fun getRenderer (node : Node ): NodeRenderer {
171+ fun getRenderer (node : Node , config : RendererConfig ? = null ): NodeRenderer {
164172 return when (node) {
165- is Document -> DocumentRenderer ()
166- is Paragraph -> ParagraphRenderer ()
167- is Heading -> HeadingRenderer ()
173+ is Document -> DocumentRenderer (config )
174+ is Paragraph -> ParagraphRenderer (config )
175+ is Heading -> HeadingRenderer (config )
168176 is Text -> TextRenderer ()
169- is Link -> LinkRenderer ()
177+ is Link -> LinkRenderer (config )
170178 is HardLineBreak , is SoftLineBreak -> LineBreakRenderer ()
171179 else -> {
172180 android.util.Log .w(
0 commit comments