There's also rstlint which performs a similar function, and supports many of the sphinx extensions to rST.
Link: http://svn.python.org/projects/python/trunk/Doc/tools/rstlint.py On Tue, Jun 19, 2012 at 04:52:38AM -0700, Mikael Lyngvig wrote: > Hi, > > I am trying to help the LLVM dev group by converting existing HTML > documentation into reSt. During that conversion stage, we've discovered > some frequently occuring mishaps in our documents that I'd like Sphinx to > catch, if possible. Currently, I am using a tiny Python script (see the > attached file) to check for these inconsistencies, but it would be very > nifty if Sphinx could catch them on its own. > > The three checks are: > > 1. Trailing whitespace in lines. > 2. Too long or too short section marker (the ===/---/^^^^ line is > shorter than or longer than the text that preceeds it). > 3. Too long lines: the LLVM group uses as standard 80 chars per line so > it would be nice with a warning, possibly by adding a new option (-maxlen > or whatever). > > The three checks are all cosmetic and does not affect the behavior of > Sphinx as far as I know. > > > Regards, > Mikael > > -- > You received this message because you are subscribed to the Google Groups > "sphinx-dev" group. > To view this discussion on the web visit > https://groups.google.com/d/msg/sphinx-dev/-/NaEV510lJroJ. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]. > For more options, visit this group at > http://groups.google.com/group/sphinx-dev?hl=en. > > #! /usr/bin/python > # A small script, which checks Sphinx reStructured Text (.rst) files for > various inconsistencies and errors so as to save > # bandwidth by catching some of the most obvious problems before the document > is sent off for review. > > import glob > import sys > > class RestructuredTextChecker: > > def __init__(self): > pass > > def load(self, filename, stderr=sys.stdout): > stream = open(filename, "rt") > number = 0 # line number > last = "" # last/previous line > while 1: > # read yet another line > line = stream.readline() > > # if None, we're at the end of the input > if not line: > break > > # increment line number > number += 1 > > # drop trailing newline, if any > if line[-1] == '\n': > line = line[:-1] > > # check for trailing whitespace > if line.rstrip() != line: > stderr.write("(%s %d) Warning: Trailing whitespace > detected\n" % ( filename, number )) > line = line.rstrip() # make comparisons of marker text > possible > > # check for too short or too long section marker > if len(line) > 0 and line[0] in "=-^": > if last != "" and len(line) < len(last): > stderr.write("(%s %d) Warning: Marker line too short\n" % > ( filename, number )) > elif last != "" and len(line) > len(last): > stderr.write("(%s %d) Warning: Marker line too long\n" % > ( filename, number )) > last = "" # disable line-too-long check of > section headers > continue > > # check for too long lines (in excess of 79 characters) > if len(last) > 79: > stderr.write("(%s %d) Warning: Line exceeds 79 characters\n" > % ( filename, number - 1 )) > > # todo: add other checks as they are discovered and deemed usable > > # save this line for possible future marker comparison > last = line > > stream.close() > > > def main(args): > # redirect all output to stdout (stderr belongs to the `yes` family of > utterly insane inventions). > output = sys.stdout > > # if no args given, show help > if len(args) == 0: > output.write("reStructured Text Checker v0.03\n") > output.write("Copyright (C) 2012 The LLVM Team. All Rights > Reserved.\n") > output.write("\n") > output.write("Syntax: \"chkrst\" source-file(s)\n") > output.write("\n") > output.write("Scans and checks .rst files for obvious yet > embarrassing errors.\n") > return 0 > > # expand wildcards in arguments > files = [] > for arg in args: > found = glob.glob(arg) > if found == []: > output.write("Warning: Pattern '%s' not matched\n" % arg) > files += found > > # process each file in turn > for file in files: > checker = RestructuredTextChecker() > checker.load(file, output) > del checker > > return 0 > > > if __name__ == "__main__": > result = main(sys.argv[1:]) > sys.exit(result) -- Sam Kleinman (tychoish): - [email protected] - tychoish <http://tychoish.com/> "don't get it right, get it written" -- james thurber
pgpYjjYYZzC7c.pgp
Description: PGP signature
