Reformatting / indenting a Cascade Style Sheet file

Ángel Ortega

If you need to compare two CSS files, the freestyle formatting can drive you crazy. You can use this little Perl script to reformat / reindent them. Or if you just want a tidier file.

#!/usr/bin/perl

# Formats a CSS file from STDIN
# Angel Ortega <angel@triptico.com>
# Public domain

my $css = join('', <STDIN>);
$css =~ s/\s+/ /g;

my $in = 0;

foreach my $c (split(/(\s*\{\s*)|(\s*\}\s*)/, $css)) {
    if ($c =~ /\{/) {
        print " {\n";
        $in = 1;
    }
    elsif ($c =~ /\}/) {
        print "}\n";
        $in = 0;
    }
    else {
        if ($in) {
            foreach my $sc (split(/\s*;\s*/, $c)) {
                print "\t$sc;\n";
            }
        }
        else {
            print $c;
        }
    }
}

I agree that, if comparing two CSS files is the aim, sorting the entries alphabetically would also be great; I left that as an exercise for the reader.