PPI-Prettify
view release on metacpan or search on metacpan
lib/PPI/Prettify.pm view on Meta::CPAN
package PPI::Prettify;
use strict;
use warnings;
use PPI::Document;
use Carp 'croak';
use HTML::Entities;
use Perl::Critic::Utils
qw/is_method_call is_subroutine_name is_package_declaration/;
use B::Keywords;
use List::MoreUtils 'any';
# ABSTRACT: A Perl HTML pretty printer to use with Google prettify CSS skins, no JavaScript required!
BEGIN {
require Exporter;
use base qw(Exporter);
our @EXPORT = qw(prettify $MARKUP_RULES);
our @EXPORT_OK = ('getExampleHTML');
}
# The mapping of PPI::Token class to span attribute type. Is exported and overridable
our $MARKUP_RULES = {
'PPI::Token::ArrayIndex' => 'var',
'PPI::Token::Attribute' => 'atn',
'PPI::Token::BOM' => 'pln',
'PPI::Token::Cast' => 'var',
'PPI::Token::Comment' => 'com',
'PPI::Token::DashedWord' => 'pln',
'PPI::Token::Data' => 'com',
'PPI::Token::End' => 'com',
'PPI::Token::Function' => 'kwd',
'PPI::Token::HereDoc' => 'str',
'PPI::Token::Keyword' => 'lit',
'PPI::Token::KeywordFunction' => 'kwd',
'PPI::Token::Label' => 'lit',
'PPI::Token::Magic' => 'typ',
'PPI::Token::Number' => 'atv',
'PPI::Token::Number::Binary' => 'atv',
'PPI::Token::Number::Exp' => 'atv',
'PPI::Token::Number::Float' => 'atv',
'PPI::Token::Number::Hex' => 'atv',
'PPI::Token::Number::Octal' => 'atv',
'PPI::Token::Number::Version' => 'atv',
'PPI::Token::Operator' => 'pun',
'PPI::Token::Pod' => 'com',
'PPI::Token::Pragma' => 'kwd',
'PPI::Token::Prototype' => 'var',
'PPI::Token::Quote' => 'str',
'PPI::Token::Quote::Double' => 'str',
'PPI::Token::Quote::Interpolate' => 'str',
'PPI::Token::Quote::Literal' => 'str',
'PPI::Token::Quote::Single' => 'str',
'PPI::Token::QuoteLike' => 'str',
'PPI::Token::QuoteLike::Backtick' => 'fun',
'PPI::Token::QuoteLike::Command' => 'fun',
'PPI::Token::QuoteLike::Readline' => 'str',
'PPI::Token::QuoteLike::Regexp' => 'str',
'PPI::Token::QuoteLike::Words' => 'str',
'PPI::Token::Regexp' => 'str',
'PPI::Token::Regexp::Match' => 'str',
'PPI::Token::Regexp::Substitute' => 'str',
'PPI::Token::Regexp::Transliterate' => 'str',
'PPI::Token::Separator' => 'kwd',
'PPI::Token::Structure' => 'pun',
'PPI::Token::Symbol' => 'typ',
'PPI::Token::Unknown' => 'pln',
'PPI::Token::Whitespace' => 'pln',
'PPI::Token::Word' => 'pln',
'PPI::Token::Word::Package' => 'atn',
};
sub prettify {
my ($args) = @_;
croak "Missing mandatory code argument in args passed to prettify()."
unless exists $args->{code} and defined $args->{code};
my $doc = eval { return PPI::Document->new( \$args->{code} ) };
croak "Error creating PPI::Document" unless $doc or $@;
return _decorate( $doc, $args->{debug} || 0 );
}
sub get_example_html {
my $htmlStart = <<'EOF';
<!DOCTYPE html>
<html>
<head><title>Example PPI::Prettify Output using the vim Desert scheme</title></head>
( run in 0.645 second using v1.01-cache-2.11-cpan-c966e8aa7e8 )