mirror of https://github.com/patacrep/patacrep.git
Luthaf
11 years ago
1 changed files with 0 additions and 157 deletions
@ -1,157 +0,0 @@ |
|||
#!/usr/bin/env python |
|||
# -*- coding: utf-8 -*- |
|||
|
|||
import json |
|||
import os.path |
|||
import re |
|||
|
|||
from songbook.files import recursiveFind |
|||
from songbook.songs import Song, SongsList |
|||
|
|||
def parseTemplate(template): |
|||
embeddedJsonPattern = re.compile(r"^%%:") |
|||
f = open(template) |
|||
code = [ line[3:-1] for line in f if embeddedJsonPattern.match(line) ] |
|||
f.close() |
|||
data = json.loads(''.join(code)) |
|||
parameters = dict() |
|||
for param in data: |
|||
parameters[param["name"]] = param |
|||
return parameters |
|||
|
|||
def toValue(parameter, data): |
|||
if "type" not in parameter: |
|||
return data |
|||
elif parameter["type"] == "stringlist": |
|||
if "join" in parameter: |
|||
joinText = parameter["join"] |
|||
else: |
|||
joinText = '' |
|||
return joinText.join(data) |
|||
elif parameter["type"] == "color": |
|||
return data[1:] |
|||
elif parameter["type"] == "font": |
|||
return data+'pt' |
|||
elif parameter["type"] == "enum": |
|||
return data |
|||
elif parameter["type"] == "file": |
|||
return data |
|||
elif parameter["type"] == "flag": |
|||
if "join" in parameter: |
|||
joinText = parameter["join"] |
|||
else: |
|||
joinText = '' |
|||
return joinText.join(data) |
|||
|
|||
def formatDeclaration(name, parameter): |
|||
value = "" |
|||
if "default" in parameter: |
|||
value = parameter["default"] |
|||
return '\\def\\set@{name}#1{{\\def\\get{name}{{#1}}}}\n'.format(name=name) + formatDefinition(name, toValue(parameter, value)) |
|||
|
|||
def formatDefinition(name, value): |
|||
return '\\set@{name}{{{value}}}\n'.format(name=name, value=value) |
|||
|
|||
def makeTexFile(sb, library, output): |
|||
name = output[:-4] |
|||
|
|||
# default value |
|||
template = "patacrep.tmpl" |
|||
songs = [] |
|||
|
|||
prefixes_tex = "" |
|||
prefixes = [] |
|||
|
|||
authwords_tex = "" |
|||
authwords = {"after": ["by"], "ignore": ["unknown"], "sep": ["and"]} |
|||
|
|||
# parse the songbook data |
|||
if "template" in sb: |
|||
template = sb["template"] |
|||
del sb["template"] |
|||
if "songs" in sb: |
|||
songs = sb["songs"] |
|||
del sb["songs"] |
|||
if "titleprefixwords" in sb: |
|||
prefixes = sb["titleprefixwords"] |
|||
for prefix in sb["titleprefixwords"]: |
|||
prefixes_tex += "\\titleprefixword{%s}\n" % prefix |
|||
sb["titleprefixwords"] = prefixes_tex |
|||
if "authwords" in sb: |
|||
# Populating default value |
|||
for key in ["after", "sep", "ignore"]: |
|||
if key not in sb["authwords"]: |
|||
sb["authwords"][key] = authwords[key] |
|||
# Processing authwords values |
|||
authwords = sb["authwords"] |
|||
for key in ["after", "sep", "ignore"]: |
|||
for word in authwords[key]: |
|||
if key == "after": |
|||
authwords_tex += "\\auth%sword{%s}\n" % ("by", word) |
|||
else: |
|||
authwords_tex += "\\auth%sword{%s}\n" % (key, word) |
|||
sb["authwords"] = authwords_tex |
|||
if "after" in authwords: |
|||
authwords["after"] = [re.compile(r"^.*%s\b(.*)" % after) for after in authwords["after"]] |
|||
if "sep" in authwords: |
|||
authwords["sep"] = [" %s" % sep for sep in authwords["sep"]] + [","] |
|||
authwords["sep"] = [re.compile(r"^(.*)%s (.*)$" % sep) for sep in authwords["sep"] ] |
|||
|
|||
if "lang" not in sb: |
|||
sb["lang"] = "french" |
|||
if "sort" in sb: |
|||
sort = sb["sort"] |
|||
del sb["sort"] |
|||
else: |
|||
sort = [u"by", u"album", u"@title"] |
|||
Song.sort = sort |
|||
Song.prefixes = prefixes |
|||
Song.authwords = authwords |
|||
|
|||
parameters = parseTemplate("templates/"+template) |
|||
|
|||
# compute songslist |
|||
if songs == "all": |
|||
songs = map(lambda x: x[len(library) + 6:], recursiveFind(os.path.join(library, 'songs'), '*.sg')) |
|||
songslist = SongsList(library, sb["lang"]) |
|||
songslist.append_list(songs) |
|||
|
|||
sb["languages"] = ",".join(songslist.languages()) |
|||
|
|||
# output relevant fields |
|||
out = open(output, 'w') |
|||
out.write('%% This file has been automatically generated, do not edit!\n') |
|||
out.write('\\makeatletter\n') |
|||
# output automatic parameters |
|||
out.write(formatDeclaration("name", {"default":name})) |
|||
out.write(formatDeclaration("songslist", {"type":"stringlist"})) |
|||
# output template parameter command |
|||
for name, parameter in parameters.iteritems(): |
|||
out.write(formatDeclaration(name, parameter)) |
|||
# output template parameter values |
|||
for name, value in sb.iteritems(): |
|||
if name in parameters: |
|||
out.write(formatDefinition(name, toValue(parameters[name],value))) |
|||
|
|||
if len(songs) > 0: |
|||
out.write(formatDefinition('songslist', songslist.latex())) |
|||
out.write('\\makeatother\n') |
|||
|
|||
# output template |
|||
commentPattern = re.compile(r"^\s*%") |
|||
f = open("templates/"+template) |
|||
content = [ line for line in f if not commentPattern.match(line) ] |
|||
|
|||
for index, line in enumerate(content): |
|||
if re.compile("getLibraryImgDirectory").search(line): |
|||
line = line.replace("\\getLibraryImgDirectory", library + "img/") |
|||
content[index] = line |
|||
if re.compile("getLibraryLilypondDirectory").search(line): |
|||
line = line.replace("\\getLibraryLilypondDirectory", library + "lilypond/") |
|||
content[index] = line |
|||
|
|||
f.close() |
|||
out.write(''.join(content)) |
|||
|
|||
out.close() |
|||
|
Loading…
Reference in new issue