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;
|