X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FGitalist%2FView%2FSyntaxHighlight.pm;h=de745abebb6645505900c63169149bee474e41b1;hb=a8f570133294adb58620440e75c2cca0d32e0934;hp=5e90ed8d6d4d9cb70584a0c8455b658ba2799fa6;hpb=4621ecf0959b92a9642a4a7cfc150c43118f46df;p=catagits%2FGitalist.git diff --git a/lib/Gitalist/View/SyntaxHighlight.pm b/lib/Gitalist/View/SyntaxHighlight.pm index 5e90ed8..de745ab 100644 --- a/lib/Gitalist/View/SyntaxHighlight.pm +++ b/lib/Gitalist/View/SyntaxHighlight.pm @@ -1,52 +1,26 @@ package Gitalist::View::SyntaxHighlight; use Moose; -use Gitalist; # ->path_to use namespace::autoclean; extends 'Catalyst::View'; use Syntax::Highlight::Engine::Kate (); -use Syntax::Highlight::Engine::Kate::Perl (); use HTML::Entities qw(encode_entities); -=begin - -B - -What should be done, but isn't currently: - - broquaint> Another Cat question - if I want to have arbitrary things highlighted is pushing things through a View at all costs terribly wrong? - broquaint> e.g modifying this slightly to highlight anything (or arrays of anything) http://github.com/broquaint/Gitalist/blob/a7cc1ede5f9729465bb53da9c3a8b300a3aa8a0a/lib/Gitalist/View/SyntaxHighlight.pm - t0m> no, that's totally fine.. I'd tend to push the rendering logic into a model, so you end up doing something like: $c->model('SyntaxDriver')->highlight_all($stuff, $c->view('SyntaxHighlight')); - broquaint> I'm thinking it's a bad idea because the Controller needs to munge data such that the View knows what to do - broquaint> You just blew my mind ;) - t0m> ^^ That works _much_ better if you split up your view methods into process & render.. - t0m> ala TT.. - t0m> i.e. I'd have 'highlight this scalar' as the ->render method in the view.. - t0m> And then the 'default' thing (i.e. process method) will do that and shove the output in the body.. - t0m> but then you can write foreach my $thing (@things) { push(@highlighted_things, $c->view('SyntaxHighlight')->render($thing)); } - t0m> and then I'd move that ^^ loop down into a model which actually knows about / abstracts walking the data structures concerned.. - t0m> But splitting render and process is the most important bit.. :) Otherwise you need to jump through hoops to render things that don't fit 'nicely' into the bits of stash / body that the view uses by 'default' - t0m> I wouldn't kill you for putting the structure walking code in the view given you're walking simple arrays / hashes.. It becomes more important if you have a more complex visitor.. - t0m> (I use Visitor in the design patterns sense) - t0m> As the visitor is responsible for walking the structure, delegating to the ->render call in the view which is responsible for actually mangling the content.. - -=cut - sub process { my($self, $c) = @_; - for($c->stash->{blobs} ? @{$c->stash->{blobs}} : $c->stash->{blob}) { - $_ = $self->highlight($c->stash->{language} => $_); - } - - $c->forward('View::Default'); + $c->res->body($self->render($c, $c->res->body, $c->stash)); } -# XXX This takes for freakin' ever on big merges. A cache may be needed. -sub highlight { - my($self, $lang, $blob) = @_; +sub render { + my ($self, $c, $blob, $args) = @_; + + # Don't bother with anything over 64kb, it'll be tragically slow. + return encode_entities $blob if length $blob > 65536; + + my $lang = $args->{language}; my $ret; if($lang) { @@ -88,3 +62,29 @@ sub highlight { } __PACKAGE__->meta->make_immutable; + +__END__ + +=head1 NAME + +Gitalist::View::SyntaxHighlight - Responsible for syntax highlighting code + +=head1 DESCRIPTION + +Catalyst View for Syntax highlighting. + +=head1 METHODS + +=head2 process + +=head2 highlight + +=head1 AUTHORS + +See L for authors. + +=head1 LICENSE + +See L for the license. + +=cut