| Index: third_party/twisted_8_1/twisted/lore/slides.py
|
| diff --git a/third_party/twisted_8_1/twisted/lore/slides.py b/third_party/twisted_8_1/twisted/lore/slides.py
|
| deleted file mode 100644
|
| index afbf7a82925eb75330d53007af9c84a41a636bea..0000000000000000000000000000000000000000
|
| --- a/third_party/twisted_8_1/twisted/lore/slides.py
|
| +++ /dev/null
|
| @@ -1,352 +0,0 @@
|
| -# Copyright (c) 2001-2004 Twisted Matrix Laboratories.
|
| -# See LICENSE for details.
|
| -
|
| -#
|
| -"""Rudimentary slide support for Lore.
|
| -
|
| -TODO:
|
| - - Complete mgp output target
|
| - - syntax highlighting
|
| - - saner font handling
|
| - - probably lots more
|
| - - Add HTML output targets
|
| - - one slides per page (with navigation links)
|
| - - all in one page
|
| -
|
| -Example input file::
|
| - <html>
|
| -
|
| - <head><title>Title of talk</title></head>
|
| -
|
| - <body>
|
| - <h1>Title of talk</h1>
|
| -
|
| - <h2>First Slide</h2>
|
| -
|
| - <ul>
|
| - <li>Bullet point</li>
|
| - <li>Look ma, I'm <strong>bold</strong>!</li>
|
| - <li>... etc ...</li>
|
| - </ul>
|
| -
|
| -
|
| - <h2>Second Slide</h2>
|
| -
|
| - <pre class="python">
|
| - # Sample code sample.
|
| - print "Hello, World!"
|
| - </pre>
|
| -
|
| - </body>
|
| -
|
| - </html>
|
| -"""
|
| -from __future__ import nested_scopes
|
| -
|
| -from twisted.lore import default
|
| -from twisted.web import domhelpers, microdom
|
| -from twisted.python import text
|
| -# These should be factored out
|
| -from twisted.lore.latex import BaseLatexSpitter, LatexSpitter, processFile, \
|
| - getLatexText, HeadingLatexSpitter
|
| -from twisted.lore.tree import getHeaders
|
| -from tree import removeH1, fixAPI, fontifyPython, \
|
| - addPyListings, addHTMLListings, setTitle
|
| -
|
| -import os, os.path, re
|
| -from cStringIO import StringIO
|
| -
|
| -hacked_entities = { 'amp': ' &', 'gt': ' >', 'lt': ' <', 'quot': ' "',
|
| - 'copy': ' (c)'}
|
| -
|
| -entities = { 'amp': '&', 'gt': '>', 'lt': '<', 'quot': '"',
|
| - 'copy': '(c)'}
|
| -
|
| -class MagicpointOutput(BaseLatexSpitter):
|
| - bulletDepth = 0
|
| -
|
| - def writeNodeData(self, node):
|
| - buf = StringIO()
|
| - getLatexText(node, buf.write, entities=hacked_entities)
|
| - data = buf.getvalue().rstrip().replace('\n', ' ')
|
| - self.writer(re.sub(' +', ' ', data))
|
| -
|
| - def visitNode_title(self, node):
|
| - self.title = domhelpers.getNodeText(node)
|
| -
|
| - def visitNode_body(self, node):
|
| - # Adapted from tree.generateToC
|
| - self.fontStack = [('standard', None)]
|
| -
|
| - # Title slide
|
| - self.writer(self.start_h2)
|
| - self.writer(self.title)
|
| - self.writer(self.end_h2)
|
| -
|
| - self.writer('%center\n\n\n\n\n')
|
| - for authorNode in domhelpers.findElementsWithAttribute(node, 'class', 'author'):
|
| - getLatexText(authorNode, self.writer, entities=entities)
|
| - self.writer('\n')
|
| -
|
| - # Table of contents
|
| - self.writer(self.start_h2)
|
| - self.writer(self.title)
|
| - self.writer(self.end_h2)
|
| -
|
| - for element in getHeaders(node):
|
| - level = int(element.tagName[1])-1
|
| - self.writer(level * '\t')
|
| - self.writer(domhelpers.getNodeText(element))
|
| - self.writer('\n')
|
| -
|
| - self.visitNodeDefault(node)
|
| -
|
| - def visitNode_div_author(self, node):
|
| - # Skip this node; it's already been used by visitNode_body
|
| - pass
|
| -
|
| - def visitNode_div_pause(self, node):
|
| - self.writer('%pause\n')
|
| -
|
| - def visitNode_pre(self, node):
|
| - # TODO: Syntax highlighting
|
| - buf = StringIO()
|
| - getLatexText(node, buf.write, entities=entities)
|
| - data = buf.getvalue()
|
| - data = text.removeLeadingTrailingBlanks(data)
|
| - lines = data.split('\n')
|
| - self.fontStack.append(('typewriter', 4))
|
| - self.writer('%' + self.fontName() + '\n')
|
| - for line in lines:
|
| - self.writer(' ' + line + '\n')
|
| - del self.fontStack[-1]
|
| - self.writer('%' + self.fontName() + '\n')
|
| -
|
| - def visitNode_ul(self, node):
|
| - if self.bulletDepth > 0:
|
| - self.writer(self._start_ul)
|
| - self.bulletDepth += 1
|
| - self.start_li = self._start_li * self.bulletDepth
|
| - self.visitNodeDefault(node)
|
| - self.bulletDepth -= 1
|
| - self.start_li = self._start_li * self.bulletDepth
|
| -
|
| - def visitNode_strong(self, node):
|
| - self.doFont(node, 'bold')
|
| -
|
| - def visitNode_em(self, node):
|
| - self.doFont(node, 'italic')
|
| -
|
| - def visitNode_code(self, node):
|
| - self.doFont(node, 'typewriter')
|
| -
|
| - def doFont(self, node, style):
|
| - self.fontStack.append((style, None))
|
| - self.writer(' \n%cont, ' + self.fontName() + '\n')
|
| - self.visitNodeDefault(node)
|
| - del self.fontStack[-1]
|
| - self.writer('\n%cont, ' + self.fontName() + '\n')
|
| -
|
| - def fontName(self):
|
| - names = [x[0] for x in self.fontStack]
|
| - if 'typewriter' in names:
|
| - name = 'typewriter'
|
| - else:
|
| - name = ''
|
| -
|
| - if 'bold' in names:
|
| - name += 'bold'
|
| - if 'italic' in names:
|
| - name += 'italic'
|
| -
|
| - if name == '':
|
| - name = 'standard'
|
| -
|
| - sizes = [x[1] for x in self.fontStack]
|
| - sizes.reverse()
|
| - for size in sizes:
|
| - if size:
|
| - return 'font "%s", size %d' % (name, size)
|
| -
|
| - return 'font "%s"' % name
|
| -
|
| - start_h2 = "%page\n\n"
|
| - end_h2 = '\n\n\n'
|
| -
|
| - _start_ul = '\n'
|
| -
|
| - _start_li = "\t"
|
| - end_li = "\n"
|
| -
|
| -
|
| -def convertFile(filename, outputter, template, ext=".mgp"):
|
| - fout = open(os.path.splitext(filename)[0]+ext, 'w')
|
| - fout.write(open(template).read())
|
| - spitter = outputter(fout.write, os.path.dirname(filename), filename)
|
| - fin = open(filename)
|
| - processFile(spitter, fin)
|
| - fin.close()
|
| - fout.close()
|
| -
|
| -
|
| -# HTML DOM tree stuff
|
| -
|
| -def splitIntoSlides(document):
|
| - body = domhelpers.findNodesNamed(document, 'body')[0]
|
| - slides = []
|
| - slide = []
|
| - title = '(unset)'
|
| - for child in body.childNodes:
|
| - if isinstance(child, microdom.Element) and child.tagName == 'h2':
|
| - if slide:
|
| - slides.append((title, slide))
|
| - slide = []
|
| - title = domhelpers.getNodeText(child)
|
| - else:
|
| - slide.append(child)
|
| - slides.append((title, slide))
|
| - return slides
|
| -
|
| -def insertPrevNextLinks(slides, filename, ext):
|
| - for slide in slides:
|
| - for name, offset in (("previous", -1), ("next", +1)):
|
| - if (slide.pos > 0 and name == "previous") or \
|
| - (slide.pos < len(slides)-1 and name == "next"):
|
| - for node in domhelpers.findElementsWithAttribute(slide.dom, "class", name):
|
| - if node.tagName == 'a':
|
| - node.setAttribute('href', '%s-%d%s'
|
| - % (filename[0], slide.pos+offset, ext))
|
| - else:
|
| - node.appendChild(microdom.Text(slides[slide.pos+offset].title))
|
| - else:
|
| - for node in domhelpers.findElementsWithAttribute(slide.dom, "class", name):
|
| - pos = 0
|
| - for child in node.parentNode.childNodes:
|
| - if child is node:
|
| - del node.parentNode.childNodes[pos]
|
| - break
|
| - pos += 1
|
| -
|
| -
|
| -class HTMLSlide:
|
| - def __init__(self, dom, title, pos):
|
| - self.dom = dom
|
| - self.title = title
|
| - self.pos = pos
|
| -
|
| -
|
| -def munge(document, template, linkrel, d, fullpath, ext, url, config):
|
| - # FIXME: This has *way* to much duplicated crap in common with tree.munge
|
| - #fixRelativeLinks(template, linkrel)
|
| - removeH1(document)
|
| - fixAPI(document, url)
|
| - fontifyPython(document)
|
| - addPyListings(document, d)
|
| - addHTMLListings(document, d)
|
| - #fixLinks(document, ext)
|
| - #putInToC(template, generateToC(document))
|
| - template = template.cloneNode(1)
|
| -
|
| - # Insert the slides into the template
|
| - slides = []
|
| - pos = 0
|
| - for title, slide in splitIntoSlides(document):
|
| - t = template.cloneNode(1)
|
| - setTitle(t, [microdom.Text(title)])
|
| - tmplbody = domhelpers.findElementsWithAttribute(t, "class", "body")[0]
|
| - tmplbody.childNodes = slide
|
| - tmplbody.setAttribute("class", "content")
|
| - # FIXME: Next/Prev links
|
| - # FIXME: Perhaps there should be a "Template" class? (setTitle/setBody
|
| - # could be methods...)
|
| - slides.append(HTMLSlide(t, title, pos))
|
| - pos += 1
|
| -
|
| - insertPrevNextLinks(slides, os.path.splitext(os.path.basename(fullpath)), ext)
|
| -
|
| - return slides
|
| -
|
| -from tree import makeSureDirectoryExists
|
| -
|
| -def getOutputFileName(originalFileName, outputExtension, index):
|
| - return os.path.splitext(originalFileName)[0]+'-'+str(index) + outputExtension
|
| -
|
| -def doFile(filename, linkrel, ext, url, templ, options={}, outfileGenerator=getOutputFileName):
|
| - from tree import parseFileAndReport
|
| - doc = parseFileAndReport(filename)
|
| - slides = munge(doc, templ, linkrel, os.path.dirname(filename), filename, ext, url, options)
|
| - for slide, index in zip(slides, range(len(slides))):
|
| - newFilename = outfileGenerator(filename, ext, index)
|
| - makeSureDirectoryExists(newFilename)
|
| - slide.dom.writexml(open(newFilename, 'wb'))
|
| -
|
| -# Prosper output
|
| -
|
| -class ProsperSlides(LatexSpitter):
|
| - firstSlide = 1
|
| - start_html = '\\documentclass[ps]{prosper}\n'
|
| - start_body = '\\begin{document}\n'
|
| - start_div_author = '\\author{'
|
| - end_div_author = '}'
|
| -
|
| - def visitNode_h2(self, node):
|
| - if self.firstSlide:
|
| - self.firstSlide = 0
|
| - self.end_body = '\\end{slide}\n\n' + self.end_body
|
| - else:
|
| - self.writer('\\end{slide}\n\n')
|
| - self.writer('\\begin{slide}{')
|
| - spitter = HeadingLatexSpitter(self.writer, self.currDir, self.filename)
|
| - spitter.visitNodeDefault(node)
|
| - self.writer('}')
|
| -
|
| - def _write_img(self, target):
|
| - self.writer('\\begin{center}\\includegraphics[%%\nwidth=1.0\n\\textwidth,'
|
| - 'height=1.0\\textheight,\nkeepaspectratio]{%s}\\end{center}\n' % target)
|
| -
|
| -
|
| -class PagebreakLatex(LatexSpitter):
|
| -
|
| - everyN = 1
|
| - currentN = 0
|
| - seenH2 = 0
|
| -
|
| - start_html = LatexSpitter.start_html+"\\date{}\n"
|
| - start_body = '\\begin{document}\n\n'
|
| -
|
| - def visitNode_h2(self, node):
|
| - if not self.seenH2:
|
| - self.currentN = 0
|
| - self.seenH2 = 1
|
| - else:
|
| - self.currentN += 1
|
| - self.currentN %= self.everyN
|
| - if not self.currentN:
|
| - self.writer('\\clearpage\n')
|
| - level = (int(node.tagName[1])-2)+self.baseLevel
|
| - self.writer('\n\n\\'+level*'sub'+'section*{')
|
| - spitter = HeadingLatexSpitter(self.writer, self.currDir, self.filename)
|
| - spitter.visitNodeDefault(node)
|
| - self.writer('}\n')
|
| -
|
| -class TwoPagebreakLatex(PagebreakLatex):
|
| -
|
| - everyN = 2
|
| -
|
| -
|
| -class SlidesProcessingFunctionFactory(default.ProcessingFunctionFactory):
|
| -
|
| - latexSpitters = default.ProcessingFunctionFactory.latexSpitters.copy()
|
| - latexSpitters['prosper'] = ProsperSlides
|
| - latexSpitters['page'] = PagebreakLatex
|
| - latexSpitters['twopage'] = TwoPagebreakLatex
|
| -
|
| - def getDoFile(self):
|
| - return doFile
|
| -
|
| - def generate_mgp(self, d, fileNameGenerator=None):
|
| - template = d.get('template', 'template.mgp')
|
| - df = lambda file, linkrel: convertFile(file, MagicpointOutput, template, ext=".mgp")
|
| - return df
|
| -
|
| -factory=SlidesProcessingFunctionFactory()
|
|
|