The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Apache2::Filter::CSS::LESS;

use 5.008;
use strict;

use APR::Table;
use Apache2::Const -compile => qw(OK);
use Apache2::Filter;
use Apache2::Log;
use Apache2::RequestRec;
use Apache2::RequestUtil;

use CSS::LESSp;

our $VERSION = '0.30';

sub handler :method {
    my ($class, $f) = @_;

    my $r = $f->r;

    my $ctx = $f->ctx;
    while ($f->read(my $buffer, 4096)) {
        $ctx .= $buffer;
    }

    unless ($f->seen_eos) {
        $f->ctx($ctx);
        return Apache2::Const::OK;
    }

    if ($ctx) {
        my $css = join '', CSS::LESSp->parse($ctx);

        # fix headers, change content type
        $r->headers_out->unset('Content-Length');
        $r->content_type($r->dir_config('LessContentType') || 'text/css');

        $f->print($css);
    }

    return Apache2::Const::OK;
}

1;

__END__

=head1 NAME

Apache2::Filter::CSS::LESS - Apache2 LESS to CSS conversion filter

=head1 SYNOPSIS

  <LocationMatch "\.less$">
      PerlOutputFilterHandler   Apache2::Filter::CSS::LESS
      # optionally, set the output content type.
      # default content type is text/css
      # PerlSetVar LessContentType "text/plain"
  </LocationMatch>

=head1 DESCRIPTION

Apache2::Filter::CSS::LESS is a mod_perl2 output filter which converts CSS
LESS files into CSS on demand using C<CSS::LESSp>.

=head2 Caching

Conversion of LESS files to CSS requires considerably more CPU resources than
simply serving up static CSS files.  Therefore, it is recommended that you use
some sort of cache in order to minimize the processing required to convert LESS
files. An example to cache everything under C</less> using C<mod_cache>:

 # cache root directory
 CacheRoot /path/to/disk/cache
 # turn on cache for "/less/" location
 CacheEnable disk /less/

see the C<mod_cache> documentation for more details.

=head1 CONFIGURATION

The following C<PerlSetVar>'s are recognized:

=over 4

=item B<LessContentType>

Sets the output content type of the filtered CSS.  The default content type
is C<text/css>.

=back

=head1 SOURCE

You can contribute or fork this project via github:

http://github.com/mschout/apache2-filter-css-less

 git clone git://github.com/mschout/apache2-filter-css-less.git

=head1 BUGS

Please report any bugs or feature requests to
bug-apache2-filter-css-less@rt.cpan.org, or through the web
interface at http://rt.cpan.org/

=head1 AUTHOR

Michael Schout E<lt>mschout@cpan.orgE<gt>

=head1 COPYRIGHT & LICENSE

Copyright 2009 Michael Schout.

This program is free software; you can redistribute it and/or modify it under
the terms of either:

=over 4

=item *

the GNU General Public License as published by the Free Software Foundation;
either version 1, or (at your option) any later version, or

=item *

the Artistic License version 2.0.

=back

=head1 SEE ALSO

L<CSS::LESSp>, L<Apache2>

=cut