> Всем привет, имеется папка с кучей файлов вида yyyy-mm-dd.html например (2013-1025.html),
> эти файлы создаются автоматически(каждый день +1 новый файл)
> как сделать в этих файлах были ссылки на следующий или предыдущий день
> руками править каждый файл не вариант.А, всё-таки, попробуем сделать это средствами HTML.
Ну, или, скажем, не только средствами HTML, но и средствами SSI и Perl.
Итак, имеется сервер apache.
Имеется директория (dir), в которой находятся постоянно генерируемые файлы вида YYYY-MM-DD.html
Создаём в этой директории dir файл .htaccess с приблизительно следующим содержанием.
AddType text/html .shtml .html
AddHandler server-parsed .shtml .html
Options +Indexes +FollowSymLinks +Includes
Тем самым разрешаем работу SSI в этой директории.
Создаём в директории /cgi-bin/ файл, обзовём его bname.pl
#!/usr/bin/perl
use strict;
use warnings;
use Time::Local;
use POSIX qw(strftime);
# получаем название открытого файла
my $date = $ARGV[0];
# вырезаем из него всё, кроме цифр и тире
$date =~ s/[^\d-]//g;
# сопоставляем дату вида YYYY-MM-DD с полученными оставшимися значениями
my ($yyyy, $mm, $dd) = ($date =~ /(\d+)-(\d+)-(\d+)/);
# переводим дату из вида YYYY-MM-DD в количество секунд с начала эпохи в unix формат (epochtime)
my $curr_date_epoch = timelocal(0, 0, 0, $dd, $mm-1, $yyyy); # current date сегодняшняя дата
my $next_date_epoch = $curr_date_epoch + 86400; # next date следующий день
my $prev_date_epoch = $curr_date_epoch - 86400; # previous date предыдущий день
# делаем обратное преобразование времени - из epoch переводим в формат YYYY-MM-DD
my $curr_date = strftime "%Y-%m-%d", (localtime($curr_date_epoch));
my $next_date = strftime "%Y-%m-%d", (localtime($next_date_epoch));
my $prev_date = strftime "%Y-%m-%d", (localtime($prev_date_epoch));
# выводим на печать в web
print "Content-type: text/html\n\n";
# рисуем табличку и заносим полученные значения
print "<table width='100%' border='0'>\n";
print "<tr>\n";
print "<td align='left'><a href='$prev_date.html'>$prev_date</a></td>\n";
print "<td align='center'>$curr_date</td>\n";
print "<td align='right'><a href='$next_date.html'>$next_date</a></td>\n";
print "</tr>\n";
print "</table>";
Изменяем уже готовые файлы в директории dir для работы с SSI.
Для этого используем следующий скрипт
#!/usr/bin/perl
use strict;
use warnings;
# директория с генерируемыми файлами
my $dir = "/usr/local/www/apache22/data/dir";
my $file;
opendir(DH, $dir) or die "Couldn't open $dir : $!";
while($file = readdir (DH)) {
next if $file =~ /^\.\.?$/;
next if $file !~ /^(\d+)-(\d+)-(\d+)\.html$/;
next if -d "$dir/$file";
&mod($file);
}
closedir(DH);
sub mod($) {
open(FH, "+<", "$dir/$file") or die "Can't read $file: $!";
my $out = '';
# в цикле вырезаем HTML теги </body> и </html> с заменой
# вместо них вставляем инклюд и заново эти же удалённые теги HTML
while(<FH>) {
s|</body>||;
s|</html>|<!--#include virtual="/cgi-bin/bname.pl?\$DOCUMENT_NAME" -->\n</body>\n</html>|;
$out .= $_;
}
seek(FH, 0, 0) or die "Seeking: $!";
print FH $out or die "Printing: $!";
truncate(FH, tell(FH)) or die "Truncating: $!";
close(FH) or die "Closing: $!";
}
Новые генерируемые файлы преобразуем с помощью следующего скрипта modern.pl
#!/usr/bin/perl
use strict;
use warnings;
use POSIX qw(strftime);
my $tomorrow = strftime "%Y-%m-%d", (localtime(time-86400));
my $file = "/usr/local/www/apache22/data/dir/$tomorrow.html";
open(FH, "+<", $file) or die "Can't read $file: $!";
my $out = '';
while(<FH>) {
s|</body>||;
s|</html>|<!--#include virtual="/cgi-bin/bname.pl?\$DOCUMENT_NAME" -->\n</body>\n</html>|;
$out .= $_;
}
seek(FH, 0, 0) or die "Seeking: $!";
print FH $out or die "Printing: $!";
truncate(FH, tell(FH)) or die "Truncating: $!";
close(FH) or die "Closing: $!";
Если генерирование нового файла в директории dir заканчивается в 24:00,
то по cron'у запускаем скрипт modern.pl каждую ночь в 1 час ночи.
0 1 * * * root /path/to/modern.pl >/dev/null 2>&1
В результате в новых файлах (как и в старых) в конце файла будет добавлена строка
<!--#include virtual="/cgi-bin/bname.pl?$DOCUMENT_NAME" -->
При открытии файла будет вызов инклюда и генерация нужных ссылок.
+--------------+--------------+--------------+
| 2013-11-24 | 2013-11-25 | 2013-11-26 |
+--------------+--------------+--------------+
левые и правые даты - соответствующие ссылки.
Такие дела.