NAME
PPI::Prettify - A Perl HTML pretty printer to use with Google prettify CSS skins, no JavaScript required!
VERSION
version 0.07
SYNOPSIS
use PPI::Prettify 'prettify';
my $codeSample = q! # get todays date in Perl
use Time::Piece;
print Time::Piece->new;
!;
my $html = prettify({ code => $codeSample });
# every Perl token wrapped in a span e.g. for "use PPI::Prettify;":
<span class="kwd">use</span>
<span class="pln"> </span>
<span class="atn">PPI::Prettify</span>
<span class="pln">;</span>
my $htmlDebug = prettify({ code => $codeSample, debug => 1 });
# with PPI::Token class, e.g. for "use PPI::Prettify;":
<span class="kwd" title="PPI::Token::Function">use</span>
<span class="pln" title="PPI::Token::Whitespace"> </span>
<span class="atn" title="PPI::Token::Word">PPI::Prettify</span>
<span class="pln" title="PPI::Token::Structure">;</span>
DESCRIPTION
This module takes a string Perl code sample and returns the tokens of the code surrounded with <span> tags. The class attributes are the same used by the prettify.js. Using PPI::Prettify you can generate the prettified code for use in webpages without using JavaScript but you can use all the CSS skins developed for prettify.js. Also, because this module uses PPI::Document to tokenize the code, it's more accurate than prettify.js.
PPI::Prettify exports prettify() and the $MARKUP_RULES hashref which is used to match PPI::Token classes to the class attribute given to that token's <span> tag. You can modify $MARKUP_RULES to tweak the mapping if you require it.
I wrote an article with more detail about the module for: PerlTricks.com.
MOTIVATION
I wanted to generate marked-up Perl code without using JavaScript for PerlTricks.com. I was dissatisfied with prettify.js as it doesn't always tokenize Perl correctly and won't run if the user has disabled JavaScript. I considered PPI::HTML but it embeds the CSS in the generated code, and I wanted to use the same markup class attributes as prettify.js so I could reuse the existing CSS developed for it.
BUGS AND LIMITATIONS
What constitutes a function and a keyword is somewhat arbitrary in Perl. PPI::Prettify mostly uses B::Keywords to help distinguish functions and keywords. However, some words such as "if", "my" and "BEGIN" are given a special class of "PPI::Token::KeywordFunction" which can be overridden in $MARKUP_RULES, should you wish to display these as keywords instead of functions.
This module does not yet process Perl code samples with heredocs correctly.
Line numbering needs to be added.
SUBROUTINES/METHODS
prettify
Takes a hashref consisting of $code and an optional debug flag. Every Perl code token is given a <span> tag that corresponds to the tags used by Google's prettify.js library. If debug => 1, then every token's span tag will be given a title attribute with the value of the originating PPI::Token class. This can help if you want to override the mappings in $MARKUP_RULES. See "SYNOPSIS" for examples.
getExampleHTML
Returns an HTML document as a string with built-in CSS to demo the syntax highlighting capabilites of PPI::Prettify. At the command line:
$ perl -MPPI::Prettify -e 'print PPI::Prettify::getExampleHTML()' > example.html
INTERNAL FUNCTIONS
_decorate
Iterates through the tokens of a PPI::Document, marking up each token with a <span> tag.
_to_html
Marks up a token with a span tag with the appropriate class attribute and the PPI::Token class.
_determine_token
Determines the PPI::Token type.
REPOSITORY
https://github.com/sillymoose/ppi-prettify
SEE ALSO
PPI::HTML is another prettifier for Perl code samples that allows the embedding of CSS directly into the HTML generation.
THANKS
Thanks to Adam Kennedy for developing PPI::Document, without which this module would not be possible.
AUTHOR
David Farrell <sillymoos@cpan.org> PerlTricks.com
COPYRIGHT AND LICENSE
This software is copyright (c) 2014 by David Farrell.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.