| rev | 
   line source | 
| 
igor@66
 | 
     1 #!/usr/bin/perl
 | 
| 
igor@66
 | 
     2 
 | 
| 
igor@66
 | 
     3 our $change_matix = '';
 | 
| 
igor@66
 | 
     4 
 | 
| 
igor@66
 | 
     5 our $change_matrix = '
 | 
| 
igor@66
 | 
     6 um über mit von vom nach zum zur in an auf
 | 
| 
igor@66
 | 
     7 der das des dem den ein einer einem einen eines
 | 
| 
igor@66
 | 
     8 ';
 | 
| 
igor@66
 | 
     9 
 | 
| 
igor@66
 | 
    10 our $change_matrix = '
 | 
| 
igor@66
 | 
    11 router network ip route
 | 
| 
igor@66
 | 
    12 ';
 | 
| 
igor@66
 | 
    13 
 | 
| 
igor@66
 | 
    14 if (open(FILE, $ARGV[0])) {
 | 
| 
igor@66
 | 
    15     local $/;
 | 
| 
igor@66
 | 
    16     $change_matrix = <FILE>;
 | 
| 
igor@66
 | 
    17 }
 | 
| 
igor@66
 | 
    18 shift @ARGV;
 | 
| 
igor@66
 | 
    19 
 | 
| 
igor@66
 | 
    20 my $BaseURL = $ARGV[0];
 | 
| 
igor@66
 | 
    21 shift;
 | 
| 
igor@66
 | 
    22 
 | 
| 
igor@66
 | 
    23 my $Subdir = $ARGV[0];
 | 
| 
igor@66
 | 
    24 shift;
 | 
| 
igor@66
 | 
    25 
 | 
| 
igor@66
 | 
    26 my $StateFile = $ARGV[0];
 | 
| 
igor@66
 | 
    27 shift;
 | 
| 
igor@66
 | 
    28 
 | 
| 
igor@66
 | 
    29 sub load_state()
 | 
| 
igor@66
 | 
    30 {
 | 
| 
igor@66
 | 
    31     my %state;
 | 
| 
igor@66
 | 
    32     my $entries = 0;
 | 
| 
igor@66
 | 
    33     if (open(FILE, "$StateFile")) {
 | 
| 
igor@66
 | 
    34         while(<FILE>) {
 | 
| 
igor@66
 | 
    35             chomp;
 | 
| 
igor@66
 | 
    36             my ($k,$v) = split /\s+/, $_, 2;
 | 
| 
igor@66
 | 
    37             $state{$k} = $v;
 | 
| 
igor@66
 | 
    38             $entries += 1;
 | 
| 
igor@66
 | 
    39         }
 | 
| 
igor@66
 | 
    40     }
 | 
| 
igor@66
 | 
    41     $state{"ENTRIES"} = $entries;
 | 
| 
igor@66
 | 
    42     return \%state;
 | 
| 
igor@66
 | 
    43 }
 | 
| 
igor@66
 | 
    44 
 | 
| 
igor@66
 | 
    45 @colors = qw(ccccff 7aedaa ddeecc ffccee);
 | 
| 
igor@66
 | 
    46 
 | 
| 
igor@66
 | 
    47 our %change_matrix;
 | 
| 
igor@66
 | 
    48 our %color;
 | 
| 
igor@66
 | 
    49 our $dropdown_number = 0;
 | 
| 
igor@66
 | 
    50 
 | 
| 
igor@66
 | 
    51 $i = 0;
 | 
