@@ -5,21 +5,18 @@ import android.content.res.Configuration
55import android.os.Build
66import android.os.Handler
77import android.os.Looper
8- import android.text.SpannableString
98import android.util.AttributeSet
109import android.util.Log
1110import android.view.View
1211import android.widget.FrameLayout
1312import com.facebook.react.bridge.ReadableMap
14- import com.swmansion.enriched.markdown.parser.MarkdownASTNode
1513import com.swmansion.enriched.markdown.parser.Md4cFlags
1614import com.swmansion.enriched.markdown.parser.Parser
17- import com.swmansion.enriched.markdown.renderer.Renderer
18- import com.swmansion.enriched.markdown.spans.ImageSpan
1915import com.swmansion.enriched.markdown.spoiler.SpoilerOverlay
2016import com.swmansion.enriched.markdown.styles.StyleConfig
2117import com.swmansion.enriched.markdown.utils.common.FeatureFlags
22- import com.swmansion.enriched.markdown.utils.common.MarkdownSegment
18+ import com.swmansion.enriched.markdown.utils.common.MarkdownSegmentRenderer
19+ import com.swmansion.enriched.markdown.utils.common.RenderedSegment
2320import com.swmansion.enriched.markdown.utils.common.splitASTIntoSegments
2421import com.swmansion.enriched.markdown.utils.text.view.emitLinkLongPressEvent
2522import com.swmansion.enriched.markdown.utils.text.view.emitLinkPressEvent
@@ -28,23 +25,6 @@ import com.swmansion.enriched.markdown.views.TableContainerView
2825import java.util.concurrent.ExecutorService
2926import java.util.concurrent.Executors
3027
31- private sealed interface RenderSegment {
32- data class Text (
33- val styledText : SpannableString ,
34- val imageSpans : List <ImageSpan >,
35- val needsJustify : Boolean ,
36- val lastElementMarginBottom : Float ,
37- ) : RenderSegment
38-
39- data class Table (
40- val node : MarkdownASTNode ,
41- ) : RenderSegment
42-
43- data class Math (
44- val latex : String ,
45- ) : RenderSegment
46- }
47-
4828class EnrichedMarkdown
4929 @JvmOverloads
5030 constructor (
@@ -200,57 +180,43 @@ class EnrichedMarkdown
200180 return @execute
201181 }
202182
203- val processedSegments =
204- splitASTIntoSegments(ast).map { segment ->
205- when (segment) {
206- is MarkdownSegment .Text -> renderTextSegment(segment.nodes, style)
207- is MarkdownSegment .Table -> RenderSegment .Table (segment.node)
208- is MarkdownSegment .Math -> RenderSegment .Math (segment.latex)
209- }
210- }
211-
212- postToMain(renderId) { applyRenderedSegments(processedSegments, style) }
183+ val segments = splitASTIntoSegments(ast)
184+ val renderedSegments =
185+ MarkdownSegmentRenderer .render(
186+ segments,
187+ style,
188+ context,
189+ onLinkPressCallback,
190+ onLinkLongPressCallback,
191+ )
192+
193+ postToMain(renderId) { applyRenderedSegments(renderedSegments, style) }
213194 } catch (e: Exception ) {
214195 Log .e(TAG , " Render failed" , e)
215196 postToMain(renderId) { clearSegments() }
216197 }
217198 }
218199 }
219200
220- private fun renderTextSegment (
221- nodes : List <MarkdownASTNode >,
222- style : StyleConfig ,
223- ): RenderSegment .Text {
224- val documentWrapper = MarkdownASTNode (type = MarkdownASTNode .NodeType .Document , children = nodes)
225- val renderer = Renderer ().apply { configure(style, context) }
226-
227- return RenderSegment .Text (
228- styledText = renderer.renderDocument(documentWrapper, onLinkPressCallback, onLinkLongPressCallback),
229- imageSpans = renderer.getCollectedImageSpans().toList(),
230- needsJustify = style.needsJustify,
231- lastElementMarginBottom = renderer.getLastElementMarginBottom(),
232- )
233- }
234-
235201 private fun applyRenderedSegments (
236- renderedSegments : List <RenderSegment >,
202+ renderedSegments : List <RenderedSegment >,
237203 style : StyleConfig ,
238204 ) {
239205 clearSegments()
240206 renderedSegments.forEach { segment ->
241207 val view =
242208 when (segment) {
243- is RenderSegment .Text -> createTextView(segment)
244- is RenderSegment .Table -> createTableView(segment, style)
245- is RenderSegment .Math -> createMathView(segment, style)
209+ is RenderedSegment .Text -> createTextView(segment)
210+ is RenderedSegment .Table -> createTableView(segment, style)
211+ is RenderedSegment .Math -> createMathView(segment, style)
246212 }
247213 segmentViews.add(view)
248214 addView(view)
249215 }
250216 layoutSegments()
251217 }
252218
253- private fun createTextView (segment : RenderSegment .Text ) =
219+ private fun createTextView (segment : RenderedSegment .Text ) =
254220 EnrichedMarkdownInternalText (context).apply {
255221 spoilerOverlay = this @EnrichedMarkdown.spoilerOverlay
256222 setIsSelectable(selectable)
@@ -271,7 +237,7 @@ class EnrichedMarkdown
271237 }
272238
273239 private fun createTableView (
274- segment : RenderSegment .Table ,
240+ segment : RenderedSegment .Table ,
275241 style : StyleConfig ,
276242 ) = TableContainerView (context, style).apply {
277243 allowFontScaling = this @EnrichedMarkdown.allowFontScaling
@@ -282,7 +248,7 @@ class EnrichedMarkdown
282248 }
283249
284250 private fun createMathView (
285- segment : RenderSegment .Math ,
251+ segment : RenderedSegment .Math ,
286252 style : StyleConfig ,
287253 ): android.view.View {
288254 if (! FeatureFlags .IS_MATH_ENABLED ) return android.view.View (context)
0 commit comments