git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9995 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			284 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			284 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import re, STDOM
 | 
						|
from string import split, join, replace, expandtabs, strip, find
 | 
						|
 | 
						|
#####################################################################
 | 
						|
#                              Updated functions                    #
 | 
						|
#####################################################################
 | 
						|
 | 
						|
def indention(str,front = re.compile("^\s+").match):
 | 
						|
    """ 
 | 
						|
    Convert all tabs to the appropriate number of spaces.
 | 
						|
    Find the number of leading spaces. If none, return 0
 | 
						|
    """
 | 
						|
    
 | 
						|
    if front(str):
 | 
						|
        start,end = front(str).span()
 | 
						|
        return end-start-1
 | 
						|
    else:
 | 
						|
        return 0     # no leading spaces
 | 
						|
 | 
						|
def insert(struct, top, level):
 | 
						|
    """
 | 
						|
    find what will be the parant paragraph of
 | 
						|
    a sentence and return that paragraph's
 | 
						|
    sub-paragraphs. The new paragraph will be
 | 
						|
    appended to those sub-paragraphs
 | 
						|
    """
 | 
						|
    #print "struct", struct, top-1
 | 
						|
    if not top-1 in range(len(struct)):
 | 
						|
        if struct:
 | 
						|
            return struct[len(struct)-1].getSubparagraphs()
 | 
						|
        return struct
 | 
						|
    run = struct[top-1]
 | 
						|
    i    = 0
 | 
						|
    while i+1 < level:
 | 
						|
        run = run.getSubparagraphs()[len(run.getSubparagraphs())-1]
 | 
						|
        i = i + 1
 | 
						|
    #print "parent for level ", level, " was => ", run.getColorizableTexts()
 | 
						|
    return run.getSubparagraphs()
 | 
						|
        
 | 
						|
def display(struct):
 | 
						|
    """
 | 
						|
    runs through the structure and prints out
 | 
						|
    the paragraphs. If the insertion works
 | 
						|
    correctly, display's results should mimic
 | 
						|
    the orignal paragraphs.
 | 
						|
    """
 | 
						|
    
 | 
						|
    if struct.getColorizableTexts():
 | 
						|
        print join(struct.getColorizableTexts()),"\n"
 | 
						|
    if struct.getSubparagraphs():
 | 
						|
        for x in struct.getSubparagraphs():
 | 
						|
            display(x)
 | 
						|
    
 | 
						|
def display2(struct):
 | 
						|
    """
 | 
						|
    runs through the structure and prints out
 | 
						|
    the paragraphs. If the insertion works
 | 
						|
    correctly, display's results should mimic
 | 
						|
    the orignal paragraphs.    
 | 
						|
    """
 | 
						|
    
 | 
						|
    if struct.getNodeValue():
 | 
						|
        print struct.getNodeValue(),"\n"
 | 
						|
    if struct.getSubparagraphs():
 | 
						|
        for x in struct.getSubparagraphs():
 | 
						|
            display(x)
 | 
						|
            
 | 
						|
def findlevel(levels,indent):
 | 
						|
    """
 | 
						|
    remove all level information of levels
 | 
						|
    with a greater level of indentation.
 | 
						|
    Then return which level should insert this
 | 
						|
    paragraph
 | 
						|
    """
 | 
						|
    
 | 
						|
    keys = levels.keys()
 | 
						|
    for key in keys:
 | 
						|
        if levels[key] > indent:
 | 
						|
            del(levels[key])
 | 
						|
    keys = levels.keys()
 | 
						|
    if not(keys):
 | 
						|
        return 0
 | 
						|
    else:
 | 
						|
        for key in keys:
 | 
						|
            if levels[key] == indent:
 | 
						|
                return key
 | 
						|
    highest = 0
 | 
						|
    for key in keys:
 | 
						|
        if key > highest:
 | 
						|
            highest = key
 | 
						|
    return highest-1
 | 
						|
 | 
						|
#####################################################################
 | 
						|
 | 
						|
# Golly, the capitalization of this function always makes me think it's a class
 | 
						|
