Compare commits

..

7 Commits

2 changed files with 21 additions and 90 deletions

View File

@ -241,33 +241,18 @@ class Song(object):
elif Verse.is_verse_marker(line): elif Verse.is_verse_marker(line):
verse_name = Verse.get_verse_from_marker(line) verse_name = Verse.get_verse_from_marker(line)
for verse in self.verses[::-1]: for verse in self.verses[::-1]:
if verse.type_ != 'verse': if verse.title == verse_name or verse.type_ == "verse":
continue
if verse_name and verse.title == verse_name:
self.verse_order.append(verse)
break
elif not verse_name:
self.verse_order.append(verse) self.verse_order.append(verse)
break break
elif Verse.is_chorus_marker(line): elif Verse.is_chorus_marker(line):
chorus_name = Verse.get_chorus_from_marker(line) chorus_name = Verse.get_chorus_from_marker(line)
for verse in self.verses[::-1]: for verse in self.verses[::-1]:
if verse.type_ != 'chorus': if verse.title == chorus_name or verse.type_ == "chorus":
continue
if chorus_name and verse.title == chorus_name:
self.verse_order.append(verse)
break
elif not chorus_name:
self.verse_order.append(verse) self.verse_order.append(verse)
break break
elif Verse.is_bridge_marker(line): elif Verse.is_bridge_marker(line):
bridge_name = Verse.get_bridge_from_marker(line) bridge_name = Verse.get_bridge_from_marker(line)
for verse in self.verses[::-1]: for verse in self.verses[::-1]:
if verse.type_ != 'bridge': if verse.title == bridge_name or verse.type_ == "bridge":
continue
elif bridge_name and verse.title == bridge_name:
self.verse_order.append(verse)
break
elif not bridge_name:
self.verse_order.append(verse) self.verse_order.append(verse)
break break

View File

