pre-process.pl
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:5k
源码类别:

通讯编程

开发平台:

Visual C++

  1. #!/usr/bin/perl -w
  2. # -*- Mode:Perl; tab-width:8; indent-tabs-mode:t -*- 
  3. #
  4. # pre-process.pl
  5. # Copyright (C) 1999 by USC/ISI
  6. # All rights reserved.                                            
  7. #                                                                
  8. # Redistribution and use in source and binary forms are permitted
  9. # provided that the above copyright notice and this paragraph are
  10. # duplicated in all such forms and that any documentation, advertising
  11. # materials, and other materials related to such distribution and use
  12. # acknowledge that the software was developed by the University of
  13. # Southern California, Information Sciences Institute.  The name of the
  14. # University may not be used to endorse or promote products derived from
  15. # this software without specific prior written permission.
  16. # THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
  17. # WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  18. # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  19. # Contributed by Nader Salehi (USC/ISI), http://www.isi.edu/~salehi
  20. die "usage: $0 working-directoryn" if ($#ARGV < 0);
  21. use IO::Handle;
  22. STDOUT->autoflush(1);
  23. foreach (@ARGV) {
  24.     if (-d $_) {
  25. do_dir($_);
  26.     } elsif (-f $_) {
  27. &pre_process_file($_);
  28.     };
  29. };
  30. exit 0;
  31. sub do_dir {
  32.     my($dir) = @_;
  33.     my($here) = `pwd`; chomp $here;
  34.     chdir ($dir) || die  "cannot chdir $dirn";
  35.     foreach (<*.tex>) {
  36. &pre_process_file($_);
  37.     };
  38.     chdir($here);
  39. };
  40. sub rewrite_code_line {
  41.     my($s) = @_;
  42.     my($qchars) = '{}';
  43.     die "need two quote charsn" if (length($qchars) != 2);
  44.     my($dummy1, $qL, $dummy2, $qR) = split(/(.)/, $qchars);
  45.     my(@in) = split(/([\$qchars])/, $s);
  46.     my(@out) = ();
  47.     my($in_code) = 0;
  48.     my($level, $i);
  49.     push(@out, '');
  50.     for ($level = $i = 0; $i <= $#in; $i++) {
  51. if ($in[$i] eq '') {
  52.     # do nothing for nothing
  53. } elsif ($in[$i] eq "\") {
  54.     $out[$#out] .= $in[$i] . $in[$i+1];
  55.     $i++;  # skip quoted piece
  56. } elsif ($in[$i] eq $qL) {
  57.     if ($level == 0) {
  58. if ($out[$#out] =~ s/\code$//) {
  59.     die "$0: nested in-codes on line:nt$sn" if ($in_code);
  60.     $in_code = 1;
  61.     push(@out, '{tt ');
  62. } else {
  63.     $out[$#out] .= $in[$i];
  64.     $in_code = 0;
  65. };
  66.     } else {
  67.         $out[$#out] .= $in[$i];
  68.     };
  69.     $level++;
  70. } elsif($in[$i] eq $qR) {
  71.     $out[$#out] .= $in[$i];
  72.     $level--;
  73.     # die "$0: extra right-quotes on line:nt$sn" if ($level < 0);
  74.     if ($level == 0 && $in_code) {
  75. $out[$#out] = &code_innards_rewrite($out[$#out]);
  76. push(@out, '');
  77. $in_code = 0;
  78.     };
  79. } else {
  80.     $out[$#out] .= $in[$i];
  81. };
  82.     };
  83.     die "$0: unterminated \code{} on line:nt$sn" if ($in_code);
  84.     return join('', @out);
  85. }
  86. sub code_innards_rewrite {
  87.     my($c) = @_;
  88.     # slashes for these things are optional in code
  89.     # first get rid of extra slashes
  90.     $c =~ s/(\[_<>&$])/$1/g;
  91.     # now put them back everywhere consistently
  92.     $c =~ s/([_<>&$])/\$1/g;
  93.     return $c;
  94. }
  95. sub pre_process_file
  96. {
  97.     local($filename) = @_;
  98.     $program_env = 0;
  99.     $change = 0;
  100.     print "$filename: ";
  101.     open(FILE, "$filename") || die "Cannot open $filename: $_";
  102.     $outFile = "$filename.new";
  103.     open(OUTFILE, ">$outFile") || die "Cannot create temp file $_";
  104.     while (<FILE>) {
  105. if (/\begins*{(program)}/) {
  106.     $program_env = 1;
  107.     $change = 1;
  108.     s/$1/verbatim/g;
  109. };
  110. if ($program_env == 1) {
  111.     s/\;/#/g;
  112.     s/{s*\cfs*(#?.*)}/$1/g;
  113.     s/\([{|}])/$1/g;
  114.     s/\*(.*)*///*$1//g;
  115.     s/([<>_$])/\$1/g;
  116.     if (/\ends*{(program)}/) {
  117. $program_env = 0;
  118. s/$1/verbatim/g;
  119.     };
  120. };
  121. # Code is tricky because we have trouble matching paired {}'s
  122. if (/\code{/) {
  123.     $_ = rewrite_code_line($_);
  124. };
  125.         # can't read the alist in nsdoc.sty 
  126.         s/{alist}/{\par\tabular{\textwidth}{rX}}/g;
  127.         # latex2html does not read def macros; therefore, we must
  128.         # remap them here to normal latex commands
  129.         s/\nsf/\textasciitilde\emph{ns}//g;
  130.         s/\ns/\emph{ns}/g;
  131.         s/\namf/\textasciitilde\emph{nam}//g;
  132.         s/\nam/\emph{nam}/g;
  133.         s/\Tclf/\textasciitilde\emph{tclcl}//g;
  134.         s/\nsTcl/\emph{ns/tclcl}/g;
  135.         s/\rtglib/\textsl{rtglib}/g;
  136. # nader's old code handling:
  137. # s/\code{([^$}]*)}/{\ss $1}/g && ($change = 1);
  138. # s/\code{s*$([^}]*)}/{\em $1}/g && ($change = 1);
  139. # s/\code{[^w]*([^$]*)([^}]*)}/{\ss $1 $2}/g && s/$/\$/g && ($change = 1);
  140. # s/\proc[]{([^}]*)}/{\ss $1 }/g && ($change = 1);
  141. print OUTFILE unless (/^%/);
  142.     };
  143.     close(OUTFILE);
  144.     close(FILE);
  145.     if ($change == 1) {
  146. print " ALTEREDn";
  147. rename($filename, "$filename.org");
  148. rename($outFile, $filename);
  149.     } else {
  150.         print " unchangedn";
  151. unlink($outFile);
  152.     };
  153. }