44from collagraph .renderers .dict_renderer import format_dict
55
66
7+ class TrackingDictRenderer (DictRenderer ):
8+ def __init__ (self ):
9+ super ().__init__ ()
10+ self .created_text_elements = 0
11+ self .set_text_calls = 0
12+
13+ def create_text_element (self ):
14+ self .created_text_elements += 1
15+ return super ().create_text_element ()
16+
17+ def set_element_text (self , el : dict , value : str ):
18+ self .set_text_calls += 1
19+ super ().set_element_text (el , value )
20+
21+
722def test_text_elements ():
823 from tests .data .text .expressions import Example
924
@@ -82,14 +97,14 @@ def test_text_elements():
8297 assert multiline ["type" ] == "TEXT_ELEMENT"
8398 assert static_multiline ["type" ] == "TEXT_ELEMENT"
8499 assert complex_multiline ["type" ] == "TEXT_ELEMENT"
85- assert static ["attrs" ][ "content " ] == "Static content"
86- assert dynamic ["attrs" ][ "content " ] == "Dynamic foo"
87- assert multiple ["attrs" ][ "content " ] == r"Even bar dyna{}mic\{} foo"
88- assert quoted ["attrs" ][ "content " ] == 'Quote "foo" and slash \\ \\ bar'
89- assert multiline ["attrs" ][ "content " ] == 'Line "foo"\n next bar'
90- assert static_multiline ["attrs" ][ "content " ] == "First line\n second line"
100+ assert static ["text " ] == "Static content"
101+ assert dynamic ["text " ] == "Dynamic foo"
102+ assert multiple ["text " ] == r"Even bar dyna{}mic\{} foo"
103+ assert quoted ["text " ] == 'Quote "foo" and slash \\ \\ bar'
104+ assert multiline ["text " ] == 'Line "foo"\n next bar'
105+ assert static_multiline ["text " ] == "First line\n second line"
91106 assert (
92- complex_multiline ["attrs" ][ "content " ]
107+ complex_multiline ["text " ]
93108 == 'Complex "foo"\n middle {{literal}} bar\n tail foo/bar'
94109 )
95110
@@ -98,6 +113,38 @@ def test_text_elements():
98113 assert split_p ["children" ][1 ]["type" ] == "TEXT_ELEMENT"
99114 assert split_p ["children" ][2 ]["type" ] == "span"
100115 assert split_p ["children" ][3 ]["type" ] == "TEXT_ELEMENT"
101- assert split_p ["children" ][0 ]["attrs" ]["content" ] == "Split"
102- assert split_p ["children" ][1 ]["attrs" ]["content" ] == " and split by "
103- assert split_p ["children" ][3 ]["attrs" ]["content" ] == " element"
116+ assert split_p ["children" ][0 ]["text" ] == "Split"
117+ assert split_p ["children" ][1 ]["text" ] == " and split by "
118+ assert split_p ["children" ][3 ]["text" ] == " element"
119+
120+
121+ def test_text_elements_use_text_renderer_api (parse_source ):
122+ App , _ = parse_source (
123+ """
124+ <item>
125+ Text content here
126+ </item>
127+
128+ <script>
129+ import collagraph as cg
130+
131+ class App(cg.Component):
132+ pass
133+ </script>
134+ """
135+ )
136+
137+ renderer = TrackingDictRenderer ()
138+ container = {"type" : "root" }
139+ gui = Collagraph (
140+ renderer = renderer ,
141+ event_loop_type = EventLoopType .SYNC ,
142+ )
143+ gui .render (App , container )
144+
145+ assert container ["children" ][0 ]["type" ] == "item"
146+ assert container ["children" ][0 ]["children" ][0 ]["type" ] == "TEXT_ELEMENT"
147+ assert container ["children" ][0 ]["children" ][0 ]["text" ] == "\n Text content here\n "
148+
149+ assert renderer .created_text_elements == 1
150+ assert renderer .set_text_calls == 1
0 commit comments