]> mj.ucw.cz Git - gallery.git/blob - gal/UCW/Gallery/Web.pm
UCW::Gallery::Web: Better interface between web FE and hooks
[gallery.git] / gal / UCW / Gallery / Web.pm
1 # Simple Photo Gallery: Web Interface
2 # (c) 2003--2012 Martin Mares <mj@ucw.cz>
3
4 package UCW::Gallery::Web;
5
6 use strict;
7 use warnings;
8
9 use UCW::Gallery;
10 use UCW::CGI;
11 use File::Spec;
12
13 my $show_img;
14 my $want_archive;
15
16 my %args = (
17         'i'     => { 'var' => \$show_img, 'check' => '\d+' },
18         'a'     => { 'var' => \$want_archive },
19 );
20
21 sub error($) {
22         print "<p style='color:red'>Bad luck, the script is broken. Sorry.\n<p>$_[0]\n";
23         print "</body></html>\n";
24 }
25
26 sub get($$) {
27         my ($self, $key) = @_;
28         return $self->{gal}->get($key);
29 }
30
31 sub extras($$) {
32         my ($self, $key) = @_;
33         my $val = $self->get($key);
34         if (ref $val eq 'CODE') {
35                 return &$val($self);
36         } else {
37                 return $val;
38         }
39 }
40
41 # For use by extras hooks
42 sub gallery($) {
43         my ($self) = @_;
44         return $self->{gal};
45 }
46
47 # For use by extras hooks: return true if we are showing an image page, false for index page
48 sub showing_image($) {
49         my ($self) = @_;
50         return $show_img ne "";
51 }
52
53 sub html_top($) {
54         my ($self) = @_;
55         my $title = UCW::CGI::html_escape($self->get('Title'));
56         my $hextras = $self->extras('WebHeadExtras');
57         my $textras = $self->extras('WebTopExtras');
58         my $theme_hextras = $self->theme_head_extras;
59         print <<EOF ;
60 Content-Type: text/html
61
62 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
63 <html><head>
64 $hextras$theme_hextras<title>$title</title>
65 </head><body>
66 $textras
67 EOF
68         $UCW::CGI::ErrorHandler::error_hook = \&error;
69 }
70
71 sub html_bot($) {
72         my ($self) = @_;
73         print $self->extras('WebBotExtras'), "</body></html>\n";
74 }
75
76 sub show_img($) {
77         my ($self) = @_;
78
79         if ($show_img < 1 || $show_img > $self->{num_photos}) {
80                 UCW::CGI::http_error('404 No such photo');
81                 return;
82         }
83
84         my $meta = $self->{meta};
85         my $id = $meta->{sequence}->[$show_img-1];
86         my $m = $meta->{photo}->{$id} or die;
87         $self->html_top;
88
89         $self->show_links(($show_img > 1 ? ("?i=".($show_img-1)) : ""),
90                           ".",
91                           ($show_img < $self->{num_photos} ? ("?i=".($show_img+1)) : ""));
92
93         my $t = UCW::CGI::html_escape($m->{title});
94         my $w = $m->{w};
95         my $h = $m->{h};
96         print "<h1>$t</h1>\n" if $t ne "";
97         my $img = $self->get('PhotoUrlPrefix') . $self->{gal}->photo_name($m, $id);
98         print "<p class=large><img src='$img' width=$w height=$h alt='$t'>\n";
99
100         $self->html_bot;
101 }
102
103 sub show_pre_thumbs($) {
104         my ($self) = @_;
105 }
106
107 sub show_post_thumbs($) {
108         my ($self) = @_;
109 }
110
111 sub show_list($) {
112         my ($self) = @_;
113         $self->html_top;
114
115         $self->show_links($self->get('BackURL'), $self->get('ParentURL'), $self->get('FwdURL'));
116         print "<h1>", $self->get('Title'), "</h1>\n";
117         my $subtitle = $self->get('SubTitle');
118         print "<h2>$subtitle</h2>\n" if $subtitle ne "";
119         $self->show_pre_thumbs;
120
121         my $meta = $self->{meta};
122         for my $idx (1..$self->{num_photos}) {
123                 my $id = $meta->{sequence}->[$idx-1];
124                 my $m = $meta->{photo}->{$id};
125                 my $click_url;
126                 if ($self->get('WebImageSubpages')) {
127                         $click_url = "?i=$idx";
128                 } else {
129                         $click_url = $self->get('PhotoUrlPrefix') . $self->{gal}->photo_name($m, $id);
130                 }
131                 $self->show_thumb($meta, $id, $click_url);
132         }
133
134         $self->show_post_thumbs;
135         $self->html_bot();
136 }
137
138 sub dispatch($) {
139         my ($self) = @_;
140         binmode STDOUT, ':utf8';
141         UCW::CGI::parse_args(\%args);
142         $self->{meta} = $self->{gal}->read_meta(File::Spec->catfile($self->get('CacheDir'), 'cache.meta'));
143         $self->{num_photos} = scalar @{$self->{meta}->{sequence}};
144
145         if ($want_archive) {
146                 require UCW::Gallery::Archive;
147                 UCW::Gallery::Archive::send_archive($self->{gal}, $self->{meta});
148         } elsif ($show_img ne "") {
149                 $self->show_img;
150         } else {
151                 $self->show_list;
152         }
153 }
154
155 sub attach($$) {
156         my ($class, $gal) = @_;
157         my $self = { gal => $gal };
158         $gal->def(
159                 WebFE => $self,
160
161                 # Extras are either strings or functions called with the current gallery object as parameter
162                 WebHeadExtras => "",
163                 WebTopExtras => "",
164                 WebBotExtras => "",
165
166                 # Used by the theming logic
167                 WebThemeCSS => undef,
168
169                 # 1 if thumbnail link to sub-pages with images, 0 if they link directly to image files
170                 WebImageSubpages => 1,
171
172                 # If enabled, calling the CGI with a=zip produces a ZIP archive with all photos.
173                 WebAllowArchives => 1,
174         );
175         bless $self, $class;
176         return $self;
177 }
178
179 42;