lilalo

diff l3-frontend @ 87:c70be67ed3d4

Наведение порядка в коде.
Обработка чуть лучше отделена от представления.

+ добавлено три совета в документацию
author devi
date Tue Feb 28 13:11:26 2006 +0200 (2006-02-28)
parents 2cb912bff2ea
children 385499ec544a
line diff
     1.1 --- a/l3-frontend	Sat Feb 25 08:02:25 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." &gt;".$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 ("&#10;", 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." &gt;".$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