#!/usr/bin/env python import os import datetime import re basedir = os.getcwd() heididir = open('heididir').read() largetablesize = '800x600' smallsize = '200x150' parts = 'include_header,include_main_column,include_side_column,include_nav_end'.split(',') partdict = {} for part in parts: partdict.update({part:open(part+'.html').read()}) def bashsafe(cmd): cmd = cmd.replace(' ','\ ') cmd = cmd.replace('(','\(') cmd = cmd.replace(')','\)') cmd = cmd.replace("'","\'") return cmd def ensurepathexists(path): if not os.path.exists(path): os.system('mkdir -p %s'%bashsafe(path)) def weblink(folder): return folder.replace(' ','%20') def prettydate(date): #return date.strftime('%A, %B %e %Y') return date.strftime('%a, %B %e, %y') def allfolders(path): listing = os.listdir(path) folders = filter(lambda x:os.path.isdir(os.path.join(path,x)),listing) return folders test = """ title 1 http 1 desc 1 title 2 http 2 desc 2 title 3 http 3 title 4 http 4 desc 4""" def readlinks(text): linkre = re.compile('[\n\r]*(.+)[\n\r]{1,2}(.+)[\n\r]{1,2}(.*)[\n\r]*') links = [] while 1: myre = linkre.search(text) if myre: links.append(myre.groups()) text = text[myre.end():] else: break links.sort(lambda x,y:cmp(x[0],y[0])) return links def readvideos(text): return readlinks(text) #generate main, only need function to make include_side_column datere = re.compile('([0-9]{4})-([0-9]{2})-([0-9]{2})[ -]+(.*)') def findtextold(path): files = os.listdir(path) textfiles = filter(lambda x:x[-4:].lower()=='.txt',files) if textfiles: return open(os.path.join(path,textfiles[0])).read() else: return '' def findtext(path): return formattext_general(findtextold(path)) def findalltext(path): files = os.listdir(path) textfiles = filter(lambda x:x[-4:].lower()=='.txt',files) text = '' if textfiles: for file in textfiles: text += open(os.path.join(path,file)).read() else: return '' return text def formattext_detectlinks(text): i=0 linkre = re.compile('(http://[\S]*)') if 0: while 1: result = linkre.search(text,i) if result: a,b = result.start(),result.end() text = text.replace(text[a:b],'%s'%(text[a:b],text[a:b])) i=b+(b-a)+len('') print len(text) else: break return text def formattext_contact(text): text = text.replace('\n','
') return text def formattext_classes(text): text = text.replace('\n','
') return text def formattext_general(text): text = text.replace('\n','
') text = text.replace('\x92',"'") text = formattext_detectlinks(text) return text def findtextfile(path): files = os.listdir(path) textfiles = filter(lambda x:x[-4:].lower()=='.txt',files) if textfiles: return os.path.join(path,textfiles[0]) def readformattextfile(path): fo = open(path) text = fo.read() text = formattext_general(text) return text def filterimages(files): images = filter(lambda x:x[-4:].lower() in ['.jpg','.png','.gif'],files) images.sort() return images def tablefy(list_of_things,cols=2): n = 1 toreturn = '\n' for thing in list_of_things: if n % cols == 1: toreturn += '' toreturn += '\n'%thing if n % cols == 0: toreturn += '' n += 1 if n % cols != 1: toreturn += '
%s
' else: toreturn += '' return toreturn def gallery(base,showtitle=False): html = '' folders = os.listdir(os.path.join(heididir,base)) folders.sort(lambda x,y:cmp(x,y)) folders = filter(lambda x:os.path.isdir(os.path.join(heididir,base,x)),folders) for folder in folders: #get first image for preview images = filterimages(os.listdir(os.path.join(heididir,base,folder))) text = findtext(os.path.join(heididir,base,folder)) if images: image = images[0] html += """

"""%(base,folder) html += """\n"""%(base,folder,'small',image) if showtitle: html += """
%s
"""%folder html += """
%s"""%text return html def goodforgallery(images): if len(images) == 1 and images[0].lower().find('flyer') != -1 or images[0].lower().find('main') != -1: return False else: return True def combinegallery(base1,base2,showtitle=False): html = '' folders = [] base1folders = allfolders(os.path.join(heididir,base1)) base2folders = allfolders(os.path.join(heididir,base2)) for f in base1folders: folders.append([base1,f]) for f in base2folders: folders.append([base2,f]) folders.sort(lambda x,y:-cmp(x[1],y[1])) for base,folder in folders: #get first image for preview images = filterimages(os.listdir(os.path.join(heididir,base,folder))) text = findtext(os.path.join(heididir,base,folder)) if images and goodforgallery(images): #and also not just a stupid flyer... image = images[0] html += """

"""%(base,folder) html += """\n"""%(base,folder,'small',image) #if showtitle: html += """
%s
"""%folder #html += """
%s"""%text return html def subgallery(base,dir,textafter=False): html = '' files = os.listdir(os.path.join(heididir,base,dir)) text = findtext(os.path.join(heididir,base,dir)) #look for main image, so as not to resize it mainimage = filter(lambda x:x.lower().find('main image')!=-1,files) if mainimage: files.remove(mainimage[0]) html += """""" %(base,dir,mainimage[0]) if base == 'eventsp': text = formattext_general(text) if not textafter: html += """

