]> git.llucax.com Git - software/bife/album.git/blob - src/BIFE/Album/Thumbs.php
Removed \n at the end of the file and added a VIM option to keep it as is.
[software/bife/album.git] / src / BIFE / Album / Thumbs.php
1 <?php
2 // vim: set expandtab tabstop=4 shiftwidth=4 binary:
3 // +--------------------------------------------------------------------+
4 // |                       BIFE - Buil It FastEr                        |
5 // +--------------------------------------------------------------------+
6 // | This file is part of BIFE.                                         |
7 // |                                                                    |
8 // | BIFE is free software; you can redistribute it and/or modify it    |
9 // | under the terms of the GNU General Public License as published by  |
10 // | the Free Software Foundation; either version 2 of the License, or  |
11 // | (at your option) any later version.                                |
12 // |                                                                    |
13 // | BIFE is distributed in the hope that it will be useful, but        |
14 // | WITHOUT ANY WARRANTY; without even the implied warranty of         |
15 // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   |
16 // | General Public License for more details.                           |
17 // |                                                                    |
18 // | You should have received a copy of the GNU General Public License  |
19 // | along with Hooks; if not, write to the Free Software Foundation,   |
20 // | Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA      |
21 // +--------------------------------------------------------------------+
22 // | Created: Wed May 17 18:16:54 ART 2003                              |
23 // | Authors: Leandro Lucarella <luca@lugmen.org.ar>                    |
24 // +--------------------------------------------------------------------+
25 //
26 // $Id$
27 //
28
29 // +X2C includes
30 require_once 'BIFE/Widget.php';
31 // ~X2C
32
33 require_once 'BIFE/Link.php';
34 require_once 'Image/Transform.php';
35
36 // +X2C Class 20 :Thumbs
37 /**
38  * Photo album widget. [TODO: Make a better explanation]
39  *
40  * @package BIFE_Album
41  * @access public
42  */
43 class BIFE_Album_Thumbs extends BIFE_Widget {
44     // ~X2C
45
46     // +X2C Operation 22
47     /**
48      * Constructor.
49      *
50      * @param  array $attrs Attributes.
51      *
52      * @return void
53      * @access public
54      */
55     function BIFE_Album_Thumbs($attrs) // ~X2C
56     {
57         $this->__construct($attrs);
58     }
59     // -X2C
60
61     // +X2C Operation 57
62     /**
63      * Constructor.
64      *
65      * @param  array $attrs Attributes.
66      *
67      * @return void
68      * @access public
69      */
70     function __construct($attrs) // ~X2C
71     {
72         // TODO - get defaults from an INI file.
73         $defaults = array(
74             'DIR'           => '.',
75             'RECURSIVE'     => true,
76             'THUMBSFORMAT'  => 'jpeg',
77             'THUMBSDIR'     => '.thumbs',
78             'EXTENSIONS'    => 'png,jpg,jpeg,PNG,JPG,JPEG',
79             'MAXROWS'       => 0,
80             'COLUMNS'       => 4,
81             'LINK'          => 'photo.xbf',
82         );
83         $attrs = array_merge($defaults, $attrs);
84         $attrs['EXTENSIONS'] = explode(',', $attrs['EXTENSIONS']);
85         parent::__construct($attrs);
86     }
87     // -X2C
88
89     // +X2C Operation 23
90     /**
91      * Renders the widget.
92      *
93      * @param  HTML_Template_HIT &$template Template to use to render the widget.
94      *
95      * @return string
96      * @access public
97      */
98     function render(&$template) // ~X2C
99     {
100         $template->pushGroup('album');
101         $list = $this->getList(BIFE_Link::getFsPath() . $this->attrs['DIR'],
102                 $this->attrs['EXTENSIONS'], $this->attrs['THUMBSFORMAT'],
103                 $this->attrs['THUMBSDIR']);
104         $tot  = count($list);
105         $rows = ceil($tot / $this->attrs['COLUMNS']);
106         for ($row = 0; $row < $rows; $row++) {
107             for ($col = 0; $col < $this->attrs['COLUMNS']; $col++) {
108                 $cur = $row * $this->attrs['COLUMNS'] + $col;
109                 if ($photo = @$list[$cur]) {
110                     if (is_null($photo['THUMB'])) {
111                         $photo['THUMB'] = $this->makeThumb($photo['FILE'],
112                             $this->attrs['THUMBSFORMAT'],
113                             $this->attrs['THUMBSDIR'],
114                             BIFE_Link::getFsPath() . $this->attrs['DIR']);
115                     }
116                     $photo['THUMB'] = BIFE_Link::getWebPath()
117                         . $this->attrs['DIR'] . '/' . $photo['THUMB'];
118                     $photo['URL'] = BIFE_Link::getURL(
119                         array(
120                             'URL'                   => $this->attrs['LINK'],
121                             'DATA-BIFE_ALBUM_FILE'  => BIFE_Link::getWebPath()
122                                  . $this->attrs['DIR'] . '/' . $photo['FILE'],
123                         )
124                     );
125                     $cell = $template->parse('item', $photo);
126                 } else {
127                     $cell = $template->parse('empty');
128                 }
129                 $template->parseBuffered('cell', 'CONTENTS', $cell);
130             }
131             $template->parseBuffered('row', 'CONTENTS',
132                 $template->popBuffer('cell'));
133         }
134         $out = $template->parse('body', array(
135             'DESC'     => $this->getDescription(),
136             'CONTENTS' => $template->popBuffer('row')));
137         $template->popGroup();
138         return $out;
139     }
140     // -X2C
141
142     // +X2C Operation 95
143     /**
144      * Gets a list of photos with their descriptions and thumbnails.
145 Returns an array of associative arrays with this keys:
146 <ul>
147 <li><b>file:</b> Photo filename.</li>
148 <li><b>desc:</b> Photo Description.</li>
149 <li><b>thumb:</b> Photo thumbnail filename.</li>
150 </ul>
151      *
152      * @param  string $root Directory where images are.
153      * @param  array $exts Images extensions to accept.
154      * @param  string $format Format to use to save the thumbs.
155      * @param  string $thumbsdir Directory where the thumbs are.
156      *
157      * @return array
158      * @access protected
159      */
160     function getList($root, $exts, $format, $thumbsdir) // ~X2C
161     {
162         $return = array();
163         $d = dir($root);
164         if ($d) {
165             while (($file = $d->read()) !== false) {
166                 list($path, $name, $ext) = $this->splitFilename("$root/$file");
167                 if (is_readable("$root/$file") and in_array($ext, $exts)) {
168                     $thumb = $this->getThumbFilename($file, $format,
169                         $thumbsdir, $root);
170                     $return[] = array(
171                         'FILE'  => $file,
172                         'DESC'  => $name,
173                         'THUMB' => $thumb,
174                     );
175                 }               
176             }
177             $d->close();
178         }
179         return $return;
180     }
181     // -X2C
182
183     // +X2C Operation 97
184     /**
185      * Creates an image thumbnail, returning his filename.
186      *
187      * @param  string $filename Filename of the image to create the thumb.
188      * @param  string $format Thumbs format.
189      * @param  string $thumbsdir Directory where to put the thumbs.
190      * @param  string $root Root directory.
191      * @param  int $size Maximum thumbnail size.
192      *
193      * @return string
194      * @access protected
195      * @static
196      */
197     function makeThumb($filename, $format, $thumbsdir, $root, $size = 100) // ~X2C
198     {
199         list($path, $name, $ext) = $this->splitFilename($filename);
200         $img =& Image_Transform::factory('GD');
201         $img->load("$root/$filename");
202         // If image is larger than the maximum size, we resize it.
203         if ($img->img_x > $size or $img->img_y > $size ) {
204             if (!@is_dir("$root/$thumbsdir") and !@mkdir("$root/$thumbsdir")) {
205                 return null;
206             }
207             if (PEAR::isError($img)) {
208                 return null;
209             }
210             if (!$img->scale($size)) {
211                 return null;
212             }
213         }
214         $img->save("$root/$thumbsdir/$name.$format", $format);
215         $img->free();
216         return "$thumbsdir/$name.$format";
217     }
218     // -X2C
219
220     // +X2C Operation 98
221     /**
222      * Returns the filename of an image thumb.
223      *
224      * @param  string $filename Filename of the image to get the thumb name.
225      * @param  string $format Thumbs format.
226      * @param  string $thumbsdir Directory where the thumbs are.
227      * @param  string $root Root directory.
228      *
229      * @return string
230      * @access protected
231      */
232     function getThumbFilename($filename, $format, $thumbsdir, $root) // ~X2C
233     {
234         list($path, $name, $ext) = $this->splitFilename($filename);
235         if (is_readable("$root/$thumbsdir/$name.$format")) {
236             return "$thumbsdir/$name.$format";
237         } else {
238             return null;
239         }
240     }
241     // -X2C
242
243     // +X2C Operation 102
244     /**
245      * Returns the description of the album.
246      *
247      * @return string
248      * @access protected
249      */
250     function getDescription() // ~X2C
251     {
252         $root = $this->attrs['DIR'];
253         return @join('', file($file));
254     }
255     // -X2C
256
257     // +X2C Operation 100
258     /**
259      * Splits a filename returning an array with the path, name and extension.
260      *
261      * @param  string $filename Filename to split.
262      *
263      * @return array
264      * @access public
265      * @static
266      */
267     function splitFilename($filename) // ~X2C
268     {
269         $path = explode('/', $filename);
270         $file = array_pop($path);
271         $ext  = '';
272         if (strstr($file, '.')) {
273             preg_match('|([^/]+?)(\.([^\.]*))?$|', $file, $m);
274             $file = @$m[1] . ((@$m[2] == '.' ) ? '.' : '');
275             $ext  = @$m[3];
276         }
277         $dir = count($path) ? join('/', $path) : '';
278         return array($dir, $file, $ext);
279     }
280     // -X2C
281
282 } // -X2C Class :Thumbs
283
284 ?>