@ -1,37 +1,30 @@
import os import os
# Tables -- don't work when rendered to PDF
# CHORD = '<td class="chord">{}</td>'
# SYLLB = '<td class="syllable">{}</td>'
# LINE = '<table class="line" border="0" cellpadding="0" cellspacing="0"><tr class="chords-line">{}</tr><tr ' \
# 'class="lyrics-line">{}</tr></table>'
# Divs
CHORD = '<div class="chord">{}</div>' CHORD = '<div class="chord">{}</div>'
SYLLB = '<div class="syllable">{}</div>' SYLLB = '<div class="syllable">{}</div>'
WRAPP = '<div class="wrapper">{}</div>' WRAPP = '<div class="wrapper">{}</div>'
LINE = '<div class="line">{}</div>' LINE = '<div class="line">{}</div>'
STANZA = '''<section class="stanza-section {verse_type}-section"> STANZA = '''<section class="stanza-section {verse_type}-section">
<h2 class="stanza-heading {verse_type}-heading">{verse_name}</h2> <h4 class="stanza-heading {verse_type}-heading">{verse_name}</h4>
<div class="stanza {verse_type}"> <div class="stanza {verse_type}">
{verse_body} {verse_body}
</div> </div>
</section>''' </section>'''
METADATA = '''<section class="metadata"> TITLE = '<section class="metadata"><h1 class="title">{title}</h1><h3 class="composer">{composer}</h3></section>'
{metadata}
</section>'''
TITLE = '<h1 class="title">{title}</h1>'
ARTIST = '<p class="artist">As performed by {artist}</p>'
COMPOSER = '<p class="composer">Written by {composer}</p>'
KEY_CAPO = '<div class="key-capo">{key_capo}</div>'
KEY = '<div class="key">Key: {key}</div>'
CAPO = '<div class="capo">Capo: {capo}</div>'
COPYRIGHT = '<p class="copyright">{copyright}</p>'
FOOTER = '<footer class="footer">{footer}</footer>'
HTML = '''<html> HTML = '''<html>
<head> <head>
<title>{title}</title> <title>{title}</title>
<style> <style>
h1.title, h2.stanza-heading, p.composer, p.artist {{ font-weight: normal; margin-top: 0; margin-bottom: 0; }} h1.title, h3.composer, h4.stanza-heading {{ font-weight: normal; }}
.metadata, .stanza-section {{ margin-bottom: 1.8rem; page-break-inside: avoid; }} h4.stanza-heading {{ margin-bottom: 0; }}
.key-capo {{ padding: 0.5rem 1rem; border: 1px solid #000; border-radius: 2px; float: right; clear: right; }} .stanza-section {{ margin-bottom: 2rem; page-break-inside: avoid; }}
.key-capo div {{ margin-top: 0.5rem; margin-bottom: 0.5rem; }}
.key-capo div:first-child {{ margin-top: 0; }}
.key-capo div:last-child {{ margin-bottom: 0; }}
footer, .footer {{ position: absolute; bottom: 0; height: 2rem; }}
.wrapper {{ display: inline-block !important; }} .wrapper {{ display: inline-block !important; }}
{styles} {styles}
</style> </style>
@ -121,36 +114,6 @@ HTML_OPTIONS = {
'default': False, 'default': False,
'group': 'composer' 'group': 'composer'
}, },
'artist_font': {
'description': 'The font for the artist',
'type': str,
'default': None,
'group': 'artist'
},
'artist_size': {
'description': 'The size of the artist in pt',
'type': int,
'default': 12,
'group': 'artist'
},
'artist_is_bold': {
'description': 'Set to True to make the artist bold',
'type': bool,
'default': False,
'group': 'artist'
},
'artist_is_centered': {
'description': 'Center the artist on the page',
'type': bool,
'default': False,
'group': 'artist'
},
'artist_is_upper': {
'description': 'Force the artist to be uppercase',
'type': bool,
'default': False,
'group': 'artist'
},
'copyright_font': { 'copyright_font': {
'description': 'The font for the copyright', 'description': 'The font for the copyright',
'type': str, 'type': str,
@ -452,7 +415,6 @@ def generate_option_styles(options):
def render(song, options=None, extra_styles=None): def render(song, options=None, extra_styles=None):
"""Render a song to HTML""" """Render a song to HTML"""
nl = os.linesep
styles = options and generate_option_styles(options) or [] styles = options and generate_option_styles(options) or []
if extra_styles: if extra_styles:
styles.append(extra_styles) styles.append(extra_styles)
@ -472,25 +434,9 @@ def render(song, options=None, extra_styles=None):
rendered_syllables.append(WRAPP.format(rendered_chord + rendered_syllable)) rendered_syllables.append(WRAPP.format(rendered_chord + rendered_syllable))
rendered_lines.append(LINE.format(''.join(rendered_syllables))) rendered_lines.append(LINE.format(''.join(rendered_syllables)))
rendered_verses.append(STANZA.format(verse_type=verse.type_ or '', verse_name=verse.title, rendered_verses.append(STANZA.format(verse_type=verse.type_ or '', verse_name=verse.title,
verse_body=nl.join(rendered_lines))) verse_body='\n'.join(rendered_lines)))
metadata_lines = [] title = song.metadata.get('title') or 'Song'
if song.metadata.get('key') or song.metadata.get('capo'): metadata = TITLE.format(title=title, composer=song.metadata.get('artist') or
key_lines = [] song.metadata.get('composer') or '')
if song.metadata.get('key'): body = metadata + '\n' + '\n'.join(rendered_verses)
key_lines.append(KEY.format(key=song.metadata.get('key'))) return HTML.format(title=title, body=body, styles=os.linesep.join(styles))
if song.metadata.get('capo'):
key_lines.append(CAPO.format(capo=song.metadata.get('capo')))
if key_lines:
metadata_lines.append(KEY_CAPO.format(key_capo=''.join(key_lines)))
metadata_lines.append(TITLE.format(title=song.metadata.get('title') or 'Song'))
if song.metadata.get('composer'):
metadata_lines.append(COMPOSER.format(composer=song.metadata.get('composer')))
if song.metadata.get('artist'):
metadata_lines.append(ARTIST.format(artist=song.metadata.get('artist')))
metadata = METADATA.format(metadata=nl.join(metadata_lines))
footer = ''
# if song.metadata.get('copyright'):
# copyright = COPYRIGHT.format(copyright=song.metadata.get('copyright'))
# footer = FOOTER.format(footer=copyright)
body = metadata + nl + nl.join(rendered_verses) + nl + footer
return HTML.format(title=song.metadata.get('title') or 'Song', body=body, styles=nl.join(styles))