def getLyricPageTemplate(): songcredits = DIV(dclass="credits", content="${SONG_CREDITS}") songtitle = DIV(dclass="songtitle", content="${SONG_TITLE}") songnotes = DIV(dclass="songnotes", content="${SONG_NOTES}") songlyrics = DIV(dclass="lyrics", content="${SONG_LYRICS}") songcopy = DIV(dclass="copy", content="${SONG_COPYRIGHT}") prev_link = A(href="${PREVID}.html", content=IMG(dclass="arrow_link", src="/pix/left_arrow.gif", alt="previous song")) next_link = A(href="${NEXTID}.html", content=IMG(dclass="arrow_link", src="/pix/right_arrow.gif", alt="next song")) title_table = TABLE(content=TR( TD(prev_link, dclass="left_arrow") + TD(dclass="songtitle", content=songtitle) + TD(next_link, dclass="right_arrow")), dclass="song_title") pagecontent = DIV(dclass="lyric_page", content=getAlphaLinks() + getSearchBox() + title_table + songnotes + songcredits + songlyrics + songcopy + "${AMAZON}" + "${ITUNES}") return Template( getBaseTemplate("lyrics").substitute( EXTRA_HEADER="", PAGE_TITLE="Elton John Lyrics: ${SONG_TITLE}", PAGE_CONTENT=pagecontent, ))
def getSingleTemplate(): single_span = SPAN(dclass="songtitle", content="${SINGLE_TITLE}") + BR() + SPAN( dclass="subtitle", content="${SINGLE_SUBTITLE}") prev_link = A(href="${PREVID}.html", content=IMG(src="/pix/left_arrow.gif", border="0", alt="previous single", title="previous single")) next_link = A(href="${NEXTID}.html", content=IMG(src="/pix/right_arrow.gif", border="0", alt="next single", title="next single")) title_bar = DIV(dclass="single_title", content=TABLE( dclass="single_title", content=TR( TD(content=prev_link, dclass="left_arrow") + TD(dclass="songtitle", content=single_span) + TD(content=next_link, dclass="right_arrow")))) issues = DIV(content="${ISSUES}") return Template( getBaseTemplate("singles").substitute( EXTRA_HEADER="", PAGE_TITLE="Elton John Single: ${SINGLE_TITLE}", PAGE_CONTENT=title_bar + issues + title_bar, ))
def yearSelector(selectedYear): allOptions = [] prevlink = "" nextlink = "" for y in allYears: selected = "" if y == selectedYear: selected = "selected" prevyear = int(selectedYear) - 1 if str(prevyear) in allYears: linkfile = "index.html" if str( prevyear ) == allYears[0] else "index" + str(prevyear) + ".html" prevlink = A(href=linkfile, content=str(prevyear) + "<<<") nextyear = int(selectedYear) + 1 if str(nextyear) in allYears: nextlink = A(href="index" + str(nextyear) + ".html", content=">>>" + str(nextyear)) allOptions.append("<option value='" + y + "'" + selected + ">" + y + " (" + str(magcount[y]) + " magazines)</option>") left = TD(prevlink) middle = TD(content=SELECT(dclass="PX20", size=1, onChange="showYear(this," + allYears[0] + ")", content="\n".join(allOptions))) right = TD(nextlink) row = TR(content=left + middle + right) return TABLE(content=row, dclass="EVEN", width="100%")
def getBooksNavBar(subcategory): cells = [] for subType in ["Books", "Magazines"]: if subType == subcategory: cells.append( TD(dclass="important padded10", content=A(href="/" + subType.lower() + "/index.html", content=subType))) else: cells.append( TD(dclass="padded10", content=A(href="/" + subType.lower() + "/index.html", content=subType))) return TABLE(dclass="center", content=TR(content="".join(cells)))
def getBottomAdvert(): ebaylink = "http://www.ebay.com/sch/captain_fantastic/m.html?_nkw=&_armrs=1&_ipg=&_from=" ebaylogo = IMG(src="/pix/ebaylogo.png", width="120", height="48") ebaytext = "See my Elton John<br/>Auction Items on EBAY" ebaylayout = TABLE(TR(TD(ebaylogo) + TD(ebaytext))) ebaybox = TD( A(href=ebaylink, content=DIV(dclass="bubble", content=ebaylayout))) tictaillink = "http://eltonography.tictail.com" tictaillogo = IMG(src="/pix/shopping_cart.png", width="59", height="48") tictailtext = "Collectibles For Sale<br/>In Eltonography SHOP" tictaillayout = TABLE(TR(TD(tictaillogo) + TD(tictailtext))) tictailbox = TD( A(href=tictaillink, content=DIV(dclass="bubble", content=tictaillayout))) table = TABLE(dclass="center", content=TR(content=ebaybox + tictailbox)) return table
def getBaseTemplate(fronttab): header_image = DIV(dclass="header_image", content=IMG(src="/pix/arms.gif", width="800", height="240")) header_image = "" #home_button = """<a href="/index.html"><img class="home_button" src="/pix/home_button.png" alt="eltonography.com home page" onmouseover="this.src='/pix/home_button_over.png';" onmouseout="this.src='/pix/home_button.png';"></a>""" #email_button = """<a href="/contact.html"><img style="position:absolute;left:185px;top:75px" class="email_button" src="/pix/email_button.png" alt="contact the author" onmouseover="this.src='/pix/email_button_over.png';" onmouseout="this.src='/pix/email_button.png';"></a>""" #sale_button = """<a href="TBD.html"><img style="position:absolute;left:265px;top:75px" class="sale_button" src="/pix/sale_button.png" alt="Elton John items for sale" onmouseover="this.src='/pix/sale_button_over.png';" onmouseout="this.src='/pix/sale_button.png';"></a>""" subtitle = DIV( dclass="title_subtext", content= "The online illustrated Elton John Discography<br/>by David Bodoh") blanktext = """<a href="/index.html"><img src="/pix/blank.gif" style="position:absolute;left:10px;top:10px;width:780px;height:150px;z-index:3;" border="0"></a>""" header_template = DIV(dclass="header", onclick="location.href='/index.html';", style="cursor: pointer;", content=blanktext + subtitle) contactLink = A(href="/contact/index.html", content="David Bodoh") copytext = "Copyright © " + str(date.today().year) + " " + contactLink trailer_div = DIV(dclass="trailer", content=getBottomAdvert() + copytext) title = TITLE(content="${PAGE_TITLE}") css = """<link rel="stylesheet" type="text/css" href="/css/style3.css" />""" js = goHome() head = HEAD(content=title + css + js + "${EXTRA_HEADER}") mainbubble = DIV(dclass="center_800", content=header_template + getTabs(fronttab) + '${PAGE_CONTENT}' + trailer_div) adbubble = DIV(dclass="advert_800", content=getGoogleAd()) body = BODY(content=mainbubble + adbubble) html = HTML(content=head + body) return Template(html)
def getBottomAdvertold(): return DIV( dclass="bold darkblue margin20", content= A(href= "http://www.ebay.com/sch/captain_fantastic/m.html?_nkw=&_armrs=1&_ipg=&_from=", content="Elton John rarities for sale on Ebay"))
def getSubAlbumBar(subcategory): cells = [] for subType in [ "Standard", "International", "Appearances", "Unauthorized", "Sessions" ]: if subType == subcategory: cells.append( TD(dclass="important padded10", content=A(href="/albums/" + subType.lower() + "/index.html", content=subType))) else: cells.append( TD(dclass="padded10", content=A(href="/albums/" + subType.lower() + "/index.html", content=subType))) return TABLE(dclass="center", content=TR(content="".join(cells)))
def getAlphaLinks(): letterlinks = [] for letter in '0' + uppercase: shown = letter if shown == '0': shown = '#' letterlinks.append( A(dclass="song_letter", href="/songs/" + letter + "_index.html", content=shown)) return DIV(dclass="lyrics_letters", content="".join(letterlinks))
def minilink(album): link = album.get('id') + ".html" year = album.find('version').get('year')[:4] year = "(" + year + ")" return A(href=link, content=IMG(dclass="margin3 sleeve", alt=album.get('title'), title=" ".join([album.get('title'), year]), id=album.get('id'), src="/pix/trans.gif", width=1, height=1))
def getAmazonButtonOld(asin): url = "".join([ "http://www.amazon.com/gp/product/", asin, "/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=", asin, "&linkCode=as2&tag=theillustrate-20" ]) gif = "http://rcm-images.amazon.com/images/G/01/associates/remote-buy-box/buy2.gif" return A(href=url, target="amazon", content=IMG(dclass="amazon_button", src=gif, alt="Buy from Amazon.com"))
def getTabs(fronttab=None): bevel = """<img class="menu_bevel", src="/pix/tab_bevel.gif"/>""" lyrics_tab = A(href="/songs/index.html", content=getTabImg("lyrics", front=fronttab == "lyrics", alt="Elton John lyrics")) albums_tab = A(href="/albums/standard/index.html", content=getTabImg("albums", front=fronttab == "albums", alt="Elton John Albums")) singles_tab = A(href="/singles/index.html", content=getTabImg("singles", front=fronttab == "singles", alt="Elton John singles")) tours_tab = A(href="/tours/index.html", content=getTabImg("tours", front=fronttab == "tours", alt="Elton John tours")) books_tab = A(href="/books/index.html", content=getTabImg("books", front=fronttab == "books", alt="Elton John books")) shop_tab = A(href="/shop/index.html", content=getTabImg("shop", front=fronttab == "shop", alt="Elton Items for Sale")) return DIV(content=bevel + lyrics_tab + albums_tab + singles_tab + tours_tab + books_tab + shop_tab, dclass="tabbed_menu")
def getDotsDiv(myindex, total): navDots = [] for link in range(total): suffix = str(link + 1) if link == 0: suffix = "" if link == myindex: navDots.append(IMG(dclass="navdots", src="/pix/white_dot.gif")) else: navDots.append( A(href="index" + suffix + ".html", alt="page " + suffix, content=IMG(dclass="noborder navdots", src="/pix/green_dot.gif"))) return DIV("".join(navDots))
def getAmazonButton(asin): ''' <a href="http://www.amazon.com/gp/product/1851498060/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=1851498060&linkCode=as2&tag=theillustrate-20&linkId=5FN7GSVXM5HOJJ3J">Two Days that Rocked the World: Elton John Live at Dodger Stadium: Photographs by Terry O'Neill</a> <img src="http://ir-na.amazon-adsystem.com/e/ir?t=theillustrate-20&l=as2&o=1&a=1851498060" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> ''' url = "".join([ "http://www.amazon.com/gp/product/", asin, "/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=", asin, "&linkCode=as2&tag=theillustrate-20&linkId=Z4H4FKDBKDF74FJX" ]) gif = "http://rcm-images.amazon.com/images/G/01/associates/remote-buy-box/buy2.gif" link = A(href=url, target="amazon", content=IMG(dclass="amazon_button", src=gif, alt="Buy from Amazon.com")) extra = '''<img src="http://ir-na.amazon-adsystem.com/e/ir?t=theillustrate-20&l=as2&o=1&a=B00ISFZQ2Q" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />''' return link
def linkTrack(track): notes = [] title = track.get('title') if (title == None): raise Exception("missing title in track") for attribute in track.keys(): if attribute == 'title': pass elif attribute == 'length': pass elif attribute == 'index': pass elif attribute == 'elton': notes.append('[Elton: ' + track.get('elton') + ']') elif attribute == 'artist': notes.append('[' + track.get('artist') + ']') elif attribute == 'live': notes.append('[live]') elif attribute == 'with': notes.append('[with ' + track.get('with') + ']') elif attribute == 'version': notes.append('[' + track.get('version') + ']') else: print "UNKNOWN attribute", attribute, "in", track.get('title') links = [] title = track.get('title') if track.get('artist'): links.append(B(title)) elif track.get('elton'): links.append(B(title)) else: for subtitle in title.split('/'): if subtitle in unlinkablesongs: links.append(B(subtitle)) continue if subtitle not in songs: print "bad song reference:\"" + subtitle + "\"" #href = subtitle.lower() #href = re.sub(' ','_',href) #href = re.sub('\(','',href) #href = re.sub('\)','',href) #href = re.sub('\'','',href) #href = re.sub('#','',href) #href = href+'.html' href = songs[subtitle] + '.html' links.append(A(href="/songs/" + href, content=B(subtitle))) linkstring = "/".join(links) notestring = " ".join(notes) return " ".join([linkstring, notestring])
def linkto(direction, country): target = country.get('id') + '.html' return A(href=target, content=IMG(src="/pix/" + direction + "_arrow.gif", border="0", title=country.get('name')))
def parse_standard_albums(): totalAlbums = 0 loadTracks(location.dbroot + "album_tracks.xml") albumroot = location.docroot + "albums/standard/" picroot = albumroot + "pix/" root = ET.parse(location.dbroot + 'category_albums.xml').getroot() ##decodedroot = ET.tostring(root) ##root2 = ET.fromstring(decodedroot) ### establish prev/next icons for category in root: if category.tag == 'description': pageDescription = DIV(dclass="description", content=category.text) continue prevalbum = None for album in category: album.set('previcon', "") album.set('nexticon', "") if prevalbum != None: prevpic = IMG(src="/pix/left_arrow.gif", border="0", title=prevalbum.get('title')) nextpic = IMG(src="/pix/right_arrow.gif", border="0", title=album.get('title')) prevalbum.set('nexticon', A(href=album.get('id') + ".html", content=nextpic)) # forward link album.set('previcon', A(href=prevalbum.get('id') + ".html", content=prevpic)) # backward link prevalbum = album styles = [] catThumbs = {} categories = [] for category in root: if category.tag == 'description': continue ### create the CSS style & index matrix for all the sprites in this category thumbs = [] for album in category: id = album.get('id') XY = '-' + album.get('spriteX') + 'px ' + '-' + album.get( 'spriteY') + 'px' imagecss = "img#" + id + "{ width:50px; height:50px; background:url(sprite.jpg) " + XY + ";}" styles.append( imagecss) # each album gets an icon in their category thumbs.append(minilink(album)) categories.append(category.get('name')) catThumbs[category.get('name')] = DIV(dclass="thumbnails", content=" ".join(thumbs)) ### create an HMTL page for each album for album in category: totalAlbums += 1 albumnotes = [] versions = [] title = album.get('title') for element in album: if element.tag == 'see': continue if element.tag == 'note': albumnotes.append(element.text) continue # otherwise it's a version tracks = [] versionNotes = [] version = element name = version.get('name') if name == None: name = "" year = '(' + version.get('year')[:4] + ')' amazonID = version.get('amazon') if amazonID: amazon = templates.getAmazonButton(amazonID) else: amazon = "" picname = version.get('pic') if not os.path.isfile(picroot + picname): print "error no pic", picname (type, width, height) = getImageInfo(picroot + picname) image = IMG(dclass="sleeve", src="pix/" + picname, width=width, height=height) picTD = TD(dclass="single_sleeve", content=image) for element in version: if element.tag == 'tracks': tracks = tracks + alltracks[element.get('id')] elif element.tag == 'section': tracks = tracks + [element] elif element.tag == 'note': versionNotes.append(element.text) else: print "bad tag", element.tag trackrows = [] trackrows.append( TR( TD(dclass="single_details", colspan=2, content=" ".join([name, year])))) for note in versionNotes: trackrows.append( TR(TD(dclass="note", colspan=2, content=note))) trackrows.append( TR(TD(dclass="amazon", colspan=2, content=amazon))) for track in tracks: if track.tag == 'section': trackrows.append( TR( TD(colspan=2, dclass="tracksection", content=track.get('title')))) continue tracktime = TD(dclass="time", content=track.get('length')) tracktext = TD(dclass="track", content=linkTrack(track)) trackrows.append(TR(tracktime + tracktext)) tracktable = TABLE("\n".join(trackrows)) detailsTD = TD(tracktable) versiontable = TABLE(dclass="single_issue", content=TR(picTD + detailsTD)) versions.append(DIV(dclass="bubble", content=versiontable)) page_template = templates.getStandardAlbumTemplate(title) album_text = page_template.substitute( NEXTICON=album.get('nexticon'), PREVICON=album.get('previcon'), ALBUM_TITLE=DIV(dclass="heading", content=U(title)), ALBUM_NOTES=DIV(dclass="subheading", content="<br/>".join(albumnotes)), VERSIONS="\n".join(versions)) target = album.get('id') + ".html" with open(albumroot + target, "w") as albumfile: albumfile.write(album_text.encode('UTF-8')) # end album #end category catDivs = [] for category in categories: catDivs.append( DIV(dclass="bubble", content=DIV(dclass="heading", content=category + ':') + catThumbs[category])) albumCSS = STYLE(content="\n".join(styles)) index_template = templates.getStandardIndexTemplate() index_text = index_template.substitute( EXTRA_STYLE=albumCSS, CONTENT=pageDescription + "".join(catDivs), ) with open(albumroot + "index.html", "w") as indexfile: indexfile.write(index_text.encode('UTF-8')) return totalAlbums
def generate_singles(): singles_root = location.docroot + "singles/" # ---------------------------------------------------------------------------- # Collect href information for albums, to verify album linking. Dictionary is # fileID -> title_string # ---------------------------------------------------------------------------- #album_ids = {} #albums = ET.parse(location.dbroot+'category_albums.xml').getroot() #for album in albums: # album_ids[album.get('id')] = album.get('title') #albums = ET.parse(location.dbroot+'other_albums.xml').getroot() #for album in albums: # album_ids[album.get('id')] = album.get('title') xmldoc = ET.parse(location.dbroot+'singles.xml').getroot() # load singles from file # ---------------------------------------------------------------------------- # Set the id/prev/next links as XML attributes. # ---------------------------------------------------------------------------- prevsingle = None for single in xmldoc: if single.get('artist') : continue # some other artist single if single.get('private') : continue # not for public website if single.tag == 'description': description = single.text continue if single.tag == 'break' : continue if single.tag == 'single' : # get the id from the title id = re.sub(' ', '_', single.get('title')).lower() id = re.sub('\(', '', id) id = re.sub('\)', '', id) id = re.sub('\/',' ', id) id = re.sub('\'', "", id) single.set('id', re.sub(' ', '_', id)) if single.tag == 'miscellaneous' : single.set('id', re.sub(' ','_',single.get('country').lower())) if prevsingle != None: prevsingle.set('nextid',single.get('id')) # forward link single.set('previd',prevsingle.get('id')) # backward link else : firstsingle = single # save first for linnking with last prevsingle = single single.set('nextid', firstsingle.get('id')) # fully cycled double linked-list firstsingle.set('previd', single.get('id')) # fully cycled double linked-list # ---------------------------------------------------------------------------- # Store each single as its own HTML file with listing of issues. Also # generate index pages. # ---------------------------------------------------------------------------- picpath = singles_root + "pix/" flagpath = location.docroot + "/pix/flags/" index_rows = [] # prepare list for index page total_issues = 0 # prepare info for index page total_pages = 0 for single in xmldoc: if single.tag == 'description': continue # already got this if single.get('artist'): continue # ignore singles by non-Elton artists if single.get('private'): continue # ignore singles not intended for public total_pages += 1 icon=None # should be populated later if single.tag == 'single': title = single.get('title') subtitle = '('+single.get('release')[0:4] + ')' (type,width,height) = getImageInfo(picpath+'icons/'+single.get('icon')) single_icon=IMG(src="pix/icons/"+single.get('icon'), width=width, height=height, alt=title, dclass="single_icon") elif single.tag == 'break': index_rows.append(DIV(dclass="bubble description", content=single.text)) continue elif single.tag == 'miscellaneous' : title = single.get('country')+" unique singles" subtitle = "(miscellaneous releases)" flag = re.sub(' ','_',single.get('country').lower()) + ".gif" if not os.path.isfile(flagpath+flag): print "ERROR missing flag for",country (type,width,height) = getImageInfo(flagpath+flag) single_icon = IMG(src="/pix/flags/"+flag, width=width, height=height, alt=title, dclass="single_icon") #print "parsing",title # TBD... #if single.get('album') : # album_href = "/albums/"+single.get('album')+".html" # album_title = album_ids.get(single.get('album')) # albumlink = "From the album " + A(href=album_href, content=album_title) # #subtitle += '<br/>('+albumlink+')' issues = [] for issue in single: if issue.get('private'): continue # not for website if issue.get('format') == "CS": continue # not for website yet total_issues += 1 # info for index page country = issue.get('country') if country == None: print "ERROR missing country" count = single.get('count') if count: count = int(count)+1 else: count = 1 single.set('count',str(count)) # detect flag GIF based on country flag = re.sub(' ','_',country.lower()) + ".gif" if not os.path.isfile(flagpath+flag): print "ERROR missing flag for",country (type,width,height) = getImageInfo(flagpath+flag) flagpic = IMG(src="/pix/flags/"+flag, width=width, height=height, alt=country, title=country) if single.tag == 'miscellaneous': flagpic="" # flag for misc issues is redundant format = issue.get('format') if format == None: print "ERROR missing format" if format == 'postcard': continue # ignore Polish cards for now year = issue.get('year') if year == 'unknown': year = "" if year == None: print "ERROR missing year" catalog = issue.get('catalog') if catalog == None: print "ERROR missing catalog" promo = "" if issue.get('promo'): promo = '[promo]' discs = "" if issue.get('discs'): discs = '[' + issue.get('discs') + ' discs]' note = "" if issue.get('note') : note = '[' + issue.get('note') + ']' if not issue.get('ps'): sleeve = "" picTD = TD(dclass="missing_sleeve", content="(no sleeve)") else: if issue.get('ps') == 'true' : sleeve = "[picture sleeve]" else : sleeve = '[' + issue.get('ps') + ']' pic = re.sub('/','',catalog).upper() pic = '/'.join([format,country,pic]) if issue.get('pic'): pic = "/".join([format,issue.get('pic')]) pic = re.sub(' ','_',pic) pic = re.sub('-','',pic) pic = re.sub('\.','',pic) if issue.get('pic') : pic = '/'.join([format,issue.get('pic')]) picfile = None if os.path.isfile(picpath+pic+".jpg"): picfile = "pix/"+pic+".jpg" elif os.path.isfile(picpath+pic+".gif"): picfile = "pix/"+pic+".gif" if picfile: (type,width,height) = getImageInfo(singles_root + picfile) picTD = TD(dclass="single_sleeve", content=IMG(dclass="sleeve", src=picfile, width=width, height=height) + BR() + sleeve) else: picTD = TD(dclass="missing_sleeve", content="[sleeve photo not available]") if issue.get('pic') != "NA": print "ERROR: can't find picture:",issue.get('pic'), title, format, country, year, catalog if os.path.isfile(singles_root + "pix/"+format+".gif"): icon = IMG(src="pix/"+format+".gif") # use graphical icon else: icon = format # use text name country = "("+country+")" if single.tag == 'miscellaneous': country = "" issueheader = TR(TD(dclass="single_details", colspan=2, content=" ".join([icon,year,catalog,country,discs,promo,note]))) trackrows = [] trackrows.append(issueheader) for track in issue: tracktime = TD(dclass="time", content=track.get('length')) tracktext = TD(dclass="track", content=linkTrack(track)) trackrows.append(TR(tracktime + tracktext)) tracktable = TABLE("\n".join(trackrows)) detailsTD = TD(tracktable) issues.append(DIV(dclass="bubble", content=TABLE(dclass="single_issue", content=TR(picTD + detailsTD)))) page_template = templates.getSingleTemplate() single_text = page_template.substitute( NEXTID = single.get('nextid'), PREVID = single.get('previd'), SINGLE_TITLE = '"'+title+'"', SINGLE_SUBTITLE = subtitle, ISSUES = "\n".join(issues) ) target = single.get('id')+".html" with open(singles_root+target, "w") as singlefile: singlefile.write(single_text.encode('latin1')) count = single.get('count') suffix = "" if count > 1: suffix = "s" subtitle = SPAN(dclass="single_count",content=subtitle + BR()+'(' + count + ' pressing'+suffix+')') iconTD = TD(dclass="single_icon", content=A(href=target, content=single_icon)) textTD = TD(dclass="single_index", content=SPAN(dclass="single_index", content=A(href=target, content=title)) + subtitle) index_rows.append(DIV(dclass="bubble", content=TABLE(TR(iconTD + textTD)))) #TBD index_rows.append(TR(TD("total worldwide pressings: " + str(total_issues)))) # ---------------------------------------------------------------------------- # Now write set of index pages that links to all the other single pages. # ---------------------------------------------------------------------------- max_rows_per_index = 30; total_index_pages = len(index_rows)/max_rows_per_index if len(index_rows) % max_rows_per_index > 0: total_index_pages += 1 for page in range(total_index_pages) : navDots=[] for link in range(total_index_pages) : suffix = str(link+1) if link == 0: suffix = "" if link == page: navDots.append(IMG(dclass="navdots", src="/pix/white_dot.gif")) else: navDots.append(A(href="index"+suffix+".html", alt="page "+suffix, content=IMG(dclass="noborder navdots", border="0", src="/pix/green_dot.gif"))) my_rows = index_rows[:max_rows_per_index] del index_rows[:max_rows_per_index] single_index_text = templates.getSingleIndex().substitute( TITLE = DIV(dclass='heading padded10', content="Elton John Singles"), DESCR = DIV(dclass='description', content=description), ISSUES = "\n".join(my_rows), NAVBAR = DIV(content=DIV(content=" ".join(navDots))), ) suffix = str(page+1) if page == 0: suffix = "" with open(singles_root+"index"+suffix+".html", "w") as singleindex: singleindex.write(single_index_text) return total_issues
def parse_other_albums(): totalAlbums = 0 loadTracks(location.dbroot + "album_tracks.xml") albumroot = location.docroot + "albums/international/" picroot = albumroot + "pix/" root = ET.parse(location.dbroot + 'other_albums.xml').getroot() # establish next/prev links prevcountry = None for country in root: if country.tag == "description": continue if country.get('private'): continue country.set('previcon', "") country.set('nexticon', "") country.set('id', re.sub(' ', '_', country.get('name')).lower()) if prevcountry != None: prevcountry.set('nexticon', linkto("right", country)) # forward link country.set('previcon', linkto("left", prevcountry)) # backward link prevcountry = country indexrows = [] for country in root: if country.tag == "description": description = country.text continue if country.get('private'): continue count = 0 name = country.get('name') bubbles = [] for album in country: print album.get('title') if album.get('private'): continue count += 1 totalAlbums += 1 # TBD id = album.get('id') picfile = country.get('id') + '/' + album.get('pic') picpath = picroot + picfile if not os.path.isfile(picpath): print "error no pic: " + picpath (type, width, height) = getImageInfo(picpath) image = IMG(dclass="sleeve", src="pix/" + picfile, width=width, height=height) picTD = TD(dclass="single_sleeve", content=image) discs = album.get('discs') if discs: prefix = discs else: prefix = "" iconfile = "/pix/" + prefix + album.tag + ".gif" iconpath = location.docroot + iconfile (type, width, height) = getImageInfo(iconpath) iconTD = TD( IMG(dclass="padded10", src=iconfile, width=width, height=height)) details = [] details.append( DIV(dclass="left important", content=U(album.get('title')))) details.append( DIV(dclass="left", content="Year: " + B(album.get('year')))) details.append( DIV(dclass="left", content="Catalog: " + B(album.get('catalog')))) textTD = TD("\n".join(details)) headerTable = TABLE(TR(iconTD + textTD)) notes = [] tracks = [] for element in album: if element.tag == 'tracks': tracks = tracks + alltracks[element.get('id')] elif element.tag == 'note': notes.append(element.text) elif element.tag == 'see': notes.append(element.text) else: print "bad tag", element.tag notesDiv = DIV(dclass="left padded3", content="<br/>".join(notes)) trackrows = [] for track in tracks: tracktime = TD(dclass="time", content=track.get('length')) tracktext = TD(dclass="track", content=linkTrack(track)) trackrows.append(TR(tracktime + tracktext)) tracksTable = TABLE("\n".join(trackrows)) detailsTD = TD(headerTable + notesDiv + tracksTable) bubbles.append( DIV(dclass="bubble", content=TABLE(dclass="single_issue", content=TR(picTD + detailsTD)))) page_template = templates.getInternationalAlbumTemplate(name) page_text = page_template.substitute(NEXTICON=country.get('nexticon'), PREVICON=country.get('previcon'), COUNTRY=DIV(dclass="heading", content="select " + name + " pressings"), ALBUMS="\n".join(bubbles)) target = country.get('id') + ".html" with open(albumroot + target, "w") as countryfile: countryfile.write(page_text.encode('UTF-8')) flagimg = A(href=target, content=IMG(dclass="hardleft20", src="/pix/flags/" + country.get('id') + ".gif")) namespan = SPAN(dclass="important hardleft200", content=A(href=target, content=name)) s = "" if count > 1: s = "s" countspan = SPAN(dclass="important hardleft400", content=A(href=target, content=str(count) + " pressing" + s)) indexrows.append( DIV(dclass="left bubble", content=flagimg + namespan + countspan)) index_template = templates.getInternationalIndexTemplate() index_text = index_template.substitute( EXTRA_STYLE="", PAGE_TITLE="Elton John International Albums", PAGE_CONTENT=DIV(dclass="description", content=description) + "".join(indexrows), ) with open(albumroot + "index.html", "w") as indexfile: indexfile.write(index_text) return totalAlbums
def topad(): ebaylink = "http://www.ebay.com/sch/captain_fantastic/m.html?item=161127422228&ssPageName=STRK%3AMESELX%3AIT&rt=nc&_trksid=p2047675.l2562" return DIV(dclass="banner", content=A(href=ebaylink, content="Rare items for sale on Ebay"))
def generate_songs(): root = ET.parse(location.dbroot + "songs.xml").getroot() # STEP 1: set the alphabetizable id for each song alphaIndex = defaultdict( list) # letter -> list of alphatitles starting with letter alphaElements = {} # alpha-ranked_title -> XML_song for song in root: if song.tag == 'introduction': introduction = ET.tostring(song) continue if song.tag == 'copyright': warning = ET.tostring(song) continue if song.tag == 'metadata': metadata = song.text continue if song.get('nolink'): continue alphatitle = song.get('title') alphatitle = re.sub('\)', '', alphatitle) alphatitle = re.sub('\(', '', alphatitle) alphatitle = re.sub('^A ', '', alphatitle) alphatitle = re.sub('^The ', '', alphatitle) if alphatitle[0].isdigit(): alphatitle = "0" + alphatitle alphaIndex[alphatitle[0]].append(alphatitle) alphaElements[alphatitle] = song # STEP 2: set the alphabetized prev/next IDs for each song prevsong = None for aid in sorted(alphaElements): if prevsong != None: prevsong.set('nextid', alphaElements[aid].get('fileID')) alphaElements[aid].set('previd', prevsong.get('fileID')) prevsong = alphaElements[aid] # STEP 3: run each song through template and write to file totalsongs = 0 searchable = [] for song in root.findall('song'): if song.get('nolink'): continue totalsongs += 1 title = song.get('title') asin = song.get('amazon') if asin: amazonWidget = getAmazonWidget(asin, title) else: amazonWidget = "" #itunesCode = song.get('itunes') #if itunesCode: itunesButton = getItunesLink(itunesCode) #else: itunesButton="" itunesButton = "" # TBD: need new affiliate links copyright = "" lyrics = [] notes = [] creditrows = [] searchtext = "" for element in song: if element.tag == 'copyright': copyright = " ".join( ["©", element.get('year'), element.get('owner')]) if element.tag == 'credit': creditType = re.sub(' ', ' ', element.get('type')) creditrows.append( TR( TD(dclass="credit_type", content=creditType + ":") + TD(dclass="credit_name", content=B(element.text)))) if element.tag == 'note': notes.append(element.text) if element.tag == 'lyrics': for verse in element: if verse.text: searchtext += re.sub('\n', ' ', verse.text) if verse.tag == 'verse': versecontent = re.sub('\n', '<br/>\n', verse.text[1:]) lyrics.append(DIV(dclass="verse", content=versecontent)) if verse.tag == 'chorus': versecontent = re.sub('\n', '<br/>\n', verse.text[1:]) lyrics.append( DIV(dclass="chorustag", content="chorus:") + DIV(dclass="chorus", content=versecontent)) if verse.tag == 'repeat': if verse.get('chorus'): lyrics.append( DIV(dclass="chorusrepeat", content="(repeat chorus " + verse.get('chorus') + ')')) else: lyrics.append( DIV(dclass="chorusrepeat", content="(repeat chorus)")) if len(searchtext): searchable.append('|'.join([ song.get('fileID'), song.get('title'), song.get('title').lower() + ' ' + searchtext.lower() ])) credittable = TABLE(dclass="credits", content="\n".join(creditrows)) if lyrics: alllyrics = "".join(lyrics) else: alllyrics = "(instrumental)" allnotes = "<br/>".join(notes) nextlink = "" if song.get('nextid'): nextlink = song.get('nextid') prevlink = "" if song.get('previd'): prevlink = song.get('previd') song_text = getLyricPageTemplate().substitute( NEXTID=nextlink, PREVID=prevlink, SONG_TITLE=title, SONG_CREDITS=credittable, SONG_NOTES=allnotes, SONG_LYRICS=DIV(dclass="bubble large", content=alllyrics), AMAZON=amazonWidget, ITUNES=itunesButton, SONG_COPYRIGHT=copyright) songsroot = location.docroot + "songs/" with open(songsroot + song.get('fileID') + ".html", "w") as songfile: print "generating", title songfile.write(song_text.encode('UTF-8')) # STEP 4: generate an index page for each alphabet letter for letter in '0' + string.uppercase: songRows = [] for title in sorted(alphaIndex[letter]): song = alphaElements[title] songRows.append( DIV(dclass="padded3", content=A(href=song.get('fileID') + ".html", content=song.get('title')))) index_text = getLyricsIndexTemplate( "Elton John \"" + letter + "\" Songs").substitute( EXTRA_HEADER="", LISTING=DIV(dclass="bubble important padded3", content="\n".join(songRows))) with open(songsroot + letter + "_index.html", "w") as indexfile: indexfile.write(index_text.encode('UTF-8')) # STEP 5: generate a single introduction index page for all lyrics index_text = getLyricsIndexTemplate("Elton John Song Lyrics").substitute( EXTRA_HEADER=META(name="description", content=metadata), LISTING=DIV(dclass="margin20 important", content=introduction) + DIV(dclass="bubble small", content=warning), ) with open(songsroot + "index.html", "w") as indexfile: indexfile.write(index_text.encode('UTF-8')) # STEP 6: generate a data file that the CGI script uses to search lyrics with open(location.dbroot + "searchable_lyrics.txt", "w") as searchfile: searchfile.write("\n".join(searchable).encode('UTF-8')) return totalsongs