Compare commits
1 Commits
d3f68f109b
...
a551fdf465
Author | SHA1 | Date | |
---|---|---|---|
a551fdf465 |
@ -241,18 +241,33 @@ 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.title == verse_name or verse.type_ == "verse":
|
if 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.title == chorus_name or verse.type_ == "chorus":
|
if 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.title == bridge_name or verse.type_ == "bridge":
|
if 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
|
||||||
|
@ -1,30 +1,37 @@
|
|||||||
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">
|
||||||
<h4 class="stanza-heading {verse_type}-heading">{verse_name}</h4>
|
<h2 class="stanza-heading {verse_type}-heading">{verse_name}</h2>
|
||||||
<div class="stanza {verse_type}">
|
<div class="stanza {verse_type}">
|
||||||
{verse_body}
|
{verse_body}
|
||||||
</div>
|
</div>
|
||||||
</section>'''
|
</section>'''
|
||||||
TITLE = '<section class="metadata"><h1 class="title">{title}</h1><h3 class="composer">{composer}</h3></section>'
|
METADATA = '''<section class="metadata">
|
||||||
|
{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, h3.composer, h4.stanza-heading {{ font-weight: normal; }}
|
h1.title, h2.stanza-heading, p.composer, p.artist {{ font-weight: normal; margin-top: 0; margin-bottom: 0; }}
|
||||||
h4.stanza-heading {{ margin-bottom: 0; }}
|
.metadata, .stanza-section {{ margin-bottom: 1.8rem; page-break-inside: avoid; }}
|
||||||
.stanza-section {{ margin-bottom: 2rem; page-break-inside: avoid; }}
|
.key-capo {{ padding: 0.5rem 1rem; border: 1px solid #000; border-radius: 2px; float: right; clear: right; }}
|
||||||
|
.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>
|
||||||
@ -114,6 +121,36 @@ 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,
|
||||||
@ -415,6 +452,7 @@ 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)
|
||||||
@ -434,9 +472,25 @@ 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='\n'.join(rendered_lines)))
|
verse_body=nl.join(rendered_lines)))
|
||||||
title = song.metadata.get('title') or 'Song'
|
metadata_lines = []
|
||||||
metadata = TITLE.format(title=title, composer=song.metadata.get('artist') or
|
if song.metadata.get('key') or song.metadata.get('capo'):
|
||||||
song.metadata.get('composer') or '')
|
key_lines = []
|
||||||
body = metadata + '\n' + '\n'.join(rendered_verses)
|
if song.metadata.get('key'):
|
||||||
return HTML.format(title=title, body=body, styles=os.linesep.join(styles))
|
key_lines.append(KEY.format(key=song.metadata.get('key')))
|
||||||
|
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))
|
||||||
|
Loading…
Reference in New Issue
Block a user