179 lines
5.1 KiB
Python
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
|
|
)
|