| Index: third_party/twisted_8_1/twisted/lore/lint.py
|
| diff --git a/third_party/twisted_8_1/twisted/lore/lint.py b/third_party/twisted_8_1/twisted/lore/lint.py
|
| deleted file mode 100644
|
| index 82a15b6de982b7419c1654fa39bcf1520c94d5d6..0000000000000000000000000000000000000000
|
| --- a/third_party/twisted_8_1/twisted/lore/lint.py
|
| +++ /dev/null
|
| @@ -1,214 +0,0 @@
|
| -# Copyright (c) 2001-2004 Twisted Matrix Laboratories.
|
| -# See LICENSE for details.
|
| -
|
| -#
|
| -
|
| -from twisted.lore import tree, process
|
| -from twisted.web import domhelpers, microdom
|
| -from twisted.python import reflect
|
| -
|
| -import parser, urlparse, os.path
|
| -
|
| -# parser.suite in Python 2.3 raises SyntaxError, <2.3 raises parser.ParserError
|
| -parserErrors = (SyntaxError, parser.ParserError)
|
| -
|
| -class TagChecker:
|
| -
|
| - def check(self, dom, filename):
|
| - self.hadErrors = 0
|
| - for method in reflect.prefixedMethods(self, 'check_'):
|
| - method(dom, filename)
|
| - if self.hadErrors:
|
| - raise process.ProcessingFailure("invalid format")
|
| -
|
| - def _reportError(self, filename, element, error):
|
| - hlint = element.hasAttribute('hlint') and element.getAttribute('hlint')
|
| - if hlint != 'off':
|
| - self.hadErrors = 1
|
| - pos = getattr(element, '_markpos', None) or (0, 0)
|
| - print "%s:%s:%s: %s" % ((filename,)+pos+(error,))
|
| -
|
| -
|
| -class DefaultTagChecker(TagChecker):
|
| -
|
| - def __init__(self, allowedTags, allowedClasses):
|
| - self.allowedTags = allowedTags
|
| - self.allowedClasses = allowedClasses
|
| -
|
| - def check_disallowedElements(self, dom, filename):
|
| - def m(node, self=self):
|
| - return not self.allowedTags(node.tagName)
|
| - for element in domhelpers.findElements(dom, m):
|
| - self._reportError(filename, element,
|
| - 'unrecommended tag %s' % element.tagName)
|
| -
|
| - def check_disallowedClasses(self, dom, filename):
|
| - def matcher(element, self=self):
|
| - if not element.hasAttribute('class'):
|
| - return 0
|
| - checker = self.allowedClasses.get(element.tagName, lambda x:0)
|
| - return not checker(element.getAttribute('class'))
|
| - for element in domhelpers.findElements(dom, matcher):
|
| - self._reportError(filename, element,
|
| - 'unknown class %s' %element.getAttribute('class'))
|
| -
|
| - def check_quote(self, dom, filename):
|
| - def matcher(node):
|
| - return ('"' in getattr(node, 'data', '') and
|
| - not isinstance(node, microdom.Comment) and
|
| - not [1 for n in domhelpers.getParents(node)[1:-1]
|
| - if n.tagName in ('pre', 'code')])
|
| - for node in domhelpers.findNodes(dom, matcher):
|
| - self._reportError(filename, node.parentNode, 'contains quote')
|
| -
|
| - def check_styleattr(self, dom, filename):
|
| - for node in domhelpers.findElementsWithAttribute(dom, 'style'):
|
| - self._reportError(filename, node, 'explicit style')
|
| -
|
| - def check_align(self, dom, filename):
|
| - for node in domhelpers.findElementsWithAttribute(dom, 'align'):
|
| - self._reportError(filename, node, 'explicit alignment')
|
| -
|
| - def check_style(self, dom, filename):
|
| - for node in domhelpers.findNodesNamed(dom, 'style'):
|
| - if domhelpers.getNodeText(node) != '':
|
| - self._reportError(filename, node, 'hand hacked style')
|
| -
|
| - def check_title(self, dom, filename):
|
| - doc = dom.documentElement
|
| - title = domhelpers.findNodesNamed(dom, 'title')
|
| - if len(title)!=1:
|
| - return self._reportError(filename, doc, 'not exactly one title')
|
| - h1 = domhelpers.findNodesNamed(dom, 'h1')
|
| - if len(h1)!=1:
|
| - return self._reportError(filename, doc, 'not exactly one h1')
|
| - if domhelpers.getNodeText(h1[0]) != domhelpers.getNodeText(title[0]):
|
| - self._reportError(filename, h1[0], 'title and h1 text differ')
|
| -
|
| - def check_80_columns(self, dom, filename):
|
| - for node in domhelpers.findNodesNamed(dom, 'pre'):
|
| - # the ps/pdf output is in a font that cuts off at 80 characters,
|
| - # so this is enforced to make sure the interesting parts (which
|
| - # are likely to be on the right-hand edge) stay on the printed
|
| - # page.
|
| - for line in domhelpers.gatherTextNodes(node, 1).split('\n'):
|
| - if len(line.rstrip()) > 80:
|
| - self._reportError(filename, node,
|
| - 'text wider than 80 columns in pre')
|
| - for node in domhelpers.findNodesNamed(dom, 'a'):
|
| - if node.getAttribute('class', '').endswith('listing'):
|
| - try:
|
| - fn = os.path.dirname(filename)
|
| - fn = os.path.join(fn, node.getAttribute('href'))
|
| - lines = open(fn,'r').readlines()
|
| - except:
|
| - self._reportError(filename, node,
|
| - 'bad listing href: %r' %
|
| - node.getAttribute('href'))
|
| - continue
|
| -
|
| - for line in lines:
|
| - if len(line.rstrip()) > 80:
|
| - self._reportError(filename, node,
|
| - 'listing wider than 80 columns')
|
| -
|
| - def check_pre_py_listing(self, dom, filename):
|
| - for node in domhelpers.findNodesNamed(dom, 'pre'):
|
| - if node.getAttribute('class') == 'python':
|
| - try:
|
| - text = domhelpers.getNodeText(node)
|
| - # Fix < and >
|
| - text = text.replace('>', '>').replace('<', '<')
|
| - # Strip blank lines
|
| - lines = filter(None,[l.rstrip() for l in text.split('\n')])
|
| - # Strip leading space
|
| - while not [1 for line in lines if line[:1] not in ('',' ')]:
|
| - lines = [line[1:] for line in lines]
|
| - text = '\n'.join(lines) + '\n'
|
| - try:
|
| - parser.suite(text)
|
| - except parserErrors, e:
|
| - # Pretend the "..." idiom is syntactically valid
|
| - text = text.replace("...","'...'")
|
| - parser.suite(text)
|
| - except parserErrors, e:
|
| - self._reportError(filename, node,
|
| - 'invalid python code:' + str(e))
|
| -
|
| - def check_anchor_in_heading(self, dom, filename):
|
| - headingNames = ['h%d' % n for n in range(1,7)]
|
| - for hname in headingNames:
|
| - for node in domhelpers.findNodesNamed(dom, hname):
|
| - if domhelpers.findNodesNamed(node, 'a'):
|
| - self._reportError(filename, node, 'anchor in heading')
|
| -
|
| - def check_texturl_matches_href(self, dom, filename):
|
| - for node in domhelpers.findNodesNamed(dom, 'a'):
|
| - if not node.hasAttribute('href'):
|
| - continue
|
| - text = domhelpers.getNodeText(node)
|
| - proto = urlparse.urlparse(text)[0]
|
| - if proto and ' ' not in text:
|
| - if text != node.getAttribute('href',''):
|
| - self._reportError(filename, node,
|
| - 'link text does not match href')
|
| -
|
| - def check_a_py_listing(self, dom, filename):
|
| - for node in domhelpers.findNodesNamed(dom, 'a'):
|
| - if node.getAttribute('class') == 'py-listing':
|
| - fn = os.path.join(os.path.dirname(filename),
|
| - node.getAttribute('href'))
|
| - lines = open(fn).readlines()
|
| - lines = lines[int(node.getAttribute('skipLines', 0)):]
|
| - for line, num in zip(lines, range(len(lines))):
|
| - if line.count('59 Temple Place, Suite 330, Boston'):
|
| - self._reportError(filename, node,
|
| - 'included source file %s has licence boilerplate.'
|
| - ' Use skipLines="%d".'
|
| - % (fn, int(node.getAttribute('skipLines',0))+num+1))
|
| -
|
| - def check_lists(self, dom, filename):
|
| - for node in (domhelpers.findNodesNamed(dom, 'ul')+
|
| - domhelpers.findNodesNamed(dom, 'ol')):
|
| - if not node.childNodes:
|
| - self._reportError(filename, node, 'empty list')
|
| - for child in node.childNodes:
|
| - if child.nodeName != 'li':
|
| - self._reportError(filename, node,
|
| - 'only list items allowed in lists')
|
| -
|
| -
|
| -def list2dict(l):
|
| - d = {}
|
| - for el in l:
|
| - d[el] = None
|
| - return d
|
| -
|
| -classes = list2dict(['shell', 'API', 'python', 'py-prototype', 'py-filename',
|
| - 'py-src-string', 'py-signature', 'py-src-parameter',
|
| - 'py-src-identifier', 'py-src-keyword'])
|
| -
|
| -tags = list2dict(["html", "title", "head", "body", "h1", "h2", "h3", "ol", "ul",
|
| - "dl", "li", "dt", "dd", "p", "code", "img", "blockquote", "a",
|
| - "cite", "div", "span", "strong", "em", "pre", "q", "table",
|
| - "tr", "td", "th", "style", "sub", "sup", "link"])
|
| -
|
| -span = list2dict(['footnote', 'manhole-output', 'index'])
|
| -
|
| -div = list2dict(['note', 'boxed', 'doit'])
|
| -
|
| -a = list2dict(['listing', 'py-listing', 'html-listing', 'absolute'])
|
| -
|
| -pre = list2dict(['python', 'shell', 'python-interpreter', 'elisp'])
|
| -
|
| -allowed = {'code': classes.has_key, 'span': span.has_key, 'div': div.has_key,
|
| - 'a': a.has_key, 'pre': pre.has_key, 'ul': lambda x: x=='toc',
|
| - 'ol': lambda x: x=='toc', 'li': lambda x: x=='ignoretoc'}
|
| -
|
| -def getDefaultChecker():
|
| - return DefaultTagChecker(tags.has_key, allowed)
|
| -
|
| -def doFile(file, checker):
|
| - dom = tree.parseFileAndReport(file)
|
| - if dom:
|
| - checker.check(dom, file)
|
|
|