Enabled content type css for css files served by template, previous implementation...
[catagits/Gitalist.git] / lib / Gitalist / Controller / Root.pm
index 25e5667..7b921f8 100644 (file)
@@ -2,58 +2,27 @@ package Gitalist::Controller::Root;
 
 use Moose;
 use Moose::Autobox;
-use Sys::Hostname qw/hostname/;
-use XML::OPML::SimpleGen;
-
+use Digest::MD5 qw(md5_hex);
 use Gitalist::Utils qw/ age_string /;
 
 use namespace::autoclean;
 
 BEGIN { extends 'Gitalist::Controller' }
 
-__PACKAGE__->config->{namespace} = '';
+__PACKAGE__->config(namespace => '');
 
 sub root : Chained('/') PathPart('') CaptureArgs(0) {}
 
 sub index : Chained('base') PathPart('') Args(0) {
-  my ( $self, $c ) = @_;
-
-  my $search = $c->req->param('s') || '';
-
-  $c->stash(
-    search_text => $search,
-  );
+    my ( $self, $c ) = @_;
+    $c->stash( search_text => $c->req->param('s') || '' ) # FIXME - XSS?
 }
 
-=head2 search_help
-
-Provides some help for the search form.
-
-=cut
-
-sub search_help : Chained('base') Args(0) {}
-
-sub opml : Chained('base') Args(0) {
-  my($self, $c) = @_;
-
-  my $opml = XML::OPML::SimpleGen->new();
-
-  $opml->head(title => lc(hostname()) . ' - ' . Gitalist->config->{name});
-
-  my @list = @{ $c->model()->repositories };
-  die 'No repositories found in '. $c->model->repo_dir
-    unless @list;
-
-  for my $proj ( @list ) {
-    $opml->insert_outline(
-      text   => $proj->name. ' - '. $proj->description,
-      xmlUrl => $c->uri_for(rss => {p => $proj->name}),
-    );
-  }
+# XXX Fragile much?
+sub css : Chained('/root') PathPart('core.css') Args(0) {
+    my ( $self, $c ) = @_;
 
-  $c->response->body($opml->as_string);
-  $c->response->content_type('application/rss');
-  $c->response->status(200);
+    $c->stash( template => 'static/css/core.css', content_type => 'text/css' );
 }
 
 sub base : Chained('/root') PathPart('') CaptureArgs(0) {
@@ -65,7 +34,6 @@ sub base : Chained('/root') PathPart('') CaptureArgs(0) {
     git_version => $git_version,
     version     => $Gitalist::VERSION,
 
-    # XXX Move these to a plugin!
     time_since => sub {
       return 'never' unless $_[0];
       return age_string(time - $_[0]->epoch);
@@ -73,21 +41,41 @@ sub base : Chained('/root') PathPart('') CaptureArgs(0) {
     short_cmt => sub {
       my $cmt = shift;
       my($line) = split /\n/, $cmt;
-      $line =~ s/^(.{70,80}\b).*/$1 \x{2026}/;
+      $line =~ s/^(.{70,80}\b).*/$1 \x{2026}/ if defined $line;
       return $line;
     },
     abridged_description => sub {
         join(' ', grep { defined } (split / /, shift)[0..10]);
     },
+    uri_for_gravatar => sub {
+        my $email = shift;
+        my $size = shift;
+        my $uri = 'http://www.gravatar.com/avatar/' . md5_hex($email);
+        $uri .= "?s=$size" if $size;
+        return $uri;
+    },
   );
 }
 
-sub end : ActionClass('RenderView') {
+sub search : Chained('base') Args(0) {}
+
+=head2 search_help
+
+Provides some help for the search form.
+
+=cut
+
+sub search_help : Chained('base') Args(0) {}
+
+sub end : ActionClass('Serialize') {
     my ($self, $c) = @_;
     # Give repository views the current HEAD.
     if ($c->stash->{Repository}) {
         $c->stash->{HEAD} = $c->stash->{Repository}->head_hash;
     }
+    if ($c->stash->{data} && blessed $c->stash->{data}) {
+        $c->stash->{rest} = $c->stash->{data}->pack;
+    }
 }
 
 sub error_404 : Action {
@@ -96,6 +84,17 @@ sub error_404 : Action {
     $c->response->body('Page not found');
 }
 
+__PACKAGE__->config(
+    default => 'text/html',
+    map => {
+        'application/json' => [qw/ JSON /],
+        map { $_ => [qw/ View Default /] }
+             qw( text/css text/html text/plain
+                 application/atom+xml application/rss+xml application/rss )
+    },
+    content_type_stash_key => 'content_type',
+);
+
 __PACKAGE__->meta->make_immutable;
 
 __END__
@@ -126,16 +125,8 @@ Provides the repository listing.
 
 Attempt to render a view, if needed.
 
-=head2 blame
-
 =head2 error_404
 
-=head2 history
-
-=head2 opml
-
-=head2 repository_index
-
 =head1 AUTHORS
 
 See L<Gitalist> for authors.