c12bc4de58
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9492 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
279 lines
8.1 KiB
Python
279 lines
8.1 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)):
|
|
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)
|