Skip to content

Commit 3608b30

Browse files
committed
Provide ContentRenderer methods that stop at caching points
1 parent e4acf56 commit 3608b30

File tree

2 files changed

+74
-11
lines changed

2 files changed

+74
-11
lines changed

lib/Terminal/Widgets/I18N/Translation.rakumod

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,35 @@ class TranslatableContentRenderer
4444
is Terminal::Widgets::TextContent::ContentRenderer {
4545
has $.locale is required;
4646

47-
#| Convert TranslatableString -> MarkupString and continue rendering
48-
multi method render(TranslatableString:D $ts) {
47+
48+
#| Translate a TranslatableString -> MarkupString and stop
49+
multi method markup-string(TranslatableString:D $ts) {
4950
my $ms = $ts.interpolatable ?? $.locale.translate($ts, :%.vars)
5051
!! $.locale.translate($ts);
51-
self.render($ms)
52+
}
53+
54+
#| Translate TranslatableString -> MarkupString, parse that -> SpanTree,
55+
#| and then stop so the translate and parse phases can be cached
56+
multi method span-tree(TranslatableString:D $ts) {
57+
self.span-tree(self.markup-string($ts))
58+
}
59+
60+
#| Translate TranslatableString -> MarkupString, parse that -> SpanTree,
61+
#| flatten to a list of SemanticSpans, and stop so work so far can be cached
62+
multi method flat-spans(TranslatableString:D $ts) {
63+
self.flat-spans(self.markup-string($ts))
64+
}
65+
66+
#| Translate TranslatableString -> MarkupString, parse that -> SpanTree,
67+
#| flatten to a list of SemanticSpans, interpolate vars for any
68+
#| InterpolantSpans in the list, and then stop so work so far can be cached
69+
multi method flat-string-spans(TranslatableString:D $ts) {
70+
self.flat-string-spans(self.markup-string($ts))
71+
}
72+
73+
#| Convert TranslatableString -> MarkupString and continue rendering
74+
multi method render(TranslatableString:D $ts) {
75+
self.render(self.markup-string($ts))
5276
}
5377
}
5478

lib/Terminal/Widgets/TextContent.rakumod

Lines changed: 47 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)