Changed the 03oz abbreviation to 03toz
[project-aon.git] / scripts / sortcorrhtml.pl
1 #!/usr/bin/perl -w
2 #
3 # Sort Correction HTML
4 #
5 # Sorts input correction HTML. Can also filter out corrections for undesired
6 # books.
7 #
8 # Assumes that corrections appear one per line. Good practice would be to pipe
9 # the output of corrtohtml.pl to this function:
10 #
11 #   corrtohtml.pl corrections | sortcorrhtml.pl
12 #
13 ################################################################################
14
15 use strict;
16
17 my $progName = "sortcorrhtml";
18 my $usage = "$progName [options]\n" .
19             "\t-b bookcode   exclude corrections specified for other books\n" .
20             "\t-s            strip book tags\n" .
21             "\t-v            verbose reporting\n";
22
23 my $optsProcessed = 0;
24 my $bookCode = "";
25 my $bookCodeReport = "";
26 my $stripBookInfo = 0;
27 my $includeUnspecifiedBook = 0;
28 my $verbose = 0;
29
30 while( $#ARGV > -1 && not $optsProcessed ) {
31   my $commandLineItem = shift @ARGV;
32   if( $commandLineItem eq "-b" ) {
33     $bookCode = shift @ARGV or die $usage;
34   }
35   elsif( $commandLineItem eq "-s" ) {
36     $stripBookInfo = 1;
37   }
38   elsif( $commandLineItem eq "-v" ) {
39     $verbose = 1;
40   }
41   elsif( $commandLineItem eq "--help" ) {
42     print $usage and exit;
43   }
44   else {
45     unshift @ARGV, $commandLineItem;
46     $optsProcessed = 1;
47   }
48 }
49
50 if( $verbose ) {
51     $bookCodeReport = " [$bookCode]";
52 }
53
54 my @bookSortOrder = &getBookSortOrder( );
55 my @sectSortOrder = &getSectSortOrder( );
56
57 my %buckets = ( );
58
59 my $corrRegex = qr{^.+?(<!--[[:space:]]*([^-]+?)[[:space:]]*-->)?<a href="([^.]+)[^#]+#([[:digit:]]*)};
60
61 my $bookRegex;
62 if( $bookCode ne "" ) {
63   $bookRegex = qr{^.+?(<!--[[:space:]]*($bookCode)[[:space:]]*-->)<a href="([^.]+).htm};
64 }
65
66 my $stripRegex;
67 if( $bookCode ne "" ) {
68   $stripRegex = qr{<!--[[:space:]]*$bookCode[[:space:]]*-->}; 
69 }
70 else {
71   $stripRegex = qr{<!--[[:space:]]*[^-]+?[[:space:]]*-->};
72 }
73
74 my @lines = <>;
75 my $maxIssue = 0;
76
77 foreach my $line (@lines) {
78   if( $bookCode ne "" ) {
79     ($line =~ m{$bookRegex}) or next; # skip other books
80   }
81
82   ($line =~ m{$corrRegex}) or die( "Error ($progName)$bookCodeReport: unrecognized correction: $line\n" );
83   my( $book, $sect, $issue ) = ($2, $3, $4);
84   $book = "unknown" unless defined $book;
85   $issue = "unassigned" unless defined $issue && $issue ne "";
86   $buckets{$book} = { } unless exists $buckets{$book};
87   $buckets{$book}->{$sect} = { } unless exists $buckets{$book}->{$sect};
88   $buckets{$book}->{$sect}->{$issue} = [ ] unless exists $buckets{$book}->{$sect}->{$issue};
89
90   if( $stripBookInfo ) {
91     $line =~ s/$stripRegex//;
92   }
93
94   if( $issue ne "unassigned" && $issue > $maxIssue ) { $maxIssue = $issue; }
95
96   push @{$buckets{$book}->{$sect}->{$issue}}, $line;
97 }
98
99 foreach my $bookKey (keys %buckets) {
100   my $found = 0;
101   foreach my $book (@bookSortOrder) {
102     if( $bookKey eq $book ) { $found = 1; }
103   }
104   unless( $found ) { die( "Error ($progName)$bookCodeReport: unknown book code: $bookKey\n" ); }
105
106   foreach my $sectKey (keys %{$buckets{$bookKey}}) {
107     $found = 0;
108     foreach my $sect (@sectSortOrder) {
109       if( $sectKey eq $sect ) { $found = 1; }
110     }
111     unless( $found ) { die( "Error ($progName)$bookCodeReport: unknown section: $sectKey\n" ); }
112   }
113 }
114
115 for( my $i = 0; $i <= $#bookSortOrder; ++$i ) {
116   for( my $j = 0; $j <= $#sectSortOrder; ++$j ) {
117     for( my $k = 0; $k <= $maxIssue; ++$k ) {
118       print @{$buckets{$bookSortOrder[$i]}->{$sectSortOrder[$j]}->{$k}} if exists $buckets{$bookSortOrder[$i]} && exists $buckets{$bookSortOrder[$i]}->{$sectSortOrder[$j]} && exists $buckets{$bookSortOrder[$i]}->{$sectSortOrder[$j]}->{$k};
119     }
120     while( $#{$buckets{$bookSortOrder[$i]}->{$sectSortOrder[$j]}->{'unassigned'}} > -1 ) {
121       print shift @{$buckets{$bookSortOrder[$i]}->{$sectSortOrder[$j]}->{'unassigned'}};
122     }
123   }
124 }
125
126 ################################################################################
127
128 sub getBookSortOrder {
129   return qw{
130     unknown
131     01fftd
132     02fotw
133     03tcok
134     04tcod
135     05sots
136     06tkot
137     07cd
138     08tjoh
139     09tcof
140     10tdot
141     11tpot
142     12tmod
143     13tplor
144     14tcok
145     15tdc
146     16tlov
147     17tdoi
148     18dotd
149     19wb
150     20tcon
151     21votm
152     22tbos
153     23mh
154     24rw
155     25totw
156     26tfobm
157     27v
158     28thos
159     01gstw
160     02tfc
161     03btng
162     04wotw
163     01hh
164     02smr
165     03toz
166     04cc
167     tmc
168     rh
169   };
170 }
171
172 sub getSectSortOrder {
173   return qw{
174     _unknown
175     toc
176     title
177     dedicate
178     acknwldg
179     coming
180     tssf
181     gamerulz
182     discplnz
183     powers
184     equipmnt
185     cmbtrulz
186     lorecrcl
187     levels
188     imprvdsc
189     kaiwisdm
190     sage
191     numbered
192     part1
193     sect1
194     sect2
195     sect3
196     sect4
197     sect5
198     sect6
199     sect7
200     sect8
201     sect9
202     sect10
203     sect11
204     sect12
205     sect13
206     sect14
207     sect15
208     sect16
209     sect17
210     sect18
211     sect19
212     sect20
213     sect21
214     sect22
215     sect23
216     sect24
217     sect25
218     sect26
219     sect27
220     sect28
221     sect29
222     sect30
223     sect31
224     sect32
225     sect33
226     sect34
227     sect35
228     sect36
229     sect37
230     sect38
231     sect39
232     sect40
233     sect41
234     sect42
235     sect43
236     sect44
237     sect45
238     sect46
239     sect47
240     sect48
241     sect49
242     sect50
243     sect51
244     sect52
245     sect53
246     sect54
247     sect55
248     sect56
249     sect57
250     sect58
251     sect59
252     sect60
253     sect61
254     sect62
255     sect63
256     sect64
257     sect65
258     sect66
259     sect67
260     sect68
261     sect69
262     sect70
263     sect71
264     sect72
265     sect73
266     sect74
267     sect75
268     sect76
269     sect77
270     sect78
271     sect79
272     sect80
273     sect81
274     sect82
275     sect83
276     sect84
277     sect85
278     sect86
279     sect87
280     sect88
281     sect89
282     sect90
283     sect91
284     sect92
285     sect93
286     sect94
287     sect95
288     sect96
289     sect97
290     sect98
291     sect99
292     sect100
293     sect101
294     sect102
295     sect103
296     sect104
297     sect105
298     sect106
299     sect107
300     sect108
301     sect109
302     sect110
303     sect111
304     sect112
305     sect113
306     sect114
307     sect115
308     sect116
309     sect117
310     sect118
311     sect119
312     sect120
313     sect121
314     sect122
315     sect123
316     sect124
317     sect125
318     sect126
319     sect127
320     sect128
321     sect129
322     sect130
323     sect131
324     sect132
325     sect133
326     sect134
327     sect135
328     sect136
329     sect137
330     sect138
331     sect139
332     sect140
333     sect141
334     sect142
335     sect143
336     sect144
337     sect145
338     sect146
339     sect147
340     sect148
341     sect149
342     sect150
343     sect151
344     sect152
345     sect153
346     sect154
347     sect155
348     sect156
349     sect157
350     sect158
351     sect159
352     sect160
353     sect161
354     sect162
355     sect163
356     sect164
357     sect165
358     sect166
359     sect167
360     sect168
361     sect169
362     sect170
363     sect171
364     sect172
365     sect173
366     sect174
367     sect175
368     sect176
369     sect177
370     sect178
371     sect179
372     sect180
373     sect181
374     sect182
375     sect183
376     sect184
377     sect185
378     sect186
379     sect187
380     sect188
381     sect189
382     sect190
383     sect191
384     sect192
385     sect193
386     sect194
387     sect195
388     sect196
389     sect197
390     sect198
391     sect199
392     part2
393     sect200
394     sect201
395     sect202
396     sect203
397     sect204
398     sect205
399     sect206
400     sect207
401     sect208
402     sect209
403     sect210
404     sect211
405     sect212
406     sect213
407     sect214
408     sect215
409     sect216
410     sect217
411     sect218
412     sect219
413     sect220
414     sect221
415     sect222
416     sect223
417     sect224
418     sect225
419     sect226
420     sect227
421     sect228
422     sect229
423     sect230
424     sect231
425     sect232
426     sect233
427     sect234
428     sect235
429     sect236
430     sect237
431     sect238
432     sect239
433     sect240
434     sect241
435     sect242
436     sect243
437     sect244
438     sect245
439     sect246
440     sect247
441     sect248
442     sect249
443     sect250
444     sect251
445     sect252
446     sect253
447     sect254
448     sect255
449     sect256
450     sect257
451     sect258
452     sect259
453     sect260
454     sect261
455     sect262
456     sect263
457     sect264
458     sect265
459     sect266
460     sect267
461     sect268
462     sect269
463     sect270
464     sect271
465     sect272
466     sect273
467     sect274
468     sect275
469     sect276
470     sect277
471     sect278
472     sect279
473     sect280
474     sect281
475     sect282
476     sect283
477     sect284
478     sect285
479     sect286
480     sect287
481     sect288
482     sect289
483     sect290
484     sect291
485     sect292
486     sect293
487     sect294
488     sect295
489     sect296
490     sect297
491     sect298
492     sect299
493     sect300
494     sect301
495     sect302
496     sect303
497     sect304
498     sect305
499     sect306
500     sect307
501     sect308
502     sect309
503     sect310
504     sect311
505     sect312
506     sect313
507     sect314
508     sect315
509     sect316
510     sect317
511     sect318
512     sect319
513     sect320
514     sect321
515     sect322
516     sect323
517     sect324
518     sect325
519     sect326
520     sect327
521     sect328
522     sect329
523     sect330
524     sect331
525     sect332
526     sect333
527     sect334
528     sect335
529     sect336
530     sect337
531     sect338
532     sect339
533     sect340
534     sect341
535     sect342
536     sect343
537     sect344
538     sect345
539     sect346
540     sect347
541     sect348
542     sect349
543     sect350
544     sect351
545     sect352
546     sect353
547     sect354
548     sect355
549     sect356
550     sect357
551     sect358
552     sect359
553     sect360
554     sect361
555     sect362
556     sect363
557     sect364
558     sect365
559     sect366
560     sect367
561     sect368
562     sect369
563     sect370
564     sect371
565     sect372
566     sect373
567     sect374
568     sect375
569     sect376
570     sect377
571     sect378
572     sect379
573     sect380
574     sect381
575     sect382
576     sect383
577     sect384
578     sect385
579     sect386
580     sect387
581     sect388
582     sect389
583     sect390
584     sect391
585     sect392
586     sect393
587     sect394
588     sect395
589     sect396
590     sect397
591     sect398
592     sect399
593     sect400
594     ill1
595     ill2
596     ill3
597     ill4
598     ill5
599     ill6
600     ill7
601     ill8
602     ill9
603     ill10
604     ill11
605     ill12
606     ill13
607     ill14
608     ill15
609     ill16
610     ill17
611     ill18
612     ill19
613     ill20
614     passing
615     map
616     action
617     crsumary
618     crtable
619     random
620     errata
621     footnotz
622     illstrat
623     license
624   };
625 }