import xml.parsers.expat import re import OFS.Image from types import * from OFS.Image import Image from OFS.Folder import Folder from OFS.SimpleItem import SimpleItem from OFS.Image import manage_addFile from OFS.Image import File from OFS.DTMLDocument import addDTMLDocument from Globals import DTMLFile, MessageDialog, package_home from Products.ExternalMethod.ExternalMethod import manage_addExternalMethod from Products.PageTemplates.ZopePageTemplate import manage_addPageTemplate import os from Products.PageTemplates.PageTemplateFile import PageTemplateFile from Products.PageTemplates.PageTemplate import PageTemplate import string import urllib import xml.dom.minidom ### G L O B A L S ### allobjects = [] pagearray = [] objindex = 0 currobj = 0 currchapter = 0 tagstr = "" counter = 1 # counts pages/pictures counterid = 1 # counts IDs onpage = 0 onpagename = 0 onpageindex = 0 onpageurl = 0 onchapter = 0 onchaptername = 0 onstart = 0 onstartname = 0 onstartindex = 0 onstarturl = 0 onend = 0 onendname = 0 onendindex = 0 onendurl = 0 gbaseurl = '' gpictpath = '' errstr = '' class lise(Folder): "The class lise" meta_type = 'lise' manage_options=( {'label': 'Contents', 'action': 'manage_main'}, {'label': 'Welcome', 'action': 'index_html'}, {'label': 'Schedule', 'action': 'schedule_html'}, {'label': 'Edit Schedule', 'action': 'manage_editScheduleForm'}, ) def __init__(self, id, title): "Initialize a new instance of lise class" self.id = id self.title = title self.freetext = 'hoho' self.schedule = 'schedule' self.xml = 'xml' self.xmlpath = 'xmlpath' self.xmlfilename = 'xmlfilename' self.link = '' def manage_editSchedule(self, title, schedule, RESPONSE=None): "Change attributes of a lise instance" self.title = title self.schedule = schedule if RESPONSE is not None: return MessageDialog( title='Edited', message='%s has been edited.'%self.id, action='./schedule_html' ) schedule_html = DTMLFile('dtml/schedule_html', globals()) manage_editScheduleForm = DTMLFile('dtml/manage_editScheduleForm', globals()) # ZOPE interface manage_addliseForm = DTMLFile('dtml/manage_addliseForm', globals()) def manage_addlise(self, id, title, pictpath, baseurl, file, RESPONSE = None): "add a lise instance in a folder." global allobjects global objindex global currchapter global currobj global tagstr global onpage global onpagename global onpageindex global onpageurl global onchapter global onchaptername global onstart global onstartname global onstartindex global onstarturl global onend global onendname global onendindex global onendurl global pagearray global errstr global counterid global gbaseurl global gpictpath allobjects = [] pagearray = [] filenames = [] fnames = [] id = str(id) title = str(title) if IsStr(gbaseurl): gbaseurl = str(baseurl) gpictpath = str(pictpath) thelen = len(gpictpath) if thelen > 0: fnames = os.listdir(gpictpath) thelen = len(filenames) j = 0 for i in fnames: if i[0] <> '.': normalize_whitespace(i) filenames.append('file://' + gpictpath + '/' + i) newObj = lise(id, title) # create new lise object self._setObject(id, newObj) # put it into zope if RESPONSE is not None: RESPONSE.redirect('manage_main') link = self.absolute_url() + '/' + id # path of new lise object object = getattr(self, id) # get the new lise object RESPONSE.redirect(link) # set path to new lise object errid = 'standard_error_message' error_html = DTMLFile('dtml/standard_error_message',globals()) addDTMLDocument(object, errid, '', error_html) errobj = getattr(object, errid) # reference this object lisescript = manage_addExternalMethod(object, 'liseScript','liseScript','lise.liseScript','liseScript') id2 = id + '.xml' manage_addFile(object, id2, file, title, 'text/xml') # create new xml file object2 = getattr(object, id2) # reference this object link2 = self.absolute_url() + '/' + id + '/' + id + '.xml' # path of xml file objarr = [] retval = '' thelen = 42 newObj.xmlpath = str(thelen) p = xml.parsers.expat.ParserCreate() taghandler = TagHandler() p.StartElementHandler = taghandler.expat_start_element p.EndElementHandler = taghandler.expat_endElement p.CharacterDataHandler = taghandler.characters p.Parse(str(object2.data)) for i in allobjects: if hasattr(i, 'typestr'): if i.typestr == 'chapter': i.parseobjects() counterid = 1 for i in allobjects: if hasattr(i, 'typestr'): if i.typestr == 'chapter': i.CreateChapter() if i.typestr == 'page': i.CreatePage() pacount = 0 for i in pagearray: if i.type == 'C': i.picturelink = 'this_is the_no_fucking_picture_error' i.pictindex = 0 for j in range(pacount, len(pagearray)): if pagearray[j].type == 'P': if len(pagearray[j].picturelink) > 0: i.picturelink = pagearray[j].picturelink break if IsInt(pagearray[j].pictindex): i.pictindex = pagearray[j].pictindex i.picturelink = '' break pacount = pacount + 1 mainid = 'main' main_html = PageTemplateFile('dtml/main.zpt',globals()).__of__(self) manage_addPageTemplate(object, mainid, '', main_html) # addDTMLDocument(object, mainid, '', main_html) mainobj = getattr(object, mainid) # reference this object setattr(mainobj, 'pagelist', pagearray) setattr(mainobj, 'filenames', filenames) if IsStr(pagearray[0].picturelink): setattr(mainobj, 'currpict', pagearray[0].picturelink) else: setattr(mainobj, 'currpict', filenames[int(pagearray[0].id)]) # sdmid = 'sdm' # sdm = SessionDataManager(sdmid) # object._setObject(sdmid, sdm) # put it into lise folder if(len(errstr) > 0): newObj.freetext = self.absolute_url() + '/' + id + '/standard_error_message' errobj.error_message = errstr + '

