自从皈依了FOSS,盗版软件是不用了,电子书还是照下不误。曾经想过用apache和scuttle来管理,然而使用起来仍然很麻烦,所以找书的时候还是到各个目录里面去翻。
做feedman的时候学会了HTML::Pager
,于是写了一个简单的CGI脚本,放到电子书的根目录下。缺省情况下,apache打开一个目录的样子很难看,而且长一点的文件名都被截断了,偏偏电子书的文件名都很长。这个CGI程序的作用就是输出一个文件列表,提供完成的文件名和链接。程序出奇的简单,首先用File::Find找出想要列出的文件,如所有的chm和pdf文件。
#!/usr/bin/perl -T use File::Find; use HTML::Pager; use CGI; use URI::Escape; use File::Basename; my @books; find({ wanted => sub{ push @books $_ if /.(?:chm|pdf)$/ }, no_chdir => 1 }, '.'); my $num_of_books = scalar @books;
这样,所有的文件名就保存在数组@books
里面,文件总数保存在变量$num_of_books
里面。接下来我们要写一个函数,从@books
中抽取出部分文件,供HTML::Pager
输出到页面上。
sub list_book_callback { my ($offset, $rows) = @_; my $current_books; for my $b ($offset .. $offset + $rows - 1) { last if $b == $num_of_books; my $filename = $books[$b]; $filename =~ s{^./}{}; my $url = 'http://localhost/book/' . uri_escape($filename); my $title = basename($filename); if ($title =~ /^(?:ch(?:apter)?)?d+.(?:chm|pdf)$/i) { $title = $filename; } push @current_books, [ qq(<a href="$url">$title</a>) ]; } return @current_books; }
这段函数对文件名做了一些特殊的处理,一般来讲,文件名即书名,我们可以去掉路径部分。而有些特殊的文件名字可能为ch01.pdf或ch02.pdf等等,上一层目录名才是书名,这时就将路径和文件名一起输出。最后就是用HTML::Pager生成列表并用CGI输出。
my $cgi = CGI->new; my $pager = HTML::Pager->new (query => $cgi, get_data_callback => &list_book_callback, rows => $num_of_books, page_size => 25, ); print $cgi->header, $cgi->start_html, $pager->output, $cgi->end_html;
程序运行结果如截图: