forked from openlp/openlp
Use Mako instead of Pystache
This commit is contained in:
parent
ac2f92f8ac
commit
a1e1092b10
@ -664,26 +664,3 @@ def transpose_chord(chord, transpose_value, notation):
|
|||||||
else:
|
else:
|
||||||
transposed_chord += note + rest
|
transposed_chord += note + rest
|
||||||
return transposed_chord
|
return transposed_chord
|
||||||
|
|
||||||
|
|
||||||
def make_list(array):
|
|
||||||
"""
|
|
||||||
converts an ordinary list into a mustache ready dict construct augmented with some information to enable special
|
|
||||||
formatting features with the first, second to last and last element.
|
|
||||||
|
|
||||||
:param array: input list
|
|
||||||
:return: mustache ready and augmented dict
|
|
||||||
"""
|
|
||||||
if len(array) < 0:
|
|
||||||
return False
|
|
||||||
|
|
||||||
result = []
|
|
||||||
for i in range(len(array)):
|
|
||||||
result.append({'entry': array[i]})
|
|
||||||
if i == 0:
|
|
||||||
result[i]['first'] = True
|
|
||||||
if i == len(array) - 1:
|
|
||||||
result[i]['last'] = True
|
|
||||||
if i == len(array) - 1 or i == len(array) - 2:
|
|
||||||
result[i]['last_or_penultimate'] = True
|
|
||||||
return result
|
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import shutil
|
import shutil
|
||||||
import pystache
|
import mako
|
||||||
|
|
||||||
from PyQt5 import QtCore, QtWidgets
|
from PyQt5 import QtCore, QtWidgets
|
||||||
from sqlalchemy.sql import and_, or_
|
from sqlalchemy.sql import and_, or_
|
||||||
@ -31,13 +31,13 @@ from sqlalchemy.sql import and_, or_
|
|||||||
from openlp.core.common import Registry, AppLocation, Settings, check_directory_exists, UiStrings, translate
|
from openlp.core.common import Registry, AppLocation, Settings, check_directory_exists, UiStrings, translate
|
||||||
from openlp.core.lib import MediaManagerItem, ItemCapabilities, PluginStatus, ServiceItemContext, \
|
from openlp.core.lib import MediaManagerItem, ItemCapabilities, PluginStatus, ServiceItemContext, \
|
||||||
check_item_selected, create_separated_list
|
check_item_selected, create_separated_list
|
||||||
from openlp.core.lib.ui import create_widget_action
|
from openlp.core.lib.ui import create_widget_action, critical_error_message_box
|
||||||
from openlp.core.common.languagemanager import get_natural_key
|
from openlp.core.common.languagemanager import get_natural_key
|
||||||
from openlp.plugins.songs.forms.editsongform import EditSongForm
|
from openlp.plugins.songs.forms.editsongform import EditSongForm
|
||||||
from openlp.plugins.songs.forms.songmaintenanceform import SongMaintenanceForm
|
from openlp.plugins.songs.forms.songmaintenanceform import SongMaintenanceForm
|
||||||
from openlp.plugins.songs.forms.songimportform import SongImportForm
|
from openlp.plugins.songs.forms.songimportform import SongImportForm
|
||||||
from openlp.plugins.songs.forms.songexportform import SongExportForm
|
from openlp.plugins.songs.forms.songexportform import SongExportForm
|
||||||
from openlp.plugins.songs.lib import VerseType, clean_string, delete_song, make_list
|
from openlp.plugins.songs.lib import VerseType, clean_string, delete_song
|
||||||
from openlp.plugins.songs.lib.db import Author, AuthorType, Song, Book, MediaFile, SongBookEntry, Topic
|
from openlp.plugins.songs.lib.db import Author, AuthorType, Song, Book, MediaFile, SongBookEntry, Topic
|
||||||
from openlp.plugins.songs.lib.ui import SongStrings
|
from openlp.plugins.songs.lib.ui import SongStrings
|
||||||
from openlp.plugins.songs.lib.openlyricsxml import OpenLyrics, SongXML
|
from openlp.plugins.songs.lib.openlyricsxml import OpenLyrics, SongXML
|
||||||
@ -663,30 +663,37 @@ class SongMediaItem(MediaManagerItem):
|
|||||||
item.raw_footer.append(translate('SongsPlugin.MediaItem', 'CCLI License: ') +
|
item.raw_footer.append(translate('SongsPlugin.MediaItem', 'CCLI License: ') +
|
||||||
Settings().value('core/ccli number'))
|
Settings().value('core/ccli number'))
|
||||||
|
|
||||||
footer_template = Settings().value('songs/footer template').replace('\n', '').replace(' ', '')
|
footer_template = Settings().value('songs/footer template')
|
||||||
# Keep this in sync with the list in songstab.py
|
# Keep this in sync with the list in songstab.py
|
||||||
item.footer_html = pystache.render(footer_template, {
|
vars = {
|
||||||
'title': song.title,
|
'title': song.title,
|
||||||
'alternate_title': song.alternate_title,
|
'alternate_title': song.alternate_title,
|
||||||
'authors_none_label': translate('OpenLP.Ui', 'Written by'),
|
'authors_none_label': translate('OpenLP.Ui', 'Written by'),
|
||||||
'authors_none': make_list(authors_none),
|
'authors_none': authors_none,
|
||||||
'authors_words_label': AuthorType.Types[AuthorType.Words],
|
'authors_words_label': AuthorType.Types[AuthorType.Words],
|
||||||
'authors_words': make_list(authors_words),
|
'authors_words': authors_words,
|
||||||
'authors_music_label': AuthorType.Types[AuthorType.Music],
|
'authors_music_label': AuthorType.Types[AuthorType.Music],
|
||||||
'authors_music': make_list(authors_music),
|
'authors_music': authors_music,
|
||||||
'authors_words_music_label': AuthorType.Types[AuthorType.WordsAndMusic],
|
'authors_words_music_label': AuthorType.Types[AuthorType.WordsAndMusic],
|
||||||
'authors_words_music': make_list(authors_words_music),
|
'authors_words_music': authors_words_music,
|
||||||
'authors_translation_label': AuthorType.Types[AuthorType.Translation],
|
'authors_translation_label': AuthorType.Types[AuthorType.Translation],
|
||||||
'authors_translation': make_list(authors_translation),
|
'authors_translation': authors_translation,
|
||||||
'authors_words_all': make_list(authors_words + authors_words_music),
|
'authors_words_all': authors_words + authors_words_music,
|
||||||
'authors_music_all': make_list(authors_music + authors_words_music),
|
'authors_music_all': authors_music + authors_words_music,
|
||||||
'copyright': song.copyright,
|
'copyright': song.copyright,
|
||||||
'songbook_entries': make_list(songbooks),
|
'songbook_entries': songbooks,
|
||||||
'ccli_license': Settings().value('core/ccli number'),
|
'ccli_license': Settings().value('core/ccli number'),
|
||||||
'ccli_license_label': translate('SongsPlugin.MediaItem', 'CCLI License'),
|
'ccli_license_label': translate('SongsPlugin.MediaItem', 'CCLI License'),
|
||||||
'ccli_number': song.ccli_number,
|
'ccli_number': song.ccli_number,
|
||||||
'topics': make_list([topic.name for topic in song.topics])
|
'topics': [topic.name for topic in song.topics]
|
||||||
})
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
item.footer_html = mako.template.Template(footer_template).render_unicode(**vars).replace('\n', '')
|
||||||
|
except mako.exceptions.SyntaxException:
|
||||||
|
log.error('Failed to render Song footer html:\n' + mako.exceptions.text_error_template().render())
|
||||||
|
critical_error_message_box(message=translate('SongsPlugin.MediaItem',
|
||||||
|
'Failed to render Song footer html.\nSee log for details'))
|
||||||
|
|
||||||
return authors_all
|
return authors_all
|
||||||
|
|
||||||
|
@ -135,7 +135,7 @@ class SongsTab(SettingsTab):
|
|||||||
placeholders = [
|
placeholders = [
|
||||||
# placeholder, description, can be empty, is a list
|
# placeholder, description, can be empty, is a list
|
||||||
['title', translate('SongsPlugin.SongsTab', 'Song Title'), False, False],
|
['title', translate('SongsPlugin.SongsTab', 'Song Title'), False, False],
|
||||||
['alternate_title', translate('SongsPlugin.SongsTab', 'Alternate Title'), False, False],
|
['alternate_title', translate('SongsPlugin.SongsTab', 'Alternate Title'), True, False],
|
||||||
['written_by', const.format(translate('SongsPlugin.SongsTab', 'Written By')), True, False],
|
['written_by', const.format(translate('SongsPlugin.SongsTab', 'Written By')), True, False],
|
||||||
['authors_none', translate('SongsPlugin.SongsTab', 'Authors when type is not set'), False, True],
|
['authors_none', translate('SongsPlugin.SongsTab', 'Authors when type is not set'), False, True],
|
||||||
['authors_words_label', const.format(AuthorType.Types[AuthorType.Words]), False, False],
|
['authors_words_label', const.format(AuthorType.Types[AuthorType.Words]), False, False],
|
||||||
@ -168,20 +168,14 @@ class SongsTab(SettingsTab):
|
|||||||
(' ²' if placeholder[3] else ''))
|
(' ²' if placeholder[3] else ''))
|
||||||
placeholder_info += '</table>'
|
placeholder_info += '</table>'
|
||||||
placeholder_info += '\n<br/>¹ {}'.format(translate('SongsPlugin.SongsTab', 'can be empty'))
|
placeholder_info += '\n<br/>¹ {}'.format(translate('SongsPlugin.SongsTab', 'can be empty'))
|
||||||
placeholder_info += '\n<br/>² {}:<pre>{{#first}} <i>True</i> {}<br/>{{entry}} {}<br/>' \
|
placeholder_info += '\n<br/>² {}'.format(translate('SongsPlugin.SongsTab', 'list of entries, can be empty'))
|
||||||
'{{#last}} <i>True</i> {}<br/>{{#last_or_penultimate}} <i>True</i> {}</pre>'\
|
|
||||||
.format(translate('SongsPlugin.SongsTab', 'list of entries, can be empty'),
|
|
||||||
translate('SongsPlugin.SongsTab', 'for first element of list'),
|
|
||||||
translate('SongsPlugin.SongsTab', 'iterates over all entries'),
|
|
||||||
translate('SongsPlugin.SongsTab', 'for last element'),
|
|
||||||
translate('SongsPlugin.SongsTab', 'for last and second to last element'))
|
|
||||||
self.footer_placeholder_info.setHtml(placeholder_info)
|
self.footer_placeholder_info.setHtml(placeholder_info)
|
||||||
self.footer_placeholder_info.setReadOnly(True)
|
self.footer_placeholder_info.setReadOnly(True)
|
||||||
|
|
||||||
self.footer_info_label.setText(translate('SongsPlugin.SongsTab', 'How to use Footers:'))
|
self.footer_info_label.setText(translate('SongsPlugin.SongsTab', 'How to use Footers:'))
|
||||||
self.footer_desc_label.setText('{} (<a href="http://mustache.github.io/mustache.5.html">{}</a>):'
|
self.footer_desc_label.setText('{} (<a href="http://docs.makotemplates.org">{}</a>):'
|
||||||
.format(translate('SongsPlugin.SongsTab', 'Footer Template'),
|
.format(translate('SongsPlugin.SongsTab', 'Footer Template'),
|
||||||
translate('SongsPlugin.SongsTab', 'Mustache Syntax')))
|
translate('SongsPlugin.SongsTab', 'Mako Syntax')))
|
||||||
self.footer_reset_button.setText(translate('SongsPlugin.SongsTab', 'Reset Template'))
|
self.footer_reset_button.setText(translate('SongsPlugin.SongsTab', 'Reset Template'))
|
||||||
|
|
||||||
def on_search_as_type_check_box_changed(self, check_state):
|
def on_search_as_type_check_box_changed(self, check_state):
|
||||||
|
@ -68,46 +68,59 @@ __default_settings__ = {
|
|||||||
'songs/chord notation': 'english', # Can be english, german or neo-latin
|
'songs/chord notation': 'english', # Can be english, german or neo-latin
|
||||||
'songs/mainview chords': False,
|
'songs/mainview chords': False,
|
||||||
'songs/disable chords import': False,
|
'songs/disable chords import': False,
|
||||||
'songs/footer template': """{{title}}<br/>
|
'songs/footer template': """\
|
||||||
|
${title}<br/>
|
||||||
|
|
||||||
{{#authors_none}}
|
%if authors_none:
|
||||||
{{#first}}{{authors_none_label}}: {{/first}}
|
<%
|
||||||
{{entry}}{{^last}}, {{/last}}
|
authors = ", ".join(authors_none)
|
||||||
{{#last}}<br/>{{/last}}
|
%>
|
||||||
{{/authors_none}}
|
${authors_none_label}: ${authors}<br/>
|
||||||
{{#authors_words_music}}
|
%endif
|
||||||
{{#first}}{{authors_words_music_label}}: {{/first}}
|
|
||||||
{{entry}}{{^last}}, {{/last}}
|
|
||||||
{{#last}}<br/>{{/last}}
|
|
||||||
{{/authors_words_music}}
|
|
||||||
{{#authors_words}}
|
|
||||||
{{#first}}{{authors_words_label}}: {{/first}}
|
|
||||||
{{entry}}{{^last}}, {{/last}}
|
|
||||||
{{#last}}<br/>{{/last}}
|
|
||||||
{{/authors_words}}
|
|
||||||
{{#authors_music}}
|
|
||||||
{{#first}}{{authors_music_label}}: {{/first}}
|
|
||||||
{{entry}}{{^last}}, {{/last}}
|
|
||||||
{{#last}}<br/>{{/last}}
|
|
||||||
{{/authors_music}}
|
|
||||||
{{#authors_translation}}
|
|
||||||
{{#first}}{{authors_translation_label}}: {{/first}}
|
|
||||||
{{entry}}{{^last}}, {{/last}}
|
|
||||||
{{#last}}<br/>{{/last}}
|
|
||||||
{{/authors_translation}}
|
|
||||||
|
|
||||||
{{#copyright}}
|
%if authors_words_music:
|
||||||
© {{copyright}}<br/>
|
<%
|
||||||
{{/copyright}}
|
authors = ", ".join(authors_words_music)
|
||||||
|
%>
|
||||||
|
${authors_words_music_label}: ${authors}<br/>
|
||||||
|
%endif
|
||||||
|
|
||||||
{{#songbook_entries}}
|
%if authors_words:
|
||||||
{{entry}}{{^last}}, {{/last}}
|
<%
|
||||||
{{#last}}<br/>{{/last}}
|
authors = ", ".join(authors_words)
|
||||||
{{/songbook_entries}}
|
%>
|
||||||
|
${authors_words_label}: ${authors}<br/>
|
||||||
|
%endif
|
||||||
|
|
||||||
{{#ccli_license}}
|
%if authors_music:
|
||||||
{{ccli_license_label}}: {{ccli_license}}<br/>
|
<%
|
||||||
{{/ccli_license}}""",
|
authors = ", ".join(authors_music)
|
||||||
|
%>
|
||||||
|
${authors_music_label}: ${authors}<br/>
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if authors_translation:
|
||||||
|
<%
|
||||||
|
authors = ", ".join(authors_translation)
|
||||||
|
%>
|
||||||
|
${authors_translation_label}: ${authors}<br/>
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if copyright:
|
||||||
|
© ${copyright}<br/>
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if songbook_entries:
|
||||||
|
<%
|
||||||
|
entries = ", ".join(songbook_entries)
|
||||||
|
%>
|
||||||
|
${entries}<br/>
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if ccli_license:
|
||||||
|
${ccli_license_label} ${ccli_license}<br/>
|
||||||
|
%endif
|
||||||
|
""",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -93,8 +93,7 @@ MODULES = [
|
|||||||
'bs4',
|
'bs4',
|
||||||
'mako',
|
'mako',
|
||||||
'uno',
|
'uno',
|
||||||
'six',
|
'six'
|
||||||
'pystache'
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user