[px] Better error reporting when encountering a parsing error in a PX.
This commit is contained in:
		
							parent
							
								
									e4b84be05e
								
							
						
					
					
						commit
						e6cacd10dd
					
				
					 4 changed files with 248 additions and 102 deletions
				
			
		| 
						 | 
				
			
			@ -3,6 +3,7 @@
 | 
			
		|||
   Python and XML.'''
 | 
			
		||||
 | 
			
		||||
# ------------------------------------------------------------------------------
 | 
			
		||||
import xml.sax
 | 
			
		||||
from px_parser import PxParser, PxEnvironment
 | 
			
		||||
from appy.pod.buffers import MemoryBuffer
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -45,13 +46,32 @@ class Px:
 | 
			
		|||
        self.parser = PxParser(PxEnvironment(), self)
 | 
			
		||||
        # Parses self.content (a PX code in a string) with self.parser, to
 | 
			
		||||
        # produce a tree of memory buffers.
 | 
			
		||||
        self.parser.parse(self.content)
 | 
			
		||||
        try:
 | 
			
		||||
            self.parser.parse(self.content)
 | 
			
		||||
        except xml.sax.SAXParseException, spe:
 | 
			
		||||
            self.completeErrorMessage(spe)
 | 
			
		||||
            raise spe
 | 
			
		||||
        # Is this PX based on a template PX?
 | 
			
		||||
        self.template = template
 | 
			
		||||
        self.hook = hook
 | 
			
		||||
        # Is there some (XML, XHTML...) prologue to dump?
 | 
			
		||||
        self.prologue = prologue
 | 
			
		||||
 | 
			
		||||
    def completeErrorMessage(self, parsingError):
 | 
			
		||||
        '''A p_parsingError occurred. Complete the error message with the
 | 
			
		||||
           erroneous line from self.content.'''
 | 
			
		||||
        # Split lines from self.content
 | 
			
		||||
        splitted = self.content.split('\n')
 | 
			
		||||
        i = parsingError.getLineNumber() - 1
 | 
			
		||||
        # Get the erroneous line, and add a subsequent line for indicating
 | 
			
		||||
        # the erroneous column.
 | 
			
		||||
        column = ' ' * (parsingError.getColumnNumber()-1) + '^'
 | 
			
		||||
        lines = [splitted[i], column]
 | 
			
		||||
        # Get the previous and next lines when present.
 | 
			
		||||
        if i > 0: lines.insert(0, splitted[i-1])
 | 
			
		||||
        if i < len(splitted)-1: lines.append(splitted[i+1])
 | 
			
		||||
        parsingError._msg += '\n%s' % '\n'.join(lines)
 | 
			
		||||
 | 
			
		||||
    def __call__(self, context, applyTemplate=True):
 | 
			
		||||
        '''Renders the PX.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue