@@ -209,22 +209,61 @@ class ContentRenderer {
209209 has % . vars ;
210210
211211
212- # ## render: RENDER TO RenderSpans
212+ # ## span-tree: PARSE TO SpanTree AND STOP
213+
214+ # | Convert MarkupString -> SpanTree and stop (so the parse can be cached)
215+ multi method span-tree (MarkupString: D $ ms ) {
216+ $ ms . parse
217+ }
218+
219+
220+ # ## flat-spans: PARSE TO SpanTree, FLATTEN, AND STOP
221+
222+ # | Convert MarkupString -> flat list of SemanticSpans and stop,
223+ # | so the parse and flatten can be cached
224+ multi method flat-spans (MarkupString: D $ ms ) {
225+ $ ms . parse. flatten
226+ }
227+
228+ # | Convert SpanTree -> flat list of SemanticSpans and stop
229+ multi method flat-spans (SpanTree: D $ st ) {
230+ $ st . flatten
231+ }
232+
233+
234+ # ## flat-string-spans: PARSE TO SpanTree, FLATTEN, INTERPOLATE, AND STOP
235+
236+ # | Convert MarkupString -> flat list of SemanticSpans, interpolate vars
237+ # | for any InterpolantSpans in the list, giving a flat list of StringSpans
238+ multi method flat-string-spans (MarkupString: D $ ms ) {
239+ $ ms . parse. flatten. map : {
240+ . isa (InterpolantSpan) ?? . interpolate(% . vars ) !! $ _ ;
241+ };
242+ }
243+
244+ # | Flatten SpanTree -> list of SemanticSpans, interpolate vars for any
245+ # | InterpolantSpans in the list, giving a flat list of StringSpans
246+ multi method flat-string-spans (SpanTree: D $ st ) {
247+ $ st . flatten. map : {
248+ . isa (InterpolantSpan) ?? . interpolate(% . vars ) !! $ _ ;
249+ };
250+ }
251+
252+
253+ # ## render: RENDER ALL THE WAY TO RenderSpans
213254
214255 # | Convert MarkupString -> SpanTree and continue rendering
215256 multi method render (MarkupString: D $ ms ) {
216257 my $ st = $ ms . parse;
217258 self . render($ st )
218259 }
219260
220- # | Convert SpanTree -> flattened list of StringSpans and continue rendering
261+ # | Convert SpanTree -> flattened list of RenderSpans
221262 multi method render (SpanTree: D $ st ) {
222- # XXXX: Performance could be improved by inlining the render pass
223- # inside the map, but this is easier to test at the moment.
224- my @ flat-ss = $ st . flatten. map : {
225- . isa (InterpolantSpan) ?? . interpolate(% . vars ) !! $ _ ;
226- };
227- self . render(@ flat-ss )
263+ $ st . flatten. map ({
264+ . isa (InterpolantSpan) ?? . interpolate(% . vars ). render
265+ !! . render
266+ })
228267 }
229268
230269 # | Convert a list of StringSpans -> a list of RenderSpans
0 commit comments