package Kwiki::PerlTidyBlocks;
use Kwiki::Plugin -Base;
use Kwiki::Installer -Base;
our $VERSION = '0.12';

const class_id => 'perl_tidy_blocks';
const css_file => 'perl_tidy_blocks.css';

sub register {
    my $registry = shift;
    $registry->add(prerequisite => 'cache');
    $registry->add(wafl => perl => 'Kwiki::PerlTidyBlocks::Wafl');
}

package Kwiki::PerlTidyBlocks::Wafl;
use base 'Spoon::Formatter::WaflBlock';

sub to_html {
    return join '',
      qq{<table class="perl_tidy_blocks"><tr><td>\n},
      $self->from_cache($self->block_text),
      qq{</td></tr></table>\n};
}

sub from_cache {
    my $source = shift;
    $self->hub->cache->process(
        sub { $self->tidy($source) }, 'perl_tidy_blocks', $source
    );
}

sub tidy {
    my $source = shift;
    require Perl::Tidy;
    my $result;
    eval {
        Perl::Tidy::perltidy(
            source      => \$source,
            destination => \$result,
            argv        => [qw( -q -html -pre -npro )],
        );
    };
    $@ ? $source : $result;
}

package Kwiki::PerlTidyBlocks;
__DATA__

__css/perl_tidy_blocks.css__
table.perl_mode pre {
    background-color: #FFF;
}

table.perl_mode td {
    border: 0;
}

.pd { color: #404080;} /* pod-text */
.c  { color: #404080;} /* comment */

.cm { color: #800097;} /* comma */
.co { color: #800097;} /* colon */

.h  { color: #804848;} /* here-doc-target */
.hh { color: #800000;} /* here-doc-text */
.q  { color: #800000;} /* quote */
.v  { color: #800000;} /* v-string */

.i  { color: #008080;} /* identifier */

.k  { color: #0000FF;} /* keyword */
.n  { color: #E02020;} /* numeric */

.m  { color: #C00080;} /* subroutine */
.j  { color: #C00080;} /* label */
.w  { color: #C00080;} /* bareword */

.p  { color: #800080;} /* paren */
.s  { color: #800080;} /* structure */
.sc { color: #800080;} /* semicolon */

.pu { color: #C44800;} /* punctuation */
