Added better support for rendering formatting tags when using chords.

This commit is contained in:
Tomas Groth 2017-02-02 21:32:35 +01:00
parent dda37552d1
commit 111826dd69
4 changed files with 94 additions and 63 deletions

View File

@ -308,7 +308,7 @@ def expand_tags(text):
:param text: The text to be expanded. :param text: The text to be expanded.
""" """
text = expand_chords(text) text = expand_chords(text, '{br}')
for tag in FormattingTags.get_html_tags(): for tag in FormattingTags.get_html_tags():
text = text.replace(tag['start tag'], tag['start html']) text = text.replace(tag['start tag'], tag['start html'])
text = text.replace(tag['end tag'], tag['end html']) text = text.replace(tag['end tag'], tag['end html'])
@ -326,6 +326,8 @@ def compare_chord_lyric(chord, lyric):
chordlen = 0 chordlen = 0
if chord == ' ': if chord == ' ':
return 0 return 0
chord = re.sub(r'\{.*?\}', r'', chord)
lyric = re.sub(r'\{.*?\}', r'', lyric)
for chord_char in chord: for chord_char in chord:
if chord_char not in SLIMCHARS: if chord_char not in SLIMCHARS:
chordlen += 2 chordlen += 2
@ -343,32 +345,71 @@ def compare_chord_lyric(chord, lyric):
return 0 return 0
def expand_chords(text): def find_formatting_tags(text, active_formatting_tags):
"""
Look for formatting tags in lyrics and adds/removes them to/from the given list. Returns the update list.
:param text:
:param active_formatting_tags:
:return:
"""
if not re.search(r'\{.*?\}', text):
return active_formatting_tags
word_it = iter(text)
# Loop through lyrics to find any formatting tags
for char in word_it:
if char == '{':
tag = ''
char = next(word_it)
start_tag = True
if char == '/':
start_tag = False
while char != '}':
tag += char
char = next(word_it)
# See if the found tag has an end tag
for formatting_tag in FormattingTags.get_html_tags():
if formatting_tag['start tag'] == '{' + tag + '}':
if formatting_tag['end tag']:
if start_tag:
# prepend the new tag to the list of active formatting tags
active_formatting_tags[:0] = tag
else:
# remove the tag from the list
active_formatting_tags.remove(tag)
return active_formatting_tags
def expand_chords(text, line_split):
""" """
Expand ChordPro tags Expand ChordPro tags
:param text: :param text:
:param line_split:
""" """
if '[' not in text and ']' not in text: if not re.search(r'\[\w+.*?\]', text):
return text return text
text_lines = text.split('{br}') text_lines = text.split(line_split)
expanded_text_lines = [] expanded_text_lines = []
for line in text_lines: for line in text_lines:
# If a ChordPro is detected in the line, build html tables. # If a ChordPro is detected in the line, build html tables.
new_line = '<table class="line" width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td>' new_line = '<table class="line" width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td>'
if '[' in text and ']' in line: active_formatting_tags = []
if re.search(r'\[\w+.*?\]', line):
words = line.split(' ') words = line.split(' ')
in_note = False in_chord = False
for word in words: for word in words:
chords = [] chords = []
lyrics = [] lyrics = []
new_line += '<table class="segment" cellpadding="0" cellspacing="0" border="0" align="left">' new_line += '<table class="segment" cellpadding="0" cellspacing="0" border="0" align="left">'
chord = '' # If the word contains a chord, we need to handle it.
lyric = '' if re.search(r'\[\w+.*?\]', word):
if '[' in word and ']' in word: chord = ''
lyric = ''
# Loop over each character of the word
for char in word: for char in word:
if char == '[': if char == '[':
in_note = True in_chord = True
if lyric != '': if lyric != '':
if chord == '': if chord == '':
chord = '&nbsp;' chord = '&nbsp;'
@ -376,9 +417,9 @@ def expand_chords(text):
lyrics.append(lyric) lyrics.append(lyric)
chord = '' chord = ''
lyric = '' lyric = ''
elif char == ']' and in_note: elif char == ']' and in_chord:
in_note = False in_chord = False
elif in_note: elif in_chord:
chord += char chord += char
else: else:
lyric += char lyric += char
@ -393,24 +434,41 @@ def expand_chords(text):
new_lyric_line = '</tr><tr>' new_lyric_line = '</tr><tr>'
for i in range(len(lyrics)): for i in range(len(lyrics)):
spacer = compare_chord_lyric(chords[i], lyrics[i]) spacer = compare_chord_lyric(chords[i], lyrics[i])
new_chord_line += '<td class="note">%s</td>' % chords[i] # Handle formatting tags
start_formatting_tags = ''
if active_formatting_tags:
start_formatting_tags = '{' + '}{'.join(active_formatting_tags) + '}'
# Update list of active formatting tags
active_formatting_tags = find_formatting_tags(lyrics[i], active_formatting_tags)
end_formatting_tags = ''
if active_formatting_tags:
end_formatting_tags = '{/' + '}{/'.join(active_formatting_tags) + '}'
new_chord_line += '<td class="chord">%s</td>' % chords[i]
if i + 1 == len(lyrics): if i + 1 == len(lyrics):
new_lyric_line += '<td class="lyrics">%s&nbsp;</td>' % lyrics[i] new_lyric_line += '<td class="lyrics">{starttags}{lyrics}&nbsp;{endtags}</td>'.format(starttags=start_formatting_tags, lyrics=lyrics[i], endtags=end_formatting_tags)
else: else:
spacing = ''
if spacer > 0: if spacer > 0:
space = '&nbsp;' * int(math.ceil(spacer / 2)) space = '&nbsp;' * int(math.ceil(spacer / 2))
new_lyric_line += '<td class="lyrics">%s%s-%s</td>' % (lyrics[i], space, space) spacing = '<span class="chordspacing">%s-%s</span>' % (space, space)
else: new_lyric_line += '<td class="lyrics">{starttags}{lyrics}{spacing}{endtags}</td>'.format(starttags=start_formatting_tags, lyrics=lyrics[i], spacing=spacing, endtags=end_formatting_tags)
new_lyric_line += '<td class="lyrics">%s</td>' % lyrics[i]
new_line += new_chord_line + new_lyric_line + '</tr>' new_line += new_chord_line + new_lyric_line + '</tr>'
else: else:
new_line += '<tr><td class="note">&nbsp;</td></tr><tr><td class="lyrics">%s&nbsp;</td></tr>' % word start_formatting_tags = ''
if active_formatting_tags:
start_formatting_tags = '{' + '}{'.join(active_formatting_tags) + '}'
active_formatting_tags = find_formatting_tags(word, active_formatting_tags)
end_formatting_tags = ''
if active_formatting_tags:
end_formatting_tags = '{/' + '}{/'.join(active_formatting_tags) + '}'
new_line += '<tr><td class="chord">&nbsp;</td></tr><tr><td class="lyrics">{starttags}{lyrics}&nbsp;{endtags}</td></tr>'.format(starttags=start_formatting_tags, lyrics=word, endtags=end_formatting_tags)
new_line += '</table>' new_line += '</table>'
#print(new_line)
else: else:
new_line += line new_line += line
new_line += '</td></tr></table>' new_line += '</td></tr></table>'
expanded_text_lines.append(new_line) expanded_text_lines.append(new_line)
# the {br} tag used to split lines is not inserted again since the line-tables style make them redundant. # the {br} tag used to split lines is not inserted again since the style of the line-tables makes them redundant.
return ''.join(expanded_text_lines) return ''.join(expanded_text_lines)

