1 |
<?php |
2 |
//------------------------------------------------------------------------------------------------- |
3 |
//$Header$ |
4 |
//------------------------------------------------------------------------------------------------- |
5 |
//This source code and any program in which it is compiled/used is provided under the MIT |
6 |
//LICENSE (full license text below). |
7 |
//------------------------------------------------------------------------------------------------- |
8 |
//pics_indexfile_make.php, Copyright (c) 2016 David T. Ashley |
9 |
// |
10 |
//Permission is hereby granted, free of charge, to any person obtaining a copy of this software and |
11 |
//associated documentation files (the "Software"), to deal in the Software without restriction, |
12 |
//including without limitation the rights to use, copy, modify, merge, publish, distribute, |
13 |
//sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is |
14 |
//furnished to do so, subject to the following conditions: |
15 |
// |
16 |
//The above copyright notice and this permission notice shall be included in all copies or |
17 |
//substantial portions of the Software. |
18 |
// |
19 |
//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT |
20 |
//NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
21 |
//NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
22 |
//DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
23 |
//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
24 |
//------------------------------------------------------------------------------------------------- |
25 |
//This program, a PHP script, creates an index file ("index2.php") based on the contents of the |
26 |
//working directory in which it is invoked. The index file created is tailored to Dave Ashley's |
27 |
//needs, but it can easily be hand-edited or this script can be modified. This program is part |
28 |
//of a 3-program suite designed to collectively create a web page directly from digital camera |
29 |
//files (and of course the web page can be customized by hand-editing after it is automatically |
30 |
//generated). |
31 |
// |
32 |
//The 3 programs in the 3-program suite are: |
33 |
// |
34 |
// pics_filenames_canonize.php: |
35 |
// Converts all names of files in a directory to lower-case, and makes substitutions for any |
36 |
// unusual characters. |
37 |
// |
38 |
// pics_thumbnails_make.php: |
39 |
// Creates thumbnails from recognized image types. The thumbnails are named relative to the |
40 |
// original image file with the suffix "_small". To support shared hosting environments where |
41 |
// CPU utilization of a script may be capped, there is a configuration constant in the script |
42 |
// that will perform only a fixed number of conversions per invocation. If this configuration |
43 |
// option is used, the script should be run repeatedly until it indicates that it has no more |
44 |
// thumbnails to create. |
45 |
// |
46 |
// If any full-sized photos are modified, any corresponding thumbnails should be deleted and |
47 |
// pics_thumbnails_make.php and pics_indexfile_make.php should be run again. |
48 |
// |
49 |
// pics_indexfile_make.php (this script): |
50 |
// Scans a directory and makes an index file ("index2.php") displaying all the thumbnail |
51 |
// images, each of which link to the corresponding full-sized image. The index file is |
52 |
// tailored to Dave Ashley's needs, but the created file can be edited and most of the |
53 |
// content pasted into an HTML file. To avoid the accidental loss of information, any |
54 |
// existing "index2.php" file is renamed out of the way. |
55 |
// |
56 |
//This script is designed to be run manually (rather than automatically invoked as a result of a |
57 |
//web page request). |
58 |
//-------------------------------------------------------------------------------- |
59 |
//C O N F I G U R A T I O N |
60 |
//-------------------------------------------------------------------------------- |
61 |
//Configuration switch combinations were not tested. E-mail me any program |
62 |
//corrections (dashley@gmail.com). |
63 |
define ("CFG_PROGNAME", "pics_indexfile_make.php"); |
64 |
//Program name. |
65 |
define ("CFG_CONSOLE_STD_LINE_LEN", 78); |
66 |
//Number of characters per line preferred for console output. |
67 |
define ("CFG_THUMBNAIL_FILENAME_SUFFIX", "_small"); |
68 |
//String added just before the filename extension to choose thumbnail names |
69 |
//based on name of full-sized image. |
70 |
define ("CFG_INDEXFILE_NAME", "index2.php"); |
71 |
//Name of the file containing the index. PHP code is assumed, but the |
72 |
//file can be harvested for the HTML. |
73 |
define ("CFG_INDEX_LINK_INDENT", 3); |
74 |
//The number of spaces to indent each link. |
75 |
define ("CFG_INDEX_PARAGRAPH_INDENT", 3); |
76 |
//The number of spaces to indent each paragraph. |
77 |
define ("CFG_INDEXFILE_PICREF_INDENT", 3); |
78 |
//The number of spaces to indent each reference to a picture. |
79 |
define ("CFG_FILEEXTENSIONS_PHOTO", "jpg/jpeg/png/gif"); |
80 |
//The file extensions that will be recognized as photos. |
81 |
define ("CFG_FILEEXTENSIONS_LINK", "mov"); |
82 |
//File extensions that will be linked to. All others will be mentioned |
83 |
//in the generated output but not linked to. |
84 |
//-------------------------------------------------------------------------------- |
85 |
//Repeats a character to the console output a certain number of times. |
86 |
function rep_char_con($c, $n) |
87 |
{ |
88 |
while ($n--) |
89 |
echo $c; |
90 |
} |
91 |
//-------------------------------------------------------------------------------- |
92 |
//Writes a standard thick horizontal line to the console. |
93 |
function hor_line_thick() |
94 |
{ |
95 |
rep_char_con("=", CFG_CONSOLE_STD_LINE_LEN); |
96 |
echo "\n"; |
97 |
} |
98 |
//-------------------------------------------------------------------------------- |
99 |
//Writes a standard thin horizontal line to the console. |
100 |
function hor_line_thin() |
101 |
{ |
102 |
rep_char_con("-", CFG_CONSOLE_STD_LINE_LEN); |
103 |
echo "\n"; |
104 |
} |
105 |
//-------------------------------------------------------------------------------- |
106 |
//Returns an array of all files in the working directory. |
107 |
//If no files can be found, returns FALSE. |
108 |
function get_file_names_in_dir() |
109 |
{ |
110 |
//Get directory list. |
111 |
$rv = scandir ("."); |
112 |
|
113 |
//If the list is empty, something went wrong. Return FALSE. |
114 |
if ($rv === FALSE) |
115 |
return FALSE; |
116 |
|
117 |
return $rv; |
118 |
} |
119 |
//-------------------------------------------------------------------------------- |
120 |
//Accepts a non-negative integer as an integer or a string. Adds commas in the |
121 |
//right places to make it more human readable. |
122 |
function int_nonneg_commanate($in_ui) |
123 |
{ |
124 |
//Ensure the integer is an integer from PHP's point of view. |
125 |
$in_ui = (int)$in_ui; |
126 |
|
127 |
//If a negative number was passed in, clip it. |
128 |
if ($in_ui < 0) |
129 |
$in_ui = 0; |
130 |
|
131 |
//Make a proper numerical string with commas out of it. |
132 |
$s_ui = number_format($in_ui); |
133 |
|
134 |
return $s_ui; |
135 |
} |
136 |
//-------------------------------------------------------------------------------- |
137 |
//Returns TRUE if a file name appears to be a valid full-sized image name, |
138 |
//or FALSE otherwise. |
139 |
function is_full_sized_image_file_name($in_filename) |
140 |
{ |
141 |
//Convert the string name to all lower case. This will do for |
142 |
//comparisons and tests. |
143 |
$in_filename = strtolower($in_filename); |
144 |
|
145 |
//Attempt to split the name into a base and an extension. Any failure |
146 |
//means it is an unsuitable name. |
147 |
$extension_start = strrpos($in_filename, "."); |
148 |
//Find position of last "." in string. This should precede the |
149 |
//file extension. |
150 |
|
151 |
if ($extension_start === FALSE) |
152 |
{ |
153 |
//Bad name. Unsuitable. |
154 |
return FALSE; |
155 |
} |
156 |
|
157 |
//Calculate the base and extension. |
158 |
$filename_base = substr($in_filename, 0, $extension_start); |
159 |
$filename_extension = substr($in_filename, $extension_start + 1); |
160 |
|
161 |
//If the extension is neither "jpg" nor "jpeg", it is unsuitable. |
162 |
if (($filename_extension != "jpg") && ($filename_extension != "jpeg")) |
163 |
return FALSE; |
164 |
|
165 |
//If the filename base is empty, the filename is unsuitable. |
166 |
if (strlen($filename_base) == 0) |
167 |
return FALSE; |
168 |
|
169 |
//If the last characters of the base are the CFG_THUMBNAIL_FILENAME_SUFFIX, |
170 |
//the name is unsuitable. |
171 |
if (strlen($filename_base) >= strlen(CFG_THUMBNAIL_FILENAME_SUFFIX)) |
172 |
{ |
173 |
if (substr($filename_base, strlen($filename_base) - strlen(CFG_THUMBNAIL_FILENAME_SUFFIX)) |
174 |
== CFG_THUMBNAIL_FILENAME_SUFFIX) |
175 |
return FALSE; |
176 |
} |
177 |
|
178 |
//Looks good. |
179 |
return TRUE; |
180 |
} |
181 |
//-------------------------------------------------------------------------------- |
182 |
//As a function of the file name, creates the file name for the thumbnail. |
183 |
function file_name_to_thumbnail_name($in_filename) |
184 |
{ |
185 |
$extension_start = strrpos($in_filename, "."); |
186 |
//Find position of last "." in string. This should precede the |
187 |
//file extension. |
188 |
if ($extension_start === FALSE) |
189 |
{ |
190 |
//"." not found. Should not happen. Filenames were checked in advance. |
191 |
echo "Fatal internal error at line " . __LINE__ . "\n"; |
192 |
exit(1); |
193 |
} |
194 |
|
195 |
$filename_prefix = substr($in_filename, 0, $extension_start); |
196 |
$filename_extension = substr($in_filename, $extension_start); |
197 |
|
198 |
$rv = $filename_prefix . CFG_THUMBNAIL_FILENAME_SUFFIX . $filename_extension; |
199 |
|
200 |
return $rv; |
201 |
} |
202 |
//-------------------------------------------------------------------------------- |
203 |
//Writes the index file preamble to the index file. This is very much |
204 |
//dependent on how the thumbnails will be used. This is currently customized |
205 |
//for what Dave Ashley does. |
206 |
function write_index_file_preamble($handle, $idstring) |
207 |
{ |
208 |
fwrite($handle, "<" . "?" . "php\n"); |
209 |
fwrite($handle, "require_once(\"style/std/stdwpstyle.inc\");\n"); |
210 |
fwrite($handle, "?" . ">" . "\n"); |
211 |
fwrite($handle, "<" . "?" . "php\n"); |
212 |
fwrite($handle, " $" . "thispage = new StdWpStyle();\n"); |
213 |
fwrite($handle, "\n"); |
214 |
fwrite($handle, " $" . "thispage->static_page_header_title_std(\"" . $idstring . "\",\n"); |
215 |
fwrite($handle, " \"" . $idstring . "\",\n"); |
216 |
fwrite($handle, " \"\");\n"); |
217 |
fwrite($handle, " $" . "thispage->static_page_photo_thumbnail_explanation(TRUE, TRUE);\n"); |
218 |
fwrite($handle, "?" . ">" . "\n"); |
219 |
for ($i = 0; $i < CFG_INDEX_PARAGRAPH_INDENT; $i++) |
220 |
{ |
221 |
fwrite($handle, " "); |
222 |
} |
223 |
fwrite($handle, "\n<p align=\"center\">\n"); |
224 |
} |
225 |
//-------------------------------------------------------------------------------- |
226 |
//Writes the index file postamble to the index file. This is very much |
227 |
//dependent on how the thumbnails will be used. This is currently customized |
228 |
//for what Dave Ashley does. |
229 |
function write_index_file_postamble($handle) |
230 |
{ |
231 |
for ($i = 0; $i < CFG_INDEX_PARAGRAPH_INDENT; $i++) |
232 |
{ |
233 |
fwrite($handle, " "); |
234 |
} |
235 |
fwrite($handle, "</p>\n\n"); |
236 |
fwrite($handle, "<" . "?" . "php\n"); |
237 |
fwrite($handle, " $" . "thispage->static_page_footer_std();\n"); |
238 |
fwrite($handle, "?" . ">" . "\n"); |
239 |
} |
240 |
//-------------------------------------------------------------------------------- |
241 |
//Writes a line to the index file corresponding to a linked larger picture |
242 |
//reprsented by a thumbnail. |
243 |
function write_index_line( $handle, |
244 |
$filename, |
245 |
$thumbnailname, |
246 |
$filename_filesize, |
247 |
$filename_xdim, |
248 |
$filename_ydim, |
249 |
$thumbnailname_filesize, |
250 |
$thumbnailname_xdim, |
251 |
$thumbnailname_ydim) |
252 |
{ |
253 |
//<a href="dscn1258.jpg"><img border="0" src="dscn1258_small.jpg" alt="dscn1258.jpg (4932338 bytes)" width="125" height="93"></a> |
254 |
//Indent. |
255 |
for ($i = 0; $i < CFG_INDEX_LINK_INDENT; $i++) |
256 |
{ |
257 |
fwrite($handle, " "); |
258 |
} |
259 |
|
260 |
fwrite($handle, "<a href=\""); |
261 |
fwrite($handle, $filename); |
262 |
fwrite($handle, "\"><img border=\"0\" src=\""); |
263 |
fwrite($handle, $thumbnailname); |
264 |
fwrite($handle, "\" alt=\""); |
265 |
fwrite($handle, $filename); |
266 |
fwrite($handle, " ("); |
267 |
fwrite($handle, int_nonneg_commanate($filename_filesize)); |
268 |
fwrite($handle, " bytes)\" "); |
269 |
fwrite($handle, "title=\""); |
270 |
fwrite($handle, $filename); |
271 |
fwrite($handle, " ("); |
272 |
fwrite($handle, int_nonneg_commanate($filename_filesize)); |
273 |
fwrite($handle, " bytes)\" width=\""); |
274 |
fwrite($handle, $thumbnailname_xdim); |
275 |
fwrite($handle, "\" height=\""); |
276 |
fwrite($handle, $thumbnailname_ydim); |
277 |
fwrite($handle, "\"></a>"); |
278 |
fwrite($handle, "\n"); |
279 |
} |
280 |
//-------------------------------------------------------------------------------- |
281 |
//Write introductory message. |
282 |
hor_line_thick(); |
283 |
echo CFG_PROGNAME . ", Copyright (c) 2016 David T. Ashley\n"; |
284 |
echo "This program comes with ABSOLUTELY NO WARRANTY; and is licensed under the\n"; |
285 |
echo "MIT License. A copy of this license is provided in the source code\n"; |
286 |
echo "of this program.\n"; |
287 |
hor_line_thin(); |
288 |
//----------------------------------------------------------------------------- |
289 |
//Get the date, time, and PID strings that will be used for the rest of the |
290 |
//script. |
291 |
$scr_datestring = date("Ymd_His"); |
292 |
$scr_pid = getmypid(); |
293 |
if ($scr_pid === FALSE) |
294 |
$scr_pid = 0; |
295 |
//----------------------------------------------------------------------------- |
296 |
//If the index file exists, rename it out of the way. This is to prevent |
297 |
//the loss of information. |
298 |
if (file_exists(CFG_INDEXFILE_NAME)) |
299 |
{ |
300 |
rename(CFG_INDEXFILE_NAME, $scr_datestring . "_" . $scr_pid . ".php"); |
301 |
} |
302 |
//----------------------------------------------------------------------------- |
303 |
//Open the index file and write the preamble. |
304 |
$indexfile_handle = fopen(CFG_INDEXFILE_NAME, "w"); |
305 |
if ($indexfile_handle === FALSE) |
306 |
{ |
307 |
echo "FATAL: unable to open index file.\n"; |
308 |
exit(1); |
309 |
} |
310 |
write_index_file_preamble($indexfile_handle, $scr_datestring . "_" . $scr_pid); |
311 |
//----------------------------------------------------------------------------- |
312 |
//Get and emit the names of everything in the directory. |
313 |
$file_list = get_file_names_in_dir(); |
314 |
if ($file_list === FALSE) |
315 |
{ |
316 |
echo "List of files from PHP function scandir() is empty.\n"; |
317 |
echo "Serious internal error, or nothing to do. Script cannot continue.\n"; |
318 |
hor_line_thick(); |
319 |
exit(1); |
320 |
} |
321 |
else |
322 |
{ |
323 |
echo "Files in working directory (unsorted, unfiltered, " |
324 |
. |
325 |
count($file_list) |
326 |
. |
327 |
" files):\n"; |
328 |
for ($i = 0; $i < count($file_list); $i++) |
329 |
echo " " . sprintf("[%5d]", $i) . " " . $file_list[$i] . "\n"; |
330 |
} |
331 |
hor_line_thin(); |
332 |
//----------------------------------------------------------------------------- |
333 |
//Remove the standard directory entries "." and ".." from the list, and |
334 |
//remove any directories. |
335 |
$temp_list = $file_list; |
336 |
unset($file_list); |
337 |
$n = 0; |
338 |
for ($i = 0; $i < count($temp_list); $i++) |
339 |
{ |
340 |
//echo "Checking " . $temp_list[$i] . "\n"; |
341 |
|
342 |
if (strcmp($temp_list[$i], ".") == 0) |
343 |
{ |
344 |
//. entry, not a file. |
345 |
} |
346 |
else if (strcmp($temp_list[$i], "..") == 0) |
347 |
{ |
348 |
//.. entry, not a file. |
349 |
} |
350 |
else if (is_file($temp_list[$i])) |
351 |
{ |
352 |
//This is a regular file. |
353 |
$file_list[] = $temp_list[$i]; |
354 |
$n++; |
355 |
} |
356 |
} |
357 |
|
358 |
if ($n == 0) |
359 |
$file_list = FALSE; |
360 |
|
361 |
unset($n); |
362 |
unset($temp_list); |
363 |
//----------------------------------------------------------------------------- |
364 |
//If there is nothing to do, end the script. |
365 |
if ($file_list === FALSE) |
366 |
{ |
367 |
echo "No files to process.\n"; |
368 |
hor_line_thick(); |
369 |
exit(0); |
370 |
} |
371 |
//----------------------------------------------------------------------------- |
372 |
//Sort the list. This is a non-event. The only rationale for sorting is that |
373 |
//it ensures that the same set of files will be processed in the same order, |
374 |
//regardless of the order provided by the underlying OS internals. |
375 |
sort($file_list); |
376 |
//----------------------------------------------------------------------------- |
377 |
//Emit the names we now have. |
378 |
echo "Files in working directory (directory entries removed, sorted, " |
379 |
. |
380 |
count($file_list) |
381 |
. |
382 |
" files):\n"; |
383 |
for ($i = 0; $i < count($file_list); $i++) |
384 |
echo " " . sprintf("[%5d]", $i) . " " . $file_list[$i] . "\n"; |
385 |
hor_line_thin(); |
386 |
|
387 |
//----------------------------------------------------------------------------- |
388 |
//For each file in the list, process it. There are different processing |
389 |
//actions for each one. |
390 |
for ($i = 0; $i < count($file_list); $i++) |
391 |
{ |
392 |
if (is_full_sized_image_file_name($file_list[$i])) |
393 |
{ |
394 |
$thumbnail_name = file_name_to_thumbnail_name($file_list[$i]); |
395 |
|
396 |
$image_data = getimagesize($file_list[$i]); |
397 |
$thumbnail_data = getimagesize($thumbnail_name); |
398 |
|
399 |
write_index_line( $indexfile_handle, |
400 |
$file_list[$i], |
401 |
$thumbnail_name, |
402 |
filesize($file_list[$i]), |
403 |
$image_data[0], |
404 |
$image_data[1], |
405 |
filesize($thumbnail_name), |
406 |
$thumbnail_data[0], |
407 |
$thumbnail_data[1]); |
408 |
|
409 |
} |
410 |
} |
411 |
|
412 |
//----------------------------------------------------------------------------- |
413 |
//Complete and close up the index file. |
414 |
write_index_file_postamble($indexfile_handle); |
415 |
fclose($indexfile_handle); |
416 |
//-------------------------------------------------------------------------------- |
417 |
echo CFG_PROGNAME . " execution ends.\n"; |
418 |
hor_line_thick(); |
419 |
//-------------------------------------------------------------------------------- |
420 |
//End of File |
421 |
//-------------------------------------------------------------------------------- |
422 |
?> |