lilalo
annotate l3-cgi-lite @ 101:c41cc9a4b5ea
* Пофиксил ошибку с неправильной кодировкой mywi-хинтов.
* Подготовил к переходу в иерархию /l3/
** Исправил пути для стилей,
** Забацал красивый l3-cgi-lite
l3-cgi-lite пока что не доделан до нужного уровня,
но я его скоро дорисую.
Уже сейчас это намного более качественный скрипт
через уродский l3-cgi
Он, конечно, поработал в свое время,
но лучше его заменить l3-cgi-lite
Из функционала добавилось:
* Кэширование страниц в html
* Навигация по каталогам
* Навигационная строка в журнале сверху
* Подготовил к переходу в иерархию /l3/
** Исправил пути для стилей,
** Забацал красивый l3-cgi-lite
l3-cgi-lite пока что не доделан до нужного уровня,
но я его скоро дорисую.
Уже сейчас это намного более качественный скрипт
через уродский l3-cgi
Он, конечно, поработал в свое время,
но лучше его заменить l3-cgi-lite
Из функционала добавилось:
* Кэширование страниц в html
* Навигация по каталогам
* Навигационная строка в журнале сверху
| author | devi | 
|---|---|
| date | Sat Jun 24 22:53:37 2006 +0300 (2006-06-24) | 
| parents | |
| children | 53b890d1ae90 | 
| rev | line source | 
|---|---|
| devi@101 | 1 #!/usr/bin/perl | 
| devi@101 | 2 | 
| devi@101 | 3 use strict; | 
| devi@101 | 4 use CGI qw(:standard); | 
| devi@101 | 5 use utf8; | 
| devi@101 | 6 | 
| devi@101 | 7 BEGIN { | 
| devi@101 | 8 chdir("/home/devi/cvs/lilalo"); | 
| devi@101 | 9 require l3config; | 
| devi@101 | 10 l3config::init_config(); | 
| devi@101 | 11 }; | 
| devi@101 | 12 | 
| devi@101 | 13 sub path_is_correct($); | 
| devi@101 | 14 sub error($); | 
| devi@101 | 15 sub remove_extra_slashes_from($); | 
| devi@101 | 16 sub print_header($); | 
| devi@101 | 17 sub print_footer; | 
| devi@101 | 18 sub nav_bar; | 
| devi@101 | 19 | 
| devi@101 | 20 my $print=""; | 
| devi@101 | 21 my $path = $ENV{PATH_INFO}; | 
| devi@101 | 22 remove_extra_slashes_from($path); | 
| devi@101 | 23 | 
| devi@101 | 24 my $real_path = $l3config::Config{"backend_datadir"} ; | 
| devi@101 | 25 my $cgi_path = $l3config::Config{"cgi_path"} ; | 
| devi@101 | 26 my $style_files = $l3config::Config{"frontend_files"} ; | 
| devi@101 | 27 my $frontend_css = $l3config::Config{"frontend_css"} ; | 
| devi@101 | 28 my $data_file = "data.xml"; | 
| devi@101 | 29 | 
| devi@101 | 30 path_is_correct($path) | 
| devi@101 | 31 or error ("Путь $path содержит недопустимые символы или комбинации символов."); | 
| devi@101 | 32 | 
| devi@101 | 33 $real_path .= $path; | 
| devi@101 | 34 remove_extra_slashes_from($real_path); | 
| devi@101 | 35 | 
| devi@101 | 36 # Чувак, ты хотел бы посмотреть на журнал $path | 
| devi@101 | 37 # Он должен находиться в каталоге $real_path файловой системы\n"; | 
| devi@101 | 38 | 
| devi@101 | 39 (-d $real_path) | 
| devi@101 | 40 or error("Каталог <b>$real_path</b> не существует. Проверьте, пожалуйста, URL\n"); | 
| devi@101 | 41 | 
| devi@101 | 42 if (-e $real_path."/$data_file") { | 
| devi@101 | 43 | 
| devi@101 | 44 # В каталоге есть файл $data_file | 
| devi@101 | 45 # Отлично! Сейчас будем показывать журнал | 
| devi@101 | 46 | 
| devi@101 | 47 # Если существуют html и xml файлы, | 
| devi@101 | 48 # html файл новее чем xml, | 
| devi@101 | 49 # и CGI-скрипту не передано дополнительных параметров, | 
| devi@101 | 50 # используем html файл, иначе перегенируем его | 
| devi@101 | 51 | 
| devi@101 | 52 unless ( -e "$real_path/$data_file" | 
| devi@101 | 53 && -e "$real_path/index.html" | 
| devi@101 | 54 && (stat("$real_path/index.html"))[9] > (stat("$real_path/$data_file"))[9] ) { | 
| devi@101 | 55 | 
| devi@101 | 56 my $l3_frontend = "/home/devi/cvs/lilalo/l3-frontend --backend_datafile $real_path/$data_file --output $real_path/index.html"; | 
| devi@101 | 57 system($l3_frontend) == 0 | 
| devi@101 | 58 or error("Файл журнала найден, но возникла ошибка при его обработке:<br/> $!"); | 
| devi@101 | 59 $print .= "(перегенирован)<br/>"; | 
| devi@101 | 60 } | 
| devi@101 | 61 | 
| devi@101 | 62 { | 
| devi@101 | 63 local $/; | 
| devi@101 | 64 open(HTML, "<:utf8", "$real_path/index.html"); | 
| devi@101 | 65 my $html = <HTML>; | 
| devi@101 | 66 | 
| devi@101 | 67 # Добавим в начало документа навигационную строку | 
| devi@101 | 68 my $nav_bar = nav_bar; | 
| devi@101 | 69 $html =~ s/(<body[^>]*>)/$1$nav_bar/; | 
| devi@101 | 70 | 
| devi@101 | 71 $print .= $html; | 
| devi@101 | 72 close(HTML); | 
| devi@101 | 73 } | 
| devi@101 | 74 | 
| devi@101 | 75 } | 
| devi@101 | 76 else { | 
| devi@101 | 77 | 
| devi@101 | 78 # В этом каталоге нет файла data.xml | 
| devi@101 | 79 # Но в нём должны быть подкаталоги! | 
| devi@101 | 80 # Если и их тут нет, то тут вообще делать нечего | 
| devi@101 | 81 | 
| devi@101 | 82 $print .= nav_bar; | 
| devi@101 | 83 | 
| devi@101 | 84 my @dirs = glob("$real_path/*"); | 
| devi@101 | 85 my $folder_link = "$cgi_path/$path"; | 
| devi@101 | 86 remove_extra_slashes_from($folder_link); | 
| devi@101 | 87 | 
| devi@101 | 88 $folder_link =~ s@/[^\/]*/?$@@; | 
| devi@101 | 89 if ($folder_link) { | 
| devi@101 | 90 $print .= "<img src='$style_files/folder.up.gif'/><a href='$folder_link'>..</a><br/>"; | 
| devi@101 | 91 } | 
| devi@101 | 92 | 
| devi@101 | 93 for my $dir (@dirs) { | 
| devi@101 | 94 next unless (-d $dir); | 
| devi@101 | 95 my ($folder_name) = $dir =~ m@.*/(.*)@; | 
| devi@101 | 96 $folder_link = "$cgi_path/$path/$folder_name"; | 
| devi@101 | 97 $folder_link =~ s@//@/@g; | 
| devi@101 | 98 $print .= "<img src='$style_files/folder.gif'/><a href='$folder_link'>$folder_name</a><br/>"; | 
| devi@101 | 99 } | 
| devi@101 | 100 | 
| devi@101 | 101 $print = print_header("LiLaLo -- ".remove_extra_slashes_from("$cgi_path/$path")) | 
| devi@101 | 102 .$print | 
| devi@101 | 103 .print_footer; | 
| devi@101 | 104 }; | 
| devi@101 | 105 | 
| devi@101 | 106 binmode STDOUT, ":utf8"; | 
| devi@101 | 107 print header(-charset => "utf-8"); | 
| devi@101 | 108 print $print; | 
| devi@101 | 109 exit(0); | 
| devi@101 | 110 | 
| devi@101 | 111 #---------------------------------------------- | 
| devi@101 | 112 | 
| devi@101 | 113 | 
| devi@101 | 114 sub error($) | 
| devi@101 | 115 { | 
| devi@101 | 116 my $message = $_[0]; | 
| devi@101 | 117 | 
| devi@101 | 118 binmode STDOUT, ":utf8"; | 
| devi@101 | 119 print header(-charset => "utf-8"); | 
| devi@101 | 120 | 
| devi@101 | 121 my $print = "<h2>Извините, произошла ошибка</h2>"; | 
| devi@101 | 122 $print .= $message; | 
| devi@101 | 123 | 
| devi@101 | 124 print $print; | 
| devi@101 | 125 exit(0); | 
| devi@101 | 126 } | 
| devi@101 | 127 | 
| devi@101 | 128 | 
| devi@101 | 129 sub path_is_correct($) | 
| devi@101 | 130 { | 
| devi@101 | 131 my $path = $_[0]; | 
| devi@101 | 132 return 0 if $path =~ m@/../@; | 
| devi@101 | 133 return 0 unless $path =~ m@^[a-zA-Z0-9./\@\-]*$@; | 
| devi@101 | 134 return 1; | 
| devi@101 | 135 } | 
| devi@101 | 136 | 
| devi@101 | 137 sub remove_extra_slashes_from($) | 
| devi@101 | 138 { | 
| devi@101 | 139 while ($_[0] =~ s@//@/@g) {1;}; | 
| devi@101 | 140 return $_[0]; | 
| devi@101 | 141 } | 
| devi@101 | 142 | 
| devi@101 | 143 sub print_header($) | 
| devi@101 | 144 { | 
| devi@101 | 145 my $title = $_[0]; | 
| devi@101 | 146 "<html>" | 
| devi@101 | 147 ."<head>" | 
| devi@101 | 148 ."<meta content='text/html; charset=utf-8' http-equiv='Content-Type' />" | 
| devi@101 | 149 ."<link rel='stylesheet' href='$frontend_css' type='text/css'/>" | 
| devi@101 | 150 ."<title>$title</title>" | 
| devi@101 | 151 ."</head>" | 
| devi@101 | 152 } | 
| devi@101 | 153 | 
| devi@101 | 154 sub print_footer() | 
| devi@101 | 155 { | 
| devi@101 | 156 "</html>"; | 
| devi@101 | 157 } | 
| devi@101 | 158 | 
| devi@101 | 159 sub nav_bar() | 
| devi@101 | 160 { | 
| devi@101 | 161 my $nav_bar=""; | 
| devi@101 | 162 my $skip_first=1; | 
| devi@101 | 163 my $current_path=""; | 
| devi@101 | 164 for my $path_part (split("/", remove_extra_slashes_from("$cgi_path/$path"))) { | 
| devi@101 | 165 if ($skip_first) { | 
| devi@101 | 166 $skip_first--; | 
| devi@101 | 167 next; | 
| devi@101 | 168 } | 
| devi@101 | 169 $current_path .= "/$path_part"; | 
| devi@101 | 170 $nav_bar .= "/<a href='$current_path'>$path_part</a>"; | 
| devi@101 | 171 } | 
| devi@101 | 172 return "<table class='nav_bar' cellpadding='0' cellspacing='0' width='100%'><tr><td>$nav_bar</td></tr></table>"; | 
| devi@101 | 173 } | 
| devi@101 | 174 | 
