"""$Id: text_html.py 699 2006-09-25 02:01:18Z rubys $""" __author__ = "Sam Ruby and Mark Pilgrim " __version__ = "$Revision: 699 $" __date__ = "$Date: 2006-09-25 02:01:18 +0000 (Mon, 25 Sep 2006) $" __copyright__ = "Copyright (c) 2002 Sam Ruby and Mark Pilgrim" """Output class for HTML text output""" from base import BaseFormatter import feedvalidator from xml.sax.saxutils import escape from feedvalidator.logging import Message, Info, Warning, Error from config import DOCSURL def escapeAndMark(x): html = escape(x) # Double-escape, and highlight, illegal characters. for i in range(len(html)-1,-1,-1): c = ord(html[i]) if 0x80 <= c <= 0x9F or c == 0xfffd: if c == 0xfffd: e = '?' else: e = '\\x%02x' % (c) html = '%s%s%s' % (html[:i], e, html[i+1:]) return html.replace(" ","  ") class Formatter(BaseFormatter): FRAGMENTLEN = 80 def __init__(self, events, rawdata): BaseFormatter.__init__(self, events) self.rawdata = rawdata def getRootClass(self, aClass): base = aClass.__bases__[0] if base == Message: return aClass if base.__name__.split('.')[-1] == 'LoggedEvent': return aClass else: return self.getRootClass(base) def getHelpURL(self, event): rootClass = self.getRootClass(event.__class__).__name__ rootClass = rootClass.split('.')[-1] rootClass = rootClass.lower() # messageClass = self.getMessageClass(event).__name__.split('.')[-1] messageClass = event.__class__.__name__.split('.')[-1] return DOCSURL + '/' + rootClass + '/' + messageClass def mostSeriousClass(self): ms=0 for event in self.data: level = -1 if isinstance(event,Info): level = 1 if isinstance(event,Warning): level = 2 if isinstance(event,Error): level = 3 ms = max(ms, level) return [None, Info, Warning, Error][ms] def header(self): return '' def format(self, event): if event.params.has_key('line'): line = event.params['line'] if line >= len(self.rawdata.split('\n')): # For some odd reason, UnicodeErrors tend to trigger a bug # in the SAX parser that misrepresents the current line number. # We try to capture the last known good line number/column as # we go along, and now it's time to fall back to that. line = event.params['line'] = event.params.get('backupline',0) column = event.params['column'] = event.params.get('backupcolumn',0) column = event.params['column'] codeFragment = self.rawdata.split('\n')[line-1] markerColumn = column if column > self.FRAGMENTLEN: codeFragment = '... ' + codeFragment[column-(self.FRAGMENTLEN/2):] markerColumn = 5 + (self.FRAGMENTLEN/2) if len(codeFragment) > self.FRAGMENTLEN: codeFragment = codeFragment[:(self.FRAGMENTLEN-4)] + ' ...' else: codeFragment = '' line = None markerColumn = None html = escapeAndMark(codeFragment) rc = u'
  • ' if line: rc += u'''''' % line rc += u'''%s, ''' % self.getLine(event) rc += u'''%s: ''' % self.getColumn(event) if 'value' in event.params: rc += u'''%s: %s''' % (escape(self.getMessage(event)), escape(event.params['value'])) else: rc += u'''%s''' % escape(self.getMessage(event)) rc += u'''%s ''' % self.getCount(event) rc += u'''[help]

    ''' % self.getHelpURL(event) rc += u'''
    ''' + html + '''
    ''' if markerColumn: rc += u' ' * markerColumn rc += u'''^''' rc += u'
  • ' return rc