File Coverage: lib/Yukki/Web/Plugin/Attachment.pm

# File Coverage

File: | lib/Yukki/Web/Plugin/Attachment.pm
Coverage: | 49.0%

line | stmt | bran | cond | sub | pod | time | code
--- | --- | --- | --- | --- | --- | --- | ---
1 |  |  |  |  |  |  | package Yukki::Web::Plugin::Attachment;
2 |
3 | 1 1 |  |  | 1 |  | 2992 8 | use v5.24;
4 | 1 1 1 |  |  | 1 |  | 9 8 20 | use utf8;
5 | 1 1 1 |  |  | 1 |  | 29 7 18 | use Moo;
6 |
7 | 1 1 1 |  |  | 1 |  | 537 3 19 | use Types::Standard qw( HashRef Str );
8 |
9 | 1 1 1 |  |  | 1 |  | 1237 4 23 | use namespace::clean;
10 |
11 |  |  |  |  |  |  | extends 'Yukki::Web::Plugin';
12 |
13 |  |  |  |  |  |  | # ABSTRACT: plugin for attachments
14 |
15 | 1 1 1 |  |  | 1 |  | 428 5 571 | use URI::Escape qw( uri_escape );
16 |
17 - 31 |  |
    =head1 SYNOPSIS

      {{attachment:main:Path/To/Attachment.pdf}}

    =head1 DESCRIPTION

    This provides a tool for generating URLs to link to attachments on the current page or from other pages.

    =head1 ATTRIBUTES

    =head2 format_helpers

    Links the "attachment" format helper to L</attachment_url>.

    =cut
32 |
33 |  |  |  |  |  |  | has format_helpers => (
34 |  |  |  |  |  |  | is => 'ro',
35 |  |  |  |  |  |  | isa => HashRef[Str],
36 |  |  |  |  |  |  | required => 1,
37 |  |  |  |  |  |  | default => sub { +{
38 |  |  |  |  |  |  | 'attachment' => 'attachment_url',
39 |  |  |  |  |  |  | } },
40 |  |  |  |  |  |  | );
41 |
42 |  |  |  |  |  |  | with 'Yukki::Web::Plugin::Role::FormatHelper';
43 |
44 - 50 |  |
    =head1 METHODS

    =head2 attachment_url

    Generates a URL for an attachment path.

    =cut
51 |
52 |  |  |  |  |  |  | sub attachment_url {
53 | 0 |  |  | 0 | 1 |  | my ($self, $params) = @_;
54 |
55 | 0 |  |  |  |  |  | my $ctx = $params->{context};
56 | 0 |  |  |  |  |  | my $file = $params->{file};
57 | 0 |  |  |  |  |  | my $arg = $params->{arg};
58 |
59 | 0 | 0 |  |  |  |  | if ($arg =~ m{
60 |
61 |  |  |  |  |  |  | ^\s*
62 |
63 |  |  |  |  |  |  | (?: ([\w]+) : )? # repository: is optional
64 |  |  |  |  |  |  | (.+) # link/to/page is mandatory
65 |
66 |  |  |  |  |  |  | \s*$
67 |
68 |  |  |  |  |  |  | }x) {
69 |
70 | 0 |  | 0 |  |  |  | my $repository = $1 // $file->repository_name;
71 | 0 |  |  |  |  |  | my $page = $file->full_path;
72 | 0 |  |  |  |  |  | my $link = $2;
73 |
74 | 0 0 |  |  |  |  |  | $link =~ s/^\s+//; $link =~ s/\s+$//;
75 |
76 | 0 |  |  |  |  |  | $page =~ s{\.yukki$}{};
77 | 0 0 |  |  |  |  |  | $link = join "/", map { uri_escape($_) } split m{/}, $link;
78 |
79 | 0 | 0 |  |  |  |  | if ($link =~ m{^/}) {
80 | 0 |  |  |  |  |  | return $ctx->rebae_url("attachment/view/$repository$link");
81 |  |  |  |  |  |  | }
82 |  |  |  |  |  |  | else {
83 | 0 |  |  |  |  |  | return $ctx->rebase_url("attachment/view/$repository/$page/$link");
84 |  |  |  |  |  |  | }
85 |  |  |  |  |  |  | }
86 |
87 | 0 |  |  |  |  |  | return;
88 |  |  |  |  |  |  | }
89 |
90 |  |  |  |  |  |  | 1;