Index: third_party/twisted_8_1/twisted/lore/man2lore.py |
diff --git a/third_party/twisted_8_1/twisted/lore/man2lore.py b/third_party/twisted_8_1/twisted/lore/man2lore.py |
deleted file mode 100644 |
index efa528a1b88eed23dc022fad285acf1da6305328..0000000000000000000000000000000000000000 |
--- a/third_party/twisted_8_1/twisted/lore/man2lore.py |
+++ /dev/null |
@@ -1,291 +0,0 @@ |
-# -*- test-case-name: twisted.lore.test.test_man2lore -*- |
-# Copyright (c) 2001-2008 Twisted Matrix Laboratories. |
-# See LICENSE for details. |
- |
- |
-""" |
-man2lore: Converts man page source (i.e. groff) into lore-compatible html. |
- |
-This is nasty and hackish (and doesn't support lots of real groff), but is good |
-enough for converting fairly simple man pages. |
-""" |
- |
-import re, os |
- |
-quoteRE = re.compile('"(.*?)"') |
- |
- |
- |
-def escape(text): |
- text = text.replace('<', '<').replace('>', '>') |
- text = quoteRE.sub('<q>\\1</q>', text) |
- return text |
- |
- |
- |
-def stripQuotes(s): |
- if s[0] == s[-1] == '"': |
- s = s[1:-1] |
- return s |
- |
- |
- |
-class ManConverter(object): |
- """ |
- Convert a man page to the Lore format. |
- |
- @ivar tp: State variable for handling text inside a C{TP} token. It can |
- take values from 0 to 3: |
- - 0: when outside of a C{TP} token. |
- - 1: once a C{TP} token has been encountered. If the previous value |
- was 0, a definition list is started. Then, at the first line of |
- text, a definition term is started. |
- - 2: when the first line after the C{TP} token has been handled. |
- The definition term is closed, and a definition is started with |
- the next line of text. |
- - 3: when the first line as definition data has been handled. |
- @type tp: C{int} |
- """ |
- state = 'regular' |
- name = None |
- tp = 0 |
- dl = 0 |
- para = 0 |
- |
- def convert(self, inf, outf): |
- self.write = outf.write |
- longline = '' |
- for line in inf.readlines(): |
- if line.rstrip() and line.rstrip()[-1] == '\\': |
- longline += line.rstrip()[:-1] + ' ' |
- continue |
- if longline: |
- line = longline + line |
- longline = '' |
- self.lineReceived(line) |
- self.closeTags() |
- self.write('</body>\n</html>\n') |
- |
- |
- def lineReceived(self, line): |
- if line[0] == '.': |
- f = getattr(self, 'macro_' + line[1:3].rstrip().upper(), None) |
- if f: |
- f(line[3:].strip()) |
- else: |
- self.text(line) |
- |
- |
- def continueReceived(self, cont): |
- if not cont: |
- return |
- if cont[0].isupper(): |
- f = getattr(self, 'macro_' + cont[:2].rstrip().upper(), None) |
- if f: |
- f(cont[2:].strip()) |
- else: |
- self.text(cont) |
- |
- |
- def closeTags(self): |
- if self.state != 'regular': |
- self.write('</%s>' % self.state) |
- if self.tp == 3: |
- self.write('</dd>\n\n') |
- self.tp = 0 |
- if self.dl: |
- self.write('</dl>\n\n') |
- self.dl = 0 |
- if self.para: |
- self.write('</p>\n\n') |
- self.para = 0 |
- |
- |
- def paraCheck(self): |
- if not self.tp and not self.para: |
- self.write('<p>') |
- self.para = 1 |
- |
- |
- def macro_TH(self, line): |
- self.write('<html><head>\n') |
- parts = [stripQuotes(x) for x in line.split(' ', 2)] + ['', ''] |
- title, manSection = parts[:2] |
- self.write('<title>%s.%s</title>' % (title, manSection)) |
- self.write('</head>\n<body>\n\n') |
- self.write('<h1>%s.%s</h1>\n\n' % (title, manSection)) |
- |
- macro_DT = macro_TH |
- |
- |
- def macro_SH(self, line): |
- self.closeTags() |
- self.write('<h2>') |
- self.para = 1 |
- self.text(stripQuotes(line)) |
- self.para = 0 |
- self.closeTags() |
- self.write('</h2>\n\n') |
- |
- |
- def macro_B(self, line): |
- words = line.split() |
- words[0] = '\\fB' + words[0] + '\\fR ' |
- self.text(' '.join(words)) |
- |
- |
- def macro_NM(self, line): |
- if not self.name: |
- self.name = line |
- self.text(self.name + ' ') |
- |
- |
- def macro_NS(self, line): |
- parts = line.split(' Ns ') |
- i = 0 |
- for l in parts: |
- i = not i |
- if i: |
- self.text(l) |
- else: |
- self.continueReceived(l) |
- |
- |
- def macro_OO(self, line): |
- self.text('[') |
- self.continueReceived(line) |
- |
- |
- def macro_OC(self, line): |
- self.text(']') |
- self.continueReceived(line) |
- |
- |
- def macro_OP(self, line): |
- self.text('[') |
- self.continueReceived(line) |
- self.text(']') |
- |
- |
- def macro_FL(self, line): |
- parts = line.split() |
- self.text('\\fB-%s\\fR' % parts[0]) |
- self.continueReceived(' '.join(parts[1:])) |
- |
- |
- def macro_AR(self, line): |
- parts = line.split() |
- self.text('\\fI %s\\fR' % parts[0]) |
- self.continueReceived(' '.join(parts[1:])) |
- |
- |
- def macro_PP(self, line): |
- self.closeTags() |
- |
- |
- def macro_IC(self, line): |
- cmd = line.split(' ', 1)[0] |
- args = line[line.index(cmd) + len(cmd):] |
- args = args.split(' ') |
- text = cmd |
- while args: |
- arg = args.pop(0) |
- if arg.lower() == "ar": |
- text += " \\fU%s\\fR" % (args.pop(0),) |
- elif arg.lower() == "op": |
- ign = args.pop(0) |
- text += " [\\fU%s\\fR]" % (args.pop(0),) |
- |
- self.text(text) |
- |
- |
- def macro_TP(self, line): |
- """ |
- Handle C{TP} token: start a definition list if it's first token, or |
- close previous definition data. |
- """ |
- if self.tp == 3: |
- self.write('</dd>\n\n') |
- self.tp = 1 |
- else: |
- self.tp = 1 |
- self.write('<dl>') |
- self.dl = 1 |
- |
- |
- def macro_BL(self, line): |
- self.write('<dl>') |
- self.tp = 1 |
- |
- |
- def macro_EL(self, line): |
- if self.tp == 3: |
- self.write('</dd>') |
- self.tp = 1 |
- self.write('</dl>\n\n') |
- self.tp = 0 |
- |
- |
- def macro_IT(self, line): |
- if self.tp == 3: |
- self.write('</dd>') |
- self.tp = 1 |
- self.continueReceived(line) |
- |
- |
- def text(self, line): |
- """ |
- Handle a line of text without detected token. |
- """ |
- if self.tp == 1: |
- self.write('<dt>') |
- if self.tp == 2: |
- self.write('<dd>') |
- self.paraCheck() |
- |
- bits = line.split('\\') |
- self.write(escape(bits[0])) |
- for bit in bits[1:]: |
- if bit[:2] == 'fI': |
- self.write('<em>' + escape(bit[2:])) |
- self.state = 'em' |
- elif bit[:2] == 'fB': |
- self.write('<strong>' + escape(bit[2:])) |
- self.state = 'strong' |
- elif bit[:2] == 'fR': |
- self.write('</%s>' % self.state) |
- self.write(escape(bit[2:])) |
- self.state = 'regular' |
- elif bit[:2] == 'fU': |
- # fU doesn't really exist, but it helps us to manage underlined |
- # text. |
- self.write('<u>' + escape(bit[2:])) |
- self.state = 'u' |
- elif bit[:3] == '(co': |
- self.write('©' + escape(bit[3:])) |
- else: |
- self.write(escape(bit)) |
- |
- if self.tp == 1: |
- self.write('</dt>') |
- self.tp = 2 |
- elif self.tp == 2: |
- self.tp = 3 |
- |
- |
- |
-class ProcessingFunctionFactory: |
- |
- def generate_lore(self, d, filenameGenerator=None): |
- ext = d.get('ext', '.html') |
- return lambda file,_: ManConverter().convert(open(file), |
- open(os.path.splitext(file)[0]+ext, 'w')) |
- |
- |
- |
-factory = ProcessingFunctionFactory() |
- |
- |
-if __name__ == '__main__': |
- import sys |
- mc = ManConverter().convert(open(sys.argv[1]), sys.stdout) |