CHORD = '
{} | '
SYLLB = '{} | '
LINE = ''
VERSE = '''
{verse_name}
{verse_body}
'''
TITLE = ''
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)