]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/samples/stxview/StructuredText/ST.py
Added some simple sample apps
[wxWidgets.git] / wxPython / samples / stxview / StructuredText / ST.py
diff --git a/wxPython/samples/stxview/StructuredText/ST.py b/wxPython/samples/stxview/StructuredText/ST.py
new file mode 100644 (file)
index 0000000..2e6d0ab
--- /dev/null
@@ -0,0 +1,278 @@
+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)):
+        return None
+    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
+            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)