| 
igor@66
 | 
    52 for (split /\n/, $change_matrix){
 | 
| 
igor@66
 | 
    53     next if /^\s*$/;
 | 
| 
igor@66
 | 
    54     my @words = sort(split /\s+/);
 | 
| 
igor@66
 | 
    55     for my $kw (@words) {
 | 
| 
igor@66
 | 
    56         $change_matrix{$kw} = [ "???", @words ];
 | 
| 
igor@66
 | 
    57         $color{$kw} = $colors[$i%@colors];
 | 
| 
igor@66
 | 
    58     }
 | 
| 
igor@66
 | 
    59     # uppercase
 | 
| 
igor@66
 | 
    60     for (@words) {
 | 
| 
igor@66
 | 
    61         s/(.)(.*)/\U$1\E$2/;
 | 
| 
igor@66
 | 
    62     }
 | 
| 
igor@66
 | 
    63     for my $kw (@words) {
 | 
| 
igor@66
 | 
    64         $change_matrix{$kw} = [ "???", @words ];
 | 
| 
igor@66
 | 
    65         $color{$kw} = $colors[$i%@colors];
 | 
| 
igor@66
 | 
    66     }
 | 
| 
igor@66
 | 
    67     $i += 1;
 | 
| 
igor@66
 | 
    68 };
 | 
| 
igor@66
 | 
    69 
 | 
| 
igor@66
 | 
    70 #for (keys(%change_matrix)) {
 | 
| 
igor@66
 | 
    71 #    print "$_ => ".join(", ", @{$change_matrix{$_}})."\n";
 | 
| 
igor@66
 | 
    72 #    print "$_ => ".$color{$_}."\n";
 | 
| 
igor@66
 | 
    73 #}
 | 
| 
igor@66
 | 
    74 our $CorrectAnswers = 0;
 | 
| 
igor@66
 | 
    75 
 | 
| 
igor@66
 | 
    76 sub generate_drop_down($$)
 | 
| 
igor@66
 | 
    77 {
 | 
| 
igor@66
 | 
    78     my $word = $_[0];
 | 
| 
igor@66
 | 
    79     my %state = %{$_[1]};
 | 
| 
igor@66
 | 
    80 
 | 
| 
igor@66
 | 
    81     my $name = "dropdown$dropdown_number";
 | 
| 
igor@66
 | 
    82     my $value = $state{$name};
 | 
| 
igor@66
 | 
    83     $dropdown_number += 1;
 | 
| 
igor@66
 | 
    84     my @variants = @{$change_matrix{$word}};
 | 
| 
igor@66
 | 
    85     $options = join("", map {my $selected = ""; $selected='selected="selected"' if $_ eq $value; "<option value=$_ $selected>$_</option>"} @variants);
 | 
| 
igor@66
 | 
    86     my $color = $color{$word};
 | 
| 
igor@66
 | 
    87     if ($word eq $value) {
 | 
| 
igor@66
 | 
    88         $color = "ffffff";
 | 
| 
igor@66
 | 
    89         $CorrectAnswers += 1;
 | 
| 
igor@66
 | 
    90     }
 | 
| 
igor@66
 | 
    91     if ($color) {
 | 
| 
igor@66
 | 
    92         $color = "background:#$color";
 | 
| 
igor@66
 | 
    93     }
 | 
| 
igor@66
 | 
    94     my $disabled = "";
 | 
| 
igor@66
 | 
    95     if ($value eq $word) {
 | 
| 
igor@66
 | 
    96         $disabled = "disabled";
 | 
| 
igor@66
 | 
    97     }
 | 
| 
igor@66
 | 
    98     my $onchange = "onchange='javascript:myAlert(\"$name\", this.form.$name, \"$word\")'";
 | 
| 
igor@66
 | 
    99     return "<form style='display:inline!important;'><select name='$name' $value $disabled $onchange style='font-size:80%; $color'>".$options."</select></form>"; 
 | 
| 
igor@66
 | 
   100 }
 | 
| 
igor@66
 | 
   101 sub highlight_word($$$)
 | 
