1+ const Ast = @This ();
2+
13const std = @import ("std" );
4+ const Writer = std .Io .Writer ();
25const Tokenizer = @import ("Tokenizer.zig" );
36const root = @import ("../root.zig" );
47const Span = root .Span ;
58
6- const Ast = @This ();
7-
89const at_rules = &.{
910 .{ .name = "media" , .func = parseMediaRule },
1011};
@@ -41,29 +42,39 @@ pub const Rule = struct {
4142 pseudo_element : Span ,
4243 };
4344
44- pub fn render (self : Simple , ast : Ast , src : []const u8 , out_stream : anytype ) ! void {
45+ pub fn render (
46+ self : Simple ,
47+ ast : Ast ,
48+ src : []const u8 ,
49+ w : * Writer ,
50+ ) ! void {
4551 if (self .element_name ) | element_name | {
4652 switch (element_name ) {
47- .name = > | name | _ = try out_stream .write (name .slice (src )),
48- .all = > _ = try out_stream .write ("*" ),
53+ .name = > | name | _ = try w .write (name .slice (src )),
54+ .all = > _ = try w .write ("*" ),
4955 }
5056 }
5157
5258 for (ast .specifiers [self .specifiers .start .. self .specifiers .end ]) | specifier | {
5359 switch (specifier ) {
54- .hash = > | hash | try out_stream .print ("#{s}" , .{hash .slice (src )}),
55- .class = > | class | try out_stream .print (".{s}" , .{class .slice (src )}),
60+ .hash = > | hash | try w .print ("#{s}" , .{hash .slice (src )}),
61+ .class = > | class | try w .print (".{s}" , .{class .slice (src )}),
5662 .attrib = > @panic ("TODO" ),
57- .pseudo_class = > | pseudo_class | try out_stream .print (":{s}" , .{pseudo_class .slice (src )}),
58- .pseudo_element = > | pseudo_element | try out_stream .print ("::{s}" , .{pseudo_element .slice (src )}),
63+ .pseudo_class = > | pseudo_class | try w .print (":{s}" , .{pseudo_class .slice (src )}),
64+ .pseudo_element = > | pseudo_element | try w .print ("::{s}" , .{pseudo_element .slice (src )}),
5965 }
6066 }
6167 }
6268 };
6369
64- pub fn render (self : Selector , ast : Ast , src : []const u8 , out_stream : anytype ) ! void {
65- switch (self ) {
66- inline else = > | sel | try sel .render (ast , src , out_stream ),
70+ pub fn render (
71+ selector : Selector ,
72+ ast : Ast ,
73+ src : []const u8 ,
74+ w : * Writer ,
75+ ) ! void {
76+ switch (selector ) {
77+ inline else = > | sel | try sel .render (ast , src , w ),
6778 }
6879 }
6980 };
@@ -72,64 +83,77 @@ pub const Rule = struct {
7283 property : Span ,
7384 value : Span ,
7485
75- pub fn render (self : Declaration , src : []const u8 , out_stream : anytype ) ! void {
76- _ = try out_stream .write (self .property .slice (src ));
77- _ = try out_stream .write (": " );
78- try renderValue (self .value .slice (src ), out_stream );
86+ pub fn render (
87+ declaration : Declaration ,
88+ src : []const u8 ,
89+ w : * Writer ,
90+ ) ! void {
91+ _ = try w .write (declaration .property .slice (src ));
92+ _ = try w .write (": " );
93+ try renderValue (declaration .value .slice (src ), w );
7994 }
8095 };
8196
82- pub fn render (self : Style , ast : Ast , src : []const u8 , out_stream : anytype , depth : usize ) ! void {
83- for (0.. depth ) | _ | _ = try out_stream .write (" " );
84- for (ast .selectors [self .selectors .start .. self .selectors .end ], 0.. ) | selector , i | {
97+ pub fn render (
98+ style : Style ,
99+ ast : Ast ,
100+ src : []const u8 ,
101+ w : * Writer ,
102+ depth : usize ,
103+ ) ! void {
104+ for (0.. depth ) | _ | _ = try w .write (" " );
105+ for (ast .selectors [style .selectors .start .. style .selectors .end ], 0.. ) | selector , i | {
85106 if (i != 0 ) {
86- _ = try out_stream .write (", " );
107+ _ = try w .write (", " );
87108 }
88109
89- try selector .render (ast , src , out_stream );
110+ try selector .render (ast , src , w );
90111 }
91112
92- _ = try out_stream .write (" {" );
113+ _ = try w .write (" {" );
93114
94- if (self .multiline_decl ) {
95- _ = try out_stream .write ("\n " );
115+ if (style .multiline_decl ) {
116+ _ = try w .write ("\n " );
96117
97- for (ast .declarations [self .declarations .start .. self .declarations .end ]) | declaration | {
98- for (0.. depth + 1 ) | _ | _ = try out_stream .write (" " );
99- try declaration .render (src , out_stream );
100- _ = try out_stream .write (";\n " );
118+ for (ast .declarations [style .declarations .start .. style .declarations .end ]) | declaration | {
119+ for (0.. depth + 1 ) | _ | _ = try w .write (" " );
120+ try declaration .render (src , w );
121+ _ = try w .write (";\n " );
101122 }
102123
103- for (0.. depth ) | _ | _ = try out_stream .write (" " );
124+ for (0.. depth ) | _ | _ = try w .write (" " );
104125 } else {
105- _ = try out_stream .write (" " );
106- for (ast .declarations [self .declarations .start .. self .declarations .end ], 0.. ) | declaration , i | {
107- if (i != 0 ) _ = try out_stream .write ("; " );
108- try declaration .render (src , out_stream );
126+ _ = try w .write (" " );
127+ for (ast .declarations [style .declarations .start .. style .declarations .end ], 0.. ) | declaration , i | {
128+ if (i != 0 ) _ = try w .write ("; " );
129+ try declaration .render (src , w );
109130 }
110- _ = try out_stream .write (" " );
131+ _ = try w .write (" " );
111132 }
112133
113- _ = try out_stream .write ("}" );
134+ _ = try w .write ("}" );
114135 }
115136 };
116137
117138 pub const Media = struct {
118139 queries : Span ,
119140 first_rule : ? u32 ,
120141
121- fn renderMediaQuery (query : []const u8 , out_stream : anytype ) ! void {
142+ fn renderMediaQuery (
143+ query : []const u8 ,
144+ w : * Writer ,
145+ ) ! void {
122146 var query_tokenizer : Tokenizer = .{};
123147
124148 while (query_tokenizer .next (query )) | token | {
125149 switch (token ) {
126- .ident = > | ident | _ = try out_stream .write (ident .slice (query )),
150+ .ident = > | ident | _ = try w .write (ident .slice (query )),
127151 .open_paren = > {
128- _ = try out_stream .write ("(" );
129- _ = try out_stream .write (query_tokenizer .next (query ).? .ident .slice (query ));
152+ _ = try w .write ("(" );
153+ _ = try w .write (query_tokenizer .next (query ).? .ident .slice (query ));
130154 switch (query_tokenizer .next (query ).? ) {
131155 .colon = > {
132- _ = try out_stream .write (": " );
156+ _ = try w .write (": " );
133157
134158 var span : ? Span = null ;
135159 while (true ) {
@@ -145,60 +169,72 @@ pub const Rule = struct {
145169
146170 std .debug .assert (span != null );
147171
148- try renderValue (span .? .slice (query ), out_stream );
172+ try renderValue (span .? .slice (query ), w );
149173 },
150174 .close_paren = > {},
151175 else = > unreachable ,
152176 }
153- _ = try out_stream .write (")" );
177+ _ = try w .write (")" );
154178 },
155179 else = > unreachable ,
156180 }
157181 }
158182 }
159183
160- pub fn render (self : Media , ast : Ast , src : []const u8 , out_stream : anytype , depth : usize ) ! void {
161- for (0.. depth ) | _ | _ = try out_stream .write (" " );
184+ pub fn render (
185+ media : Media ,
186+ ast : Ast ,
187+ src : []const u8 ,
188+ w : * Writer ,
189+ depth : usize ,
190+ ) ! void {
191+ for (0.. depth ) | _ | _ = try w .write (" " );
162192
163- _ = try out_stream .write ("@media " );
193+ _ = try w .write ("@media " );
164194
165- for (ast .media_queries [self .queries .start .. self .queries .end ], 0.. ) | query , i | {
195+ for (ast .media_queries [media .queries .start .. media .queries .end ], 0.. ) | query , i | {
166196 if (i != 0 ) {
167- _ = try out_stream .write (", " );
197+ _ = try w .write (", " );
168198 }
169199
170- try renderMediaQuery (query .slice (src ), out_stream );
200+ try renderMediaQuery (query .slice (src ), w );
171201 }
172202
173- _ = try out_stream .write (" {" );
203+ _ = try w .write (" {" );
174204
175- if (self .first_rule ) | first_rule | {
176- _ = try out_stream .write ("\n " );
205+ if (media .first_rule ) | first_rule | {
206+ _ = try w .write ("\n " );
177207
178208 var first = true ;
179209 var rule = ast .rules [first_rule ];
180210 while (true ) {
181211 if (! first ) {
182- _ = try out_stream .write ("\n\n " );
212+ _ = try w .write ("\n\n " );
183213 }
184214 first = false ;
185215
186- try rule .render (ast , src , out_stream , depth + 1 );
216+ try rule .render (ast , src , w , depth + 1 );
187217
188218 rule = ast .rules [rule .next orelse break ];
189219 }
190- _ = try out_stream .write ("\n " );
220+ _ = try w .write ("\n " );
191221 }
192222
193- for (0.. depth ) | _ | _ = try out_stream .write (" " );
194- _ = try out_stream .write ("}" );
223+ for (0.. depth ) | _ | _ = try w .write (" " );
224+ _ = try w .write ("}" );
195225 }
196226 };
197227
198- pub fn render (self : Rule , ast : Ast , src : []const u8 , out_stream : anytype , depth : usize ) anyerror ! void {
199- switch (self .type ) {
200- .style = > | style | try style .render (ast , src , out_stream , depth ),
201- .media = > | media | try media .render (ast , src , out_stream , depth ),
228+ pub fn render (
229+ rule : Rule ,
230+ ast : Ast ,
231+ src : []const u8 ,
232+ w : * Writer ,
233+ depth : usize ,
234+ ) anyerror ! void {
235+ switch (rule .type ) {
236+ .style = > | style | try style .render (ast , src , w , depth ),
237+ .media = > | media | try media .render (ast , src , w , depth ),
202238 }
203239 }
204240};
@@ -275,16 +311,8 @@ const Formatter = struct {
275311 ast : Ast ,
276312 src : []const u8 ,
277313
278- pub fn format (
279- f : Formatter ,
280- comptime fmt : []const u8 ,
281- options : std.fmt.FormatOptions ,
282- out_stream : anytype ,
283- ) ! void {
284- _ = fmt ;
285- _ = options ;
286-
287- try f .ast .render (f .src , out_stream );
314+ pub fn format (f : Formatter , w : * Writer ) ! void {
315+ try f .ast .render (f .src , w );
288316 }
289317};
290318
@@ -295,22 +323,22 @@ pub fn formatter(self: Ast, src: []const u8) Formatter {
295323 };
296324}
297325
298- pub fn render (self : Ast , src : []const u8 , out_stream : anytype ) ! void {
326+ pub fn render (ast : Ast , src : []const u8 , w : * Writer ) ! void {
299327 var first = true ;
300- var rule = self .rules [self .first_rule orelse return ];
328+ var rule = ast .rules [ast .first_rule orelse return ];
301329 while (true ) {
302330 if (! first ) {
303- _ = try out_stream .write ("\n\n " );
331+ _ = try w .write ("\n\n " );
304332 }
305333 first = false ;
306334
307- try rule .render (self , src , out_stream , 0 );
335+ try rule .render (ast , src , w , 0 );
308336
309- rule = self .rules [rule .next orelse break ];
337+ rule = ast .rules [rule .next orelse break ];
310338 }
311339}
312340
313- fn renderValue (value : []const u8 , out_stream : anytype ) ! void {
341+ fn renderValue (value : []const u8 , w : * Writer ) ! void {
314342 var value_tokenizer : Tokenizer = .{};
315343
316344 var last_token : ? Tokenizer.Token = null ;
@@ -322,9 +350,9 @@ fn renderValue(value: []const u8, out_stream: anytype) !void {
322350 .function = > false ,
323351 else = > true ,
324352 } else false ) {
325- _ = try out_stream .write (" " );
353+ _ = try w .write (" " );
326354 }
327- _ = try out_stream .write (token .span ().slice (value ));
355+ _ = try w .write (token .span ().slice (value ));
328356 }
329357}
330358
0 commit comments