# -*- test-case-name: twisted.python.test.test_htmlizer -*- # Copyright (c) Twisted Matrix Laboratories. # See LICENSE for details. """ HTML rendering of Python source. """ from twisted.python.compat import _tokenize, escape import tokenize, keyword from . import reflect from twisted.python._oldstyle import _oldStyle @_oldStyle class TokenPrinter: """ Format a stream of tokens and intermediate whitespace, for pretty-printing. """ currentCol, currentLine = 0, 1 lastIdentifier = parameters = 0 encoding = "utf-8" def __init__(self, writer): self.writer = writer def printtoken(self, type, token, sCoordinates, eCoordinates, line): if hasattr(tokenize, "ENCODING") and type == tokenize.ENCODING: self.encoding = token return (srow, scol) = sCoordinates (erow, ecol) = eCoordinates if self.currentLine < srow: self.writer('\n'*(srow-self.currentLine)) self.currentLine, self.currentCol = srow, 0 self.writer(' '*(scol-self.currentCol)) if self.lastIdentifier: type = "identifier" self.parameters = 1 elif type == tokenize.NAME: if keyword.iskeyword(token): type = 'keyword' else: if self.parameters: type = 'parameter' else: type = 'variable' else: type = tokenize.tok_name.get(type).lower() self.writer(token, type) self.currentCol = ecol self.currentLine += token.count('\n') if self.currentLine != erow: self.currentCol = 0 self.lastIdentifier = token in ('def', 'class') if token == ':': self.parameters = 0 @_oldStyle class HTMLWriter: """ Write the stream of tokens and whitespace from L{TokenPrinter}, formating tokens as HTML spans. """ noSpan = [] def __init__(self, writer): self.writer = writer noSpan = [] reflect.accumulateClassList(self.__class__, "noSpan", noSpan) self.noSpan = noSpan def write(self, token, type=None): if isinstance(token, bytes): token = token.decode("utf-8") token = escape(token) token = token.encode("utf-8") if (type is None) or (type in self.noSpan): self.writer(token) else: self.writer( b'<span class="py-src-' + type.encode("utf-8") + b'">' + token + b'</span>') class SmallerHTMLWriter(HTMLWriter): """ HTMLWriter that doesn't generate spans for some junk. Results in much smaller HTML output. """ noSpan = ["endmarker", "indent", "dedent", "op", "newline", "nl"] def filter(inp, out, writer=HTMLWriter): out.write(b'<pre>') printer = TokenPrinter(writer(out.write).write).printtoken try: for token in _tokenize(inp.readline): (tokenType, string, start, end, line) = token printer(tokenType, string, start, end, line) except tokenize.TokenError: pass out.write(b'</pre>\n') def main(): import sys stdout = getattr(sys.stdout, "buffer", sys.stdout) with open(sys.argv[1], "rb") as f: filter(f, stdout) if __name__ == '__main__': main()
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
__pycache__ | Folder | 0755 |
|
|
_pydoctortemplates | Folder | 0755 |
|
|
test | Folder | 0755 |
|
|
__init__.py | File | 674 B | 0644 |
|
_appdirs.py | File | 788 B | 0644 |
|
_inotify.py | File | 3.37 KB | 0644 |
|
_oldstyle.py | File | 2.53 KB | 0644 |
|
_release.py | File | 18.03 KB | 0644 |
|
_sendmsg.c | File | 15.42 KB | 0644 |
|
_setup.py | File | 12.6 KB | 0644 |
|
_shellcomp.py | File | 23.76 KB | 0644 |
|
_textattributes.py | File | 8.87 KB | 0644 |
|
_tzhelper.py | File | 3.12 KB | 0644 |
|
_url.py | File | 253 B | 0644 |
|
compat.py | File | 21.91 KB | 0644 |
|
components.py | File | 13.96 KB | 0644 |
|
constants.py | File | 544 B | 0644 |
|
context.py | File | 3.93 KB | 0644 |
|
deprecate.py | File | 26.15 KB | 0644 |
|
failure.py | File | 23.38 KB | 0644 |
|
fakepwd.py | File | 5.99 KB | 0644 |
|
filepath.py | File | 57.51 KB | 0644 |
|
formmethod.py | File | 11.19 KB | 0644 |
|
htmlizer.py | File | 3.27 KB | 0644 |
|
lockfile.py | File | 7.54 KB | 0644 |
|
log.py | File | 21.95 KB | 0644 |
|
logfile.py | File | 9.85 KB | 0644 |
|
modules.py | File | 26.5 KB | 0644 |
|
monkey.py | File | 2.17 KB | 0644 |
|
procutils.py | File | 1.39 KB | 0644 |
|
randbytes.py | File | 3.87 KB | 0644 |
|
rebuild.py | File | 9.04 KB | 0644 |
|
reflect.py | File | 19.02 KB | 0644 |
|
release.py | File | 1.16 KB | 0644 |
|
roots.py | File | 7.23 KB | 0644 |
|
runtime.py | File | 6.13 KB | 0644 |
|
sendmsg.py | File | 3.34 KB | 0644 |
|
shortcut.py | File | 2.2 KB | 0644 |
|
syslog.py | File | 3.64 KB | 0644 |
|
systemd.py | File | 2.77 KB | 0644 |
|
text.py | File | 5.35 KB | 0644 |
|
threadable.py | File | 3.22 KB | 0644 |
|
threadpool.py | File | 9.61 KB | 0644 |
|
twisted-completion.zsh | File | 1.33 KB | 0644 |
|
url.py | File | 244 B | 0644 |
|
urlpath.py | File | 8.87 KB | 0644 |
|
usage.py | File | 34.19 KB | 0644 |
|
util.py | File | 27.29 KB | 0644 |
|
versions.py | File | 322 B | 0644 |
|
win32.py | File | 5.42 KB | 0644 |
|
zippath.py | File | 9.02 KB | 0644 |
|
zipstream.py | File | 9.53 KB | 0644 |
|