Yukki
view release on metacpan or search on metacpan
lib/Yukki/Web/Controller/Page.pm view on Meta::CPAN
package Yukki::Web::Controller::Page;
{
$Yukki::Web::Controller::Page::VERSION = '0.140290';
}
use 5.12.1;
use Moose;
with 'Yukki::Web::Controller';
use Try::Tiny;
use Yukki::Error qw( http_throw );
# ABSTRACT: controller for viewing and editing pages
sub fire {
my ($self, $ctx) = @_;
given ($ctx->request->path_parameters->{action}) {
when ('view') { $self->view_page($ctx) }
when ('edit') { $self->edit_page($ctx) }
when ('history') { $self->view_history($ctx) }
when ('diff') { $self->view_diff($ctx) }
when ('preview') { $self->preview_page($ctx) }
when ('attach') { $self->upload_attachment($ctx) }
when ('rename') { $self->rename_page($ctx) }
when ('remove') { $self->remove_page($ctx) }
default {
http_throw('That page action does not exist.', {
status => 'NotFound',
});
}
}
}
sub repo_name_and_path {
my ($self, $ctx) = @_;
my $repo_name = $ctx->request->path_parameters->{repository};
my $path = $ctx->request->path_parameters->{page};
if (not defined $path) {
my $repo_config
= $self->app->settings->repositories->{$repo_name};
my $path_str = $repo_config->default_page;
$path = [ split m{/}, $path_str ];
}
return ($repo_name, $path);
}
sub lookup_page {
my ($self, $repo_name, $page) = @_;
my $repository = $self->model('Repository', { name => $repo_name });
my $final_part = pop @$page;
my $filetype;
if ($final_part =~ s/\.(?<filetype>[a-z0-9]+)$//) {
$filetype = $+{filetype};
}
my $path = join '/', @$page, $final_part;
return $repository->file({ path => $path, filetype => $filetype });
}
sub view_page {
my ($self, $ctx) = @_;
my ($repo_name, $path) = $self->repo_name_and_path($ctx);
my $page = $self->lookup_page($repo_name, $path);
my $breadcrumb = $self->breadcrumb($page->repository, $path);
my $body;
if (not $page->exists) {
my @files = $page->list_files;
$body = $self->view('Page')->blank($ctx, {
title => $page->file_name,
breadcrumb => $breadcrumb,
repository => $repo_name,
page => $page->full_path,
files => \@files,
});
}
else {
$body = $self->view('Page')->view($ctx, {
title => $page->title,
breadcrumb => $breadcrumb,
repository => $repo_name,
page => $page->full_path,
file => $page,
});
}
$ctx->response->body($body);
}
sub edit_page {
my ($self, $ctx) = @_;
lib/Yukki/Web/Controller/Page.pm view on Meta::CPAN
content => $diff,
);
$ctx->response->body(
$self->view('Page')->diff($ctx, {
title => $page->title,
breadcrumb => $breadcrumb,
repository => $repo_name,
page => $page->full_path,
file => $file_preview,
})
);
}
catch {
my $ERROR = $_;
if ("$_" =~ /usage: git diff/) {
http_throw 'Diffs will not work with git versions before 1.7.2. Please use a newer version of git. If you are using a newer version of git, please file a support issue.';
}
die $ERROR;
};
}
sub preview_page {
my ($self, $ctx) = @_;
my ($repo_name, $path) = $self->repo_name_and_path($ctx);
my $page = $self->lookup_page($repo_name, $path);
my $breadcrumb = $self->breadcrumb($page->repository, $path);
my $content = $ctx->request->body_parameters->{yukkitext};
my $position = $ctx->request->parameters->{yukkitext_position};
my $file_preview = $page->file_preview(
content => $content,
position => $position,
);
$ctx->response->body(
$self->view('Page')->preview($ctx, {
title => $page->title,
breadcrumb => $breadcrumb,
repository => $repo_name,
page => $page->full_path,
file => $file_preview,
})
);
}
sub upload_attachment {
my ($self, $ctx) = @_;
my $repo_name = $ctx->request->path_parameters->{repository};
my $path = delete $ctx->request->path_parameters->{page};
my $page = $self->lookup_page($repo_name, $path);
my @file = split m{/}, $page->path;
push @file, $ctx->request->uploads->{file}->filename;
$ctx->request->path_parameters->{action} = 'upload';
$ctx->request->path_parameters->{file} = \@file;
$self->controller('Attachment')->fire($ctx);
}
sub breadcrumb {
my ($self, $repository, $path_parts) = @_;
my @breadcrumb;
my @path_acc;
push @breadcrumb, {
label => $repository->title,
href => join('/', '/page/view/', $repository->name),
};
for my $path_part (@$path_parts) {
push @path_acc, $path_part;
my $file = $repository->file({
path => join('/', @path_acc),
filetype => 'yukki',
});
push @breadcrumb, {
label => $file->title,
href => join('/', '/page/view', $repository->name, $file->full_path),
};
}
return \@breadcrumb;
}
1;
__END__
=pod
=head1 NAME
Yukki::Web::Controller::Page - controller for viewing and editing pages
=head1 VERSION
version 0.140290
=head1 DESCRIPTION
Controller for viewing and editing pages
=head1 METHODS
=head2 fire
On a view request routes to L</view_page>, edit request to L</edit_page>, preview request to L</preview_page>, and attach request to L</upload_attachment>.
( run in 0.575 second using v1.01-cache-2.11-cpan-71847e10f99 )