summaryrefslogtreecommitdiff
path: root/bin/reportlab/tools/pythonpoint/stdparser.py
diff options
context:
space:
mode:
Diffstat (limited to 'bin/reportlab/tools/pythonpoint/stdparser.py')
-rw-r--r--bin/reportlab/tools/pythonpoint/stdparser.py813
1 files changed, 0 insertions, 813 deletions
diff --git a/bin/reportlab/tools/pythonpoint/stdparser.py b/bin/reportlab/tools/pythonpoint/stdparser.py
deleted file mode 100644
index aaca2df2000..00000000000
--- a/bin/reportlab/tools/pythonpoint/stdparser.py
+++ /dev/null
@@ -1,813 +0,0 @@
-"""
-Parser for PythonPoint using the xmllib.py in the standard Python
-distribution. Slow, but always present. We intend to add new parsers
-as Python 2.x and the XML package spread in popularity and stabilise.
-
-The parser has a getPresentation method; it is called from
-pythonpoint.py.
-"""
-
-import string, imp, sys, os, copy
-from reportlab.lib.utils import SeqTypes
-from reportlab.lib import xmllib
-from reportlab.lib import colors
-from reportlab.lib.enums import TA_LEFT, TA_RIGHT, TA_CENTER, TA_JUSTIFY
-from reportlab.lib.utils import recursiveImport
-from reportlab.tools.pythonpoint import pythonpoint
-from reportlab.platypus import figures
-
-
-def getModule(modulename,fromPath='reportlab.tools.pythonpoint.styles'):
- """Get a module containing style declarations.
-
- Search order is:
- reportlab/tools/pythonpoint/
- reportlab/tools/pythonpoint/styles/
- ./
- """
-
- try:
- exec 'from reportlab.tools.pythonpoint import '+modulename
- return eval(modulename)
- except ImportError:
- try:
- exec 'from reportlab.tools.pythonpoint.styles import '+modulename
- return eval(modulename)
- except ImportError:
- exec 'import '+modulename
- return eval(modulename)
-
-
-class PPMLParser(xmllib.XMLParser):
- attributes = {
- #this defines the available attributes for all objects,
- #and their default values. Although these don't have to
- #be strings, the ones parsed from the XML do, so
- #everything is a quoted string and the parser has to
- #convert these to numbers where appropriate.
- 'stylesheet': {
- 'path':'None',
- 'module':'None',
- 'function':'getParagraphStyles'
- },
- 'frame': {
- 'x':'0',
- 'y':'0',
- 'width':'0',
- 'height':'0',
- 'border':'false',
- 'leftmargin':'0', #this is ignored
- 'topmargin':'0', #this is ignored
- 'rightmargin':'0', #this is ignored
- 'bottommargin':'0', #this is ignored
- },
- 'slide': {
- 'id':'None',
- 'title':'None',
- 'effectname':'None', # Split, Blinds, Box, Wipe, Dissolve, Glitter
- 'effectdirection':'0', # 0,90,180,270
- 'effectdimension':'H', # H or V - horizontal or vertical
- 'effectmotion':'I', # Inwards or Outwards
- 'effectduration':'1', #seconds,
- 'outlineentry':'None',
- 'outlinelevel':'0' # 1 is a child, 2 is a grandchild etc.
- },
- 'para': {
- 'style':'Normal',
- 'bullettext':'',
- 'effectname':'None',
- 'effectdirection':'0',
- 'effectdimension':'H',
- 'effectmotion':'I',
- 'effectduration':'1'
- },
- 'image': {
- 'filename':'',
- 'width':'None',
- 'height':'None',
- 'effectname':'None',
- 'effectdirection':'0',
- 'effectdimension':'H',
- 'effectmotion':'I',
- 'effectduration':'1'
- },
- 'table': {
- 'widths':'None',
- 'heights':'None',
- 'fieldDelim':',',
- 'rowDelim':'\n',
- 'style':'None',
- 'effectname':'None',
- 'effectdirection':'0',
- 'effectdimension':'H',
- 'effectmotion':'I',
- 'effectduration':'1'
- },
- 'rectangle': {
- 'x':'0',
- 'y':'0',
- 'width':'100',
- 'height':'100',
- 'fill':'None',
- 'stroke':'(0,0,0)',
- 'linewidth':'0',
- 'effectname':'None',
- 'effectdirection':'0',
- 'effectdimension':'H',
- 'effectmotion':'I',
- 'effectduration':'1'
- },
- 'roundrect': {
- 'x':'0',
- 'y':'0',
- 'width':'100',
- 'height':'100',
- 'radius':'6',
- 'fill':'None',
- 'stroke':'(0,0,0)',
- 'linewidth':'0',
- 'effectname':'None',
- 'effectdirection':'0',
- 'effectdimension':'H',
- 'effectmotion':'I',
- 'effectduration':'1'
- },
- 'line': {
- 'x1':'0',
- 'y1':'0',
- 'x2':'100',
- 'y2':'100',
- 'stroke':'(0,0,0)',
- 'width':'0',
- 'effectname':'None',
- 'effectdirection':'0',
- 'effectdimension':'H',
- 'effectmotion':'I',
- 'effectduration':'1'
- },
- 'ellipse': {
- 'x1':'0',
- 'y1':'0',
- 'x2':'100',
- 'y2':'100',
- 'stroke':'(0,0,0)',
- 'fill':'None',
- 'linewidth':'0',
- 'effectname':'None',
- 'effectdirection':'0',
- 'effectdimension':'H',
- 'effectmotion':'I',
- 'effectduration':'1'
- },
- 'polygon': {
- 'points':'(0,0),(50,0),(25,25)',
- 'stroke':'(0,0,0)',
- 'linewidth':'0',
- 'stroke':'(0,0,0)',
- 'fill':'None',
- 'effectname':'None',
- 'effectdirection':'0',
- 'effectdimension':'H',
- 'effectmotion':'I',
- 'effectduration':'1'
- },
- 'string':{
- 'x':'0',
- 'y':'0',
- 'color':'(0,0,0)',
- 'font':'Times-Roman',
- 'size':'12',
- 'align':'left',
- 'effectname':'None',
- 'effectdirection':'0',
- 'effectdimension':'H',
- 'effectmotion':'I',
- 'effectduration':'1'
- },
- 'customshape':{
- 'path':'None',
- 'module':'None',
- 'class':'None',
- 'initargs':'None'
- }
- }
-
- def __init__(self):
- self.presentations = []
- #yes, I know a generic stack would be easier...
- #still, testing if we are 'in' something gives
- #a degree of validation.
- self._curPres = None
- self._curSection = None
- self._curSlide = None
- self._curFrame = None
- self._curPara = None #the only places we are interested in
- self._curPrefmt = None
- self._curPyCode = None
- self._curString = None
- self._curTable = None
- self._curTitle = None
- self._curAuthor = None
- self._curSubject = None
- self.fx = 1
- xmllib.XMLParser.__init__(self)
-
- def _arg(self,tag,args,name):
- "What's this for???"
- if args.has_key(name):
- v = args[name]
- else:
- if self.attributes.has_key(tag):
- v = self.attributes[tag][name]
- else:
- v = None
- return v
-
- def ceval(self,tag,args,name):
- if args.has_key(name):
- v = args[name]
- else:
- if self.attributes.has_key(tag):
- v = self.attributes[tag][name]
- else:
- return None
-
- # handle named colors (names from reportlab.lib.colors)
- if name in ('color', 'stroke', 'fill'):
- v = str(pythonpoint.checkColor(v))
-
- return eval(v)
-
- def getPresentation(self):
- return self._curPres
-
-
- def handle_data(self, data):
- #the only data should be paragraph text, preformatted para
- #text, 'string text' for a fixed string on the page,
- #or table data
-
- if self._curPara:
- self._curPara.rawtext = self._curPara.rawtext + data
- elif self._curPrefmt:
- self._curPrefmt.rawtext = self._curPrefmt.rawtext + data
- elif self._curPyCode:
- self._curPyCode.rawtext = self._curPyCode.rawtext + data
- elif self._curString:
- self._curString.text = self._curString.text + data
- elif self._curTable:
- self._curTable.rawBlocks.append(data)
- elif self._curTitle <> None: # need to allow empty strings,
- # hence explicitly testing for None
- self._curTitle = self._curTitle + data
- elif self._curAuthor <> None:
- self._curAuthor = self._curAuthor + data
- elif self._curSubject <> None:
- self._curSubject = self._curSubject + data
-
- def handle_cdata(self, data):
- #just append to current paragraph text, so we can quote XML
- if self._curPara:
- self._curPara.rawtext = self._curPara.rawtext + data
- elif self._curPrefmt:
- self._curPrefmt.rawtext = self._curPrefmt.rawtext + data
- elif self._curPyCode:
- self._curPyCode.rawtext = self._curPyCode.rawtext + data
- elif self._curString:
- self._curString.text = self._curString.text + data
- elif self._curTable:
- self._curTable.rawBlocks.append(data)
- elif self._curAuthor <> None:
- self._curAuthor = self._curAuthor + data
- elif self._curSubject <> None:
- self._curSubject = self._curSubject + data
-
- def start_presentation(self, args):
- self._curPres = pythonpoint.PPPresentation()
- self._curPres.filename = self._arg('presentation',args,'filename')
- self._curPres.effectName = self._arg('presentation',args,'effect')
- self._curPres.pageDuration = self._arg('presentation',args,'pageDuration')
-
- h = self._arg('presentation',args,'pageHeight')
- if h:
- self._curPres.pageHeight = h
- w = self._arg('presentation',args,'pageWidth')
- if w:
- self._curPres.pageWidth = w
- #print 'page size =', self._curPres.pageSize
-
- def end_presentation(self):
- pass
-## print 'Fully parsed presentation',self._curPres.filename
-
- def start_title(self, args):
- self._curTitle = ''
-
-
- def end_title(self):
- self._curPres.title = self._curTitle
- self._curTitle = None
-
- def start_author(self, args):
- self._curAuthor = ''
-
- def end_author(self):
- self._curPres.author = self._curAuthor
- self._curAuthor = None
-
- def start_subject(self, args):
- self._curSubject = ''
-
- def end_subject(self):
- self._curPres.subject = self._curSubject
- self._curSubject = None
-
- def start_stylesheet(self, args):
- #makes it the current style sheet.
- path = self._arg('stylesheet',args,'path')
- if path=='None': path = []
- if type(path) not in SeqTypes: path = [path]
- path.append('styles')
- path.append(os.getcwd())
- modulename = self._arg('stylesheet', args, 'module')
- funcname = self._arg('stylesheet', args, 'function')
- try:
- found = imp.find_module(modulename, path)
- (file, pathname, description) = found
- mod = imp.load_module(modulename, file, pathname, description)
- except ImportError:
- #last gasp
- mod = getModule(modulename)
-
- #now get the function
- func = getattr(mod, funcname)
- pythonpoint.setStyles(func())
-## print 'set global stylesheet to %s.%s()' % (modulename, funcname)
-
- def end_stylesheet(self):
- pass
-
- def start_section(self, args):
- name = self._arg('section',args,'name')
- self._curSection = pythonpoint.PPSection(name)
-
- def end_section(self):
- self._curSection = None
-
-
- def start_slide(self, args):
- s = pythonpoint.PPSlide()
- s.id = self._arg('slide',args,'id')
- s.title = self._arg('slide',args,'title')
- a = self._arg('slide',args,'effectname')
- if a <> 'None':
- s.effectName = a
- s.effectDirection = self.ceval('slide',args,'effectdirection')
- s.effectDimension = self._arg('slide',args,'effectdimension')
- s.effectDuration = self.ceval('slide',args,'effectduration')
- s.effectMotion = self._arg('slide',args,'effectmotion')
-
- #HACK - may not belong here in the long run...
- #by default, use the slide title for the outline entry,
- #unless it is specified as an arg.
- a = self._arg('slide',args,'outlineentry')
- if a == "Hide":
- s.outlineEntry = None
- elif a <> 'None':
- s.outlineEntry = a
- else:
- s.outlineEntry = s.title
-
- s.outlineLevel = self.ceval('slide',args,'outlinelevel')
-
- #let it know its section, which may be none
- s.section = self._curSection
- self._curSlide = s
-
- def end_slide(self):
- self._curPres.slides.append(self._curSlide)
- self._curSlide = None
-
- def start_frame(self, args):
- self._curFrame = pythonpoint.PPFrame(
- self.ceval('frame',args,'x'),
- self.ceval('frame',args,'y'),
- self.ceval('frame',args,'width'),
- self.ceval('frame',args,'height')
- )
- if self._arg('frame',args,'border')=='true':
- self._curFrame.showBoundary = 1
-
- def end_frame(self):
- self._curSlide.frames.append(self._curFrame)
- self._curFrame = None
-
- def start_notes(self, args):
- name = self._arg('notes',args,'name')
- self._curNotes = pythonpoint.PPNotes()
-
- def end_notes(self):
- self._curSlide.notes.append(self._curNotes)
- self._curNotes = None
-
- def start_registerFont(self, args):
- name = self._arg('font',args,'name')
- path = self._arg('font',args,'path')
- pythonpoint.registerFont0(self.sourceFilename, name, path)
-
-
- def end_registerFont(self):
- pass
-
-
- def pack_slide(self, element, args):
- if self.fx:
- effectName = self._arg(element,args,'effectname')
- if effectName <> 'None':
- curSlide = copy.deepcopy(self._curSlide)
- if self._curFrame:
- curFrame = copy.deepcopy(self._curFrame)
- curSlide.frames.append(curFrame)
- self._curPres.slides.append(curSlide)
- self._curSlide.effectName = effectName
- self._curSlide.effectDirection = self.ceval(element,args,'effectdirection')
- self._curSlide.effectDimension = self._arg(element,args,'effectdimension')
- self._curSlide.effectDuration = self.ceval(element,args,'effectduration')
- self._curSlide.effectMotion = self._arg(element,args,'effectmotion')
- self._curSlide.outlineEntry = None
-
- def start_para(self, args):
- self.pack_slide('para', args)
- self._curPara = pythonpoint.PPPara()
- self._curPara.style = self._arg('para',args,'style')
-
- # hack - bullet character if bullet style
- bt = self._arg('para',args,'bullettext')
- if bt == '':
- if self._curPara.style == 'Bullet':
- bt = '\xc2\xb7' # Symbol Font bullet character, reasonable default
- elif self._curPara.style == 'Bullet2':
- bt = '\xc2\xb7' # second-level bullet
- else:
- bt = None
-
- self._curPara.bulletText = bt
-
- def end_para(self):
- if self._curFrame:
- self._curFrame.content.append(self._curPara)
- self._curPara = None
- elif self._curNotes:
- self._curNotes.content.append(self._curPara)
- self._curPara = None
-
-
- def start_prefmt(self, args):
- self._curPrefmt = pythonpoint.PPPreformattedText()
- self._curPrefmt.style = self._arg('prefmt',args,'style')
-
-
- def end_prefmt(self):
- self._curFrame.content.append(self._curPrefmt)
- self._curPrefmt = None
-
-
- def start_pycode(self, args):
- self._curPyCode = pythonpoint.PPPythonCode()
- self._curPyCode.style = self._arg('pycode',args,'style')
-
-
- def end_pycode(self):
- self._curFrame.content.append(self._curPyCode)
- self._curPyCode = None
-
-
- def start_image(self, args):
- self.pack_slide('image',args)
- sourceFilename = self.sourceFilename # XXX
- filename = self._arg('image',args,'filename')
- filename = os.path.join(os.path.dirname(sourceFilename), filename)
- self._curImage = pythonpoint.PPImage()
- self._curImage.filename = filename
- self._curImage.width = self.ceval('image',args,'width')
- self._curImage.height = self.ceval('image',args,'height')
-
-
- def end_image(self):
- self._curFrame.content.append(self._curImage)
- self._curImage = None
-
-
- def start_table(self, args):
- self.pack_slide('table',args)
- self._curTable = pythonpoint.PPTable()
- self._curTable.widths = self.ceval('table',args,'widths')
- self._curTable.heights = self.ceval('table',args,'heights')
- #these may contain escapes like tabs - handle with
- #a bit more care.
- if args.has_key('fieldDelim'):
- self._curTable.fieldDelim = eval('"' + args['fieldDelim'] + '"')
- if args.has_key('rowDelim'):
- self._curTable.rowDelim = eval('"' + args['rowDelim'] + '"')
- if args.has_key('style'):
- self._curTable.style = args['style']
-
-
- def end_table(self):
- self._curFrame.content.append(self._curTable)
- self._curTable = None
-
-
- def start_spacer(self, args):
- """No contents so deal with it here."""
- sp = pythonpoint.PPSpacer()
- sp.height = eval(args['height'])
- self._curFrame.content.append(sp)
-
-
- def end_spacer(self):
- pass
-
-
- ## the graphics objects - go into either the current section
- ## or the current slide.
- def start_fixedimage(self, args):
- sourceFilename = self.sourceFilename
- filename = self._arg('image',args,'filename')
- filename = os.path.join(os.path.dirname(sourceFilename), filename)
- img = pythonpoint.PPFixedImage()
- img.filename = filename
- img.x = self.ceval('fixedimage',args,'x')
- img.y = self.ceval('fixedimage',args,'y')
- img.width = self.ceval('fixedimage',args,'width')
- img.height = self.ceval('fixedimage',args,'height')
- self._curFixedImage = img
-
-
- def end_fixedimage(self):
- if self._curSlide:
- self._curSlide.graphics.append(self._curFixedImage)
- elif self._curSection:
- self._curSection.graphics.append(self._curFixedImage)
- self._curFixedImage = None
-
-
- def start_rectangle(self, args):
- self.pack_slide('rectangle', args)
- rect = pythonpoint.PPRectangle(
- self.ceval('rectangle',args,'x'),
- self.ceval('rectangle',args,'y'),
- self.ceval('rectangle',args,'width'),
- self.ceval('rectangle',args,'height')
- )
- rect.fillColor = self.ceval('rectangle',args,'fill')
- rect.strokeColor = self.ceval('rectangle',args,'stroke')
- self._curRectangle = rect
-
-
- def end_rectangle(self):
- if self._curSlide:
- self._curSlide.graphics.append(self._curRectangle)
- elif self._curSection:
- self._curSection.graphics.append(self._curRectangle)
- self._curRectangle = None
-
-
- def start_roundrect(self, args):
- self.pack_slide('roundrect', args)
- rrect = pythonpoint.PPRoundRect(
- self.ceval('roundrect',args,'x'),
- self.ceval('roundrect',args,'y'),
- self.ceval('roundrect',args,'width'),
- self.ceval('roundrect',args,'height'),
- self.ceval('roundrect',args,'radius')
- )
- rrect.fillColor = self.ceval('roundrect',args,'fill')
- rrect.strokeColor = self.ceval('roundrect',args,'stroke')
- self._curRoundRect = rrect
-
-
- def end_roundrect(self):
- if self._curSlide:
- self._curSlide.graphics.append(self._curRoundRect)
- elif self._curSection:
- self._curSection.graphics.append(self._curRoundRect)
- self._curRoundRect = None
-
-
- def start_line(self, args):
- self.pack_slide('line', args)
- self._curLine = pythonpoint.PPLine(
- self.ceval('line',args,'x1'),
- self.ceval('line',args,'y1'),
- self.ceval('line',args,'x2'),
- self.ceval('line',args,'y2')
- )
- self._curLine.strokeColor = self.ceval('line',args,'stroke')
-
-
- def end_line(self):
- if self._curSlide:
- self._curSlide.graphics.append(self._curLine)
- elif self._curSection:
- self._curSection.graphics.append(self._curLine)
- self._curLine = None
-
-
- def start_ellipse(self, args):
- self.pack_slide('ellipse', args)
- self._curEllipse = pythonpoint.PPEllipse(
- self.ceval('ellipse',args,'x1'),
- self.ceval('ellipse',args,'y1'),
- self.ceval('ellipse',args,'x2'),
- self.ceval('ellipse',args,'y2')
- )
- self._curEllipse.strokeColor = self.ceval('ellipse',args,'stroke')
- self._curEllipse.fillColor = self.ceval('ellipse',args,'fill')
-
-
- def end_ellipse(self):
- if self._curSlide:
- self._curSlide.graphics.append(self._curEllipse)
- elif self._curSection:
- self._curSection.graphics.append(self._curEllipse)
- self._curEllipse = None
-
-
- def start_polygon(self, args):
- self.pack_slide('polygon', args)
- self._curPolygon = pythonpoint.PPPolygon(self.ceval('polygon',args,'points'))
- self._curPolygon.strokeColor = self.ceval('polygon',args,'stroke')
- self._curPolygon.fillColor = self.ceval('polygon',args,'fill')
-
-
- def end_polygon(self):
- if self._curSlide:
- self._curSlide.graphics.append(self._curPolygon)
- elif self._curSection:
- self._curSection.graphics.append(self._curPolygon)
- self._curEllipse = None
-
-
- def start_string(self, args):
- self.pack_slide('string', args)
- self._curString = pythonpoint.PPString(
- self.ceval('string',args,'x'),
- self.ceval('string',args,'y')
- )
- self._curString.color = self.ceval('string',args,'color')
- self._curString.font = self._arg('string',args,'font')
- self._curString.size = self.ceval('string',args,'size')
- if args['align'] == 'left':
- self._curString.align = TA_LEFT
- elif args['align'] == 'center':
- self._curString.align = TA_CENTER
- elif args['align'] == 'right':
- self._curString.align = TA_RIGHT
- elif args['align'] == 'justify':
- self._curString.align = TA_JUSTIFY
- #text comes later within the tag
-
-
- def end_string(self):
- #controller should have set the text
- if self._curSlide:
- self._curSlide.graphics.append(self._curString)
- elif self._curSection:
- self._curSection.graphics.append(self._curString)
- self._curString = None
-
-
- def start_infostring(self, args):
- # like a string, but lets them embed page no, author etc.
- self.start_string(args)
- self._curString.hasInfo = 1
-
-
- def end_infostring(self):
- self.end_string()
-
-
- def start_customshape(self, args):
- #loads one
- path = self._arg('customshape',args,'path')
- if path=='None':
- path = []
- else:
- path=[path]
-
- # add package root folder and input file's folder to path
- path.append(os.path.dirname(self.sourceFilename))
- path.append(os.path.dirname(pythonpoint.__file__))
-
- modulename = self._arg('customshape',args,'module')
- funcname = self._arg('customshape',args,'class')
- try:
- found = imp.find_module(modulename, path)
- (file, pathname, description) = found
- mod = imp.load_module(modulename, file, pathname, description)
- except ImportError:
- mod = getModule(modulename)
-
- #now get the function
-
- func = getattr(mod, funcname)
- initargs = self.ceval('customshape',args,'initargs')
- self._curCustomShape = apply(func, initargs)
-
- def end_customshape(self):
- if self._curSlide:
- self._curSlide.graphics.append(self._curCustomShape)
- elif self._curSection:
- self._curSection.graphics.append(self._curCustomShape)
- self._curCustomShape = None
-
- def start_drawing(self, args):
- #loads one
- moduleName = args["module"]
- funcName = args["constructor"]
- showBoundary = int(args.get("showBoundary", "0"))
- hAlign = args.get("hAlign", "CENTER")
-
-
- # the path for the imports should include:
- # 1. document directory
- # 2. python path if baseDir not given, or
- # 3. baseDir if given
- try:
- dirName = sdict["baseDir"]
- except:
- dirName = None
- importPath = [os.getcwd()]
- if dirName is None:
- importPath.extend(sys.path)
- else:
- importPath.insert(0, dirName)
-
- modul = recursiveImport(moduleName, baseDir=importPath)
- func = getattr(modul, funcName)
- drawing = func()
-
- drawing.hAlign = hAlign
- if showBoundary:
- drawing._showBoundary = 1
-
- self._curDrawing = pythonpoint.PPDrawing()
- self._curDrawing.drawing = drawing
-
- def end_drawing(self):
- self._curFrame.content.append(self._curDrawing)
- self._curDrawing = None
-
- def start_pageCatcherFigure(self, args):
- filename = args["filename"]
- pageNo = int(args["pageNo"])
- width = float(args.get("width", "595"))
- height = float(args.get("height", "842"))
-
-
- fig = figures.PageCatcherFigureNonA4(filename, pageNo, args.get("caption", ""), width, height)
- sf = args.get('scaleFactor', None)
- if sf: sf = float(sf)
- border = not (args.get('border', None) in ['0','no'])
-
- fig.scaleFactor = sf
- fig.border = border
-
- #self.ceval('pageCatcherFigure',args,'scaleFactor'),
- #initargs = self.ceval('customshape',args,'initargs')
- self._curFigure = pythonpoint.PPFigure()
- self._curFigure.figure = fig
-
- def end_pageCatcherFigure(self):
- self._curFrame.content.append(self._curFigure)
- self._curFigure = None
-
- ## intra-paragraph XML should be allowed through into PLATYPUS
- def unknown_starttag(self, tag, attrs):
- if self._curPara:
- echo = '<%s' % tag
- for (key, value) in attrs.items():
- echo = echo + ' %s="%s"' % (key, value)
- echo = echo + '>'
- self._curPara.rawtext = self._curPara.rawtext + echo
- else:
- print 'Unknown start tag %s' % tag
-
-
- def unknown_endtag(self, tag):
- if self._curPara:
- self._curPara.rawtext = self._curPara.rawtext + '</%s>'% tag
- else:
- print 'Unknown end tag %s' % tag
-
- def handle_charref(self, name):
- try:
- if name[0]=='x':
- n = int(name[1:],16)
- else:
- n = int(name)
- except ValueError:
- self.unknown_charref(name)
- return
- self.handle_data(unichr(n).encode('utf8'))