Initial revision
[project-aon.git] / scripts / sortcorrhtml.pl
diff --git a/scripts/sortcorrhtml.pl b/scripts/sortcorrhtml.pl
new file mode 100755 (executable)
index 0000000..1c5745e
--- /dev/null
@@ -0,0 +1,625 @@
+#!/usr/bin/perl -w
+#
+# Sort Correction HTML
+#
+# Sorts input correction HTML. Can also filter out corrections for undesired
+# books.
+#
+# Assumes that corrections appear one per line. Good practice would be to pipe
+# the output of corrtohtml.pl to this function:
+#
+#   corrtohtml.pl corrections | sortcorrhtml.pl
+#
+################################################################################
+
+use strict;
+
+my $progName = "sortcorrhtml";
+my $usage = "$progName [options]\n" .
+            "\t-b bookcode   exclude corrections specified for other books\n" .
+            "\t-s            strip book tags\n" .
+            "\t-v            verbose reporting\n";
+
+my $optsProcessed = 0;
+my $bookCode = "";
+my $bookCodeReport = "";
+my $stripBookInfo = 0;
+my $includeUnspecifiedBook = 0;
+my $verbose = 0;
+
+while( $#ARGV > -1 && not $optsProcessed ) {
+  my $commandLineItem = shift @ARGV;
+  if( $commandLineItem eq "-b" ) {
+    $bookCode = shift @ARGV or die $usage;
+  }
+  elsif( $commandLineItem eq "-s" ) {
+    $stripBookInfo = 1;
+  }
+  elsif( $commandLineItem eq "-v" ) {
+    $verbose = 1;
+  }
+  elsif( $commandLineItem eq "--help" ) {
+    print $usage and exit;
+  }
+  else {
+    unshift @ARGV, $commandLineItem;
+    $optsProcessed = 1;
+  }
+}
+
+if( $verbose ) {
+    $bookCodeReport = " [$bookCode]";
+}
+
+my @bookSortOrder = &getBookSortOrder( );
+my @sectSortOrder = &getSectSortOrder( );
+
+my %buckets = ( );
+
+my $corrRegex = qr{^.+?(<!--[[:space:]]*([^-]+?)[[:space:]]*-->)?<a href="([^.]+)[^#]+#([[:digit:]]*)};
+
+my $bookRegex;
+if( $bookCode ne "" ) {
+  $bookRegex = qr{^.+?(<!--[[:space:]]*($bookCode)[[:space:]]*-->)<a href="([^.]+).htm};
+}
+
+my $stripRegex;
+if( $bookCode ne "" ) {
+  $stripRegex = qr{<!--[[:space:]]*$bookCode[[:space:]]*-->}; 
+}
+else {
+  $stripRegex = qr{<!--[[:space:]]*[^-]+?[[:space:]]*-->};
+}
+
+my @lines = <>;
+my $maxIssue = 0;
+
+foreach my $line (@lines) {
+  if( $bookCode ne "" ) {
+    ($line =~ m{$bookRegex}) or next; # skip other books
+  }
+
+  ($line =~ m{$corrRegex}) or die( "Error ($progName)$bookCodeReport: unrecognized correction: $line\n" );
+  my( $book, $sect, $issue ) = ($2, $3, $4);
+  $book = "unknown" unless defined $book;
+  $issue = "unassigned" unless defined $issue && $issue ne "";
+  $buckets{$book} = { } unless exists $buckets{$book};
+  $buckets{$book}->{$sect} = { } unless exists $buckets{$book}->{$sect};
+  $buckets{$book}->{$sect}->{$issue} = [ ] unless exists $buckets{$book}->{$sect}->{$issue};
+
+  if( $stripBookInfo ) {
+    $line =~ s/$stripRegex//;
+  }
+
+  if( $issue ne "unassigned" && $issue > $maxIssue ) { $maxIssue = $issue; }
+
+  push @{$buckets{$book}->{$sect}->{$issue}}, $line;
+}
+
+foreach my $bookKey (keys %buckets) {
+  my $found = 0;
+  foreach my $book (@bookSortOrder) {
+    if( $bookKey eq $book ) { $found = 1; }
+  }
+  unless( $found ) { die( "Error ($progName)$bookCodeReport: unknown book code: $bookKey\n" ); }
+
+  foreach my $sectKey (keys %{$buckets{$bookKey}}) {
+    $found = 0;
+    foreach my $sect (@sectSortOrder) {
+      if( $sectKey eq $sect ) { $found = 1; }
+    }
+    unless( $found ) { die( "Error ($progName)$bookCodeReport: unknown section: $sectKey\n" ); }
+  }
+}
+
+for( my $i = 0; $i <= $#bookSortOrder; ++$i ) {
+  for( my $j = 0; $j <= $#sectSortOrder; ++$j ) {
+    for( my $k = 0; $k <= $maxIssue; ++$k ) {
+      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};
+    }
+    while( $#{$buckets{$bookSortOrder[$i]}->{$sectSortOrder[$j]}->{'unassigned'}} > -1 ) {
+      print shift @{$buckets{$bookSortOrder[$i]}->{$sectSortOrder[$j]}->{'unassigned'}};
+    }
+  }
+}
+
+################################################################################
+
+sub getBookSortOrder {
+  return qw{
+    unknown
+    01fftd
+    02fotw
+    03tcok
+    04tcod
+    05sots
+    06tkot
+    07cd
+    08tjoh
+    09tcof
+    10tdot
+    11tpot
+    12tmod
+    13tplor
+    14tcok
+    15tdc
+    16tlov
+    17tdoi
+    18dotd
+    19wb
+    20tcon
+    21votm
+    22tbos
+    23mh
+    24rw
+    25totw
+    26tfobm
+    27v
+    28thos
+    01gstw
+    02tfc
+    03btng
+    04wotw
+    01hh
+    02smr
+    03oz
+    04cc
+    tmc
+    rh
+  };
+}
+
+sub getSectSortOrder {
+  return qw{
+    _unknown
+    toc
+    title
+    dedicate
+    acknwldg
+    coming
+    tssf
+    gamerulz
+    discplnz
+    powers
+    equipmnt
+    cmbtrulz
+    lorecrcl
+    levels
+    imprvdsc
+    kaiwisdm
+    sage
+    numbered
+    part1
+    sect1
+    sect2
+    sect3
+    sect4
+    sect5
+    sect6
+    sect7
+    sect8
+    sect9
+    sect10
+    sect11
+    sect12
+    sect13
+    sect14
+    sect15
+    sect16
+    sect17
+    sect18
+    sect19
+    sect20
+    sect21
+    sect22
+    sect23
+    sect24
+    sect25
+    sect26
+    sect27
+    sect28
+    sect29
+    sect30
+    sect31
+    sect32
+    sect33
+    sect34
+    sect35
+    sect36
+    sect37
+    sect38
+    sect39
+    sect40
+    sect41
+    sect42
+    sect43
+    sect44
+    sect45
+    sect46
+    sect47
+    sect48
+    sect49
+    sect50
+    sect51
+    sect52
+    sect53
+    sect54
+    sect55
+    sect56
+    sect57
+    sect58
+    sect59
+    sect60
+    sect61
+    sect62
+    sect63
+    sect64
+    sect65
+    sect66
+    sect67
+    sect68
+    sect69
+    sect70
+    sect71
+    sect72
+    sect73
+    sect74
+    sect75
+    sect76
+    sect77
+    sect78
+    sect79
+    sect80
+    sect81
+    sect82
+    sect83
+    sect84
+    sect85
+    sect86
+    sect87
+    sect88
+    sect89
+    sect90
+    sect91
+    sect92
+    sect93
+    sect94
+    sect95
+    sect96
+    sect97
+    sect98
+    sect99
+    sect100
+    sect101
+    sect102
+    sect103
+    sect104
+    sect105
+    sect106
+    sect107
+    sect108
+    sect109
+    sect110
+    sect111
+    sect112
+    sect113
+    sect114
+    sect115
+    sect116
+    sect117
+    sect118
+    sect119
+    sect120
+    sect121
+    sect122
+    sect123
+    sect124
+    sect125
+    sect126
+    sect127
+    sect128
+    sect129
+    sect130
+    sect131
+    sect132
+    sect133
+    sect134
+    sect135
+    sect136
+    sect137
+    sect138
+    sect139
+    sect140
+    sect141
+    sect142
+    sect143
+    sect144
+    sect145
+    sect146
+    sect147
+    sect148
+    sect149
+    sect150
+    sect151
+    sect152
+    sect153
+    sect154
+    sect155
+    sect156
+    sect157
+    sect158
+    sect159
+    sect160
+    sect161
+    sect162
+    sect163
+    sect164
+    sect165
+    sect166
+    sect167
+    sect168
+    sect169
+    sect170
+    sect171
+    sect172
+    sect173
+    sect174
+    sect175
+    sect176
+    sect177
+    sect178
+    sect179
+    sect180
+    sect181
+    sect182
+    sect183
+    sect184
+    sect185
+    sect186
+    sect187
+    sect188
+    sect189
+    sect190
+    sect191
+    sect192
+    sect193
+    sect194
+    sect195
+    sect196
+    sect197
+    sect198
+    sect199
+    part2
+    sect200
+    sect201
+    sect202
+    sect203
+    sect204
+    sect205
+    sect206
+    sect207
+    sect208
+    sect209
+    sect210
+    sect211
+    sect212
+    sect213
+    sect214
+    sect215
+    sect216
+    sect217
+    sect218
+    sect219
+    sect220
+    sect221
+    sect222
+    sect223
+    sect224
+    sect225
+    sect226
+    sect227
+    sect228
+    sect229
+    sect230
+    sect231
+    sect232
+    sect233
+    sect234
+    sect235
+    sect236
+    sect237
+    sect238
+    sect239
+    sect240
+    sect241
+    sect242
+    sect243
+    sect244
+    sect245
+    sect246
+    sect247
+    sect248
+    sect249
+    sect250
+    sect251
+    sect252
+    sect253
+    sect254
+    sect255
+    sect256
+    sect257
+    sect258
+    sect259
+    sect260
+    sect261
+    sect262
+    sect263
+    sect264
+    sect265
+    sect266
+    sect267
+    sect268
+    sect269
+    sect270
+    sect271
+    sect272
+    sect273
+    sect274
+    sect275
+    sect276
+    sect277
+    sect278
+    sect279
+    sect280
+    sect281
+    sect282
+    sect283
+    sect284
+    sect285
+    sect286
+    sect287
+    sect288
+    sect289
+    sect290
+    sect291
+    sect292
+    sect293
+    sect294
+    sect295
+    sect296
+    sect297
+    sect298
+    sect299
+    sect300
+    sect301
+    sect302
+    sect303
+    sect304
+    sect305
+    sect306
+    sect307
+    sect308
+    sect309
+    sect310
+    sect311
+    sect312
+    sect313
+    sect314
+    sect315
+    sect316
+    sect317
+    sect318
+    sect319
+    sect320
+    sect321
+    sect322
+    sect323
+    sect324
+    sect325
+    sect326
+    sect327
+    sect328
+    sect329
+    sect330
+    sect331
+    sect332
+    sect333
+    sect334
+    sect335
+    sect336
+    sect337
+    sect338
+    sect339
+    sect340
+    sect341
+    sect342
+    sect343
+    sect344
+    sect345
+    sect346
+    sect347
+    sect348
+    sect349
+    sect350
+    sect351
+    sect352
+    sect353
+    sect354
+    sect355
+    sect356
+    sect357
+    sect358
+    sect359
+    sect360
+    sect361
+    sect362
+    sect363
+    sect364
+    sect365
+    sect366
+    sect367
+    sect368
+    sect369
+    sect370
+    sect371
+    sect372
+    sect373
+    sect374
+    sect375
+    sect376
+    sect377
+    sect378
+    sect379
+    sect380
+    sect381
+    sect382
+    sect383
+    sect384
+    sect385
+    sect386
+    sect387
+    sect388
+    sect389
+    sect390
+    sect391
+    sect392
+    sect393
+    sect394
+    sect395
+    sect396
+    sect397
+    sect398
+    sect399
+    sect400
+    ill1
+    ill2
+    ill3
+    ill4
+    ill5
+    ill6
+    ill7
+    ill8
+    ill9
+    ill10
+    ill11
+    ill12
+    ill13
+    ill14
+    ill15
+    ill16
+    ill17
+    ill18
+    ill19
+    ill20
+    passing
+    map
+    action
+    crsumary
+    crtable
+    random
+    errata
+    footnotz
+    illstrat
+    license
+  };
+}