# repo_dir __path_to(../)__
</Model::CollectionOfRepos>
+# default = standard Gitalist transformer
+# other = ?cm=$mangler
+<Model::ContentMangler>
+ <blob>
+ default Gitalist::ContentMangler::Transformer::SyntaxHighlightBlob
+ doc Gitalist::ContentMangler::Transformer::EnPodulate
+ </blob>
+ <diff_fancy>
+ default Gitalist::ContentMangler::Transformer::SyntaxHighlightDiff
+ </diff_fancy>
+</Model::ContentMangler>
+
sitename "A Gitalist"
<paging>
+++ /dev/null
-package Gitalist::ContentMangler::Resolver;
-use Moose::Role;
-
-requires 'resolve';
-
-1;
+++ /dev/null
-use MooseX::Declare;
-
-class Gitalist::ContentMangler::Resolver::Default with Gitalist::ContentMangler::Resolver {
- method resolve ($data) {
- # This should be pulled out of $self->config
- my $language;
- $language = 'Perl' if $data->{filename} =~ /\.p[lm]$/i;
- $language = 'Diff' if $data->{action} eq 'diff_fancy';
- return unless $language;
- return 'Gitalist::ContentMangler::Transformer::SyntaxHighlight' => {language => $language, css => $language};
- }
-}
--- /dev/null
+use MooseX::Declare;
+
+# Currently a POC to demonstrate non SyntaxHighlight based
+# CM::Transformer. The default output is ugly as sin.
+class Gitalist::ContentMangler::Transformer::EnPodulate {
+ use Pod::Simple::HTML;
+
+ method transform(Str :$blob, Str :$filename) {
+ my $p = Pod::Simple::HTML->new;
+ $p->output_string(\my $html);
+ $p->parse_string_document( $blob );
+ $html =~ m{<body[^>]*>(.*?)</body>}s;
+ return { blob => $1 };
+ }
+}
+++ /dev/null
-use MooseX::Declare;
-
-class Gitalist::ContentMangler::Transformer::SyntaxHighlight {
- method transform($c, $config) {
- $c->stash(
- syntax_css => $c->uri_for("/static/css/syntax/$config->{css}.css"),
- mangled => 1,
- );
- for (grep $_, $c->stash->{blobs} ? @{$c->stash->{blobs}} : $c->stash->{blob}) {
- $_ = $c->view('SyntaxHighlight')->render($c, $_, $config);
- }
- }
-}
--- /dev/null
+use MooseX::Declare;
+
+class Gitalist::ContentMangler::Transformer::SyntaxHighlightBlob
+ with Gitalist::ContentMangler::Transformer::SyntaxHighlightRole {
+ method transform(Str :$blob, Str :$filename) {
+ return unless $filename =~ /\.p[lm]$/;
+ return { blob => $self->highlight($blob, 'Perl'), language => 'Perl' };
+ }
+}
--- /dev/null
+use MooseX::Declare;
+
+class Gitalist::ContentMangler::Transformer::SyntaxHighlightDiff
+ with Gitalist::ContentMangler::Transformer::SyntaxHighlightRole {
+ method transform(ArrayRef :$diffs) {
+ return {
+ language => 'Diff',
+ blobs => [map $self->highlight($_, 'Diff'), @$diffs],
+ };
+ }
+}
--- /dev/null
+use MooseX::Declare;
+
+role Gitalist::ContentMangler::Transformer::SyntaxHighlightRole {
+ use Syntax::Highlight::Engine::Kate ();
+ use Syntax::Highlight::Engine::Kate::Perl ();
+
+ use HTML::Entities qw(encode_entities);
+
+ method highlight(Str $blob, Str $lang) {
+ # Don't bother with anything over 128kb, it'll be tragically slow.
+ return encode_entities $blob if length $blob > 131_072;
+
+ my $ret;
+ if ($lang) {
+ # via http://github.com/jrockway/angerwhale/blob/master/lib/Angerwhale/Format/Pod.pm#L136
+ $ret = eval {
+ no warnings 'redefine';
+ local *Syntax::Highlight::Engine::Kate::Template::logwarning
+ = sub { die @_ }; # i really don't care
+ my $hl = Syntax::Highlight::Engine::Kate->new(
+ language => $lang,
+ substitutions => {
+ "<" => "<",
+ ">" => ">",
+ "&" => "&",
+ q{'} => "'",
+ q{"} => """,
+ },
+ format_table => {
+ # convert Kate's internal representation into
+ # <span class="<internal name>"> value </span>
+ map {
+ $_ => [ qq{<span class="$_">}, '</span>' ]
+ }
+ qw/Alert BaseN BString Char Comment DataType
+ DecVal Error Float Function IString Keyword
+ Normal Operator Others RegionMarker Reserved
+ String Variable Warning/,
+ },
+ );
+
+ my $hltxt = $hl->highlightText($blob);
+ $hltxt =~ s/([^[:ascii:]])/encode_entities($1)/eg;
+ $hltxt;
+ };
+ warn $@ if $@;
+ }
+
+ return $ret || encode_entities($blob);
+ }
+}
diff_tree => $tree,
diff => $patch,
# XXX Hack hack hack, see View::SyntaxHighlight
- blobs => [map $_->{diff}, @$patch],
+ diffs => [map $_->{diff}, @$patch],
%diff_args,
);
}
use Moose;
use MooseX::Types::Moose qw/HashRef/;
use MooseX::Types::Common::String qw/NonEmptySimpleStr/;
-use Gitalist::ContentMangler::Resolver;
use namespace::autoclean;
extends 'Catalyst::Model';
-has resolver_class => (
- isa => NonEmptySimpleStr,
+# XXX This could live as metadata somewhere or in the config or whatever..
+has transform_params => (
is => 'ro',
- required => 1,
- default => 'Gitalist::ContentMangler::Resolver::Default',
-);
-
-has resolver_config => (
isa => HashRef,
- is => 'ro',
- default => sub { {} },
+ default => sub { {
+ blob => [qw/blob filename/],
+ diff_fancy => [qw/diffs/],
+ } },
);
-has _resolver => (
- does => 'Gitalist::ContentMangler::Resolver',
- handles => ['resolve'],
- is => 'bare', lazy => 1,
- default => sub {
- my $self = shift;
- my $class = $self->resolver_class;
- Class::MOP::load_class($class);
- return $class->new($self->resolver_config);
- },
-);
-
-# FIXME This method is a gross hack.
-#
-# We need to work out what types of content mangles we have for various things based on hit type
-# file name and mime type, and perform the appropriate bits..
-
-# We need to support multiple languages, and we also want to be able to do HTMLizing (for e.g. Pod)
-
sub process {
- my ($self, $c) = @_;
-
- # Find appropriate mangler based on filename,action,config
- # Mangler should provide a transform e.g what part of the stash to mangle
- # Then call the transform with the appropriate mangling
-
- my($transformer, $config) = $self->resolve({
- filename => $c->stash->{filename} || '',
- config => Gitalist->config->{'Model::ContentMangler'},
- action => $c->action->name,
- });
-
- return
- unless $transformer;
-
- Class::MOP::load_class($transformer);
- $transformer->new($config)->transform($c, $config);
+ my ($self, $c) = @_;
+
+ my $config = Gitalist->config->{'Model::ContentMangler'}; # XXX Yeah it's a bit ugly. Feh.
+ my $action = $c->action->name;
+ my $mangler = $c->req->param('cm') || '';
+ my $transformer = $config->{$action}{$mangler || 'default'};
+
+ return unless $transformer;
+ Class::MOP::load_class($transformer);
+
+ my $result = $transformer->new()->transform(
+ map { $_ => $c->stash->{$_} } @{ $self->transform_params->{$action} }
+ ) || {};
+
+ $c->stash->{mangled} = 1 if %$result;
+ $c->stash(%$result);
}
__PACKAGE__->meta->make_immutable;
-[% IF syntax_css %]<link rel="stylesheet" type="text/css" href="[% syntax_css %]"/>[% END %]
+[% IF language %]<link rel="stylesheet" type="text/css" href="[% c.uri_for("/static/css/syntax/" _ language _ ".css") %]"/>[% END %]
</div>
[% END %]
-[% subinclude('/fragment/ref/blob', c.req.captures, c.req.args.to_path) %]
+[% subinclude('/fragment/ref/blob', c.req.captures, c.req.args.to_path, c.req.parameters) %]