Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python
- import sys
- import getopt
- import re
- import string
- wrap = 79
- debug = False
- verbose = False
- quiet = False
- def usage(argv0):
- print >> sys.stderr, """
- usage: %s [options]
- options:
- -h,-?,--help : print this message
- -q,-quiet : suppress even more TeX and LaTeX output
- -v,-verbose : allow all TeX and LaTeX output
- -d,-debug : debug this script
- """ % (argv0)
- def msg(s):
- global debug, lineno
- if debug:
- #print >>sys.stderr, s
- print ("[input line %d] " % lineno) + s
- lineno = 0
- def read_partial_line():
- global lineno
- line = sys.stdin.readline()
- if not line:
- return None
- lineno += 1
- return line[:-1] if line.endswith('\n') else line
- def read_line_unwrapped():
- global verbatim_next_line
- line = read_partial_line()
- if verbatim_next_line:
- return line
- if line is None:
- return None
- n = len(line)
- while n == wrap:
- cont = read_partial_line()
- line += cont
- n = len(cont)
- return line
- re_fatal = re.compile(".*==> Fatal error")
- # re_error = re.compile("^l\.[1-9]\d* |^\.?/.*:[1-9]\d*: ")
- re_error = re.compile("^l\.[1-9]\d* |^<argument> ")
- # re_error = re.compile("^l\.[1-9]\d* ")
- re_underfull = re.compile("Underfull ")
- re_overfull = re.compile("Overfull ")
- re_xparse = re.compile("\* LaTeX warning: \"xparse/redefine-command\"$")
- re_ignore = re.compile(string.join( [
- "entering extended mode$",
- "LaTeX2e <.*>$",
- "Package: `setspace' [\d\.]* <.*>$",
- "Package scrlfile, .* \(loading files\)$",
- "For additional information .*$",
- "Copyright \(C\) Markus Kohm",
- "\*{49}$",
- "Babel.*loaded\.$",
- "\[Loading MPS to PDF converter.*\]$",
- "LaTeX Warning: Marginpar on page \d* moved\.$",
- "{[^ ]*}",
- "{\"?C:[/\\\\][^\"]*\"?}",
- "Non-PDF special ignored!",
- "No file .*\.bbl\.$",
- "LaTeX Warning: There were undefined references\.$",
- "\(see the transcript file for additional information\)",
- "{C:/Program Files/MiKTeX.*}<.*>$",
- "<[^>]*/[^>]*>"
- ], "|"))
- re_reference = re.compile("LaTeX Warning: Reference ")
- re_citation = re.compile("LaTeX Warning: Citation `.*' on page \d* undefined on input line \d*\.")
- re_fileref = re.compile('\([\.]*/|\("?C:[/\\\\]')
- def lstrip_filename(s):
- if len(s) > 2 and s[0] == '"':
- i = s.find('"', 1)
- if i == len(s)-1:
- return (s, None)
- else:
- return (s[:i], s[i+1:])
- for i in range(0, len(s)):
- if s[i] == ')':
- return (s[:i], s[i:])
- elif s[i] == ' ':
- return (s[:i], s[i+1:])
- return (s, None)
- def lstrip_pageno(s):
- for i in range(0, len(s)):
- if s[i] < '0' or s[i] > '9':
- return (s[:i], s[i:])
- return (s, None)
- parens = 0
- inpage = False
- underfull = 0
- overfull = 0
- references = 0
- citations = 0
- ignore_next_lines = 0
- verbatim_next_line = False
- status = 0
- last_match = None
- def save(m):
- global last_match
- last_match = m
- return m
- def filter(line):
- global parens, inpage, ignore_next_lines, verbatim_next_line, underfull, overfull, references, citations, status
- if ignore_next_lines > 0:
- ignore_next_lines = ignore_next_lines - 1
- return None
- if verbatim_next_line:
- verbatim_next_line = False
- print line
- return None
- # msg("filter: %s" % line)
- originalline = line
- line = line.lstrip()
- if not line:
- return None
- elif save(re_ignore.match(line)):
- # msg("..." + line)
- return line[last_match.end():]
- elif re_fileref.match(line):
- parens += 1
- # read a file name (assuming no spaces in file names) and keep filtering
- (filename,line) = lstrip_filename(line[1:])
- # msg("...processing file: %s" % (filename))
- return line
- elif line[0] == ')':
- if parens == 0:
- msg("mismatched right paren")
- else:
- parens -= 1
- return line[1:]
- elif line[0] == '[' and line[1] in ('1', '2', '3', '4', '5', '6', '7', '8', '9'):
- if inpage:
- msg("starting new page, but didn't finish last one")
- inpage = True
- (pageno, line) = lstrip_pageno(line[1:])
- # msg("... processing page: %s" % pageno)
- return line
- elif line[0] == ']':
- if not inpage:
- msg("endingn page, but never started one")
- inpage = False
- return line[1:]
- elif re_xparse.match(line):
- ignore_next_lines = 2
- return None
- elif re_underfull.match(line):
- underfull += 1
- ignore_next_lines = 1
- return None
- elif re_overfull.match(line):
- overfull += 1
- ignore_next_lines = 1
- return None
- elif re_reference.match(line):
- references += 1
- if not quiet:
- print originalline
- return None
- elif re_citation.match(line):
- citations += 1
- if not quiet:
- print originalline
- return None
- elif re_fatal.match(line):
- print originalline
- status = 1
- return None
- elif re_error.match(line):
- print originalline
- verbatim_next_line = 1
- return None
- else:
- print originalline
- return None
- def main(argv):
- global debug, verbose, quiet, wrap
- try:
- opts, args = getopt.getopt(argv[1:], "h?dvq", ["help", "quiet", "verbose", "debug"])
- except getopt.GetoptError:
- usage(argv[0])
- sys.exit(2)
- for opt, arg in opts:
- if opt in ("-h", "-?", "--help"):
- usage(argv[0])
- sys.exit()
- elif opt in ('-d', '--debug'):
- debug = True
- elif opt in ('-q', '--quiet'):
- quiet = True
- elif opt in ('-v', '--verbose'):
- verbose = True
- if quiet and verbose:
- quiet = False
- while True:
- line = read_line_unwrapped()
- if line is None:
- break
- while not (line is None):
- line = filter(line)
- if status:
- sys.exit(status)
- print "Number of underfull warnings : %d" % underfull
- print "Number of overfull warnings : %d" % overfull
- print "Number of undefined references : %d" % references
- print "Number of missing citations : %d" % citations
- if __name__ == "__main__":
- main(sys.argv)
Advertisement
Add Comment
Please, Sign In to add comment