/[suikacvs]/markup/html/html5/spec-ja/common.pl
Suika

Contents of /markup/html/html5/spec-ja/common.pl

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.9 - (hide annotations) (download)
Sun Oct 26 07:03:10 2008 UTC (17 years, 3 months ago) by apache
Branch: MAIN
Changes since 1.8: +6 -2 lines
File MIME type: text/plain
/: 0e39ac88e71e60206c341926e3785dcd updated by

1 wakaba 1.1 use strict;
2    
3     my $data_suffix = q[.dat];
4 wakaba 1.7 my $data_dir_name = q[data/];
5 wakaba 1.8 my $data2_dir_name = q[data2/];
6     my $data2_suffix = q[.dat];
7     my $lock_suffix = q[.lock];
8     my $fallback_file_name = $data2_dir_name . 'fallback' . $data2_suffix;
9    
10     our $UseCVS //= 1;
11 wakaba 1.1
12     sub normalize ($) {
13     my $s = shift;
14     $s =~ s/\s+/ /g;
15     $s =~ s/^ //;
16     $s =~ s/ $//g;
17     return $s;
18     } # normalize
19    
20 wakaba 1.8 sub get_hash ($) {
21     require Digest::MD5;
22     return Digest::MD5::md5_hex (normalize ($_[0]));
23     } # get_hash
24    
25 wakaba 1.1 sub create_pattern1 ($) {
26     my $s = quotemeta shift;
27     $s =~ s/\\\*/(.+)/g;
28     return $s;
29     } # create_pattern1
30    
31     sub replace_pattern2 ($@) {
32     my $s = shift;
33     my @arg = @_;
34     $s =~ s/\$(\d+)/$arg[$1 - 1]/g;
35     return $s;
36     } # replace_pattern2
37    
38 wakaba 1.5 sub load_data_file ($$$) {
39     my ($data_file_name, $exact_data, $pattern_data) = @_;
40 wakaba 1.1
41     open my $data_file, '<:utf8', $data_file_name
42     or die "$0: $data_file_name: $!";
43     local $/ = undef;
44     my $data = <$data_file>;
45     $data =~ s/\x0D?\x0A/\n/g;
46     for (split /\n\n+(?=#)/, $data) {
47     my ($en, $ja) = split /\n#ja\n/, $_;
48     if ($en =~ s/^#en\n//) {
49     $exact_data->{normalize ($en)} = $ja;
50     } elsif ($en =~ s/^#pattern\n//) {
51     $pattern_data->{create_pattern1 (normalize ($en))} = $ja;
52     }
53     }
54     } # load_data_file
55    
56     sub for_each_data_file ($) {
57     my ($code) = @_;
58    
59     opendir my $data_dir, $data_dir_name or die "$0: $data_dir_name: $!";
60     for (sort {$a cmp $b} readdir $data_dir) {
61     next if /^\./; # hidden files
62 wakaba 1.2 next if /^_/; # editable but not-used files
63 wakaba 1.1 my $data_file_name = qq[$data_dir_name$_];
64     next unless $data_file_name =~ /\Q$data_suffix\E$/;
65 wakaba 1.3 $code->($data_file_name, $_);
66 wakaba 1.1 }
67     } # for_each_data_file
68 wakaba 1.8
69     sub read_data_file ($) {
70     my $file_name = shift;
71     if (-f $file_name) {
72     warn "Loading $file_name...\n";
73     return do $file_name;
74     } else {
75     warn "File $file_name not found\n";
76     return {};
77     }
78     } # read_data_file
79    
80     sub write_data_file ($$) {
81     my ($file_name, $data) = @_;
82    
83     require Data::Dumper;
84     local $Data::Dumper::Sortkeys = 1;
85    
86     my $had_file = -f $file_name;
87     open my $file, '>:encoding(utf8)', $file_name or die "$0: $file_name: $!";
88     print $file Data::Dumper::Dumper ($data);
89     close $file;
90     unless ($had_file) {
91 apache 1.9 system_ ('cvs', 'add', $file_name) if $UseCVS;
92 wakaba 1.8 }
93     } # write_data_file
94    
95     sub hash_to_file_name ($) {
96     return $data2_dir_name . substr ($_[0], 0, 2) . $data2_suffix;
97     } # hash_to_file_name
98    
99     my $Entry = {};
100    
101     sub get_entry ($) {
102     my $hash = shift;
103    
104     my $file_name = hash_to_file_name ($hash);
105     unless ($Entry->{$file_name}) {
106     $Entry->{$file_name} = read_data_file ($file_name);
107     }
108    
109     if ($Entry->{$file_name}->{exact}->{$hash}) {
110     return (0, $Entry->{$file_name}->{exact}->{$hash});
111     } elsif ($Entry->{$file_name}->{pattern}->{$hash}) {
112     return (1, $Entry->{$file_name}->{pattern}->{$hash});
113     } else {
114     return (undef, undef);
115     }
116     } # get_entry
117    
118     sub set_entry ($$$) {
119     my ($hash, $is_pattern, $value) = @_;
120    
121     my $file_name = hash_to_file_name ($hash);
122     unless ($Entry->{$file_name}) {
123     $Entry->{$file_name} = read_data_file ($file_name);
124     }
125    
126     unless ($value) {
127     delete $Entry->{$file_name}->{exact}->{$hash};
128     delete $Entry->{$file_name}->{pattern}->{$hash};
129     } elsif ($is_pattern) {
130     delete $Entry->{$file_name}->{exact}->{$hash};
131     $Entry->{$file_name}->{pattern}->{$hash} = $value;
132     } else {
133     $Entry->{$file_name}->{exact}->{$hash} = $value;
134     delete $Entry->{$file_name}->{pattern}->{$hash};
135     }
136     $Entry->{$file_name}->{modified} = 1;
137     } # set_entry
138    
139     use Fcntl ':flock';
140     my $Lock;
141    
142     sub lock_entry ($) {
143     if ($Lock) {
144     die "$0: lock_entry: Another entry is locked";
145     }
146    
147     my $hash = shift;
148     my $file_name = hash_to_file_name ($hash) . $lock_suffix;
149     open $Lock, '>', $file_name or die "$0: $file_name: $!";
150     flock $Lock, LOCK_EX;
151     } # lock_entry
152    
153     sub commit_entries ($) {
154     for my $file_name (keys %{$Entry}) {
155     if ($Entry->{$file_name}->{modified}) {
156     write_data_file ($file_name => $Entry->{$file_name});
157     }
158     }
159    
160     my $msg = shift // $0;
161 apache 1.9 system_ ('cvs', 'commit', -m => $msg) if $UseCVS;
162 wakaba 1.8 } # commit_entries
163    
164     sub get_all_entries () {
165     opendir my $dir, $data2_dir_name or die "$0: $data2_dir_name: $!";
166     for (readdir $dir) {
167     next unless /\Q$data2_suffix\E$/;
168     my $file_name = $data2_dir_name . $_;
169     next if $Entry->{$file_name};
170    
171     $Entry->{$file_name} = read_data_file ($file_name);
172     }
173    
174     return $Entry;
175     } # get_all_entries
176    
177     my $FallbackEntry;
178     sub get_fallback_entry ($) {
179     my $hash = shift;
180     unless (defined $FallbackEntry) {
181     $FallbackEntry = read_data_file ($fallback_file_name);
182     }
183     return $FallbackEntry->{$hash} // {};
184     } # get_fallback_entry
185    
186     sub set_fallback_entry ($$) {
187     my ($hash, $value) = @_;
188     unless (defined $FallbackEntry) {
189     $FallbackEntry = read_data_file ($fallback_file_name);
190     }
191     $FallbackEntry->{$hash} = $value;
192     } # set_fallback_entry
193    
194     sub clear_fallback_entries () {
195     $FallbackEntry = {};
196     } # clear_fallback_entries
197    
198     sub save_fallback_entries () {
199     write_data_file ($fallback_file_name => $FallbackEntry)
200     if defined $FallbackEntry;
201     } # save_fallback_entries
202    
203     sub htescape ($) {
204     my $s = shift;
205     $s =~ s/&/&amp;/g;
206     $s =~ s/</&lt;/g;
207     $s =~ s/"/&quot;/g;
208     return $s;
209     } # htescape
210 apache 1.9
211     sub system_ (@) {
212     (system @_) == 0 or die "$0: $?";
213     } # system_
214 wakaba 1.1
215     1;
216    

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24