Browse Source

Sorted out configuration defaults (between hard-coded defaults, templates, and configuration files)

pull/47/head
Louis 10 years ago
parent
commit
414716cdba
  1. 28
      songbook_core/authors.py
  2. 67
      songbook_core/build.py
  3. 26
      songbook_core/index.py

28
songbook_core/authors.py

@ -3,6 +3,34 @@
"""Authors string management.""" """Authors string management."""
import re
DEFAULT_AUTHWORDS = {
"after": ["by"],
"ignore": ["unknown"],
"sep": ["and"],
}
def compile_authwords(authwords):
# Convert strings to regular expressions
# Fill holes
for (key, value) in DEFAULT_AUTHWORDS.items():
if key not in authwords:
authwords[key] = value
# Compilation
authwords['after'] = [
re.compile(r"^.*%s\b(.*)" % word)
for word in authwords['after']
]
authwords['sep'] = [
re.compile(r"^(.*)%s (.*)$" % word)
for word in ([" %s" % word for word in authwords['sep']] + [','])
]
return authwords
def split_author_names(string): def split_author_names(string):
r"""Split author between first and last name. r"""Split author between first and last name.

67
songbook_core/build.py

@ -11,6 +11,7 @@ import re
from subprocess import Popen, PIPE, call from subprocess import Popen, PIPE, call
from songbook_core import __DATADIR__ from songbook_core import __DATADIR__
from songbook_core import authors
from songbook_core import content from songbook_core import content
from songbook_core import errors from songbook_core import errors
from songbook_core.index import process_sxd from songbook_core.index import process_sxd
@ -19,11 +20,6 @@ from songbook_core.templates import TexRenderer
LOGGER = logging.getLogger(__name__) LOGGER = logging.getLogger(__name__)
EOL = "\n" EOL = "\n"
DEFAULT_AUTHWORDS = {
"after": ["by"],
"ignore": ["unknown"],
"sep": ["and"],
}
DEFAULT_STEPS = ['tex', 'pdf', 'sbx', 'pdf', 'clean'] DEFAULT_STEPS = ['tex', 'pdf', 'sbx', 'pdf', 'clean']
GENERATED_EXTENSIONS = [ GENERATED_EXTENSIONS = [
"_auth.sbx", "_auth.sbx",
@ -36,6 +32,12 @@ GENERATED_EXTENSIONS = [
"_title.sbx", "_title.sbx",
"_title.sxd", "_title.sxd",
] ]
DEFAULT_CONFIG = {
'template': "default.tex",
'lang': 'english',
'content': [],
'titleprefixwords': [],
}
@ -50,46 +52,10 @@ class Songbook(object):
def __init__(self, raw_songbook, basename): def __init__(self, raw_songbook, basename):
super(Songbook, self).__init__() super(Songbook, self).__init__()
self.config = raw_songbook
self.basename = basename self.basename = basename
# Default values: will be updated while parsing raw_songbook # Some special keys have their value processed.
self.config = {
'template': "default.tex",
'lang': 'english',
'sort': [u"by", u"album", u"@title"],
'content': None,
'titleprefixwords': [],
}
self._parse_raw(raw_songbook)
def _parse_raw(self, raw_songbook):
"""Parse raw_songbook.
The principle is: some special keys have their value processed; others
are stored verbatim in self.config.
"""
self.config.update(raw_songbook)
self._set_datadir() self._set_datadir()
self._set_authwords()
def _set_authwords(self):
# Ensure self.config['authwords'] contains all entries
for (key, value) in DEFAULT_AUTHWORDS.items():
if key not in self.config['authwords']:
self.config['authwords'][key] = value
# Convert strings to regular expressions
self.config["authwords"]['after'] = [
re.compile(r"^.*%s\b(.*)" % after)
for after
in self.config['authwords']["after"]
]
self.config["authwords"]['sep'] = [
re.compile(r"^(.*)%s (.*)$" % sep)
for sep in ([
" %s" % sep for sep in self.config['authwords']["sep"]
] + [','])
]
def _set_datadir(self): def _set_datadir(self):
"""Set the default values for datadir""" """Set the default values for datadir"""
@ -110,21 +76,30 @@ class Songbook(object):
self.config['datadir'] = abs_datadir self.config['datadir'] = abs_datadir
def build_config(self, from_templates):
config = DEFAULT_CONFIG
config.update(from_templates)
config.update(self.config)
# Post-processing
config['authwords'] = authors.compile_authwords(config['authwords'])
return config
def write_tex(self, output): def write_tex(self, output):
"""Build the '.tex' file corresponding to self. """Build the '.tex' file corresponding to self.
Arguments: Arguments:
- output: a file object, in which the file will be written. - output: a file object, in which the file will be written.
""" """
self.contentlist = content.process_content(self.config['content'], self.config)
renderer = TexRenderer( renderer = TexRenderer(
self.config['template'], self.config['template'],
self.config['datadir'], self.config['datadir'],
self.config['lang'], self.config['lang'],
) )
context = renderer.get_variables() context = self.build_config(renderer.get_variables())
context.update(self.config) self.contentlist = content.process_content(self.config['content'], context)
context['render_content'] = content.render_content context['render_content'] = content.render_content
context['titleprefixkeys'] = ["after", "sep", "ignore"] context['titleprefixkeys'] = ["after", "sep", "ignore"]
context['content'] = self.contentlist context['content'] = self.contentlist

26
songbook_core/index.py

@ -13,7 +13,7 @@ import locale
import re import re
import codecs import codecs
from songbook_core.authors import processauthors from songbook_core import authors
from songbook_core.plastex import simpleparse from songbook_core.plastex import simpleparse
EOL = u"\n" EOL = u"\n"
@ -66,7 +66,6 @@ class Index(object):
self.data = dict() self.data = dict()
self.keywords = dict() self.keywords = dict()
self.prefix_patterns = [] self.prefix_patterns = []
self.authwords = {"after": [], "ignore": [], "sep": []}
if indextype == "TITLE INDEX DATA FILE": if indextype == "TITLE INDEX DATA FILE":
self.indextype = "TITLE" self.indextype = "TITLE"
elif indextype == "SCRIPTURE INDEX DATA FILE": elif indextype == "SCRIPTURE INDEX DATA FILE":
@ -100,26 +99,7 @@ class Index(object):
)) ))
if self.indextype == "AUTHOR": if self.indextype == "AUTHOR":
for key in self.keywords: self.authwords = authors.compile_authwords(self.keywords)
if key in self.authwords:
self.authwords[key] = self.keywords[key]
for word in self.authwords.keys():
if word in self.keywords:
if word == "after":
self.authwords[word] = [
re.compile(r"^.*{after}\b(.*)".format(after=after))
for after in self.keywords[word]
]
elif word == "sep":
self.authwords[word] = [" {sep}".format(sep=sep)
for sep in self.authwords[word]
] + [","]
self.authwords[word] = [
re.compile(r"^(.*){sep} (.*)$".format(sep=sep))
for sep in self.authwords[word]
]
else:
self.authwords[word] = self.keywords[word]
def _raw_add(self, key, number, link): def _raw_add(self, key, number, link):
"""Add a song to the list. """Add a song to the list.
@ -157,7 +137,7 @@ class Index(object):
if self.indextype == "AUTHOR": if self.indextype == "AUTHOR":
# Processing authors # Processing authors
for author in processauthors( for author in authors.processauthors(
key, key,
**self.authwords): **self.authwords):
self._raw_add(author, number, link) self._raw_add(author, number, link)

Loading…
Cancel
Save