[Bio] / FigWebServices / feature.cgi Repository:
ViewVC logotype

Annotation of /FigWebServices/feature.cgi

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.6 - (view) (download)

1 : olson 1.6 #
2 :     # Copyright (c) 2003-2006 University of Chicago and Fellowship
3 :     # for Interpretations of Genomes. All Rights Reserved.
4 :     #
5 :     # This file is part of the SEED Toolkit.
6 :     #
7 :     # The SEED Toolkit is free software. You can redistribute
8 :     # it and/or modify it under the terms of the SEED Toolkit
9 :     # Public License.
10 :     #
11 :     # You should have received a copy of the SEED Toolkit Public License
12 :     # along with this program; if not write to the University of Chicago
13 :     # at info@ci.uchicago.edu or the Fellowship for Interpretation of
14 :     # Genomes at veronika@thefig.info or download a copy from
15 :     # http://www.theseed.org/LICENSE.TXT.
16 :     #
17 :    
18 : mkubal 1.1 use FIG;
19 :     my $fig = new FIG;
20 :    
21 :     use HTML;
22 :     use strict;
23 :     use GenoGraphics;
24 :     use CGI;
25 :     my $cgi = new CGI;
26 :    
27 :     if (0)
28 :     {
29 :     my $VAR1;
30 :     eval(join("",`cat /tmp/protein_parms`));
31 :     $cgi = $VAR1;
32 :     # print STDERR &Dumper($cgi);
33 :     }
34 :    
35 :     if (0)
36 :     {
37 :     print $cgi->header;
38 :     my @params = $cgi->param;
39 :     print "<pre>\n";
40 :     foreach $_ (@params)
41 :     {
42 :     print "$_\t:",join(",",$cgi->param($_)),":\n";
43 :     }
44 :    
45 :     if (0)
46 :     {
47 :     if (open(TMP,">/tmp/protein_parms"))
48 :     {
49 :     print TMP &Dumper($cgi);
50 :     close(TMP);
51 :     }
52 :     }
53 :     exit;
54 :     }
55 :    
56 :     my $html = [];
57 : disz 1.2 unshift @$html, "<TITLE>The SEED Feature Page</TITLE>\n";
58 : mkubal 1.1
59 :     my $feature = $cgi->param('feature');
60 :     if (! $feature)
61 :     {
62 :     unshift @$html, "<TITLE>The SEED: Feature Page</TITLE>\n";
63 :     push(@$html,"<h1>Sorry, you need to specify a feature</h1>\n");
64 :     &HTML::show_page($cgi,$html);
65 :     exit;
66 :     }
67 :    
68 :     if ($feature !~ /^fig\|/)
69 :     {
70 :     if ($_ = $fig->by_alias($feature))
71 :     {
72 :     $feature = $_;
73 :     }
74 :     else
75 :     {
76 :     unshift @$html, "<TITLE>The SEED: Feature Page</TITLE>\n";
77 :     push(@$html,"<h1>Sorry, $feature appears not to have a FIG id at this point</h1>\n");
78 :     &HTML::show_page($cgi,$html);
79 :     exit;
80 :     }
81 :     }
82 :    
83 : disz 1.3 my $request = $cgi->param("request") || "";
84 :    
85 :     if ($request eq "view_annotations") { &view_annotations($fig,$cgi,$html,$feature); }
86 :     elsif ($request eq "view_all_annotations") { &view_all_annotations($fig,$cgi,$html,$feature); }
87 :     elsif ($request eq "dna_sequence") { &dna_sequence($fig,$cgi,$html,$feature); }
88 :     else { &show_initial($fig,$cgi,$html,$feature); }
89 : mkubal 1.1
90 :    
91 :     &HTML::show_page($cgi,$html);
92 :     exit;
93 :    
94 :    
95 :     #==============================================================================
96 :     # view_annotations
97 :     #==============================================================================
98 :    
99 :     sub view_annotations {
100 : disz 1.2 my($fig,$cgi,$html,$feature) = @_;
101 : mkubal 1.1
102 : disz 1.2 unshift @$html, "<TITLE>The SEED: eature Annotations</TITLE>\n";
103 : mkubal 1.1 my $col_hdrs = ["who","when","annotation"];
104 : disz 1.2 my $tab = [ map { [$_->[2],$_->[1],"<pre>" . $_->[3] . "<\/pre>"] } $fig->feature_annotations($feature) ];
105 : mkubal 1.1 if (@$tab > 0)
106 :     {
107 : disz 1.2 push(@$html,&HTML::make_table($col_hdrs,$tab,"Annotations for $feature"));
108 : mkubal 1.1 }
109 :     else
110 :     {
111 : disz 1.2 push(@$html,"<h1>No Annotations for $feature</h1>\n");
112 : mkubal 1.1 }
113 :     }
114 :    
115 :     sub view_all_annotations {
116 :     my($fig,$cgi,$html,$peg) = @_;
117 :     my($ann);
118 :    
119 :     unshift @$html, "<TITLE>The SEED: Protein Annotations</TITLE>\n";
120 :     if ($fig->is_real_feature($peg))
121 :     {
122 :     my $col_hdrs = ["who","when","PEG","genome","annotation"];
123 :     my @related = $fig->related_by_func_sim($peg,$cgi->param('user'));
124 :     push(@related,$peg);
125 :    
126 :     my @annotations = $fig->merged_related_annotations(\@related);
127 :    
128 :     my $tab = [ map { $ann = $_;
129 :     [$ann->[2],$ann->[1],&HTML::fid_link($cgi,$ann->[0]),
130 :     $fig->genus_species(&FIG::genome_of($ann->[0])),
131 :     "<pre>" . $ann->[3] . "</pre>"
132 :     ] } @annotations];
133 :     if (@$tab > 0)
134 :     {
135 :     push(@$html,&HTML::make_table($col_hdrs,$tab,"All Related Annotations for $peg"));
136 :     }
137 :     else
138 :     {
139 :     push(@$html,"<h1>No Annotations for $peg</h1>\n");
140 :     }
141 :     }
142 :     }
143 :    
144 :    
145 :     #==============================================================================
146 :     # show_initial
147 :     #==============================================================================
148 :    
149 :     sub show_initial {
150 : disz 1.2 my($fig,$cgi,$html,$feature) = @_;
151 : mkubal 1.1
152 : disz 1.2 unshift @$html, "<TITLE>The SEED: Feature Page</TITLE>\n";
153 :     my $gs = $fig->org_of($feature);
154 :     if (! $fig->is_real_feature($feature))
155 : mkubal 1.1 {
156 : disz 1.2 push(@$html,"<h1>Sorry, $feature is an unknown identifier</h1>\n");
157 : mkubal 1.1 }
158 :     else
159 :     {
160 : disz 1.2 push(@$html,"<h1>Feature $feature: $gs</h1>\n");
161 : overbeek 1.5 my $url = $cgi->url(-relative => 1, -query => 1, -path_info => 1);
162 : disz 1.2 &display_peg($fig,$cgi,$html,$feature);
163 : mkubal 1.1 }
164 :     }
165 :    
166 :     #==============================================================================
167 :     # display_peg
168 :     #==============================================================================
169 :    
170 :     sub display_peg {
171 :     my($fig,$cgi,$html,$peg) = @_;
172 :     my $loc;
173 :    
174 :     my $half_sz = 5000;
175 :    
176 :     if ($loc = $fig->feature_location($peg))
177 :     {
178 :     my($contig,$beg,$end) = &FIG::boundaries_of($loc);
179 :     my $min = &FIG::max(0,&FIG::min($beg,$end) - $half_sz);
180 :     my $max = &FIG::max($beg,$end) + $half_sz;
181 :     my($feat,$min,$max) = $fig->genes_in_region(&FIG::genome_of($peg),$contig,$min,$max);
182 :    
183 :     &print_context($fig,$cgi,$html,$peg,$feat,$min,$max);
184 :     }
185 :    
186 : disz 1.2 #&print_assignments($fig,$cgi,$html,$peg);
187 :     my @links = $fig->peg_links($peg);
188 :     if (@links > 0)
189 :     {
190 :     my $col_hdrs = [1,2,3,4,5];
191 :     my $title = "Links to Related Entries in Other Sites";
192 :     my $tab = [];
193 :     my ($n,$i);
194 :     for ($i=0; ($i < @links); $i += 5)
195 :     {
196 :     $n = (($i + (5-1)) < @links) ? $i+(5-1) : $i+(@links - $i);
197 :     push(@$tab,[@links[$i..$n]]);
198 :     }
199 :     push(@$html,&HTML::make_table($col_hdrs,$tab,$title));
200 :     }
201 : mkubal 1.1 push(@$html,$cgi->hr);
202 : overbeek 1.5 my $link1 = $cgi->url(-relative => 1, -query => 1, -path_info => 1) . "&request=view_annotations";
203 :     my $link2 = $cgi->url(-relative => 1, -query => 1, -path_info => 1) . "&request=view_all_annotations";
204 : mkubal 1.1 push(@$html,"<br><a href=$link1>To View Annotations</a>/<a href=$link2>To View All Related Annotations</a>\n");
205 :    
206 :    
207 : overbeek 1.5 my $link = $cgi->url(-relative => 1, -query => 1, -path_info => 1) . "&request=dna_sequence";
208 : mkubal 1.1 push(@$html,"<br><a href=$link>DNA Sequence</a>\n");
209 :    
210 : overbeek 1.5 $link = $cgi->url(-relative => 1);
211 : mkubal 1.1 $link =~ s/protein.cgi/fid_checked.cgi/;
212 :     my $user = $cgi->param('user');
213 :     if (! $user)
214 :     {
215 :     $user = "";
216 :     }
217 :     else
218 :     {
219 : disz 1.2 $link = $link . "?fid=$feature&user=$user&checked=$feature&assign/annotate=assign/annotate";
220 : mkubal 1.1 push(@$html,"<br><a href=$link target=checked_window>To Make an Annotation</a>\n");
221 :     }
222 :    
223 :     my $has_translation = $fig->translatable($peg);
224 :    
225 :    
226 :     }
227 :    
228 :    
229 :    
230 :    
231 :     ################# Context on the Chromosome ############################
232 :    
233 :     sub print_context {
234 :     my($fig,$cgi,$html,$peg,$feat,$beg,$end) = @_;
235 : disz 1.2 my($contig1,$beg1,$end1,$strand,$max_so_far,$comment, $aliases);
236 :     my($fid1,$sz,$color,$map,$gg,$n,$link);
237 : mkubal 1.1
238 :    
239 :     my $user = $cgi->param('user');
240 :     push(@$html,$cgi->start_form(-action => &FIG::cgi_url . "/chromosomal_clusters.cgi"),
241 : disz 1.2 $cgi->hidden(-name => "feature", -value => $peg),
242 : mkubal 1.1 $cgi->hidden(-name => "user", -value => $user));
243 :    
244 : disz 1.2 my $col_hdrs = ["fid","starts","ends","size","","comment","aliases"];
245 : mkubal 1.1 my($tab) = [];
246 :     my $genes = [];
247 :    
248 : disz 1.2 #my $peg_function = &trans_function_of($cgi,$fig,$peg,$user);
249 : mkubal 1.1
250 : disz 1.2 #my($role,$role1,%related_roles);
251 :     #foreach $role (&FIG::roles_of_function($peg_function))
252 :     #{
253 :     # foreach $role1 ($fig->neighborhood_of_role($role))
254 :     # {
255 :     # $related_roles{$role1} = 1;
256 :     # }
257 :     # }
258 : mkubal 1.1
259 :     foreach $fid1 (@$feat)
260 :     {
261 :     $aliases = join( ', ', $fig->feature_aliases($fid1) );
262 :     ($contig1,$beg1,$end1) = $fig->boundaries_of(scalar $fig->feature_location($fid1));;
263 :     $strand = ($beg1 < $end1) ? "+" : "-";
264 :    
265 :     if ($fid1 eq $peg) { $color = "green" }
266 :     else { $color = "red" }
267 :    
268 :     if ($fid1 =~ /peg\.(\d+)$/)
269 :     {
270 :     $n = $1;
271 : overbeek 1.5 $link = $cgi->url(-relative => 1) . "?feature=$fid1&user=$user";
272 : mkubal 1.1 }
273 :     elsif ($fid1 =~ /\.([a-z]+)\.\d+$/)
274 :     {
275 :     $n = uc $1;
276 :     $link = "";
277 :     }
278 :     else
279 :     {
280 :     $n ="";
281 :     $link = "";
282 :     }
283 :    
284 :     push(@$genes,[&FIG::min($beg1,$end1),&FIG::max($beg1,$end1),($strand eq "+") ? "rightArrow" : "leftArrow", $color,$n,$link]);
285 :     $max_so_far = &FIG::max($beg1,$end1);
286 :    
287 :    
288 :     if (&FIG::ftype($fid1) eq "peg")
289 :     {
290 :     $comment = &trans_function_of($cgi,$fig,$fid1,$user);
291 :     }
292 :     else
293 :     {
294 :     $comment = "";
295 :     }
296 :     $comment = &set_map_links($fig,&FIG::genome_of($fid1),$comment);
297 :     if ($fid1 eq $peg)
298 :     {
299 :     $comment = "\@bgcolor=\"#00FF00\":$comment";
300 :     }
301 :     $sz = abs($end1-$beg1)+1;
302 :    
303 : disz 1.2
304 :     push(@$tab,[&HTML::fid_link($cgi,$fid1,"local"),$beg1,$end1,$sz,$strand,
305 :     $comment,&HTML::set_prot_links($cgi,$aliases)]);
306 : mkubal 1.1 }
307 :     $map = ["",$beg,$end,$genes];
308 :     $gg = [$map];
309 :     push(@$html,&HTML::make_table($col_hdrs,$tab,"Context on contig $contig1"));
310 : disz 1.2 # push(@$html,$cgi->br,$cgi->submit('pin with checked genes'),$cgi->end_form,$cgi->br);
311 : mkubal 1.1 push(@$html,@{ &GenoGraphics::render($gg,700,4,0,1) });
312 :     return;
313 :     }
314 :    
315 :     sub set_map_links {
316 :     my($fig,$org,$func) = @_;
317 :    
318 :     if ($func =~ /^(.*)(\d+\.\d+\.\d+\.\d+)(.*)$/)
319 :     {
320 :     my $before = $1;
321 :     my $ec = $2;
322 :     my $after = $3;
323 :     return &set_map_links($fig,$org,$before) . &set_ec_to_maps($fig,$org,$ec) . &set_map_links($fig,$org,$after);
324 :     }
325 :     return $func;
326 :     }
327 :    
328 :     sub set_ec_to_maps {
329 :     my($fig,$org,$ec) = @_;
330 :    
331 :     my @maps = $fig->ec_to_maps($ec);
332 :     if (@maps > 0)
333 :     {
334 :     $cgi->delete('request');
335 : overbeek 1.5 my $url = $cgi->url(-relative => 1, -query => 1, -path_info => 1) . "&request=ec_to_maps&ec=$ec&org=$org";
336 : mkubal 1.1 my $link = "<a href=\"$url\">$ec</a>";
337 :     return $link;
338 :     }
339 :     return $ec;
340 :     }
341 :    
342 :     sub show_ec_to_maps {
343 :     my($fig,$cgi,$html,$ec) = @_;
344 :    
345 :     my $ec = $cgi->param('ec');
346 :     if (! $ec)
347 :     {
348 :     push(@$html,$cgi->h1("Missing EC number"));
349 :     return;
350 :     }
351 :    
352 :     my @maps = $fig->ec_to_maps($ec);
353 :     if (@maps > 0)
354 :     {
355 :     my $col_hdrs = ["map","metabolic topic"];
356 :     my $map;
357 :     my $tab = [map { $map = $_; [&map_link($cgi,$map),$fig->map_name($map)] } @maps];
358 :     push(@$html,&HTML::make_table($col_hdrs,$tab,"$ec: " . $fig->ec_name($ec)));
359 :     }
360 :     }
361 :    
362 :     sub map_link {
363 :     my($cgi,$map) = @_;
364 :    
365 :     $cgi->delete('request');
366 : overbeek 1.5 my $url = $cgi->url(-relative => 1, -query => 1, -path_info => 1) . "&request=link_to_map&map=$map";
367 : mkubal 1.1 my $link = "<a href=\"$url\">$map</a>";
368 :     return $link;
369 :     }
370 :    
371 :     sub link_to_map {
372 :     my($fig,$cgi,$html) = @_;
373 :    
374 :     my $map = $cgi->param('map');
375 :     if (! $map)
376 :     {
377 :     push(@$html,$cgi->h1("Missing Map"));
378 :     return;
379 :     }
380 :    
381 :     my $org = $cgi->param('org');
382 :     if (! $org)
383 :     {
384 :     push(@$html,$cgi->h1("Missing Org Parameter"));
385 :     return;
386 :     }
387 :     my$user = $cgi->param('user');
388 :     $user = $user ? $user : "";
389 :    
390 :     $ENV{"REQUEST_METHOD"} = "GET";
391 :     $ENV{"QUERY_STRING"} = "user=$user&map=$map&org=$org";
392 :     my @out = `./show_kegg_map.cgi`;
393 :     &HTML::trim_output(\@out);
394 :     push(@$html,@out);
395 :     }
396 :    
397 :    
398 :     sub dna_sequence {
399 :     my($fig,$cgi,$html,$fid) = @_;
400 :     my($seq,$func,$i);
401 :    
402 :     unshift @$html, "<TITLE>The SEED: Nucleotide Sequence</TITLE>\n";
403 :     if ($seq = $fig->dna_seq($fig->genome_of($fid),scalar $fig->feature_location($fid)))
404 :     {
405 : disz 1.2 $func = $fig->function_of($feature,$cgi->param('user'));
406 : mkubal 1.1 push(@$html,$cgi->pre,">$fid $func\n");
407 :     for ($i=0; ($i < length($seq)); $i += 60)
408 :     {
409 :     if ($i > (length($seq) - 60))
410 :     {
411 :     push(@$html,substr($seq,$i) . "\n");
412 :     }
413 :     else
414 :     {
415 :     push(@$html,substr($seq,$i,60) . "\n");
416 :     }
417 :     }
418 :     push(@$html,$cgi->end_pre);
419 :     }
420 :     else
421 :     {
422 :     push(@$html,$cgi->h1("No DNA sequence available for $fid"));
423 :     }
424 :     }
425 :    
426 :    
427 :    
428 :    
429 :     sub in {
430 :     my($x,$xL) = @_;
431 :     my($i);
432 :    
433 :     for ($i=0; ($i < @$xL) && ($x != $xL->[$i]); $i++) {}
434 :     return ($i < @$xL);
435 :     }
436 :    
437 :     sub in_bounds {
438 :     my($min,$max,$x) = @_;
439 :    
440 :     if ($x < $min) { return $min }
441 :     elsif ($x > $max) { return $max }
442 :     else { return $x }
443 :     }
444 :    
445 :     sub decr_coords {
446 :     my($genes,$min) = @_;
447 :     my($gene);
448 :    
449 :     foreach $gene (@$genes)
450 :     {
451 :     $gene->[0] -= $min;
452 :     $gene->[1] -= $min;
453 :     }
454 :     return $genes;
455 :     }
456 :    
457 :     sub flip_map {
458 :     my($genes,$min,$max) = @_;
459 :     my($gene);
460 :    
461 :     foreach $gene (@$genes)
462 :     {
463 :     ($gene->[0],$gene->[1]) = ($max - $gene->[1],$max - $gene->[0]);
464 :     $gene->[2] = ($gene->[2] eq "rightArrow") ? "leftArrow" : "rightArrow";
465 :     }
466 :     return $genes;
467 :     }
468 :    
469 :     sub cluster_genes {
470 :     my($all_pegs,$peg) = @_;
471 :     my(%seen,$i,$j,$k,$x,$cluster,$conn,$pegI,$red_set);
472 :    
473 :     my @color_sets = ();
474 :    
475 :     $conn = &get_connections_by_similarity($all_pegs);
476 :     for ($i=0; ($i < @$all_pegs); $i++)
477 :     {
478 :     if ($all_pegs->[$i] eq $peg) { $pegI = $i }
479 :     if (! $seen{$i})
480 :     {
481 :     $cluster = [$i];
482 :     $seen{$i} = 1;
483 :     for ($j=0; ($j < @$cluster); $j++)
484 :     {
485 :     $x = $conn->{$cluster->[$j]};
486 :     foreach $k (@$x)
487 :     {
488 :     if (! $seen{$k})
489 :     {
490 :     push(@$cluster,$k);
491 :     $seen{$k} = 1;
492 :     }
493 :     }
494 :     }
495 :    
496 :     if ((@$cluster > 1) || ($cluster->[0] eq $pegI))
497 :     {
498 :     push(@color_sets,$cluster);
499 :     }
500 :     }
501 :     }
502 :     for ($i=0; ($i < @color_sets) && (! &in($pegI,$color_sets[$i])); $i++) {}
503 :     $red_set = $color_sets[$i];
504 :     splice(@color_sets,$i,1);
505 :     @color_sets = sort { @$b <=> @$a } @color_sets;
506 :     unshift(@color_sets,$red_set);
507 :    
508 :     my $color_sets = {};
509 :     for ($i=0; ($i < @color_sets); $i++)
510 :     {
511 :     foreach $x (@{$color_sets[$i]})
512 :     {
513 :     $color_sets->{$all_pegs->[$x]} = $i;
514 :     }
515 :     }
516 :     return $color_sets;
517 :     }
518 :    
519 :     sub get_connections_by_similarity {
520 :     my($all_pegs) = @_;
521 :     my($i,$j,$tmp,$peg,%pos_of);
522 :     my($sim,%conn,$x,$y);
523 :    
524 :     for ($i=0; ($i < @$all_pegs); $i++)
525 :     {
526 :     $tmp = $fig->maps_to_id($all_pegs->[$i]);
527 :     push(@{$pos_of{$tmp}},$i); # map the representative in nr to subscript in all_pegs
528 :     if ($tmp ne $all_pegs->[$i])
529 :     {
530 :     push(@{$pos_of{$all_pegs->[$i]}},$i);
531 :     }
532 :     }
533 :    
534 :     foreach $y (keys(%pos_of))
535 :     {
536 :     $x = $pos_of{$y};
537 :     for ($i=0; ($i < @$x); $i++)
538 :     {
539 :     for ($j=$i+1; ($j < @$x); $j++)
540 :     {
541 :     push(@{$conn{$x->[$i]}},$x->[$j]);
542 :     push(@{$conn{$x->[$j]}},$x->[$i]);
543 :     }
544 :     }
545 :     }
546 :    
547 :     for ($i=0; ($i < @$all_pegs); $i++)
548 :     {
549 :     foreach $sim ($fig->sims($all_pegs->[$i],500,1.0e-5,"raw"))
550 :     {
551 :     if (defined($x = $pos_of{$sim->id2}))
552 :     {
553 :     foreach $y (@$x)
554 :     {
555 :     push(@{$conn{$i}},$y);
556 :     }
557 :     }
558 :     }
559 :     }
560 :     return \%conn;
561 :     }
562 :    
563 :     sub set_colors_text_and_links {
564 :     my($gg,$all_pegs,$color_sets) = @_;
565 :     my($map,$gene,$peg,$color);
566 :    
567 :     foreach $map (@$gg)
568 :     {
569 :     foreach $gene (@{$map->[3]})
570 :     {
571 :     $peg = $gene->[5];
572 :     if (defined($color = $color_sets->{$peg}))
573 :     {
574 :     $gene->[3] = ($color == 0) ? "red" : "color$color";
575 :     $gene->[4] = $color + 1;
576 :     }
577 :     $gene->[5] = &peg_url($cgi,$peg);
578 :     }
579 :     }
580 :     }
581 :    
582 :     sub peg_url {
583 :     my($cgi,$peg) = @_;
584 :    
585 :     my $prot = $cgi->param('prot');
586 :     $cgi->delete('prot');
587 : overbeek 1.5 my $url = $cgi->url(-relative => 1, -query => 1, -path_info => 1) . "&prot=$peg&compare_region=1";
588 : mkubal 1.1 $cgi->delete('prot');
589 :     $cgi->param(-name => 'prot', -value => $prot);
590 :    
591 :     return $url;
592 :     }
593 :    
594 : disz 1.2 sub trans_function_of {
595 :     my($cgi,$fig,$peg,$user) = @_;
596 : mkubal 1.1
597 : disz 1.2 if (wantarray())
598 :     {
599 :     my $x;
600 :     my @funcs = $fig->function_of($peg);
601 :     if ($cgi->param('translate'))
602 :     {
603 :     @funcs = map { $x = $_; $x->[1] = $fig->translate_function($x->[1]); $x } @funcs;
604 :     }
605 :     return @funcs;
606 :     }
607 :     else
608 : mkubal 1.1 {
609 : disz 1.2 my $func = $fig->function_of($peg,$user);
610 :     if ($cgi->param('translate'))
611 : mkubal 1.1 {
612 : disz 1.2 $func = $fig->translate_function($func);
613 : mkubal 1.1 }
614 : disz 1.2 return $func;
615 : mkubal 1.1 }
616 :     }
617 : disz 1.2

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3