by babes

' RESPONSE.redirect(self.absolute_url() + '/' + id + '/standard_error_message') else: RESPONSE.redirect(self.absolute_url() + '/' + id + '/main?theid=1') ######################################################################################## class Error_DTML(SimpleItem): "the ERROR message" meta_type = 'error_message' def __init__(self, id): self.id = id ######################################################################################## class TagHandler: def __init__(self): self.tags={} self.name="" self.index = "" self.url = "" self.startname = "" self.startindex = 0 self.starturl = "" self.endname = "" self.endindex = 0 self.endurl = "" self.chapterindex = 0 self.currentchapter = 0 def expat_start_element(self, name, attrs): global allobjects global objindex global currchapter global currobj global tagstr global onpage global onpagename global onpageindex global onpageurl global onchapter global onchaptername global onstart global onstartname global onstartindex global onstarturl global onend global onendname global onendindex global onendurl global errstr if name == 'page': onstart = False onpage = True currobj = PageObject() if onchapter: thelen = len(currchapter.chapterobjects) if thelen > 0: currobj.prevref = currchapter.chapterobjects[thelen - 1] currchapter.chapterobjects[thelen - 1].nextref = currobj currchapter.chapterobjects.append(currobj) currobj.chapterindex = currchapter.chapterindex else: thelen = len(allobjects) if thelen > 0: currobj.prevref = allobjects[thelen - 1] allobjects[thelen - 1].nextref = currobj allobjects.append(currobj) if name == 'chapter': onstart = False onend = False currobj = ChapterObject(objindex) objindex += 1 if onchapter: currobj.upref = currchapter thelen = len(currchapter.chapterobjects) if thelen > 0: currobj.prevref = currchapter.chapterobjects[thelen - 1] currchapter.chapterobjects[thelen - 1].nextref = currobj currchapter.chapterobjects.append(currobj) else: allobjects.append(currobj) onchapter = True currchapter = currobj if name == 'name': tagstr = "" if onpage: onpagename = True else: if onchapter: if (not onstart) and (not onend): onchaptername = True else: if onstart: onstartname = True if onend: onendname = True else: errstr = errstr + 'ERROR in XML file: \"<name> tag outside <page> or <chapter>\"
' if name == 'index': tagstr = "" if onpage: onpageindex = True else: if onchapter: if onstart: if not onend: onstartindex = True else: onendindex = True else: errstr = errstr + 'ERROR in XML file: \"<index> tag inside chapter but outside <start> or <end>\"
' else: errstr = errstr + 'ERROR in XML file: \"<index> tag outside <page> or <chapter>\"
' if name == 'url': tagstr = "" if onpage: onpageurl = True else: if onchapter: if onstart: if not onend: onstarturl = True else: onendurl = True else: errstr = errstr + 'ERROR in XML file: \"<url> tag inside chapter but outside <start> or <end>\"
' else: errstr = errstr + 'ERROR in XML file: \"<url> tag outside <page> or <chapter>\"
' if name == 'start': if onchapter: onstart = True currobj = StartEndObject() thelen = len(currchapter.chapterobjects) if thelen > 0: currobj.prevref = currchapter.chapterobjects[thelen - 1] currchapter.chapterobjects[thelen - 1].nextref = currobj currchapter.chapterobjects.append(currobj) else: errstr = errstr + 'ERROR in XML file: \"<start> tag outside <chapter>\"
' if name == 'end': if onchapter: if onstart: onend = True else: errstr = errstr + 'ERROR in XML file: \"<end> tag without <start>\"
' else: errstr = errstr + 'ERROR in XML file: \"<end> tag outside <chapter>\"
' def characters(self, ch): global tagstr tagstr += ch def expat_endElement(self, name): global allobjects global objindex global currchapter global currobj global tagstr global onpage global onpagename global onpageindex global onpageurl global onchapter global onchaptername global onstart global onstartname global onstartindex global onstarturl global onend global onendname global onendindex global onendurl global errstr # errstr = errstr + 'end: ' + name + ':
' if name == 'page': onpage = False if name == 'chapter': objindex -= 1 if objindex <= 0: onchapter = False currchapter = 0 else: currchapter = currchapter.upref if name == 'name': tagstr = normalize_whitespace(tagstr) if onpagename: onpagename = False currobj.name = tagstr if onchaptername: if currobj.typestr == 'chapter': currobj.name = tagstr onchaptername = False if onstartname: if currobj.typestr == 'start': currobj.startname = tagstr onstartname = False if onendname: if currobj.typestr == 'start': currobj.endname = tagstr onendname = False if name == 'index': tagstr = normalize_whitespace(tagstr) if onpageindex: if IsInt(tagstr): currobj.index = int(tagstr) - 1 else: errstr = errstr + 'ERRRRROR: cannot extract number from page index.
' onpageindex = False if onstartindex: if IsInt(tagstr): currobj.startindex = int(tagstr) - 1 else: errstr = errstr + 'ERRRRROR: cannot extract startnumber from startindex.
' onstartindex = False if onendindex: if IsInt(tagstr): currobj.endindex = int(tagstr) - 1 else: errstr = errstr + 'ERRRRROR: cannot extract endnumber from endindex.
' onendindex = False if name == 'url': tagstr = normalize_whitespace(tagstr) if onpageurl: currobj.url = tagstr onpageurl = False if onstarturl: currobj.starturl = tagstr onstarturl = False if onendurl: currobj.endurl = tagstr onendurl = False if name == 'end': onstart = False onend = False ######################################################################################## def normalize_whitespace(text): "Remove redundant whitespace from a string" return ' '.join(text.split()) ######################################################################################## def IsInt(str): """ Is the given string an Integer? """ try: int(str) except ValueError: return 0 else: return 1 ######################################################################################## def IsStr(str): """ Is the given string really a string? """ try: str + '' except: return 0 else: return 1 ######################################################################################## class PageObject: def __init__(self): self.name = "" self.index = "" self.pictindex = 0 self.url = "" self.isselected = False self.typestr = "page" self.chapterindex = 0 self.prevref = 0 self.nextref = 0 self.chapref = 0 def CreatePage(self): global counter global counterid global gbaseurl global gpicpath global pagearray global errstr pageelement = PageElement() pageelement.id = str(counterid) pageelement.type = "P" pageelement.name = self.name if IsStr(self.url): if len(self.url) > 0: pageelement.picturelink = gbaseurl + '/' + self.url pageelement.level = self.chapterindex if IsInt(self.index): if int(self.index) > 0: pageelement.pictindex = int(self.index) - 1 else: pageelement.pictindex = '9999' else: pageelement.pictindex = '9999' if pageelement.level == 0: pageelement.open = 1 else: pageelement.open = 0 pagearray.append(pageelement) counter = counter + 1 counterid = counterid + 1 ######################################################################################## class ChapterObject: def __init__(self, chapterindex): self.name = "" self.typestr = "chapter" self.chapterindex = chapterindex self.isselected = False self.isopen = False self.prevref = 0 self.nextref = 0 self.upref = 0 self.chapterobjects = [] self.pages_subchapters = [] def parseobjects(self): thelen = len(self.chapterobjects) if hasattr(self, 'chapterobjects'): count = 0 for i in self.chapterobjects: count += 1 if hasattr(self, 'typestr'): if i.typestr == 'page': self.pages_subchapters.append(i) if i.typestr == 'chapter': i.parseobjects() if i.typestr == 'start': i.startindex = int(i.startindex) if i.startindex > 0: i.endindex = int(i.endindex) if i.endindex > 0: if i.endindex < i.startindex: errstr = errstr + 'ERROR in XML file: \"<start> index bigger then <end> index.\"
' else: startfound = False for j in range(count, len(self.chapterobjects)): if self.chapterobjects[j].typestr == 'start': startfound = True i.endindex = self.chapterobjects[j].startindex - 1 break if self.chapterobjects[j].typestr == 'page': i.endindex = self.chapterobjects[j].index - 1 startfound = True break if not startfound: errstr = errstr + 'ERROR in XML file: \"<start> tag in chapter has no end-tag.\"
' # print ' startname: ', i.startname # print 'startindex: ', i.startindex # print ' endurl: ', i.starturl # print ' endname: ', i.endname # print ' endindex: ', i.endindex # print ' endurl: ', i.endurl, '\n' def CreateChapter(self): global counter global counterid global baseurl global pagearray global errstr thelen = len(self.chapterobjects) chapelement = PageElement() chapelement.name = self.name chapelement.id = counterid chapelement.type = "C" chapelement.level = self.chapterindex chapelement.open = 0 chapelement.picturelink = '' chapelement.pictindex = 9999; pagearray.append(chapelement) counterid = counterid + 1 if hasattr(self, 'chapterobjects'): count = 0 for i in self.chapterobjects: count += 1 if hasattr(self, 'typestr'): if i.typestr == 'page': i.CreatePage() if i.typestr == 'chapter': i.CreateChapter() if i.typestr == 'start': namenumber = counter nameprev = "" urlstart = 0 urlend = 0 if i.startname != '': t = re.search(r'\d*$', i.startname) if not IsInt(t.group(0)): t = re.sub('(\..*$)', '', s) t = re.search(r'\d*$', t) if IsInt(t.group(0)): namenumber = int(t.group(0)) nameprev = re.sub(r'\d*$', '', i.startname) else: errstr = errstr + 'ERRRRROR: cannot extract startnumber.
' else: namenumber = int(t.group(0)) nameprev = re.sub(r'\d*$', '', i.startname) if ( (i.startindex > 0) and (i.endindex > 0) and (i.endindex > i.startindex) ): currcount = 0 for j in range(i.startindex, i.endindex + 1): currnumber = namenumber + currcount pageelement = PageElement() pageelement.name = nameprev + str(currnumber) pageelement.level = self.chapterindex + 1 pageelement.id = counterid pageelement.type = "P" pageelement.open = 0 pageelement.pictindex = j pagearray.append(pageelement) currlen = len(pagearray) if pagearray[currlen - 2].type == 'C': pagearray[currlen - 2].pictindex = j counter = counter + 1 counterid = counterid + 1 currcount = currcount + 1 else: t = re.search(r'\d*$', i.starturl) if not IsInt(t.group(0)): t = re.sub('(\..*$)', '', s) t = re.search(r'\d*$', t) if IsInt(t.group(0)): urlstart = int(t.group(0)) else: errstr = errstr + 'ERRRRROR: cannot extract number from starturl.
' else: urlstart = int(t.group(0)) t = re.search(r'\d*$', i.endurl) if not IsInt(t.group(0)): t = re.sub('(\..*$)', '', s) t = re.search(r'\d*$', t) if IsInt(t.group(0)): urlend = int(t.group(0)) else: errstr = errstr + 'ERRRRROR: cannot extract from endnumber.
' else: urlend = int(t.group(0)) if ( (urlstart > 0) and (urlend > 0) and (urlend > urlstart) ): for j in range(urlstart, urlend): pageelement = PageElement() currnumber = namenumber + j pageelement.name = nameprev + str(currnumber) pageelement.level = self.chapterindex + 1 pageelement.id = counterid pageelement.type = "P" pageelement.open = 0 pageelement.pictindex = j pagearray.append(pageelement) counter = counter + 1 counterid = counterid + 1 ######################################################################################## class StartEndObject: def __init__(self): self.startname = "" self.startindex = 0 self.starturl = "" self.endname = "" self.endindex = 0 self.endurl = "" self.typestr = "start" self.prevref = 0 self.nextref = 0 self.chapref = 0 ######################################################################################## class PageElement: def __init__(self): self.id = "" self.type = "" self.name = "" self.picturelink = "" self.pictindex = 0 self.level = 0 self.open = 0