lilalo
changeset 87:c70be67ed3d4
Наведение порядка в коде.
Обработка чуть лучше отделена от представления.
+ добавлено три совета в документацию
Обработка чуть лучше отделена от представления.
+ добавлено три совета в документацию
author | devi |
---|---|
date | Tue Feb 28 13:11:26 2006 +0200 (2006-02-28) |
parents | 3058ada85a58 |
children | 385499ec544a |
files | l3-frontend |
line diff
1.1 --- a/l3-frontend Sat Feb 25 08:31:35 2006 +0200 1.2 +++ b/l3-frontend Tue Feb 28 13:11:26 2006 +0200 1.3 @@ -24,7 +24,7 @@ 1.4 # ^^^ 1.5 1.6 our %Stat; 1.7 -our %CommandsFDistribution; # Сколько раз в журнале встречается какая команда 1.8 +our %frequency_of_command; # Сколько раз в журнале встречается какая команда 1.9 our $table_number=1; 1.10 1.11 my %mywi_cache_for; # Кэш для экономии обращений к mywi 1.12 @@ -39,6 +39,8 @@ 1.13 sub main; 1.14 sub collapse_list($); 1.15 1.16 +sub minutes_passed; 1.17 + 1.18 sub print_all; 1.19 sub print_command_lines; 1.20 sub print_files; 1.21 @@ -177,7 +179,7 @@ 1.22 # Commands 1.23 for my $command (@commands) { 1.24 $command =~ s/'//g; 1.25 - $CommandsFDistribution{$command}++; 1.26 + $frequency_of_command{$command}++; 1.27 if (!$Commands_Description{$command}) { 1.28 $mywi_cache_for{$command} ||= mywi_client ($command) || ""; 1.29 my $mywi = join ("\n", grep(/\([18]|sh|script\)/, split(/\n/, $mywi_cache_for{$command}))); 1.30 @@ -320,6 +322,45 @@ 1.31 $$cl->{"class"}.="_root"; 1.32 } 1.33 1.34 +# my $hint; 1.35 +# $hint = make_comment($$cl->{"cline"}); 1.36 +# if ($hint) { 1.37 +# $$cl->{hint} = $hint; 1.38 +# } 1.39 + $$cl->{hint}=""; 1.40 + 1.41 +# Выводим <head_lines> верхних строк 1.42 +# и <tail_lines> нижних строк, 1.43 +# если эти параметры существуют 1.44 + my $output=""; 1.45 + 1.46 + if ($$cl->{"last_command"} eq "cat" && !$$cl->{"err"} && !($$cl->{"cline"} =~ /</)) { 1.47 + my $filename = $$cl->{"cline"}; 1.48 + $filename =~ s/.*\s+(\S+)\s*$/$1/; 1.49 + $Files{$filename}->{"content"} = $$cl->{"output"}; 1.50 + $Files{$filename}->{"source_command_id"} = $$cl->{"id"} 1.51 + } 1.52 + my @lines = split '\n', $$cl->{"output"}; 1.53 + if (( 1.54 + $Config{"head_lines"} 1.55 + || $Config{"tail_lines"} 1.56 + ) 1.57 + && $#lines > $Config{"head_lines"} + $Config{"tail_lines"} ) { 1.58 +# 1.59 + for (my $i=0; $i<= $#lines && $i < $Config{"head_lines"}; $i++) { 1.60 + $output .= $lines[$i]."\n"; 1.61 + } 1.62 + $output .= $Config{"skip_text"}."\n"; 1.63 + 1.64 + my $start_line=$#lines-$Config{"tail_lines"}+1; 1.65 + for (my $i=$start_line; $i<= $#lines; $i++) { 1.66 + $output .= $lines[$i]."\n"; 1.67 + } 1.68 + } 1.69 + else { 1.70 + $output = $$cl->{"output"}; 1.71 + } 1.72 + $$cl->{short_output} = $output; 1.73 1.74 #Обработка пометок 1.75 # Если несколько пометок (notes) идут подряд, 1.76 @@ -379,6 +420,13 @@ 1.77 $$cl=0; 1.78 } 1.79 } 1.80 + if ($$cl->{"class"} == "note") { 1.81 + my $note_html = $$cl->{note}; 1.82 + $note_html = join ("\n", map ("<p>$_</p>", split (/-\n/, $note))); 1.83 + $note_html =~ s@(http:[a-zA-Z.0-9/?\_%-]*)@<a href='$1'>$1</a>@g; 1.84 + $note_html =~ s@(www\.[a-zA-Z.0-9/?\_%-]*)@<a href='$1'>$1</a>@g; 1.85 + $$cl->{"note_html"} = $note_html; 1.86 + } 1.87 } 1.88 1.89 } 1.90 @@ -420,8 +468,6 @@ 1.91 } 1.92 } 1.93 1.94 - #$result = "Filter=".$Config{filter}."\n"; 1.95 - 1.96 $Stat{LastCommand} ||= 0; 1.97 $Stat{TotalCommands} ||= 0; 1.98 $Stat{ErrorCommands} ||= 0; 1.99 @@ -451,11 +497,7 @@ 1.100 # Если у нас недостаточно информации о том, подходит строка под фильтр или нет, 1.101 # мы её выводим 1.102 1.103 - #$result .= "before<br/>"; 1.104 for my $filter_key (keys %filter) { 1.105 - #$result .= "undefined local session id<br/>\n" if !defined($cl->{local_session_id}); 1.106 - #$result .= "undefined filter key $filter_key <br/>\n" if !defined($Sessions{$cl->{local_session_id}}->{$filter_key}); 1.107 - #$result .= $Sessions{$cl->{local_session_id}}->{$filter_key}." != ".$filter{$filter_key}; 1.108 next COMMAND_LINE 1.109 if defined($cl->{local_session_id}) 1.110 && defined($Sessions{$cl->{local_session_id}}->{$filter_key}) 1.111 @@ -470,10 +512,13 @@ 1.112 $Stat{TotalTime} += $cl->{time} - $Stat{LastCommand} 1.113 } 1.114 my $seconds_since_last_command = $cl->{time} - $Stat{LastCommand}; 1.115 + 1.116 + if ($Stat{LastCommand} > $cl->{time}) { 1.117 + $result .= "Время идёт вспять<br/>"; 1.118 + }; 1.119 $Stat{LastCommand} = $cl->{time}; 1.120 $Stat{TotalCommands}++; 1.121 1.122 - 1.123 # Пропускаем строки, выходящие за границу "signature", 1.124 # при условии, что границы указаны 1.125 # Пропускаем неправильные/прерванные/другие команды 1.126 @@ -490,14 +535,22 @@ 1.127 || ($Config{"skip_wrong"} =~ /^y/i && $cl->{"err"} != 0) 1.128 || ($Config{"skip_interrupted"} =~ /^y/i && $cl->{"err"} == 130); 1.129 1.130 + 1.131 + 1.132 + 1.133 +# 1.134 +## 1.135 +## Начинается собственно вывод 1.136 +## 1.137 +# 1.138 + 1.139 +### Сначала обрабатываем границы разделов 1.140 +### Если тип команды "note", это граница 1.141 + 1.142 if ($cl->{class} eq "note") { 1.143 - my $note = $cl->{note}; 1.144 - $note = join ("\n", map ("<p>$_</p>", split (/-\n/, $note))); 1.145 - $note =~ s@(http:[a-zA-Z.0-9/?\_%-]*)@<a href='$1'>$1</a>@g; 1.146 - $note =~ s@(www\.[a-zA-Z.0-9/?\_%-]*)@<a href='$1'>$1</a>@g; 1.147 $this_day_result .= "<tr><td colspan='6'>" 1.148 . "<h4 id='note$note_number'>".$cl->{note_title}."</h4>" if $cl->{note_title} 1.149 - . "".$note."<p/><p/></td></tr>"; 1.150 + . "".$cl->{note_html}."<p/><p/></td></tr>"; 1.151 1.152 if ($cl->{note_title}) { 1.153 push @{$toc[@toc]},"<a href='#note$note_number'>".$cl->{note_title}."</a>"; 1.154 @@ -506,45 +559,6 @@ 1.155 next; 1.156 } 1.157 1.158 - 1.159 - my $output=""; 1.160 -# Выводим <head_lines> верхних строк 1.161 -# и <tail_lines> нижних строк, 1.162 -# если эти параметры существуют 1.163 - 1.164 - if ($cl->{"last_command"} eq "cat" && !$cl->{"err"} && !($cl->{"cline"} =~ /</)) { 1.165 - my $filename = $cl->{"cline"}; 1.166 - $filename =~ s/.*\s+(\S+)\s*$/$1/; 1.167 - $Files{$filename}->{"content"} = $cl->{"output"}; 1.168 - $Files{$filename}->{"source_command_id"} = $cl->{"id"} 1.169 - } 1.170 - my @lines = split '\n', $cl->{"output"}; 1.171 - if (( 1.172 - $Config{"head_lines"} 1.173 - || $Config{"tail_lines"} 1.174 - ) 1.175 - && $#lines > $Config{"head_lines"} + $Config{"tail_lines"} ) { 1.176 - 1.177 - for (my $i=0; $i<= $#lines && $i < $Config{"head_lines"}; $i++) { 1.178 - $output .= $lines[$i]."\n"; 1.179 - } 1.180 - $output .= $Config{"skip_text"}."\n"; 1.181 - 1.182 - my $start_line=$#lines-$Config{"tail_lines"}+1; 1.183 - for ($i=$start_line; $i<= $#lines; $i++) { 1.184 - $output .= $lines[$i]."\n"; 1.185 - } 1.186 - } 1.187 - else { 1.188 - $ output .= $cl->{"output"}; 1.189 - } 1.190 - 1.191 -# 1.192 -## 1.193 -## Начинается собственно вывод 1.194 -## 1.195 -# 1.196 - 1.197 my ($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = localtime($cl->{time}); 1.198 1.199 # Добавляем спереди 0 для удобочитаемости 1.200 @@ -555,47 +569,27 @@ 1.201 $class=$cl->{"class"}; 1.202 $Stat{ErrorCommands}++ if $class =~ /wrong/; 1.203 $Stat{MistypedCommands}++ if $class =~ /mistype/; 1.204 - 1.205 - 1.206 + 1.207 # DAY CHANGE 1.208 if ( $last_day ne $day) { 1.209 if ($last_day) { 1.210 1.211 # Вычисляем разность множеств. 1.212 # Что-то вроде этого, если бы так можно было писать: 1.213 -# @new_commands = keys %CommandsFDistribution - @known_commands; 1.214 +# @new_commands = keys %frequency_of_command - @known_commands; 1.215 1.216 1.217 $result .= "<h3 id='day$last_day'>".$Day_Name[$last_wday]."</h3>"; 1.218 - 1.219 - 1.220 - 1.221 for my $entry_class (sort keys %new_entries_of) { 1.222 - my $new_commands_section = make_new_entries_table($entry_class=~/[0-9]+\s+(.*)/, \@known_commands); 1.223 - 1.224 - my $table_caption = "Таблица " 1.225 - . $table_number++ 1.226 - . ". " 1.227 - . $Day_Name[$last_wday] 1.228 - . ". Новые " 1.229 - . $new_entries_of{$entry_class}; 1.230 - if ($new_commands_section) { 1.231 - $result .= "<table class='new_commands_table' width='700' cellspacing='0' cellpadding='0'>" 1.232 - . "<tr class='new_commands_caption'>" 1.233 - . "<td colspan='2' align='right'>$table_caption</td>" 1.234 - . "</tr>" 1.235 - . "<tr class='new_commands_header'>" 1.236 - . "<td width=100>Команда</td><td width=600>Описание</td>" 1.237 - . "</tr>" 1.238 - . $new_commands_section 1.239 - . "</table>" 1.240 - } 1.241 - 1.242 + my $table_caption = "Таблица ".$table_number++.".".$Day_Name[$last_wday] 1.243 + .". Новые ".$new_entries_of{$entry_class}; 1.244 + my $new_commands_section = make_new_entries_table( 1.245 + $table_caption, 1.246 + $entry_class=~/[0-9]+\s+(.*)/, 1.247 + \@known_commands); 1.248 } 1.249 - @known_commands = keys %CommandsFDistribution; 1.250 - #$result .= "<table width='100%'>\n"; 1.251 + @known_commands = keys %frequency_of_command; 1.252 $result .= $this_day_result; 1.253 - #$result .= "</table>"; 1.254 } 1.255 1.256 push @toc, "<a href='#day$day'>".$Day_Name[$wday]."</a>\n"; 1.257 @@ -603,47 +597,11 @@ 1.258 $last_wday=$wday; 1.259 $this_day_result = q(); 1.260 } 1.261 - elsif ($seconds_since_last_command > 7200) { 1.262 - my $hours_passed = int($seconds_since_last_command/3600); 1.263 - my $passed_word = $hours_passed % 10 == 1 ? "прошла" 1.264 - : "прошло"; 1.265 - my $hours_word = $hours_passed % 10 == 1 ? "часа": 1.266 - "часов"; 1.267 - $this_day_result .= "<div class='much_time_passed'>" 1.268 - . $passed_word." >".$hours_passed." ".$hours_word 1.269 - . "</div>\n"; 1.270 - } 1.271 - elsif ($seconds_since_last_command > 600) { 1.272 - my $minutes_passed = int($seconds_since_last_command/60); 1.273 - 1.274 - 1.275 - my $passed_word = $minutes_passed % 100 > 10 1.276 - && $minutes_passed % 100 < 20 ? "прошло" 1.277 - : $minutes_passed % 10 == 1 ? "прошла" 1.278 - : "прошло"; 1.279 - 1.280 - my $minutes_word = $minutes_passed % 100 > 10 1.281 - && $minutes_passed % 100 < 20 ? "минут" : 1.282 - $minutes_passed % 10 == 1 ? "минута": 1.283 - $minutes_passed % 10 == 0 ? "минут" : 1.284 - $minutes_passed % 10 > 4 ? "минут" : 1.285 - "минуты"; 1.286 - 1.287 - if ($seconds_since_last_command < 1800) { 1.288 - $this_day_result .= "<div class='time_passed'>" 1.289 - . $passed_word." ".$minutes_passed." ".$minutes_word 1.290 - . "</div>\n"; 1.291 - } 1.292 - else { 1.293 - $this_day_result .= "<div class='much_time_passed'>" 1.294 - . $passed_word." ".$minutes_passed." ".$minutes_word 1.295 - . "</div>\n"; 1.296 - } 1.297 + else { 1.298 + $this_day_result .= minutes_passed($seconds_since_last_command); 1.299 } 1.300 1.301 - #$this_day_result .= "<table cellspacing='0' cellpading='0' class='command' id='command:".$cl->{"id"}."' width='100%'><tr>\n"; 1.302 $this_day_result .= "<div class='command' id='command:".$cl->{"id"}."' >\n"; 1.303 - 1.304 1.305 # CONSOLE CHANGE 1.306 if ($cl->{"tty"} && $last_tty ne $cl->{"tty"} && 0) { 1.307 @@ -657,44 +615,29 @@ 1.308 # Session change 1.309 if ( $last_session ne $cl->{"local_session_id"}) { 1.310 my $tty = $cl->{"tty"}; 1.311 - $this_day_result .= "<a href='?local_session_id=".$cl->{"local_session_id"}."'><div class='ttychange'>" 1.312 + $this_day_result .= "<div class='ttychange'><a href='?local_session_id=".$cl->{"local_session_id"}."'>" 1.313 . $Sessions{$cl->{"local_session_id"}}->{"tty"} 1.314 - ."</div></a>"; 1.315 + ."</a></div>"; 1.316 $last_session=$cl->{"local_session_id"}; 1.317 } 1.318 1.319 # TIME 1.320 - $this_day_result .= "<div class='time'>$hour:$min:$sec</div>" 1.321 - if $Config{"show_time"} =~ /^y/i; 1.322 - 1.323 - #$this_day_result .= $Config{"show_time"} =~ /^y/i 1.324 - # ? "<td width='100' valign='top' class='time' width='$Config{time_width}'>$hour:$min:$sec</td>" 1.325 - # : "<td width='0'/>"; 1.326 - 1.327 -# CLASS 1.328 -# if ($cl->{"err"}) { 1.329 -# $this_day_result .= "<td width='6' valign='top'>" 1.330 -# . "<table><tr><td width='6' height='6' class='err_box'>" 1.331 -# . "E" 1.332 -# . "</td></tr></table>" 1.333 -# . "</td>"; 1.334 -# } 1.335 -# else { 1.336 -# $this_day_result .= "<td width='10' valign='top'>" 1.337 -# . " " 1.338 -# . "</td>"; 1.339 -# } 1.340 + if ($Config{"show_time"} =~ /^y/i) { 1.341 + $this_day_result .= "<div class='time'>$hour:$min:$sec</div>" 1.342 + } 1.343 1.344 # COMMAND 1.345 - my $hint = make_comment($cl->{"cline"}); 1.346 - 1.347 my $cline; 1.348 $prompt_hint = join (" ", map("$_=$cl->{$_}", grep (!/^(output|diff)$/, sort(keys(%{$cl}))))); 1.349 $cline = "<span title='$prompt_hint'>".$cl->{"prompt"}."</span>".$cl->{"cline"}; 1.350 $cline =~ s/\n//; 1.351 1.352 - $cline = "<span title='$hint' class='with_hint'>$cline</span>" if $hint; 1.353 - $cline = "<span class='without_hint'>$cline</span>" if !$hint; 1.354 + if ($cl->{"hint"}) { 1.355 + $cline = "<span title='$cl->{hint}' class='with_hint'>$cline</span>" ; 1.356 + } 1.357 + else { 1.358 + $cline = "<span class='without_hint'>$cline</span>"; 1.359 + } 1.360 1.361 $this_day_result .= "<table cellpadding='0' cellspacing='0'><tr><td>\n<div class='cblock_$cl->{class}'>\n"; 1.362 $this_day_result .= "<div class='cline'>\n" . $cline ; #cline 1.363 @@ -710,8 +653,8 @@ 1.364 $Config{"suppress_pagers"} =~ /^y/i && grep ($_ eq $last_command, @{$Config{"pagers"}}) || 1.365 $Config{"suppress_terminal"}=~ /^y/i && grep ($_ eq $last_command, @{$Config{"terminal"}}) 1.366 )) { 1.367 - $this_day_result .= "<pre class='output'>\n" . $output . "</pre>\n"; 1.368 - } 1.369 + $this_day_result .= "<pre class='output'>\n" . $cl->{short_output} . "</pre>\n"; 1.370 + } 1.371 1.372 # DIFF 1.373 $this_day_result .= "<pre class='diff'>".$cl->{"diff"}."</pre>" 1.374 @@ -738,19 +681,6 @@ 1.375 $this_day_result .= "</div>\n"; 1.376 } 1.377 1.378 -# COMMENT 1.379 - if ( $Config{"show_comments"} =~ /^y/i) { 1.380 - my $comment = make_comment($cl->{"cline"}); 1.381 - if ($comment) { 1.382 - $this_day_result .= 1.383 - "<div class='note' width='100%'>" 1.384 - . $comment 1.385 - . "</div>\n" 1.386 - ; 1.387 - 1.388 - } 1.389 - } 1.390 - 1.391 # Вывод очередной команды окончен 1.392 $this_day_result .= "</div>\n"; # cblock 1.393 $this_day_result .= "</td></tr></table>\n" 1.394 @@ -760,28 +690,14 @@ 1.395 $result .= "<h3 id='day$last_day'>".$Day_Name[$last_wday]."</h3>"; 1.396 1.397 for my $entry_class (keys %new_entries_of) { 1.398 - my $new_commands_section = make_new_entries_table($entry_class=~/[0-9]+\s+(.*)/, \@known_commands); 1.399 - my $table_caption = "Таблица " 1.400 - . $table_number++ 1.401 - . ". " 1.402 - . $Day_Name[$last_wday] 1.403 - . ". Новые " 1.404 - . $new_entries_of{$entry_class}; 1.405 - if ($new_commands_section) { 1.406 - $result .= "<table class='new_commands_table' width='700' cellspacing='0' cellpadding='0'>" 1.407 - . "<tr class='new_commands_caption'>" 1.408 - . "<td colspan='2' align='right'>$table_caption</td>" 1.409 - . "</tr>" 1.410 - . "<tr class='new_commands_header'>" 1.411 - . "<td width=100>Команда</td><td width=600>Описание</td>" 1.412 - . "</tr>" 1.413 - . $new_commands_section 1.414 - . "</table>" 1.415 - } 1.416 - 1.417 + my $table_caption = "Таблица ".$table_number++.".".$Day_Name[$last_wday] 1.418 + . ". Новые ".$new_entries_of{$entry_class}; 1.419 + my $new_commands_section = make_new_entries_table( 1.420 + $table_caption, 1.421 + $entry_class=~/[0-9]+\s+(.*)/, 1.422 + \@known_commands); 1.423 } 1.424 - @known_commands = keys %CommandsFDistribution; 1.425 - 1.426 + @known_commands = keys %frequency_of_command; 1.427 $result .= $this_day_result; 1.428 } 1.429 1.430 @@ -789,25 +705,36 @@ 1.431 1.432 } 1.433 1.434 +############# 1.435 +# print_all 1.436 +# 1.437 +# Напечатать таблицу неизвестных команд 1.438 +# 1.439 +# In: $_[0] table_caption 1.440 +# $_[1] entries_class 1.441 +# @_[2..] known_commands 1.442 +# Out: 1.443 + 1.444 sub make_new_entries_table 1.445 { 1.446 + my $table_caption; 1.447 my $entries_class = shift; 1.448 my @known_commands = @{$_[0]}; 1.449 + my $result = ""; 1.450 1.451 my %count; 1.452 my @new_commands = (); 1.453 - for my $c (keys %CommandsFDistribution, @known_commands) { 1.454 + for my $c (keys %frequency_of_command, @known_commands) { 1.455 $count{$c}++ 1.456 } 1.457 - for my $c (keys %CommandsFDistribution) { 1.458 + for my $c (keys %frequency_of_command) { 1.459 push @new_commands, $c if $count{$c} != 2; 1.460 } 1.461 1.462 - 1.463 my $new_commands_section; 1.464 if (@new_commands){ 1.465 my $hint; 1.466 - for my $c (reverse sort { $CommandsFDistribution{$a} <=> $CommandsFDistribution{$b} } @new_commands) { 1.467 + for my $c (reverse sort { $frequency_of_command{$a} <=> $frequency_of_command{$b} } @new_commands) { 1.468 $hint = make_comment($c); 1.469 next unless $hint; 1.470 my ($command, $hint) = $hint =~ m/(.*?) \s*- \s*(.*)/; 1.471 @@ -815,9 +742,71 @@ 1.472 $new_commands_section .= "<tr><td valign='top'>$command</td><td>$hint</td></tr>"; 1.473 } 1.474 } 1.475 - return $new_commands_section; 1.476 + if ($new_commands_section) { 1.477 + $result .= "<table class='new_commands_table' width='700' cellspacing='0' cellpadding='0'>" 1.478 + . "<tr class='new_commands_caption'>" 1.479 + . "<td colspan='2' align='right'>$table_caption</td>" 1.480 + . "</tr>" 1.481 + . "<tr class='new_commands_header'>" 1.482 + . "<td width=100>Команда</td><td width=600>Описание</td>" 1.483 + . "</tr>" 1.484 + . $new_commands_section 1.485 + . "</table>" 1.486 + } 1.487 + return $result; 1.488 } 1.489 1.490 +############# 1.491 +# print_all 1.492 +# 1.493 +# 1.494 +# 1.495 +# In: $_[0] seconds_since_last_command 1.496 +# Out: "minutes passed" text 1.497 + 1.498 +sub minutes_passed 1.499 +{ 1.500 + my $seconds_since_last_command = shift; 1.501 + my $result = ""; 1.502 + if ($seconds_since_last_command > 7200) { 1.503 + my $hours_passed = int($seconds_since_last_command/3600); 1.504 + my $passed_word = $hours_passed % 10 == 1 ? "прошла" 1.505 + : "прошло"; 1.506 + my $hours_word = $hours_passed % 10 == 1 ? "часа": 1.507 + "часов"; 1.508 + $result .= "<div class='much_time_passed'>" 1.509 + . $passed_word." >".$hours_passed." ".$hours_word 1.510 + . "</div>\n"; 1.511 + } 1.512 + elsif ($seconds_since_last_command > 600) { 1.513 + my $minutes_passed = int($seconds_since_last_command/60); 1.514 + 1.515 + 1.516 + my $passed_word = $minutes_passed % 100 > 10 1.517 + && $minutes_passed % 100 < 20 ? "прошло" 1.518 + : $minutes_passed % 10 == 1 ? "прошла" 1.519 + : "прошло"; 1.520 + 1.521 + my $minutes_word = $minutes_passed % 100 > 10 1.522 + && $minutes_passed % 100 < 20 ? "минут" : 1.523 + $minutes_passed % 10 == 1 ? "минута": 1.524 + $minutes_passed % 10 == 0 ? "минут" : 1.525 + $minutes_passed % 10 > 4 ? "минут" : 1.526 + "минуты"; 1.527 + 1.528 + if ($seconds_since_last_command < 1800) { 1.529 + $result .= "<div class='time_passed'>" 1.530 + . $passed_word." ".$minutes_passed." ".$minutes_word 1.531 + . "</div>\n"; 1.532 + } 1.533 + else { 1.534 + $result .= "<div class='much_time_passed'>" 1.535 + . $passed_word." ".$minutes_passed." ".$minutes_word 1.536 + . "</div>\n"; 1.537 + } 1.538 + } 1.539 + return $result; 1.540 +} 1.541 1.542 ############# 1.543 # print_all 1.544 @@ -1041,7 +1030,7 @@ 1.545 # Некоторые значения пересчитываются! 1.546 # Дальше их лучше уже не использовать!!! 1.547 1.548 - my %CommandsFrequency = %CommandsFDistribution; 1.549 + my %CommandsFrequency = %frequency_of_command; 1.550 1.551 $Stat{TotalTime} ||= 0; 1.552 my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($Stat{FirstCommand} || 0); 1.553 @@ -1362,6 +1351,41 @@ 1.554 добавляются точно таким же способом, только вместо симолов #^ или #v 1.555 нужно использовать символы #= 1.556 </p></li> 1.557 + 1.558 + <p><li> 1.559 + Содержимое файла может быть показано в журнале. 1.560 + Для этого его нужно вывести с помощью программы cat. 1.561 + Если вывод команды отметить симоволами #!, 1.562 + содержимое файла будет показано в журнале 1.563 + в специально отведённой для этого секции. 1.564 + </li></p> 1.565 + 1.566 + <p> 1.567 + <li> 1.568 + Для того чтобы вставить скриншот интересующего вас окна в журнал, 1.569 + нужно воспользоваться командой l3shot. 1.570 + После того как команда вызвана, нужно с помощью мыши выбрать окно, которое 1.571 + должно быть в журнале. 1.572 + </li> 1.573 + </p> 1.574 + 1.575 + <p> 1.576 + <li> 1.577 + Команды в журнале расположены в хронологическом порядке. 1.578 + Если две команды давались одна за другой, но на разных терминалах, 1.579 + в журнале они будут рядом, даже если они не имеют друг к другу никакого отношения. 1.580 +<pre> 1.581 +1 1.582 + 2 1.583 +3 1.584 + 4 1.585 +</pre> 1.586 + Группы команд, выполненных на разных терминалах, разделяются специальной линией. 1.587 + Под этой линией в правом углу показано имя терминала, на котором выполнялись команды. 1.588 + Для того чтобы посмотреть команды только одного сенса, 1.589 + нужно щёкнуть по этому названию. 1.590 + </li> 1.591 + </p> 1.592 </ol> 1.593 HELP 1.594