| rev | line source | 
| devi@23 | 1 #!/usr/bin/perl -w | 
| devi@23 | 2 | 
| devi@23 | 3 use lib '.'; | 
| devi@23 | 4 use l3config; | 
| devi@23 | 5 | 
| devi@23 | 6 our @Command_Lines; | 
| devi@23 | 7 | 
| devi@23 | 8 # vvv Инициализация переменных выполняется процедурой init_variables | 
| devi@23 | 9 our @Day_Name; | 
| devi@23 | 10 our @Month_Name; | 
| devi@23 | 11 our @Of_Month_Name; | 
| devi@23 | 12 our %Search_Machines; | 
| devi@23 | 13 our %Elements_Visibility; | 
| devi@23 | 14 # ^^^ | 
| devi@23 | 15 | 
| devi@23 | 16 sub search_buy; | 
| devi@23 | 17 sub make_comment; | 
| devi@23 | 18 sub load_command_lines_from_xml; | 
| devi@23 | 19 sub print_command_lines; | 
| devi@23 | 20 sub init_variables; | 
| devi@23 | 21 sub main; | 
| devi@23 | 22 | 
| devi@23 | 23 main(); | 
| devi@23 | 24 | 
| devi@23 | 25 sub main | 
| devi@23 | 26 { | 
| devi@23 | 27 	$| = 1; | 
| devi@23 | 28 | 
| devi@23 | 29 	init_variables(); | 
| devi@23 | 30 	init_config(); | 
| devi@23 | 31 | 
| devi@23 | 32 	load_command_lines_from_xml($Config{"cache"}); | 
| devi@23 | 33 	print_command_lines($Config{"output"}); | 
| devi@23 | 34 } | 
| devi@23 | 35 | 
| devi@23 | 36 | 
| devi@23 | 37 sub search_by | 
| devi@23 | 38 { | 
| devi@23 | 39 	my $sm = shift; | 
| devi@23 | 40 	my $topic = shift; | 
| devi@23 | 41 	$topic =~ s/ /+/; | 
| devi@23 | 42 | 
| devi@23 | 43 	return "<a href='".	$Search_Machines{$sm}->{"query"}."$topic'><img width='16' height='16' src='". | 
| devi@23 | 44 				$Search_Machines{$sm}->{"icon"}."' border='0'/></a>"; | 
| devi@23 | 45 } | 
| devi@23 | 46 | 
| devi@23 | 47 sub make_comment | 
| devi@23 | 48 { | 
| devi@23 | 49 	my $commands = $_[0]; | 
| devi@23 | 50 	my $files = $_[1]; | 
| devi@23 | 51 	chomp $commands; | 
| devi@23 | 52 	chomp $files; | 
| devi@23 | 53 	return if (!$commands && !$files); | 
| devi@23 | 54 | 
| devi@23 | 55 	my $comment=""; | 
| devi@23 | 56 | 
| devi@23 | 57 	# Commands | 
| devi@23 | 58 	for my $command (split /\s+/,$commands) { | 
| devi@23 | 59 		$command =~ s/'//g; | 
| devi@23 | 60 		my $description=""; | 
| devi@23 | 61 		eval { $description=`mywi-client '$command'`; } ; | 
| devi@23 | 62 		$description = join ("<br>\n", grep(/\([18]\)/, split(/\n/, $description))); | 
| devi@23 | 63 		$description =~ s/.*?-//; | 
| devi@23 | 64 		next if $description =~ /^\s*$/; | 
| devi@23 | 65 | 
| devi@23 | 66 		my $query=$command." ".$Config{"keywords"}; | 
| devi@23 | 67 		$query =~ s/\ /+/g; | 
| devi@23 | 68 		my $search= 	search_by("opennet",$query). | 
| devi@23 | 69 				search_by("local",$command). | 
| devi@23 | 70 				search_by("google",$query); | 
| devi@23 | 71 | 
| devi@23 | 72 		$comment .=     "<tr><td class='note_title'>$command</td>". | 
| devi@23 | 73 				"<td class='note_search'>$search</td>". | 
| devi@23 | 74 				"</tr><tr><td width='100%' colspan='2' class='note_text'>". | 
| devi@23 | 75 				"$description</td></tr><tr/>"; | 
| devi@23 | 76 	} | 
| devi@23 | 77 | 
| devi@23 | 78 	# Files | 
| devi@23 | 79 	for my $file (split /\s+/,$files) { | 
| devi@23 | 80 		$file =~ s@.*/@@; | 
| devi@23 | 81 		$file =~ s/'//g; | 
| devi@23 | 82 		next if $file =~ /^\s*$/; | 
| devi@23 | 83 		next if $file =~ /^-/; | 
| devi@23 | 84 | 
| devi@23 | 85 		my $description=`mywi '$file'`; | 
| devi@23 | 86 		$description = join ("<br>\n", grep(/\(5\)/, split(/\n/, $description))); | 
| devi@23 | 87 		next if $description =~ /^\s*$/; | 
| devi@23 | 88 | 
| devi@23 | 89 		my $query=$file." ".$Config{"files_keywords"}; | 
| devi@23 | 90 		$query =~ s/\ /+/g; | 
| devi@23 | 91 		my $search= 	search_by("opennet",$query). | 
| devi@23 | 92 				search_by("local",$file). | 
| devi@23 | 93 				search_by("google",$query); | 
| devi@23 | 94 | 
| devi@23 | 95 		$comment .=     "<tr><td class='note_title'>$file</td>". | 
| devi@23 | 96 				"<td class='note_search'>$search</td>". | 
| devi@23 | 97 				"</tr><tr><td width='100%' colspan='2' class='note_text'>". | 
| devi@23 | 98 				"$description</td></tr><tr/>"; | 
| devi@23 | 99 	} | 
| devi@23 | 100 | 
| devi@23 | 101 | 
| devi@23 | 102 	return $comment; | 
| devi@23 | 103 } | 
| devi@23 | 104 | 
| devi@23 | 105 =cut | 
| devi@23 | 106 Процедура load_command_lines_from_xml выполняет загрузку разобранного lab-скрипта | 
| devi@23 | 107 из XML-документа в переменную @Command_Lines | 
| devi@23 | 108 | 
| devi@23 | 109 Предупреждение! | 
| devi@23 | 110 Процедура не в состоянии обрабатывать XML-документ любой структуры. | 
| devi@23 | 111 В действительности файл cache из которого загружаются данные | 
| devi@23 | 112 просто напоминает XML с виду. | 
| devi@23 | 113 =cut | 
| devi@23 | 114 sub load_command_lines_from_xml | 
| devi@23 | 115 { | 
| devi@23 | 116 	my $datafile = $_[0]; | 
| devi@23 | 117 | 
| devi@23 | 118 	open (CLASS, $datafile) | 
| devi@23 | 119 		or die "Can't open file of the class ",$datafile,"\n"; | 
| devi@23 | 120 	local $/; | 
| devi@23 | 121 	$data = <CLASS>; | 
| devi@23 | 122 	close(CLASS); | 
| devi@23 | 123 | 
| devi@23 | 124 	for $command ($data =~ m@<command>(.*?)</command>@sg) { | 
| devi@23 | 125 		my %cl; | 
| devi@23 | 126 		while ($command =~ m@<([^>]*?)>(.*?)</\1>@sg) { | 
| devi@23 | 127 			$cl{$1} = $2; | 
| devi@23 | 128 		} | 
| devi@23 | 129 		push @Command_Lines, \%cl; | 
| devi@23 | 130 	} | 
| devi@23 | 131 } | 
| devi@23 | 132 | 
| devi@23 | 133 =cut | 
| devi@23 | 134 Процедура print_command_lines выводит HTML-представление | 
| devi@23 | 135 разобранного lab-скрипта. | 
| devi@23 | 136 | 
| devi@23 | 137 Разобранный lab-скрипт должен находиться в массиве @Command_Lines | 
| devi@23 | 138 =cut | 
| devi@23 | 139 | 
| devi@23 | 140 sub print_command_lines | 
| devi@23 | 141 { | 
| devi@23 | 142 	my $output_filename=$_[0]; | 
| devi@23 | 143 | 
| devi@23 | 144 	my $course_name = $Config{"course-name"}; | 
| devi@23 | 145 	my $course_code = $Config{"course-code"}; | 
| devi@23 | 146 	my $course_date = $Config{"course-date"}; | 
| devi@23 | 147 	my $course_center = $Config{"course-center"}; | 
| devi@23 | 148 	my $course_trainer = $Config{"course-trainer"}; | 
| devi@23 | 149 	my $course_student = $Config{"course-student"}; | 
| devi@23 | 150 | 
| devi@23 | 151 | 
| devi@23 | 152 	# Результат выполнения процедуры равен | 
| devi@23 | 153 	# join("", @Result{header,body,stat,help,about,footer}) | 
| devi@23 | 154 	my %Result; | 
| devi@23 | 155 	my $toc ="";  # Хранит оглавление по дням | 
| devi@23 | 156 | 
| devi@23 | 157 	$Result{"body"} = "<table width='100%'>\n"; | 
| devi@23 | 158 | 
| devi@23 | 159 	my $cl; | 
| devi@23 | 160 	my $last_tty=""; | 
| devi@23 | 161 	my $last_day=""; | 
| devi@23 | 162 	my $in_range=0; | 
| devi@23 | 163 | 
| devi@23 | 164 	for my $cl (@Command_Lines) { | 
| devi@23 | 165 | 
| devi@23 | 166 		if ($Config{"from"} && $cl->{"cline"} =~ /$Config{"signature"}\s*$Config{"from"}/) { | 
| devi@23 | 167 			$in_range=1; | 
| devi@23 | 168 			next; | 
| devi@23 | 169 		} | 
| devi@23 | 170 		if ($Config{"to"} && $cl->{"cline"} =~ /$Config{"signature"}\s*$Config{"to"}/) { | 
| devi@23 | 171 			$in_range=0; | 
| devi@23 | 172 			next; | 
| devi@23 | 173 		} | 
| devi@23 | 174 		next if ($Config{"from"} && $Config{"to"} && !$in_range) | 
| devi@23 | 175 			|| | 
| devi@23 | 176 		    	($Config{"skip_empty"} =~ /^y/i && $cl->{"cline"} =~ /^\s*$/ ) | 
| devi@23 | 177 			|| | 
| devi@23 | 178 			($Config{"skip_wrong"} =~ /^y/i && $cl->{"err"} != 0) | 
| devi@23 | 179 			|| | 
| devi@23 | 180 			($Config{"skip_interrupted"} =~ /^y/i && $cl->{"err"} == 130); | 
| devi@23 | 181 | 
| devi@23 | 182 		#my @new_commands=@{$cl->{"new_commands"}}; | 
| devi@23 | 183 		#my @new_files=@{$cl->{"new_files"}}; | 
| devi@23 | 184 | 
| devi@23 | 185 		my $cl_class="cline"; | 
| devi@23 | 186 		my $out_class="output"; | 
| devi@23 | 187 		if ($cl->{"class"}) { | 
| devi@23 | 188 			$cl_class = $cl->{"class"}."_".$cl_class; | 
| devi@23 | 189 			$out_class = $cl->{"class"}."_".$out_class; | 
| devi@23 | 190 		} | 
| devi@23 | 191 | 
| devi@23 | 192 		my @new_commands; | 
| devi@23 | 193 		my @new_files; | 
| devi@23 | 194 		@new_commands = split (/\s+/, $cl->{"new_commands"}) if defined $cl->{"new_commands"}; | 
| devi@23 | 195 		@new_files = split (/\s+/, $cl->{"new_files"}) if defined $cl->{"new_files"}; | 
| devi@23 | 196 | 
| devi@23 | 197 		my $output=""; | 
| devi@23 | 198 		if ($Config{"head_lines"} || $Config{"tail_lines"}) { | 
| devi@23 | 199 			# Partialy output | 
| devi@23 | 200 			my @lines = split '\n', $cl->{"output"}; | 
| devi@23 | 201 			# head | 
| devi@23 | 202 			my $mark=1; | 
| devi@23 | 203 			for (my $i=0; $i<= $#lines && $i < $Config{"head_lines"}; $i++) { | 
| devi@23 | 204 				$output .= $lines[$i]."\n"; | 
| devi@23 | 205 			} | 
| devi@23 | 206 			# tail | 
| devi@23 | 207 			my $start=$#lines-$Config{"tail_lines"}+1; | 
| devi@23 | 208 			if ($start < 0) { | 
| devi@23 | 209 				$start=0; | 
| devi@23 | 210 				$mark=0; | 
| devi@23 | 211 			} | 
| devi@23 | 212 			if ($start < $Config{"head_lines"}) { | 
| devi@23 | 213 				$start=$Config{"head_lines"}; | 
| devi@23 | 214 				$mark=0; | 
| devi@23 | 215 			} | 
| devi@23 | 216 			$output .= $Config{"skip_text"}."\n" if $mark; | 
| devi@23 | 217 			for (my $i=$start; $i<= $#lines; $i++) { | 
| devi@23 | 218 				$output .= $lines[$i]."\n"; | 
| devi@23 | 219 			} | 
| devi@23 | 220 		} | 
| devi@23 | 221 		else { | 
| devi@23 | 222 			# Full output | 
| devi@23 | 223 			$output .= $cl->{"output"}; | 
| devi@23 | 224 		} | 
| devi@23 | 225 		#$output .= "^C\n" if ($cl->{"err"} eq "130"); | 
| devi@23 | 226 | 
| devi@23 | 227 		# | 
| devi@23 | 228 		## | 
| devi@23 | 229 		## Начинается собственно вывод | 
| devi@23 | 230 		## | 
| devi@23 | 231 		# | 
| devi@23 | 232 | 
| devi@23 | 233 		# <command> | 
| devi@23 | 234 | 
| devi@23 | 235 		my ($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = localtime($cl->{time}); | 
| devi@23 | 236 		# Добавляем спереди 0 для удобочитаемости | 
| devi@23 | 237 		$min = "0".$min if $min =~ /^.$/; | 
| devi@23 | 238 		$hour = "0".$hour if $hour =~ /^.$/; | 
| devi@23 | 239 		$sec = "0".$sec if $sec =~ /^.$/; | 
| devi@23 | 240 | 
| devi@23 | 241 		$class=$cl->{"out_class"}; | 
| devi@23 | 242 		$class =~ s/output$//; | 
| devi@23 | 243 | 
| devi@23 | 244 | 
| devi@23 | 245 		$Result{"body"} .= "<tr class='command'>\n"; | 
| devi@23 | 246 | 
| devi@23 | 247 | 
| devi@23 | 248 		# DAY CHANGE | 
| devi@23 | 249 		if ( $last_day ne $day) { | 
| devi@23 | 250 			#$Result{"body"} .= "<td colspan='6'><p></p><h3>День ",$day,"</h4></td></tr><tr>"; | 
| devi@23 | 251 			$Result{"body"} .= "<td colspan='6'><p></p><h3 id='day$day'>".$Day_Name[$wday]."</h4></td></tr><tr>"; | 
| devi@23 | 252 			$toc .= "<li><a href='#day$day'>".$Day_Name[$wday]."</a></li>\n"; | 
| devi@23 | 253 			$last_day=$day; | 
| devi@23 | 254 		} | 
| devi@23 | 255 | 
| devi@23 | 256 		# CONSOLE CHANGE | 
| devi@23 | 257 		if ( $last_tty ne $cl->{"tty"}) { | 
| devi@23 | 258 			$Result{"body"} .= "<td colspan='6'><table><tr><td class='ttychange' width='140' align='center'>".$cl->{"tty"}."</td><td/></tr></table></td></tr><tr>"; | 
| devi@23 | 259 			$last_tty=$cl->{"tty"}; | 
| devi@23 | 260 		} | 
| devi@23 | 261 | 
| devi@23 | 262 		# TIME | 
| devi@23 | 263 		if ($Config{"show_time"} =~ /^y/i) { | 
| devi@23 | 264 			$Result{"body"} .= "<td valign='top' class='time' width='$Config{time_width}'><pre>". | 
| devi@23 | 265 				$hour. ":". $min. ":". $sec. | 
| devi@23 | 266 				"</td>"; | 
| devi@23 | 267 		} else { | 
| devi@23 | 268 			$Result{"body"} .= "<td width='0'/>" | 
| devi@23 | 269 		} | 
| devi@23 | 270 | 
| devi@23 | 271 		# COMMAND | 
| devi@23 | 272 		$Result{"body"} .= "<td class='script'>\n"; | 
| devi@23 | 273 		$Result{"body"} .= "<pre class='${class}cline'>\n"; | 
| devi@23 | 274 		my $cline = $cl->{"cline"}; | 
| devi@23 | 275 		$cline =~ s/\n//; | 
| devi@23 | 276 		$Result{"body"} .= $cl->{"prompt"}.$cl->{"cline"}; | 
| devi@23 | 277 		$Result{"body"} .= "</pre>\n"; | 
| devi@23 | 278 | 
| devi@23 | 279 		my $last_command = $cl->{"last_command"}; | 
| devi@23 | 280 		if (!( | 
| devi@23 | 281 		$Config{"suppress_editors"} =~ /^y/i && grep ($_ eq $last_command, @{$Config{"editors"}}) || | 
| devi@23 | 282 		$Config{"suppress_pagers"}  =~ /^y/i && grep ($_ eq $last_command, @{$Config{"pagers"}}) || | 
| devi@23 | 283 		$Config{"suppress_terminal"}=~ /^y/i && grep ($_ eq $last_command, @{$Config{"terminal"}}) | 
| devi@23 | 284 			)) { | 
| devi@23 | 285 | 
| devi@23 | 286 			$Result{"body"} .= "<pre class='".$cl->{out_class}."'>"; | 
| devi@23 | 287 			$Result{"body"} .= $output; | 
| devi@23 | 288 			$Result{"body"} .= "</pre>\n"; | 
| devi@23 | 289 		} | 
| devi@23 | 290 | 
| devi@23 | 291 		# DIFF | 
| devi@23 | 292 		if ( $Config{"show_diffs"} =~ /^y/i && $cl->{"diff"}) { | 
| devi@23 | 293 			$Result{"body"} .= "<table><tr><td width='5'/><td class='diff'><pre>"; | 
| devi@23 | 294 			$Result{"body"} .= $cl->{"diff"}; | 
| devi@23 | 295 			$Result{"body"} .= "</pre></td></tr></table>"; | 
| devi@23 | 296 		} | 
| devi@23 | 297 | 
| devi@23 | 298 		# COMMENT | 
| devi@23 | 299 		if ( $Config{"show_comments"} =~ /^y/i) { | 
| devi@23 | 300 			my $comment = make_comment(join(" ",@new_commands), join (" ",@new_files)); | 
| devi@23 | 301 			if ($comment) { | 
| devi@23 | 302 				$Result{"body"} .= "<table width='$Config{comment_width}'>". | 
| devi@23 | 303 						"<tr><td width='5'/><td>"; | 
| devi@23 | 304 				$Result{"body"} .= "<table class='note' width='100%'>"; | 
| devi@23 | 305 				$Result{"body"} .= $comment; | 
| devi@23 | 306 				$Result{"body"} .= "</table>\n"; | 
| devi@23 | 307 				$Result{"body"} .= "</td></tr></table>"; | 
| devi@23 | 308 			} | 
| devi@23 | 309 			else { | 
| devi@23 | 310 				$Result{"body"} .= "<table width='$Config{comment_width}'>". | 
| devi@23 | 311 						"<tr><td width='5'/><td>"; | 
| devi@23 | 312 				$Result{"body"} .= "<table class='note' width='100%'>"; | 
| devi@23 | 313 				$Result{"body"} .= "commands ".join(" ",@new_commands)."<br/>"; | 
| devi@23 | 314 				$Result{"body"} .= "files ".join(" ",@new_files)."<br/>"; | 
| devi@23 | 315 				$Result{"body"} .= "</table>\n"; | 
| devi@23 | 316 				$Result{"body"} .= "</td></tr></table>"; | 
| devi@23 | 317 			} | 
| devi@23 | 318 		} | 
| devi@23 | 319 | 
| devi@23 | 320 		# Вывод очередной команды окончен | 
| devi@23 | 321 		$Result{"body"} .= "</td>\n"; | 
| devi@23 | 322 		$Result{"body"} .= "</tr>\n"; | 
| devi@23 | 323 	} | 
| devi@23 | 324 | 
| devi@23 | 325 	$Result{"body"} .= "</table>\n"; | 
| devi@23 | 326 | 
| devi@23 | 327 	$Result{"stat"} = "<hr/>"; | 
| devi@23 | 328 	$Result{"stat"} .= "<h2 id='stat'>Статистика</h2>"; | 
| devi@23 | 329 	$Result{"stat"} .= "Статистическая информация о журнале<br/>"; | 
| devi@23 | 330 	$Result{"help"} .= "<hr/>"; | 
| devi@23 | 331 	$Result{"help"} .= "<h2 id='help'>Справка</h2>"; | 
| devi@23 | 332 	$Result{"help"} .= "$Html_Help<br/>"; | 
| devi@23 | 333 	$Result{"about"} .= "<hr/>"; | 
| devi@23 | 334 	$Result{"about"} .= "<h2 id='about'>О программе</h2>"; | 
| devi@23 | 335 	$Result{"about"} .= "$Html_About"; | 
| devi@23 | 336 	$Result{"footer"} .= "</body>\n"; | 
| devi@23 | 337 	$Result{"footer"} .= "</html>\n"; | 
| devi@23 | 338 | 
| devi@23 | 339 	# Заголовок генерируется позже всего | 
| devi@23 | 340 	# Тогда, когда известно уже, что должно быть написано в | 
| devi@23 | 341 	# оглавлении | 
| devi@23 | 342 	$Result{"header"} = <<HEADER; | 
| devi@23 | 343 	<html> | 
| devi@23 | 344 	<head> | 
| devi@23 | 345 	<meta content='text/html; charset=utf-8' http-equiv='Content-Type' /> | 
| devi@23 | 346 	<link rel='stylesheet' href='labmaker.css' type='text/css'/> | 
| devi@23 | 347 	</head> | 
| devi@23 | 348 	<body> | 
| devi@23 | 349 	<script> | 
| devi@23 | 350 	$Html_JavaScript | 
| devi@23 | 351 	</script> | 
| devi@23 | 352 	<h2>Журнал лабораторных работ</h2> | 
| devi@23 | 353 | 
| devi@23 | 354 	<p> | 
| devi@23 | 355 	Выполнил $course_student<br/> | 
| devi@23 | 356 	Проверил $course_trainer <br/> | 
| devi@23 | 357 	Курс $course_name ($course_code), | 
| devi@23 | 358 	$course_date<br/> | 
| devi@23 | 359 	Учебный центр $course_center <br/> | 
| devi@23 | 360 	</p> | 
| devi@23 | 361 | 
| devi@23 | 362 	<ul> | 
| devi@23 | 363 		<li><a href='#log'>Журнал</a></li> | 
| devi@23 | 364 		<ul>$toc</ul> | 
| devi@23 | 365 		<li><a href='#stat'>Статистика</a></li> | 
| devi@23 | 366 		<li><a href='#help'>Справка</a></li> | 
| devi@23 | 367 		<li><a href='#about'>О программе</a></li> | 
| devi@23 | 368 	</ul> | 
| devi@23 | 369 | 
| devi@23 | 370 	<h2 id="log">Журнал</h2> | 
| devi@23 | 371 HEADER | 
| devi@23 | 372 	$Result{"header"} .= "<table class='visibility_form'><tr><td><form>\n"; | 
| devi@23 | 373 	for my $element (keys %Elements_Visibility) | 
| devi@23 | 374 	{ | 
| devi@23 | 375 		my @e = split /\s+/, $element; | 
| devi@23 | 376 		my $showhide = join "", map { "ShowHide('$_');" } @e ; | 
| devi@23 | 377 		$Result{"header"} .= "<input type='checkbox' name='$e[0]' onclick=\"$showhide\" checked>". | 
| devi@23 | 378 				$Elements_Visibility{$element}. | 
| devi@23 | 379 				"</input><br>\n"; | 
| devi@23 | 380 	} | 
| devi@23 | 381 | 
| devi@23 | 382 	$Result{"header"} .= "</form></td></tr></table>\n"; | 
| devi@23 | 383 | 
| devi@23 | 384 	open(OUT, ">", $output_filename) | 
| devi@23 | 385 		or die "Can't open $output_filename for writing\n"; | 
| devi@23 | 386 	print OUT $Result{"header"}, $Result{"body"}, $Result{"stat"}, $Result{"help"}, $Result{"about"}, $Result{"footer"}; | 
| devi@23 | 387 	close(OUT); | 
| devi@23 | 388 } | 
| devi@23 | 389 | 
| devi@23 | 390 | 
| devi@23 | 391 | 
| devi@23 | 392 | 
| devi@23 | 393 | 
| devi@23 | 394 | 
| devi@23 | 395 sub init_variables | 
| devi@23 | 396 { | 
| devi@23 | 397 $Html_Help = <<HELP; | 
| devi@23 | 398 	Справка по использованию журнала | 
| devi@23 | 399 HELP | 
| devi@23 | 400 | 
| devi@23 | 401 $Html_About = <<ABOUT; | 
| devi@23 | 402 	<p> | 
| devi@23 | 403 	LiLaLo (L3) расшифровывается как Live Lab Log.<br/> | 
| devi@23 | 404 	Программа разработана для повышения эффективности обучения<br/> | 
| devi@23 | 405 	Unix/Linux-системам.<br/> | 
| devi@23 | 406 	(c) Игорь Чубин, 2004-2005<br/> | 
| devi@23 | 407 	</p> | 
| devi@23 | 408 ABOUT | 
| devi@23 | 409 $Html_About.='$Id$ </p>'; | 
| devi@23 | 410 | 
| devi@23 | 411 $Html_JavaScript = <<JS; | 
| devi@23 | 412 	function getElementsByClassName(Class_Name) | 
| devi@23 | 413 	{ | 
| devi@23 | 414 		var Result=new Array(); | 
| devi@23 | 415 		var All_Elements=document.all || document.getElementsByTagName('*'); | 
| devi@23 | 416 		for (i=0; i<All_Elements.length; i++) | 
| devi@23 | 417 			if (All_Elements[i].className==Class_Name) | 
| devi@23 | 418 		Result.push(All_Elements[i]); | 
| devi@23 | 419 		return Result; | 
| devi@23 | 420 	} | 
| devi@23 | 421 	function ShowHide (name) | 
| devi@23 | 422 	{ | 
| devi@23 | 423 		elements=getElementsByClassName(name); | 
| devi@23 | 424 		for(i=0; i<elements.length; i++) | 
| devi@23 | 425 			if (elements[i].style.display == "none") | 
| devi@23 | 426 				elements[i].style.display = ""; | 
| devi@23 | 427 			else | 
| devi@23 | 428 				elements[i].style.display = "none"; | 
| devi@23 | 429 			//if (elements[i].style.visibility == "hidden") | 
| devi@23 | 430 			//	elements[i].style.visibility = "visible"; | 
| devi@23 | 431 			//else | 
| devi@23 | 432 			//	elements[i].style.visibility = "hidden"; | 
| devi@23 | 433 	} | 
| devi@23 | 434 	function filter_by_output(text) | 
| devi@23 | 435 	{ | 
| devi@23 | 436 | 
| devi@23 | 437 		var jjj=0; | 
| devi@23 | 438 | 
| devi@23 | 439 		elements=getElementsByClassName('command'); | 
| devi@23 | 440 		for(i=0; i<elements.length; i++) { | 
| devi@23 | 441 			subelems = elements[i].getElementsByTagName('pre'); | 
| devi@23 | 442 			for(j=0; j<subelems.length; j++) { | 
| devi@23 | 443 				if (subelems[j].className = 'output') { | 
| devi@23 | 444 					var str = new String(subelems[j].nodeValue); | 
| devi@23 | 445 					if (jjj != 1) { | 
| devi@23 | 446 						alert(str); | 
| devi@23 | 447 						jjj=1; | 
| devi@23 | 448 					} | 
| devi@23 | 449 					if (str.indexOf(text) >0) | 
| devi@23 | 450 						subelems[j].style.display = "none"; | 
| devi@23 | 451 					else | 
| devi@23 | 452 						subelems[j].style.display = ""; | 
| devi@23 | 453 | 
| devi@23 | 454 				} | 
| devi@23 | 455 | 
| devi@23 | 456 			} | 
| devi@23 | 457 		} | 
| devi@23 | 458 | 
| devi@23 | 459 	} | 
| devi@23 | 460 JS | 
| devi@23 | 461 | 
| devi@23 | 462 %Search_Machines = ( | 
| devi@23 | 463 		"google" => 	{ 	"query" => 	"http://www.google.com/search?q=" , | 
| devi@23 | 464 					"icon" 	=> 	"google.ico" }, | 
| devi@23 | 465 		"freebsd" => 	{ 	"query" => 	"http://www.freebsd.org/cgi/man.cgi?query=", | 
| devi@23 | 466 					"icon"	=>	"freebsd.ico" }, | 
| devi@23 | 467 		"linux"  => 	{ 	"query" => 	"http://man.he.net/?topic=", | 
| devi@23 | 468 					"icon"	=>	"linux.ico"}, | 
| devi@23 | 469 		"opennet"  => 	{ 	"query" => 	"http://www.opennet.ru/search.shtml?words=", | 
| devi@23 | 470 					"icon"	=>	"opennet.ico"}, | 
| devi@23 | 471 		"local" => 	{ 	"query" => 	"http://www.freebsd.org/cgi/man.cgi?query=", | 
| devi@23 | 472 					"icon"	=>	"freebsd.ico" }, | 
| devi@23 | 473 | 
| devi@23 | 474 	); | 
| devi@23 | 475 | 
| devi@23 | 476 %Elements_Visibility = ( | 
| devi@23 | 477 		"note"		=>	"замечания", | 
| devi@23 | 478 		"diff"		=>	"редактор", | 
| devi@23 | 479 		"time"		=>	"время", | 
| devi@23 | 480 		"ttychange" 	=>	"терминал", | 
| devi@23 | 481 		"wrong_output wrong_cline wrong_root_output wrong_root_cline" | 
| devi@23 | 482 				=>	"команды с ошибками", | 
| devi@23 | 483 		"interrupted_output interrupted_cline interrupted_root_output interrupted_root_cline" | 
| devi@23 | 484 				=>	"прерванные команды", | 
| devi@23 | 485 		"tab_completion_output tab_completion_cline" | 
| devi@23 | 486 				=> 	"продолжение с помощью tab" | 
| devi@23 | 487 ); | 
| devi@23 | 488 | 
| devi@23 | 489 @Day_Name      = qw/ Воскресенье Понедельник Вторник Среда Четверг Пятница Суббота /; | 
| devi@23 | 490 @Month_Name    = qw/ Январь Февраль Март Апрель Май Июнь Июль Август Сентябрь Октябрь Ноябрь Декабрь /; | 
| devi@23 | 491 @Of_Month_Name = qw/ Января Февраля Марта Апреля Мая Июня Июля Августа Сентября Октября Ноября Декабря /; | 
| devi@23 | 492 } | 
| devi@23 | 493 |