summaryrefslogtreecommitdiff
path: root/bin/gen-xhtml-thumbnails
blob: 7b2502384518fd56fc56e8bebd1662204f750aa9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#!/usr/bin/perl
# Copyright © 2009 by Daniel Friesel <derf@derf.homelinux.org>
# License: WTFPL <http://sam.zoy.org/wtfpl>
use strict;
use warnings;
use Image::Imlib2;
use constant {
	DEFAULT_FILEMODE => oct(644),
	THUMB_MAX_DIM => 150,
	THUMB_QUALITY => 60,
};

my $directory = shift || '.';
my $thumbdir  = "$directory/.thumbs";
my $indexfile = "$directory/index.xhtml";
my ($dx, $dy);
my @files;
my $number = 0;
local $| = 1;

sub print_progress {
	if (($number % 60) == 0) {
		if ($number) {
			printf(" %4d/%d\n", $number, scalar(@files));
		}
		printf('[%3d%%] ', $number * 100 / @files);
	} elsif (($number % 10) == 0) {
		print ' ';
	}
	return;
}

open(my $index, '>', $indexfile) or die("Cannot open $indexfile for writing: $!");

print $index <<'EOD';
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
	"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
	<title></title>
	<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
</head>
<body><div>
EOD

if (! -d $thumbdir) {
	mkdir($thumbdir) or die("cannot create $thumbdir: $!");
}

opendir(my $dirhandle, $directory) or die("Cannot open directory $directory: $!");

foreach my $file (readdir($dirhandle)) {
	if ($file =~ / \. ( png | jp e? g ) $ /ix) {
		push(@files, $file);
	}
}

closedir($dirhandle);

print "Generating thumbnails [ - cached | + generated ]\n";

foreach my $file (sort(@files)) {
	my $image = Image::Imlib2->load($file);
	my $thumb;

	printf {$index} (
		'<div style="float: left; width: %dpx; height: %dpx">',
		THUMB_MAX_DIM * 1.1,
		THUMB_MAX_DIM * 1.1,
	);
	print {$index} "<a href=\"$file\"><img src=\".thumbs/$file\" alt=\"$file\" /></a></div>\n";
	print_progress;
	$number++;

	if (-e "$thumbdir/$file") {
		print '-';
		next;
	}

	($dx, $dy) = ($image->width, $image->height);

	if ($dx > $dy) {
		$thumb = $image->create_scaled_image(THUMB_MAX_DIM, 0);
	} else {
		$thumb = $image->create_scaled_image(0, THUMB_MAX_DIM);
	}

	$thumb->set_quality(THUMB_QUALITY);
	$thumb->save("$thumbdir/$file");

	chmod(DEFAULT_FILEMODE, "$thumbdir/$file");
	print '+';
}
print "\n";

print $index <<'EOD';
</div></body>
</html>
EOD

close($index) or die("Cannot close $indexfile: $!");
chmod(DEFAULT_FILEMODE, $indexfile);

__END__

=head1 NAME

gen-xhtml-thumbnails - Generate Thumbnails + Index for a set of images

=head1 SYNOPSIS

B<gen-xhtml-thumbnails> [I<directory>]

=head1 DESCRIPTION

gen-xhtml-thumbnails will create an F<index.xhtml> with a list (thumbnails) of
all images found if I<directory>; the thumbnails will link to the images.

The F<index.xhtml> file will always be created in I<directory>.
The thumbnails will be saved in F<.thumbs>, also in I<directory>.
If I<directory> is not specified, the current directory is used.

Note that only the images in the directory itself will be processed, recursion
is not supported.