def StructuredText(paragraphs, paragraph_delimiter=re.compile('\n\s*\n')):
 | 
						|
    """
 | 
						|
    StructuredText accepts paragraphs, which is a list of 
 | 
						|
    lines to be parsed. StructuredText creates a structure
 | 
						|
    which mimics the structure of the paragraphs.
 | 
						|
    Structure => [paragraph,[sub-paragraphs]]
 | 
						|
    """
 | 
						|
 | 
						|
    currentlevel    = 0
 | 
						|
    currentindent  = 0
 | 
						|
    levels            = {0:0}
 | 
						|
    level             = 0        # which header are we under
 | 
						|
    struct            = []      # the structure to be returned
 | 
						|
    run                = struct
 | 
						|
    
 | 
						|
    paragraphs = filter(
 | 
						|
        strip,
 | 
						|
        paragraph_delimiter.split(expandtabs('\n\n'+paragraphs+'\n\n'))
 | 
						|
        )
 | 
						|
    
 | 
						|
    if not paragraphs: return []
 | 
						|
    
 | 
						|
    ind = []     # structure based on indention levels
 | 
						|
    for paragraph in paragraphs:
 | 
						|
        ind.append([indention(paragraph), paragraph])
 | 
						|
    
 | 
						|
    currentindent = indention(paragraphs[0])
 | 
						|
    levels[0]        = currentindent
 | 
						|
    
 | 
						|
    #############################################################
 | 
						|
    #                                  updated                  #
 | 
						|
    #############################################################
 | 
						|
    
 | 
						|
    for indent,paragraph in ind :
 | 
						|
        if indent == 0:
 | 
						|
            level          = level + 1
 | 
						|
            currentlevel   = 0
 | 
						|
            currentindent  = 0
 | 
						|
            levels         = {0:0}
 | 
						|
            struct.append(StructuredTextParagraph(paragraph, indent=indent, level=currentlevel))
 | 
						|
        elif indent > currentindent:
 | 
						|
            currentlevel            = currentlevel + 1
 | 
						|
            currentindent           = indent
 | 
						|
            levels[currentlevel]    = indent
 | 
						|
            run = insert(struct,level,currentlevel)
 | 
						|
            run.append(StructuredTextParagraph(paragraph, indent=indent, level=currentlevel))
 | 
						|
        elif indent < currentindent:
 | 
						|
            result   = findlevel(levels,indent)
 | 
						|
            if result > 0:
 | 
						|
                currentlevel = result
 | 
						|
            currentindent  = indent
 | 
						|
            if not level:
 | 
						|
                struct.append(StructuredTextParagraph(paragraph, indent=indent, level=currentlevel))
 | 
						|
            else:
 | 
						|
                run = insert(struct,level,currentlevel)
 | 
						|
                run.append(StructuredTextParagraph(paragraph, indent=indent, level=currentlevel))
 | 
						|
        else:
 | 
						|
            if insert(struct,level,currentlevel):
 | 
						|
                run = insert(struct,level,currentlevel)
 | 
						|
            else:
 | 
						|
                run = struct
 | 
						|
                currentindet = indent
 | 
						|
            run.append(StructuredTextParagraph(paragraph, indent=indent, level=currentlevel))
 | 
						|
    
 | 
						|
    return StructuredTextDocument(struct)
 | 
						|
 | 
						|
Basic = StructuredText
 | 
						|
 | 
						|
