CHORD = '{}' SYLLB = '{}' LINE = '{}{}
' VERSE = '''

{verse_name}

{verse_body}
''' TITLE = '

{title}

{artist}

' HTML = ''' {title} {body} ''' def render(song): """Render a song to HTML""" rendered_verses = [] for verse in song.verses: rendered_lines = [] for line in verse.lines: rendered_chords = [] rendered_syllables = [] for word_counter, word in enumerate(line.words): is_last_word = (word_counter + 1) == len(line.words) for syll_counter, syllable in enumerate(word.syllables): is_last_syllable = (syll_counter + 1) == len(word.syllables) rendered_chords.append(CHORD.format(syllable.chord or ' ')) rendered_syllables.append(SYLLB.format( syllable.syllable + (' ' if is_last_syllable and not is_last_word else ''))) rendered_lines.append(LINE.format(''.join(rendered_chords), ''.join(rendered_syllables))) rendered_verses.append(VERSE.format(verse_type=verse.type_ or '', verse_name=verse.title, verse_body='\n'.join(rendered_lines))) title = song.metadata.get('title') or 'Song' metadata = TITLE.format(title=title, artist=song.metadata.get('artist') or song.metadata.get('composer') or '') body = metadata + '\n' + '\n'.join(rendered_verses) return HTML.format(title=title, body=body)