/[dtapublic]/projs/dtats/trunk/projs/20161008_web_page_thumbnail_make/indexfile_make.php
ViewVC logotype

Annotation of /projs/dtats/trunk/projs/20161008_web_page_thumbnail_make/indexfile_make.php

Parent Directory Parent Directory | Revision Log Revision Log


Revision 110 - (hide annotations) (download)
Sat Dec 31 19:42:04 2016 UTC (7 years, 9 months ago) by dashley
File size: 18148 byte(s)
Update keywords, license.
1 dashley 107 <?php
2     //-------------------------------------------------------------------------------------------------
3 dashley 110 //$Header$
4 dashley 107 //-------------------------------------------------------------------------------------------------
5 dashley 110 //This source code and any program in which it is compiled/used is provided under the MIT
6     //LICENSE (full license text below).
7 dashley 107 //-------------------------------------------------------------------------------------------------
8 dashley 110 //Copyright (c) 2016 David T. Ashley
9 dashley 107 //
10 dashley 110 //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 dashley 107 //
16 dashley 110 //The above copyright notice and this permission notice shall be included in all copies or
17     //substantial portions of the Software.
18 dashley 107 //
19 dashley 110 //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 dashley 107 //-------------------------------------------------------------------------------------------------
25     //--------------------------------------------------------------------------------
26     //C O N F I G U R A T I O N
27     //--------------------------------------------------------------------------------
28     //Configuration switch combinations were not tested. E-mail me any program
29     //corrections (dashley@gmail.com).
30     define ("CFG_PROGNAME", "indexfile_make.php");
31     //Program name.
32     define ("CFG_CONSOLE_STD_LINE_LEN", 78);
33     //Number of characters per line preferred for console output.
34     define ("CFG_THUMBNAIL_FILENAME_SUFFIX", "_small");
35     //String added just before the filename extension to choose thumbnail names
36     //based on name of full-sized image.
37     define ("CFG_INDEXFILE_NAME", "index2.php");
38     //Name of the file containing the index. PHP code is assumed, but the
39     //file can be harvested for the HTML.
40     define ("CFG_INDEXFILE_PICREF_INDENT", 3);
41     //The number of spaces to indent each reference to a picture.
42     define ("CFG_FILEEXTENSIONS_PHOTO", "jpg/jpeg");
43     //The file extensions that will be recognized as photos.
44     define ("CFG_FILEEXTENSIONS_LINK", "mov");
45     //File extensions that will be linked to. All others will be mentioned
46     //in the generated output but not linked to.
47     //--------------------------------------------------------------------------------
48     //Repeats a character to the console output a certain number of times.
49     function rep_char_con($c, $n)
50     {
51     while ($n--)
52     echo $c;
53     }
54     //--------------------------------------------------------------------------------
55     //Writes a standard thick horizontal line to the console.
56     function hor_line_thick()
57     {
58     rep_char_con("=", CFG_CONSOLE_STD_LINE_LEN);
59     echo "\n";
60     }
61     //--------------------------------------------------------------------------------
62     //Writes a standard thin horizontal line to the console.
63     function hor_line_thin()
64     {
65     rep_char_con("-", CFG_CONSOLE_STD_LINE_LEN);
66     echo "\n";
67     }
68     //--------------------------------------------------------------------------------
69     //Returns an array of all files in the working directory.
70     //If no files can be found, returns FALSE.
71     function get_file_names_in_dir()
72     {
73     //Get directory list.
74     $rv = scandir (".");
75    
76     //If the list is empty, something went wrong. Return FALSE.
77     if ($rv === FALSE)
78     return FALSE;
79    
80     return $rv;
81     }
82     //--------------------------------------------------------------------------------
83     //Accepts a non-negative integer as an integer or a string. Adds commas in the
84     //right places to make it more human readable.
85     function int_nonneg_commanate($in_ui)
86     {
87     //Ensure the integer is an integer from PHP's point of view.
88     $in_ui = (int)$in_ui;
89    
90     //If a negative number was passed in, clip it.
91     if ($in_ui < 0)
92     $in_ui = 0;
93    
94     //Make a proper numerical string with commas out of it.
95     $s_ui = number_format($in_ui);
96    
97     return $s_ui;
98     }
99     //--------------------------------------------------------------------------------
100     //Returns TRUE if a file name appears to be a valid full-sized image name,
101     //or FALSE otherwise.
102     function is_full_sized_image_file_name($in_filename)
103     {
104     //Convert the string name to all lower case. This will do for
105     //comparisons and tests.
106     $s = strtolower($s);
107    
108     //Attempt to split the name into a base and an extension. Any failure
109     //means it is an unsuitable name.
110     $extension_start = strrpos($in_filename, ".");
111     //Find position of last "." in string. This should precede the
112     //file extension.
113    
114     if ($extension_start === FALSE)
115     {
116     //Bad name. Unsuitable.
117     return FALSE;
118     }
119    
120     //Calculate the base and extension.
121     $filename_base = substr($in_filename, 0, $extension_start);
122     $filename_extension = substr($in_filename, $extension_start + 1);
123    
124     //If the extension is neither "jpg" nor "jpeg", it is unsuitable.
125     if (($filename_extension != "jpg") && ($filename_extension != "jpeg"))
126     return FALSE;
127    
128     //If the filename base is empty, the filename is unsuitable.
129     if (strlen($filename_base) == 0)
130     return FALSE;
131    
132     //If the last characters of the base are the CFG_THUMBNAIL_FILENAME_SUFFIX,
133     //the name is unsuitable.
134     if (strlen($filename_base) >= strlen(CFG_THUMBNAIL_FILENAME_SUFFIX))
135     {
136     if (substr($filename_base, strlen($filename_base) - strlen(CFG_THUMBNAIL_FILENAME_SUFFIX))
137     == CFG_THUMBNAIL_FILENAME_SUFFIX)
138     return FALSE;
139     }
140    
141     //Looks good.
142     return TRUE;
143     }
144     //--------------------------------------------------------------------------------
145     //As a function of the file name, creates the file name for the thumbnail.
146     function file_name_to_thumbnail_name($in_filename)
147     {
148     $extension_start = strrpos($in_filename, ".");
149     //Find position of last "." in string. This should precede the
150     //file extension.
151     if ($extension_start === FALSE)
152     {
153     //"." not found. Should not happen. Filenames were checked in advance.
154     echo "Fatal internal error at line " . __LINE__ . "\n";
155     exit(1);
156     }
157    
158     $filename_prefix = substr($in_filename, 0, $extension_start);
159     $filename_extension = substr($in_filename, $extension_start);
160    
161     $rv = $filename_prefix . CFG_THUMBNAIL_FILENAME_SUFFIX . $filename_extension;
162    
163     return $rv;
164     }
165     //--------------------------------------------------------------------------------
166     //Writes the index file preamble to the index file. This is very much
167     //dependent on how the thumbnails will be used. This is currently customized
168     //for what Dave Ashley does.
169     function write_index_file_preamble($handle, $idstring)
170     {
171     fwrite($handle, "<" . "?" . "php\n");
172     fwrite($handle, "require_once(\"style/std/stdwpstyle.inc\");\n");
173     fwrite($handle, "?" . ">" . "\n");
174     fwrite($handle, "<" . "?" . "php\n");
175     fwrite($handle, " $" . "thispage = new StdWpStyle();\n");
176     fwrite($handle, "\n");
177     fwrite($handle, " $" . "thispage->static_page_header_title_std(\"" . $idstring . "\",\n");
178     fwrite($handle, " \"" . $idstring . "\",\n");
179     fwrite($handle, " \"\");\n");
180     fwrite($handle, " $" . "thispage->static_page_photo_thumbnail_explanation(TRUE, TRUE);\n");
181     fwrite($handle, "?" . ">" . "\n");
182     for ($i = 0; $i < CFG_INDEX_PARAGRAPH_INDENT; $i++)
183     {
184     fwrite($handle, " ");
185     }
186     fwrite($handle, "\n<p align=\"center\">\n");
187     }
188     //--------------------------------------------------------------------------------
189     //Writes the index file postamble to the index file. This is very much
190     //dependent on how the thumbnails will be used. This is currently customized
191     //for what Dave Ashley does.
192     function write_index_file_postamble($handle)
193     {
194     for ($i = 0; $i < CFG_INDEX_PARAGRAPH_INDENT; $i++)
195     {
196     fwrite($handle, " ");
197     }
198     fwrite($handle, "</p>\n\n");
199     fwrite($handle, "<" . "?" . "php\n");
200     fwrite($handle, " $" . "thispage->static_page_footer_std();\n");
201     fwrite($handle, "?" . ">" . "\n");
202     }
203     //--------------------------------------------------------------------------------
204     //Writes a line to the index file corresponding to a linked larger picture
205     //reprsented by a thumbnail.
206     function write_index_line( $handle,
207     $filename,
208     $thumbnailname,
209     $filename_filesize,
210     $filename_xdim,
211     $filename_ydim,
212     $thumbnailname_filesize,
213     $thumbnailname_xdim,
214     $thumbnailname_ydim)
215     {
216     //<a href="dscn1258.jpg"><img border="0" src="dscn1258_small.jpg" alt="dscn1258.jpg (4932338 bytes)" width="125" height="93"></a>
217     //Indent.
218     for ($i = 0; $i < CFG_INDEX_LINK_INDENT; $i++)
219     {
220     fwrite($handle, " ");
221     }
222    
223     fwrite($handle, "<a href=\"");
224     fwrite($handle, $filename);
225     fwrite($handle, "\"><img border=\"0\" src=\"");
226     fwrite($handle, $thumbnailname);
227     fwrite($handle, "\" alt=\"");
228     fwrite($handle, $filename);
229     fwrite($handle, " (");
230     fwrite($handle, int_nonneg_commanate($filename_filesize));
231     fwrite($handle, " bytes)\" ");
232     fwrite($handle, "title=\"");
233     fwrite($handle, $filename);
234     fwrite($handle, " (");
235     fwrite($handle, int_nonneg_commanate($filename_filesize));
236     fwrite($handle, " bytes)\" width=\"");
237     fwrite($handle, $thumbnailname_xdim);
238     fwrite($handle, "\" height=\"");
239     fwrite($handle, $thumbnailname_ydim);
240     fwrite($handle, "\"></a>");
241     fwrite($handle, "\n");
242     }
243     //--------------------------------------------------------------------------------
244     //Write introductory message.
245     hor_line_thick();
246     echo CFG_PROGNAME . " Copyright (C) 2015 David T. Ashley\n";
247     echo "This program comes with ABSOLUTELY NO WARRANTY; and is licensed under\n";
248     echo "the GNU General Public License, Version 3. A copy of this license is\n";
249     echo "provided in the source code of this program.\n";
250     hor_line_thin();
251     //-----------------------------------------------------------------------------
252     //Get the date, time, and PID strings that will be used for the rest of the
253     //script.
254     $scr_datestring = date("Ymd_His");
255     $scr_pid = getmypid();
256     if ($scr_pid === FALSE)
257     $scr_pid = 0;
258     //-----------------------------------------------------------------------------
259     //If the index file exists, rename it out of the way. This is to prevent
260     //the loss of information.
261     if (file_exists(CFG_INDEXFILE_NAME))
262     {
263     rename(CFG_INDEXFILE_NAME, $scr_datestring . "_" . $scr_pid . ".php");
264     }
265     //-----------------------------------------------------------------------------
266     //Open the index file and write the preamble.
267     $indexfile_handle = fopen(CFG_INDEXFILE_NAME, "w");
268     if ($indexfile_handle === FALSE)
269     {
270     echo "FATAL: unable to open index file.\n";
271     exit(1);
272     }
273     write_index_file_preamble($indexfile_handle, $scr_datestring . "_" . $scr_pid);
274     //-----------------------------------------------------------------------------
275     //Get and emit the names of everything in the directory.
276     $file_list = get_file_names_in_dir();
277     if ($file_list === FALSE)
278     {
279     echo "List of files from PHP function scandir() is empty.\n";
280     echo "Serious internal error, or nothing to do. Script cannot continue.\n";
281     hor_line_thick();
282     exit(1);
283     }
284     else
285     {
286     echo "Files in working directory (unsorted, unfiltered, "
287     .
288     count($file_list)
289     .
290     " files):\n";
291     for ($i = 0; $i < count($file_list); $i++)
292     echo " " . sprintf("[%5d]", $i) . " " . $file_list[$i] . "\n";
293     }
294     hor_line_thin();
295     //-----------------------------------------------------------------------------
296     //Remove the standard directory entries "." and ".." from the list, and
297     //remove any directories.
298     $temp_list = $file_list;
299     unset($file_list);
300     $n = 0;
301     for ($i = 0; $i < count($temp_list); $i++)
302     {
303     //echo "Checking " . $temp_list[$i] . "\n";
304    
305     if (strcmp($temp_list[$i], ".") == 0)
306     {
307     //. entry, not a file.
308     }
309     else if (strcmp($temp_list[$i], "..") == 0)
310     {
311     //.. entry, not a file.
312     }
313     else if (is_file($temp_list[$i]))
314     {
315     //This is a regular file.
316     $file_list[] = $temp_list[$i];
317     $n++;
318     }
319     }
320    
321     if ($n == 0)
322     $file_list = FALSE;
323    
324     unset($n);
325     unset($temp_list);
326     //-----------------------------------------------------------------------------
327     //If there is nothing to do, end the script.
328     if ($file_list === FALSE)
329     {
330     echo "No files to process.\n";
331     hor_line_thick();
332     exit(0);
333     }
334     //-----------------------------------------------------------------------------
335     //Sort the list. This is a non-event. The only rationale for sorting is that
336     //it ensures that the same set of files will be processed in the same order,
337     //regardless of the order provided by the underlying OS internals.
338     sort($file_list);
339     //-----------------------------------------------------------------------------
340     //Emit the names we now have.
341     echo "Files in working directory (directory entries removed, sorted, "
342     .
343     count($file_list)
344     .
345     " files):\n";
346     for ($i = 0; $i < count($file_list); $i++)
347     echo " " . sprintf("[%5d]", $i) . " " . $file_list[$i] . "\n";
348     hor_line_thin();
349    
350     //-----------------------------------------------------------------------------
351     //For each file in the list, process it. There are different processing
352     //actions for each one.
353     for ($i = 0; $i < count($file_list); $i++)
354     {
355     if (is_full_sized_image_file_name($file_list[$i]))
356     {
357     $thumbnail_name = file_name_to_thumbnail_name($file_list[$i]);
358    
359     $image_data = getimagesize($file_list[$i]);
360     $thumbnail_data = getimagesize($thumbnail_name);
361    
362     write_index_line( $indexfile_handle,
363     $file_list[$i],
364     $thumbnail_name,
365     filesize($file_list[$i]),
366     $image_data[0],
367     $image_data[1],
368     filesize($thumbnail_name),
369     $thumbnail_data[0],
370     $thumbnail_data[1]);
371    
372     }
373     }
374    
375     //-----------------------------------------------------------------------------
376     //Complete and close up the index file.
377     write_index_file_postamble($indexfile_handle);
378     fclose($indexfile_handle);
379    
380     // $i = 0;
381     // $completed = 0;
382     // while (($completed < CFG_MAX_THUMBNAILS_PER_INVOCATION) && ($i < count($file_list)))
383     // {
384     // if (is_full_sized_image_file_name($file_list[$i]))
385     // {
386     // $thumbnail_name = file_name_to_thumbnail_name($file_list[$i]);
387     //
388     // if (file_exists($thumbnail_name))
389     // {
390     // echo " " . sprintf("[%5d]", $i) . " " . $file_list[$i] . " : skipping because corresponding thumbnail exists.\n";
391     // hor_line_thin();
392     // }
393     // else
394     // {
395     // echo " " . sprintf("[%5d]", $i) . " " . $file_list[$i] . " : creating thumbnail.\n";
396     //
397     // echo "Creating thumbnail \"" .
398     // $thumbnail_name .
399     // "\" from image \"" .
400     // $file_list[$i] .
401     // "\".\n";
402     //
403     // create_thumbnail($file_list[$i],
404     // $thumbnail_name,
405     // $filename_filesize,
406     // $filename_xdim,
407     // $filename_ydim,
408     // $thumbnail_filesize,
409     // $thumbnail_xdim,
410     // $thumbnail_ydim);
411     //
412     // echo "Conversion complete.\n";
413     // echo " Full-sized image file size/xdim/ydim = " .
414     // $filename_filesize . "/" . $filename_xdim . "/" . $filename_ydim .
415     // ",\n";
416     // echo " Thumbnail image filesize/xdim/ydim = " .
417     // $thumbnail_filesize . "/" . $thumbnail_xdim . "/" . $thumbnail_ydim .
418     // ",\n";
419     //
420     // hor_line_thin();
421     // $completed++;
422     // }
423     // }
424     // else
425     // {
426     // //Unsuitable base name. Can't use it.
427     // echo " " . sprintf("[%5d]", $i) . " " . $file_list[$i] . " : skipping due to unsuitable name.\n";
428     // hor_line_thin();
429     // }
430     //
431     // $i++;
432     // }
433     //
434     // //Emit a message about whether the program should be run again. I am aware of
435     // //the uncovered case--where the last thumbnail was made on the last iteration
436     // //of this invocation--but I will leave it uncovered for now. All that happens
437     // //is the user runs the program unnecessarily one more time.
438     // if ($completed == 0)
439     // {
440     // echo "No thumbnails were created--this program is done creating thumbnails.\n";
441     // echo "It is not necessary to run this program again.\n";
442     // hor_line_thin();
443     // }
444     // else
445     // {
446     // echo $completed . " thumbnail(s) were created. Please run this program repeatedly again\n";
447     // echo "until no more thumbnails are created.\n";
448     // hor_line_thin();
449     // }
450     //--------------------------------------------------------------------------------
451     echo CFG_PROGNAME . " execution ends.\n";
452     hor_line_thick();
453     //--------------------------------------------------------------------------------
454     //End of File
455     //--------------------------------------------------------------------------------
456     ?>

Properties

Name Value
svn:eol-style native
svn:executable *
svn:keywords Header

dashley@gmail.com
ViewVC Help
Powered by ViewVC 1.1.25