* Added separate checks for matching braces.

* Added more LaTex cmds from the docs.
* Blocked forward-slash warnings with delimiters-only option.
* Put help message on shorter line to fit an 80 char screen.
This commit is contained in:
Raymond Hettinger 2003-05-12 23:33:28 +00:00
parent b539d05cbe
commit 62aa994633

View file

@ -52,6 +52,11 @@ cmdstr = r"""
\refmodindex \seerfc \makeindex \makemodindex \renewcommand \refmodindex \seerfc \makeindex \makemodindex \renewcommand
\indexname \appendix \protect \indexiv \mbox \textasciitilde \indexname \appendix \protect \indexiv \mbox \textasciitilde
\platform \seeurl \leftmargin \labelwidth \localmoduletable \platform \seeurl \leftmargin \labelwidth \localmoduletable
\LaTeX \copyright \memberline \backslash \pi \centerline
\caption \vspace \textwidth \menuselection \textless
\makevar \csimplemacro \menuselection \bfcode \sub \release
\email \kwindex \refexmodindex \filenq \e \menuselection
\exindex \linev \newsgroup \verbatim \setshortversion
""" """
def matchclose(c_lineno, c_symbol, openers, pairmap): def matchclose(c_lineno, c_symbol, openers, pairmap):
@ -85,8 +90,6 @@ def checkit(source, opts, morecmds=[]):
for cmd in morecmds: for cmd in morecmds:
validcmds.add('\\' + cmd) validcmds.add('\\' + cmd)
openers = [] # Stack of pending open delimiters
if '-m' in opts: if '-m' in opts:
pairmap = {']':'[(', ')':'(['} # Munged openers pairmap = {']':'[(', ')':'(['} # Munged openers
else: else:
@ -94,6 +97,10 @@ def checkit(source, opts, morecmds=[]):
openpunct = sets.Set('([') # Set of valid openers openpunct = sets.Set('([') # Set of valid openers
delimiters = re.compile(r'\\(begin|end){([_a-zA-Z]+)}|([()\[\]])') delimiters = re.compile(r'\\(begin|end){([_a-zA-Z]+)}|([()\[\]])')
braces = re.compile(r'({)|(})')
openers = [] # Stack of pending open delimiters
bracestack = [] # Stack of pending open braces
tablestart = re.compile(r'\\begin{(?:long)?table([iv]+)}') tablestart = re.compile(r'\\begin{(?:long)?table([iv]+)}')
tableline = re.compile(r'\\line([iv]+){') tableline = re.compile(r'\\line([iv]+){')
@ -107,7 +114,7 @@ def checkit(source, opts, morecmds=[]):
for lineno, line in izip(count(startline), islice(source, startline-1, None)): for lineno, line in izip(count(startline), islice(source, startline-1, None)):
line = line.rstrip() line = line.rstrip()
if '-f' not in opts and '/' in line: if '/' in line and '-f' not in opts and '-d' not in opts:
# Warn whenever forward slashes encountered # Warn whenever forward slashes encountered
line = line.rstrip() line = line.rstrip()
print 'Warning, forward slash on line %d: %s' % (lineno, line) print 'Warning, forward slash on line %d: %s' % (lineno, line)
@ -123,7 +130,7 @@ def checkit(source, opts, morecmds=[]):
if cmd not in validcmds: if cmd not in validcmds:
print r'Warning, unknown tex cmd on line %d: \%s' % (lineno, cmd) print r'Warning, unknown tex cmd on line %d: \%s' % (lineno, cmd)
# Check balancing of open/close markers (parens, brackets, etc) # Check balancing of open/close parenthesis and brackets
for begend, name, punct in delimiters.findall(line): for begend, name, punct in delimiters.findall(line):
if '-v' in opts: if '-v' in opts:
print lineno, '|', begend, name, punct, print lineno, '|', begend, name, punct,
@ -138,6 +145,18 @@ def checkit(source, opts, morecmds=[]):
if '-v' in opts: if '-v' in opts:
print ' --> ', openers print ' --> ', openers
# Balance opening and closing braces
for open, close in braces.findall(line):
if open == '{':
bracestack.append(lineno)
if close == '}':
try:
bracestack.pop()
except IndexError:
print r'Warning, unmatched } on line %s.' % (lineno,)
if '-v' in opts:
print ' --> ', bracestack
# Check table levels (make sure lineii only inside tableii) # Check table levels (make sure lineii only inside tableii)
m = tablestart.search(line) m = tablestart.search(line)
if m: if m:
@ -152,6 +171,8 @@ def checkit(source, opts, morecmds=[]):
lastline = lineno lastline = lineno
for lineno, symbol in openers: for lineno, symbol in openers:
print "Unmatched open delimiter '%s' on line %d" % (symbol, lineno) print "Unmatched open delimiter '%s' on line %d" % (symbol, lineno)
for lineno in bracestack:
print "Unmatched { on line %d" % (lineno,)
print 'Done checking %d lines.' % (lastline,) print 'Done checking %d lines.' % (lastline,)
return 0 return 0