kommersbuch/wscript

179 lines
5.1 KiB
Python

#! /usr/bin/env python
# encoding: utf-8
import os
import re
from functools import reduce
from waflib import TaskGen
APPNAME = 'kommersbuch'
VERSION = '1.0'
top = '.'
out = 'build'
src = 'src'
lib = 'lib'
src_scores = os.path.join(src, 'scores')
src_lyrics = os.path.join(src, 'lyrics')
built_lyrics_path = os.path.abspath(os.path.join(out, src, 'lyrics'))
built_scores_path = os.path.abspath(os.path.join(out, src, 'scores'))
templater_path = os.path.abspath(os.path.join(src, 'tools/templater.py'))
score_lyrics_template_path = os.path.abspath(
os.path.join(src, 'templates', 'score_lyrics.j2'))
book_template_path = os.path.abspath(
os.path.join(src, 'templates', 'book.j2'))
def dist(ctx):
ctx.excl = '**/.waf* **/*~ **/*.pyc **/*.swp **/.lock* out pdf midi music .git .DS_Store'
def configure(ctx):
ctx.find_program('lualatex', var='LUALATEX')
ctx.find_program('lilypond', var='LILYPOND')
ctx.find_program('timidity', var='TIMIDITY')
ctx.find_program('opusenc', var='OPUSENC')
def pre(ctx):
os.system('mkdir -p {1} && cp -r {0}/* {1}'.format(lib, built_lyrics_path))
TaskGen.declare_chain(
name='opus',
rule='${TIMIDITY} ${SRC} -Ow -o - | ${OPUSENC} - ${TGT}',
ext_in='.midi',
ext_out='.opus',
shell=True)
def build(ctx):
ctx.add_pre_fun(pre)
ctx.add_group('lilypond')
ctx.add_group('opus')
ctx.add_group('book')
lilypond_rule = '${LILYPOND} -o ${TGT[0].abspath().replace(".pdf", "")} ${SRC}'
lyrics_template_rule = templater_path + ' ' + \
score_lyrics_template_path + ' "{0}" > ${{TGT}}'
book_template_rule = templater_path + ' ' + \
book_template_path + ' "{0}" > ${{TGT}}'
lyrics_combined_rule = 'cd ' + built_lyrics_path + \
' && ${LUALATEX} --shell-escape '
scoredata = []
scores = ctx.path.ant_glob(src_scores + '/*.ly')
for score in scores:
filename = os.path.basename(score.abspath())
lyricsfile = os.path.join(src_lyrics, filename.replace('.ly', '.tex'))
lilyfile = filename.replace('.ly', '.pdf')
lily_score_file = '{0}_score.pdf'.format(
lilyfile.replace('.pdf', ''))
lily_midi_file = lilyfile.replace('.pdf', '_score.midi')
target_files = '{0} {1} {2}'.format(
os.path.join(src_scores, lilyfile),
os.path.join(src_scores, lily_score_file),
os.path.join(src_scores, lily_midi_file))
score_content = ''
with open(score.abspath(), 'r') as f:
score_content = f.read()
matches = re.findall('title = "(.*)"', score_content)
score_title = matches[0]
scoredata.append(
{'title': score_title,
'score': score.abspath(),
'lyrics': os.path.abspath(lyricsfile)})
ctx.set_group('lilypond')
# score without lyrics & midi
ctx(
rule=lilypond_rule,
source=score,
target=target_files,
shell=True
)
# score with lyrics
template_data = {
'score_file': score.abspath(),
'lyrics_file': os.path.abspath(lyricsfile)
}
lyrics_rule = lyrics_template_rule.format(str(template_data))
built_lyricsfile = os.path.join(
src_lyrics,
filename.replace('.ly', '_built.tex'))
ctx(
rule=lyrics_rule,
source=lyricsfile,
target=built_lyricsfile,
shell=True
)
final_lyrics_path = os.path.join(
built_scores_path, filename.replace('.ly', '_lyrics.pdf'))
lyrics_combined_rule_final = lyrics_combined_rule + \
filename.replace('.ly', '_built.tex') + \
' && cp ' + filename.replace('.ly', '_built.pdf') + \
' ' + final_lyrics_path
ctx(
rule=lyrics_combined_rule_final,
source=score.relpath() + ' ' + built_lyricsfile,
target=os.path.join(
src_scores, filename.replace('.ly', '_lyrics.pdf')),
shell=True
)
# opus
ctx.set_group('opus')
ctx(source=os.path.join(src_scores, lily_midi_file))
# booklet
template_data = {
'scores': scoredata,
}
book_rule = book_template_rule.format(str(template_data))
built_bookfile = os.path.join(src_lyrics, 'book.tex')
ctx.set_group('book')
ctx(
rule=book_rule,
source=os.path.relpath(book_template_path),
target=built_bookfile,
shell=True
)
final_book_path = os.path.join(built_scores_path, 'book.pdf')
book_combined_rule_final = lyrics_combined_rule + \
'book.tex' + \
' && cp book.pdf' + \
' ' + final_book_path
book_sources = os.path.relpath(book_template_path)
for score in scoredata:
book_sources = '{0} {1} {2}'.format(
book_sources,
os.path.relpath(score['score']),
os.path.relpath(score['lyrics']))
ctx(
rule='{0} && {0}'.format(book_combined_rule_final),
source=book_sources,
target=os.path.join(src_scores, 'book.pdf'),
shell=True
)