| 
igor@66
 | 
   102 {
 | 
| 
igor@66
 | 
   103     my $tag = $_[0];
 | 
| 
igor@66
 | 
   104     my $text = $_[1];
 | 
| 
igor@66
 | 
   105     my $state = $_[2];
 | 
| 
igor@66
 | 
   106 
 | 
| 
igor@66
 | 
   107     if ($tag=~/^<[aA]/) {
 | 
| 
igor@66
 | 
   108         return $tag.$text;
 | 
| 
igor@66
 | 
   109     }
 | 
| 
igor@66
 | 
   110     my $re = join("|", keys(%change_matrix));
 | 
| 
igor@66
 | 
   111     $text =~ s@(^|[;> ])($re)(?=([ <]|$))@"$1".generate_drop_down($2, $state)@egms;
 | 
| 
igor@66
 | 
   112     return $tag.$text;
 | 
| 
igor@66
 | 
   113 }
 | 
| 
igor@66
 | 
   114 
 | 
| 
igor@66
 | 
   115 my $state = load_state();
 | 
| 
igor@66
 | 
   116 #my %a = %{$state};
 | 
| 
igor@66
 | 
   117 #print join(", ", keys(%a)),"\n";
 | 
| 
igor@66
 | 
   118 
 | 
| 
igor@66
 | 
   119 $jquery = "<script type='text/javascript' src='http://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js'></script>";
 | 
| 
igor@66
 | 
   120 local $/;
 | 
| 
igor@66
 | 
   121 $text = <>;
 | 
| 
igor@66
 | 
   122 $text =~ s@(<a.*?>)(.*?)(</a>)@$2@g;
 | 
| 
igor@66
 | 
   123 $text =~ s@(.*)(<body[^>]*>)@$2@ims;
 | 
| 
igor@66
 | 
   124 my $before_body = $1;
 | 
| 
igor@66
 | 
   125 $text =~ s@(</body[^>]*>)@<script type='text/javascript'>memo_init();</script>$1@ims;
 | 
| 
igor@66
 | 
   126 $text =~ s/(<.*?>)([^<]*)(?=<)/highlight_word($1, $2, $state)/egms;
 | 
| 
igor@66
 | 
   127 $text = $before_body.$text;
 | 
| 
igor@66
 | 
   128 
 | 
| 
igor@66
 | 
   129 my $wrong_answers = $$state{"ENTRIES"} - $CorrectAnswers;
 | 
| 
igor@66
 | 
   130 $info_div = "
 | 
| 
igor@66
 | 
   131     <div style='
 | 
| 
igor@66
 | 
   132         position:fixed;
 | 
| 
igor@66
 | 
   133         bottom:0;
 | 
| 
igor@66
 | 
   134         right:0;
 | 
| 
igor@66
 | 
   135         color:white;
 | 
| 
igor@66
 | 
   136         background-color:green;
 | 
| 
igor@66
 | 
   137         font-size:70%;
 | 
| 
igor@66
 | 
   138         padding:5pt;
 | 
| 
igor@66
 | 
   139         z-index:1000;
 | 
| 
igor@66
 | 
   140         border-top-left-radius:
 | 
| 
igor@66
 | 
   141         5pt;-moz-border-radius-topleft:5pt;
 | 
| 
igor@66
 | 
   142         '>
 | 
| 
igor@66
 | 
   143             <span id='wrong_answers' style='color:#ff2222;'>$wrong_answers</span>  
 | 
| 
igor@66
 | 
   144             <span id='correct_answers'>$CorrectAnswers</span>  
 | 
| 
igor@66
 | 
   145             <span id='yet_to_answer'>$dropdown_number</span>
 | 
| 
igor@66
 | 
   146     </div>";
 | 
| 
igor@66
 | 
   147 
 | 
| 
igor@66
 | 
   148 $text =~ s@(<body[^>]*>)@<script type="text/javascript">var memo_subdir="$Subdir";</script><script type="text/javascript" src="http://xgu.ru/memo_files/memo.js"></script>$jquery$1$info_div@i;
 | 
| 
igor@66
 | 
   149 $text =~ s@(<head[^>]*>)@$1<base href="$BaseURL">@i;
 | 
| 
igor@66
 | 
   150 print $text;
 |