View File

@ -583,16 +583,6 @@ LYRICS_SRC = Template("""
.lyricsmain { .lyricsmain {
${main} ${main}
} }
table.line {}
table.segment {
float: left;
}
td.note {
text-align: left;
}
td.lyrics {
text-align: left;
}
""") """)
FOOTER_SRC = Template(""" FOOTER_SRC = Template("""
@ -623,24 +613,20 @@ LYRICS_FORMAT_SRC = Template("""
""") """)
CHORDS_FORMAT = Template(""" CHORDS_FORMAT = Template("""
.chordline { table.line {}
line-height: ${chord_line_height}; table.segment {
float: left;
} }
.chordline span.chord span { td.chord {
position: relative; font-size: 80%;
display: ${chords_display};
} }
.chordline span.chord span strong { td.lyrics {
position: absolute;
top: -0.8em;
left: 0;
font-size: 75%;
font-weight: normal;
line-height: normal;
display: ${chords_display};
} }
.firstchordline { .chordspacing {
line-height: ${first_chord_line_height}; display: ${chords_display};
}""") }
""")
def build_html(item, screen, is_live, background, image=None, plugins=None): def build_html(item, screen, is_live, background, image=None, plugins=None):
@ -823,12 +809,7 @@ def build_footer_css(item, height):
def build_chords_css(): def build_chords_css():
if Settings().value('songs/mainview chords'): if Settings().value('songs/mainview chords'):
chord_line_height = '2.0em' chords_display = 'table-cell'
chords_display = 'inline'
first_chord_line_height = '2.1em'
else: else:
chord_line_height = '1.0em'
chords_display = 'none' chords_display = 'none'
first_chord_line_height = '1.0em' return CHORDS_FORMAT.substitute(chords_display=chords_display)
return CHORDS_FORMAT.substitute(chord_line_height=chord_line_height, chords_display=chords_display,
first_chord_line_height=first_chord_line_height)

View File

@ -263,7 +263,7 @@ class ServiceItem(RegistryProperties):
new_frame = { new_frame = {
'title': clean_tags(page), 'title': clean_tags(page),
'text': clean_tags(page.rstrip(), True), 'text': clean_tags(page.rstrip(), True),
'chords_text': expand_chords(clean_tags(page.rstrip(), False)), 'chords_text': expand_chords(clean_tags(page.rstrip(), False), '\n'),
'html': html_data.replace('&amp;nbsp;', '&nbsp;'), 'html': html_data.replace('&amp;nbsp;', '&nbsp;'),
'verseTag': verse_tag, 'verseTag': verse_tag,
} }

View File

@ -17,14 +17,6 @@
* Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Temple Place, Suite 330, Boston, MA 02111-1307 USA *
******************************************************************************/ ******************************************************************************/
#chords {
font-size: 20pt;
color: gray;
background-color: gray;
color: white;
cursor: pointer;
}
#header { #header {
padding-bottom: 1em; padding-bottom: 1em;
@ -60,7 +52,7 @@
vertical-align: middle; vertical-align: middle;
} }
#nextslide td.note { #nextslide td.chord {
color: gray; color: gray;
} }
@ -70,7 +62,7 @@ table.segment {
float: left; float: left;
} }
td.note { td.chord {
font-size: 30pt; font-size: 30pt;
color: yellow; color: yellow;
} }