@@ -246,7 +246,7 @@ function print_atrule(node, indent_level, css) {
246246 let buffer = indent ( indent_level ) + '@' + node . name
247247
248248 // @font -face has no prelude
249- if ( node . prelude ) {
249+ if ( node . prelude !== null ) {
250250 buffer += ' ' + substr ( node . prelude , css )
251251 }
252252
@@ -267,7 +267,63 @@ function print_atrule(node, indent_level, css) {
267267 * @returns {string } A formatted Declaration
268268 */
269269function print_declaration ( node , indent_level , css ) {
270- return indent ( indent_level ) + node . property + ': ' + substr ( node . value , css ) + ';'
270+ return indent ( indent_level ) + node . property . toLowerCase ( ) + ': ' + print_value ( node . value , indent_level , css ) . trim ( ) + ';'
271+ }
272+
273+ /**
274+ * @param {import('css-tree').List } children
275+ * @param {number } indent_level
276+ * @param {string } css
277+ */
278+ function print_list ( children , indent_level , css ) {
279+ let buffer = ''
280+
281+ for ( let node of children ) {
282+ if ( node !== children . first && node . type !== 'Operator' ) {
283+ buffer += ' '
284+ }
285+
286+ if ( node . type === 'Identifier' ) {
287+ // TODO: new CSS keywork NaN should not be lowercased
288+ buffer += node . name . toLowerCase ( )
289+ } else if ( node . type === 'Function' ) {
290+ buffer += print_function ( node , 0 , css )
291+ } else if ( node . type === 'Dimension' ) {
292+ buffer += node . value + node . unit . toLowerCase ( )
293+ } else if ( node . type === 'Value' ) {
294+ // Values can be inside var() as fallback
295+ // var(--prop, VALUE)
296+ buffer += print_value ( node , 0 , css )
297+ } else {
298+ buffer += print_unknown ( node , 0 , css )
299+ }
300+ }
301+ return buffer
302+ }
303+
304+ /**
305+ * @param {import('css-tree').Value | import('css-tree').Raw } node
306+ * @param {number } indent_level
307+ * @param {string } css
308+ */
309+ function print_value ( node , indent_level , css ) {
310+ if ( node . type === 'Raw' ) {
311+ return print_unknown ( node , 0 , css )
312+ }
313+
314+ return print_list ( node . children , 0 , css )
315+ }
316+
317+ /**
318+ * @param {import('css-tree').FunctionNode } node
319+ * @param {number } indent_level
320+ * @param {string } css
321+ */
322+ function print_function ( node , indent_level , css ) {
323+ let buffer = node . name . toLowerCase ( ) + '('
324+ buffer += print_list ( node . children , 0 , css )
325+ buffer += ')'
326+ return buffer
271327}
272328
273329/**
@@ -316,8 +372,8 @@ export function format(css) {
316372 let ast = parse ( css , {
317373 positions : true ,
318374 parseAtrulePrelude : false ,
319- parseCustomProperty : false ,
320- parseValue : false ,
375+ parseCustomProperty : true ,
376+ parseValue : true ,
321377 } )
322378 return print ( ast , 0 , css )
323379}
0 commit comments