%s

""" % text files = filterimages(files) loi = [] for file in files: mystr = '' mystr += """\n""" %(base,dir,file) mystr += """\n""" %(base,dir,'small',file) loi.append(mystr) html += tablefy(loi) if textafter: html += """

%s

""" % text return html class Page: def __init__(self,nav='',sub=None): self.fullsidebar = False self.nav = nav self.sub = sub def make_header(self): return partdict['include_header'] def make_nav_end(self): return partdict['include_nav_end'] def make_main_column(self): html = """\n\n""" if self.nav == '': html += """

""" html += """

%s

"""%"She'enedra" #return partdict['include_main_column'] html += findtext(heididir) elif self.nav == 'about': html += """
""" html += """

%s

"""%self.nav.capitalize() html += """ These pages were designed my Kyle Graehl.
kgraehl.org

These scripts generate all the pages from some data and images on a samba share. pages.py (create pages) updateimages.py (make sure thumbnails and images are resized)

This is so that my Mom (who got me to make this site) can update the website without having to use any html or special program. She just puts images and some dummy text file into the appropriate events or video or photoshoot folder. """ else: html += """

""" html += """

%s

"""%self.nav.capitalize() if self.nav == 'gallery' or self.nav == 'events' or self.nav == 'members': if self.nav == 'events': self.fullsidebar = True #check if sub, too!, if sub, then we are on a small gallery if self.sub: if self.nav == 'members': #mom wants the bio text to come after the pictures html += subgallery(self.nav,self.sub,True) else: html += subgallery(self.nav,self.sub) else: if self.nav == 'members': html += """

(Click on a member for more photos)""" html += gallery(self.nav,True) elif self.nav == 'gallery': html += """

(Click on a picture for more photos)""" html += combinegallery(self.nav,'events') else: html += """

(Click on a picture for more photos)""" html += gallery(self.nav) #if gallery, also get pictures from events! elif self.nav == 'videos': textfile = findtextfile(os.path.join(heididir,self.nav)) text = open(textfile).read() links = readvideos(text) for title,http,desc in links: html += """

%s
%s"""%(http,title,desc) #now also read videos from events elif self.nav == 'classes': html += formattext_general(findalltext(os.path.join(heididir,self.nav))) elif self.nav == 'contact': html += findtext(os.path.join(heididir,self.nav)) elif self.nav == 'links': textfile = findtextfile(os.path.join(heididir,self.nav)) text = open(textfile).read() links = readlinks(text) links.sort(lambda x,y:cmp(x[0],y[0])) for title,http,desc in links: html += """

%s
%s"""%(http,title,desc) html += """

""" html += """\n\n""" return html def make_side_column(self): #have to do more special stuff here pass #now = datetime.datetime.now().strftime('%A, %B %e %Y') #today = datetime.datetime.now() today = datetime.date.today() #collect future events eventdirs = os.listdir(os.path.join(heididir,'events')) eventlist = [] for dir in eventdirs: #parse! myre = datere.search(dir) if myre: year,month,day,desc = myre.groups() year,month,day = map(int,[year,month,day]) date = datetime.date(year,month,day) eventlist.append([dir,date,desc]) eventlist.sort(lambda x,y:-cmp(x[1],y[1])) futureevents = [] pastevents = [] for dir,date,desc in eventlist: if date >= today: #future futureevents.append([dir,date,desc]) else: pastevents.append([dir,date,desc]) if not self.fullsidebar: numnonfullsidebar = 10 pastevents = pastevents[:numnonfullsidebar] html = """
Upcoming Events
""" n = 0 for dir,date,desc in futureevents: n += 1 if n%2 == 0: evenodd = 'odd' else: evenodd = 'even' html += """
%s%s
"""%(evenodd,weblink(dir),desc,prettydate(date)) html += """
Past Events
""" n = 0 for dir,date,desc in pastevents: n += 1 if n%2 == 0: evenodd = 'odd' else: evenodd = 'even' html += """
%s%s
"""%(evenodd,weblink(dir),desc,prettydate(date)) html += """
see more past events...

 

 

 

 

 

 

 

 """ return html def make_all(self): return self.make_header() + self.make_main_column() + self.make_side_column() + self.make_nav_end() navs = ',gallery,videos,members,classes,contact,links,events,about'.split(',') navdict = {'gallery':allfolders(os.path.join(heididir,'gallery')),\ 'members':allfolders(os.path.join(heididir,'members')),\ 'events':allfolders(os.path.join(heididir,'events'))} for nav in navs: page = Page(nav,None) ensurepathexists(os.path.join(basedir,nav)) fo = open(os.path.join(basedir,nav,'index.html'),'w') fo.write(page.make_all()) fo.close() if navdict.has_key(nav): for sub in navdict[nav]: page = Page(nav,sub) ensurepathexists(os.path.join(basedir,nav,sub)) fo = open(os.path.join(basedir,nav,sub,'index.html'),'w') fo.write(page.make_all()) fo.close() print 'made pages'