class StructuredTextParagraph(STDOM.Element):
 | 
						|
 | 
						|
    indent=0
 | 
						|
 | 
						|
    def __init__(self, src, subs=None, **kw):
 | 
						|
        if subs is None: subs=[]
 | 
						|
        self._src=src
 | 
						|
        self._subs=list(subs)
 | 
						|
        
 | 
						|
        self._attributes=kw.keys()
 | 
						|
        for k, v in kw.items(): setattr(self, k, v)
 | 
						|
 | 
						|
    def getChildren(self, type=type, lt=type([])):
 | 
						|
        src=self._src
 | 
						|
        if type(src) is not lt: src=[src]
 | 
						|
        return src+self._subs
 | 
						|
 | 
						|
    def getAttribute(self, name):
 | 
						|
        return getattr(self, name, None)
 | 
						|
        
 | 
						|
    def getAttributeNode(self, name):
 | 
						|
        if hasattr(self, name):
 | 
						|
            return STDOM.Attr(name, getattr(self, name))
 | 
						|
 | 
						|
    def getAttributes(self):
 | 
						|
        d={}
 | 
						|
        for a in self._attributes:
 | 
						|
            d[a]=getattr(self, a, '')
 | 
						|
        return STDOM.NamedNodeMap(d)
 | 
						|
 | 
						|
    def getSubparagraphs(self):
 | 
						|
        return self._subs
 | 
						|
 | 
						|
    def setSubparagraphs(self, subs):
 | 
						|
        self._subs=subs
 | 
						|
 | 
						|
    def getColorizableTexts(self):
 | 
						|
        return (self._src,)
 | 
						|
 | 
						|
    def setColorizableTexts(self, src):
 | 
						|
        self._src=src[0]
 | 
						|
 | 
						|
    def __repr__(self):
 | 
						|
        r=[]; a=r.append
 | 
						|
        a((' '*(self.indent or 0))+
 | 
						|
          ('%s(' % self.__class__.__name__)
 | 
						|
          +str(self._src)+', ['
 | 
						|
          )
 | 
						|
        for p in self._subs: a(`p`)
 | 
						|
        a((' '*(self.indent or 0))+'])')
 | 
						|
        return join(r,'\n')
 | 
						|
 | 
						|
    """
 | 
						|
    create aliases for all above functions in the pythony way.
 | 
						|
    """
 | 
						|
 | 
						|
    def _get_Children(self, type=type, lt=type([])):
 | 
						|
        return self.getChildren(type,lt)
 | 
						|
        
 | 
						|
    def _get_Attribute(self, name):
 | 
						|
        return self.getAttribute(name)
 | 
						|
        
 | 
						|
    def _get_AttributeNode(self, name):
 | 
						|
        return self.getAttributeNode(name)
 | 
						|
 | 
						|
    def _get_Attributes(self):
 | 
						|
        return self.getAttributes()
 | 
						|
 | 
						|
    def _get_Subparagraphs(self):
 | 
						|
        return self.getSubparagraphs()
 | 
						|
 | 
						|
    def _set_Subparagraphs(self, subs):
 | 
						|
        return self.setSubparagraphs(subs)
 | 
						|
 | 
						|
    def _get_ColorizableTexts(self):
 | 
						|
        return self.getColorizableTexts()
 | 
						|
 | 
						|
    def _set_ColorizableTexts(self, src):
 | 
						|
        return self.setColorizableTexts(src)
 | 
						|
 | 
						|
class StructuredTextDocument(StructuredTextParagraph):
 | 
						|
    """
 | 
						|
    A StructuredTextDocument holds StructuredTextParagraphs
 | 
						|
    as its subparagraphs.
 | 
						|
    """
 | 
						|
    _attributes=()
 | 
						|
    
 | 
						|
    def __init__(self, subs=None, **kw):
 | 
						|
        apply(StructuredTextParagraph.__init__,
 | 
						|
                (self, '', subs),
 | 
						|
                kw)
 | 
						|
 | 
						|
    def getChildren(self):
 | 
						|
        return self._subs
 | 
						|
        
 | 
						|
    def getColorizableTexts(self):
 | 
						|
        return ()
 | 
						|
        
 | 
						|
    def setColorizableTexts(self, src):
 | 
						|
        pass
 | 
						|
 | 
						|
    def __repr__(self):
 | 
						|
        r=[]; a=r.append
 | 
						|
        a('%s([' % self.__class__.__name__)
 | 
						|
        for p in self._subs: a(`p`+',')
 | 
						|
        a('])')
 | 
						|
        return join(r,'\n')
 | 
						|
    
 | 
						|
    """
 | 
						|
    create aliases for all above functions in the pythony way.
 | 
						|
    """
 | 
						|
    
 | 
						|
    def _get_Children(self):
 | 
						|
        return self.getChildren()
 | 
						|
        
 | 
						|
    def _get_ColorizableTexts(self):
 | 
						|
        return self.getColorizableTexts()
 | 
						|
        
 | 
						|
    def _set_ColorizableTexts(self, src):
 | 
						|
        return self.setColorizableTexts(src)
 |