Browse Source

Lecture des variables dans les fichiers de templates

pull/20/head
Luthaf 11 years ago
parent
commit
f0411615f3
  1. 33
      songbook_core/build.py
  2. 28
      songbook_core/data/examples/songs/greensleeves.ly
  3. 97
      songbook_core/data/latex/chords.sty
  4. 122
      songbook_core/data/latex/crepbook.cls
  5. 114
      songbook_core/data/templates/default.tex
  6. 17
      songbook_core/data/templates/layout.tex
  7. 53
      songbook_core/data/templates/patacrep.tex
  8. 25
      songbook_core/data/templates/songs.tex
  9. 10
      songbook_core/plastex.py
  10. 5
      songbook_core/plastex_patchedbabel.py
  11. 65
      songbook_core/templates.py

33
songbook_core/build.py

@ -5,7 +5,6 @@
import codecs import codecs
import glob import glob
import json
import logging import logging
import os.path import os.path
import re import re
@ -26,27 +25,6 @@ DEFAULT_AUTHWORDS = {
} }
def parse_template(template):
"""Return the dict of default parameters defined in the template."""
embedded_json_pattern = re.compile(r"^%%:")
with open(template) as template_file:
code = [
line[3:-1]
for line
in template_file
if embedded_json_pattern.match(line)
]
data = json.loads(''.join(code))
parameters = dict()
for param in data:
try:
parameters[param["name"]] = param["default"]
except KeyError:
parameters[param["name"]] = None
return parameters
# pylint: disable=too-few-public-methods # pylint: disable=too-few-public-methods
class Songbook(object): class Songbook(object):
"""Represent a songbook (.sb) file. """Represent a songbook (.sb) file.
@ -85,12 +63,9 @@ class Songbook(object):
Song.authwords['ignore'] = self.config['authwords']['ignore'] Song.authwords['ignore'] = self.config['authwords']['ignore']
Song.authwords['sep'] = [ Song.authwords['sep'] = [
re.compile(r"^(.*)%s (.*)$" % sep) re.compile(r"^(.*)%s (.*)$" % sep)
for sep for sep in ([
in ([ " %s" % sep for sep in self.config['authwords']["sep"]
" %s" % sep ] + [','])
for sep
in self.config['authwords']["sep"]
] + [','])
] ]
def _parse(self, raw_songbook): def _parse(self, raw_songbook):
@ -134,7 +109,7 @@ class Songbook(object):
self.config['datadir'], self.config['datadir'],
) )
context = parse_template(renderer.file_template()) context = renderer.get_variables()
context.update(self.config) context.update(self.config)
context['titleprefixkeys'] = ["after", "sep", "ignore"] context['titleprefixkeys'] = ["after", "sep", "ignore"]

28
songbook_core/data/examples/songs/greensleeves.ly

@ -1,21 +1,19 @@
\include "_lilypond/header" \include "_lilypond/header"
\paper{paper-height = 6.5\cm} \paper{paper-height = 6.5\cm}
%\new \songbookstaff
{ {
\key a \minor \key a \minor
\time 6/8 \time 6/8
\partial 8 a'8 \partial 8 a'8
\relative c''{ \relative c''{
c4 d8 e8. (f16) e8 d4 b8 g8. (a16) b8 c4 d8 e8. (f16) e8 d4 b8 g8. (a16) b8
c4 a8 a8. (gis16) a8 b4 gis8 e4 a8 c4 a8 a8. (gis16) a8 b4 gis8 e4 a8
c4 d8 e8. (f16 e8) d4 b8 g8. (a16) b8 c4 d8 e8. (f16 e8) d4 b8 g8. (a16) b8
c8. (b16) a8 gis8. (fis16) gis8 a4 a8 a4. c8. (b16) a8 gis8. (fis16) gis8 a4 a8 a4.
g'4. g8. (fis16) e8 d4 b8 g8. (a16) b8
c4 (a8) a8. (gis16) a8 b4 gis8 e4.
g'4. g8. (fis16) e8 d4 b8 g8. (a16) b8
c8. (b16) a8 gis8. (fis16) gis8 a4. a4.
}
}
g'4. g8. (fis16) e8 d4 b8 g8. (a16) b8
c4 (a8) a8. (gis16) a8 b4 gis8 e4.
g'4. g8. (fis16) e8 d4 b8 g8. (a16) b8
c8. (b16) a8 gis8. (fis16) gis8 a4. a4.
}
}

97
songbook_core/data/latex/chords.sty

@ -4,7 +4,50 @@
\newcommand*{\Sharp}{\nolinebreak\hspace{-.05em}\raisebox{.6ex}{\,\small\bf \#}} \newcommand*{\Sharp}{\nolinebreak\hspace{-.05em}\raisebox{.6ex}{\,\small\bf \#}}
\newcommand*{\Flat}{\nolinebreak\hspace{-.05em}\raisebox{.6ex}{\,\small$\mathbf{\flat}$}} \newcommand*{\Flat}{\nolinebreak\hspace{-.05em}\raisebox{.6ex}{\,\small$\mathbf{\flat}$}}
\newcommand*{\chordrule}{\mbox{\hspace{1cm}\rule[0.5cm]{15cm}{0.02cm}}\vspace{-.4cm}} \newcommand*{\chordrule}{\mbox{\hspace{1cm}\rule[0.5cm]{15cm}{0.02cm}}\vspace{-.4cm}}
\newcommand*{\chordname}[2]{\makebox[3cm]{\raisebox{.5cm}{\large \textbf{\iflanguage{english}{#1}{#2}}}}} \newcommand*{\chordname}[1]{\makebox[3cm]{\raisebox{.5cm}{\large \textbf{#1}}}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Multilanguage management
\AtBeginDocument{
% Default names (english)
\newcommand{\guitarchordsname}{Guitar chords}
\newcommand{\ukulelechordsname}{Ukulele chords}
\newcommand{\chordnameAsharp}{A\Sharp = B\Flat}
\newcommand{\chordnameA}{A}
\newcommand{\chordnameB}{B}
\newcommand{\chordnameCsharp}{C\Sharp = D\Flat}
\newcommand{\chordnameC}{C}
\newcommand{\chordnameDsharp}{D\Sharp = E\Flat}
\newcommand{\chordnameD}{D}
\newcommand{\chordnameE}{E}
\newcommand{\chordnameFsharp}{F\Sharp = G\Flat}
\newcommand{\chordnameF}{F}
\newcommand{\chordnameGsharp}{G\Sharp = A\Flat}
\newcommand{\chordnameG}{G}
\IfStrEq{\mainlanguage}{french}{
% French names
\renewcommand{\guitarchordsname}{Accords de guitare}
\renewcommand{\ukulelechordsname}{Accords de ukulélé}
\renewcommand{\chordnameAsharp}{La\Sharp = Si\Flat}
\renewcommand{\chordnameA}{La}
\renewcommand{\chordnameB}{Si}
\renewcommand{\chordnameCsharp}{Do\Sharp = Ré\Flat}
\renewcommand{\chordnameC}{Do}
\renewcommand{\chordnameDsharp}{Ré\Sharp = Mi\Flat}
\renewcommand{\chordnameD}{Ré}
\renewcommand{\chordnameE}{Mi}
\renewcommand{\chordnameFsharp}{Fa\Sharp = Sol\Flat}
\renewcommand{\chordnameF}{Fa}
\renewcommand{\chordnameGsharp}{Sol\Sharp = La\Flat}
\renewcommand{\chordnameG}{Sol}
}{}
}
% End of multilanguage management
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newcommand{\chords}{ \newcommand{\chords}{
\begin{songs}{} \begin{songs}{}
@ -16,8 +59,8 @@
\songcolumns{1} \songcolumns{1}
\ifguitar \ifguitar
\iflanguage{english}{\beginsong{Guitar chords}}{\beginsong{Accords de guitare}} \beginsong{\guitarchordsname}
\chordname{C}{Do} \chordname{\chordnameC}
\gtab{C}{~:X32010} \gtab{C}{~:X32010}
\gtab{C7}{~:X32310} \gtab{C7}{~:X32310}
\gtab{Cm}{3:X02210} \gtab{Cm}{3:X02210}
@ -29,7 +72,7 @@
\gtab*{C6}{~:XX2213} \gtab*{C6}{~:XX2213}
\chordrule \chordrule
\chordname{C\Sharp = D\Flat}{Do\Sharp = Ré\Flat} \chordname{\chordnameCsharp}
\gtab{C\#}{4:X02220} \gtab{C\#}{4:X02220}
\gtab{C\#7}{4:X02020} \gtab{C\#7}{4:X02020}
\gtab{C\#m}{4:X02210} \gtab{C\#m}{4:X02210}
@ -41,7 +84,7 @@
\gtab*{C\#6}{1:X02010} \gtab*{C\#6}{1:X02010}
\chordrule \chordrule
\chordname{D}{Ré} \chordname{\chordnameD}
\gtab{D}{~:XX0232} \gtab{D}{~:XX0232}
\gtab{D7}{~:XX0212} \gtab{D7}{~:XX0212}
\gtab{Dm}{~:XX0231} \gtab{Dm}{~:XX0231}
@ -53,7 +96,7 @@
\gtab*{D6}{~:X00202} \gtab*{D6}{~:X00202}
\chordrule \chordrule
\chordname{D\Sharp = E\Flat}{Ré\Sharp = Mi\Flat} \chordname{\chordnameDsharp}
\gtab{D\#}{6:X02220} \gtab{D\#}{6:X02220}
\gtab{D\#7}{6:X02020} \gtab{D\#7}{6:X02020}
\gtab{D\#m}{6:X02210} \gtab{D\#m}{6:X02210}
@ -65,7 +108,7 @@
\gtab*{D\#6}{1:X00202} \gtab*{D\#6}{1:X00202}
\chordrule \chordrule
\chordname{E}{Mi} \chordname{\chordnameE}
\gtab{E}{~:022100} \gtab{E}{~:022100}
\gtab{E7}{~:020100} \gtab{E7}{~:020100}
\gtab{Em}{~:022000} \gtab{Em}{~:022000}
@ -77,7 +120,7 @@
\gtab*{E6}{~:022120} \gtab*{E6}{~:022120}
\chordrule \chordrule
\chordname{F}{Fa} \chordname{\chordnameF}
\gtab{F}{1:022100} \gtab{F}{1:022100}
\gtab{F7}{1:020100} \gtab{F7}{1:020100}
\gtab{Fm}{1:022000} \gtab{Fm}{1:022000}
@ -89,7 +132,7 @@
\gtab*{F6}{~:XX0211} \gtab*{F6}{~:XX0211}
\chordrule \chordrule
\chordname{F\Sharp = G\Flat}{Fa\Sharp = Sol\Flat} \chordname{\chordnameFsharp}
\gtab{F\#}{2:022100} \gtab{F\#}{2:022100}
\gtab{F\#7}{2:020100} \gtab{F\#7}{2:020100}
\gtab{F\#m}{2:022000} \gtab{F\#m}{2:022000}
@ -101,7 +144,7 @@
\gtab*{F\#6}{~:XX1322} \gtab*{F\#6}{~:XX1322}
\chordrule \chordrule
\chordname{G}{Sol} \chordname{\chordnameG}
\gtab{G}{~:320003} \gtab{G}{~:320003}
\gtab{G7}{~:320001} \gtab{G7}{~:320001}
\gtab{Gm}{3:022000} \gtab{Gm}{3:022000}
@ -113,7 +156,7 @@
\gtab*{G6}{~:320000} \gtab*{G6}{~:320000}
\chordrule \chordrule
\chordname{G\Sharp = A\Flat}{Sol\Sharp = La\Flat} \chordname{\chordnameGsharp}
\gtab{G\#}{4:022100} \gtab{G\#}{4:022100}
\gtab{G\#7}{4:020100} \gtab{G\#7}{4:020100}
\gtab{G\#m}{4:022000} \gtab{G\#m}{4:022000}
@ -125,7 +168,7 @@
\gtab*{G\#6}{~:XX1111} \gtab*{G\#6}{~:XX1111}
\chordrule \chordrule
\chordname{A}{La} \chordname{\chordnameA}
\gtab{A}{~:X02220} \gtab{A}{~:X02220}
\gtab{A7}{~:X02020} \gtab{A7}{~:X02020}
\gtab{Am}{~:X02210} \gtab{Am}{~:X02210}
@ -137,7 +180,7 @@
\gtab*{A6}{~:XX2222} \gtab*{A6}{~:XX2222}
\chordrule \chordrule
\chordname{A\Sharp = B\Flat}{La\Sharp = Si\Flat} \chordname{\chordnameAsharp}
\gtab{A\#}{1:X02220} \gtab{A\#}{1:X02220}
\gtab{A\#7}{1:X02020} \gtab{A\#7}{1:X02020}
\gtab{A\#m}{1:X02210} \gtab{A\#m}{1:X02210}
@ -149,7 +192,7 @@
\gtab*{A\#6}{~:XX3333} \gtab*{A\#6}{~:XX3333}
\chordrule \chordrule
\chordname{B}{Si} \chordname{\chordnameB}
\gtab{B}{2:X02220} \gtab{B}{2:X02220}
\gtab{B7}{X21202} \gtab{B7}{X21202}
\gtab{Bm}{2:X02210} \gtab{Bm}{2:X02210}
@ -169,9 +212,9 @@
\fi \fi
\ifukulele \ifukulele
\iflanguage{english}{\beginsong{Ukulele chords}}{\beginsong{Accords de ukulélé}} \beginsong{\ukulelechordsname}
\chordname{C}{Do} \chordname{\chordnameC}
\utab{C}{~:0003} \utab{C}{~:0003}
\utab{C7}{~:0001} \utab{C7}{~:0001}
\utab{Cm}{~:0333} \utab{Cm}{~:0333}
@ -183,7 +226,7 @@
\utab*{Cdim}{2:3101} \utab*{Cdim}{2:3101}
\chordrule \chordrule
\chordname{C\Sharp = D\Flat}{Do\Sharp = Ré\Flat} \chordname{\chordnameCsharp}
\utab{C\#}{1:0003} \utab{C\#}{1:0003}
\utab{C\#7}{1:0001} \utab{C\#7}{1:0001}
\utab{C\#m}{~:1104} \utab{C\#m}{~:1104}
@ -195,7 +238,7 @@
\utab*{C\#dim}{~:0104} \utab*{C\#dim}{~:0104}
\chordrule \chordrule
\chordname{D}{Ré} \chordname{\chordnameD}
\utab{D}{~:2220} \utab{D}{~:2220}
\utab{D7}{2:0001} \utab{D7}{2:0001}
\utab{Dm}{~:2210} \utab{Dm}{~:2210}
@ -207,7 +250,7 @@
\utab*{Ddim}{1:0104} \utab*{Ddim}{1:0104}
\chordrule \chordrule
\chordname{D\Sharp = E\Flat}{Ré\Sharp = Mi\Flat} \chordname{\chordnameDsharp}
\utab{D\#}{1:2220} \utab{D\#}{1:2220}
\utab{D\#7}{3:0001} \utab{D\#7}{3:0001}
\utab{D\#m}{1:2210} \utab{D\#m}{1:2210}
@ -219,7 +262,7 @@
\utab*{D\#dim}{~:2320} \utab*{D\#dim}{~:2320}
\chordrule \chordrule
\chordname{E}{Mi} \chordname{\chordnameE}
\utab{E}{2:2220} \utab{E}{2:2220}
\utab{E7}{~:1202} \utab{E7}{~:1202}
\utab{Em}{~:0432} \utab{Em}{~:0432}
@ -231,7 +274,7 @@
\utab*{Edim}{1:2320} \utab*{Edim}{1:2320}
\chordrule \chordrule
\chordname{F}{Fa} \chordname{\chordnameF}
\utab{F}{~:2010} \utab{F}{~:2010}
\utab{F7}{~:2310} \utab{F7}{~:2310}
\utab{Fm}{~:1013} \utab{Fm}{~:1013}
@ -243,7 +286,7 @@
\utab*{Fdim}{2:2320} \utab*{Fdim}{2:2320}
\chordrule \chordrule
\chordname{F\Sharp = G\Flat}{Fa\Sharp = Sol\Flat} \chordname{\chordnameFsharp}
\utab{F\#}{1:2010} \utab{F\#}{1:2010}
\utab{F\#7}{1:2310} \utab{F\#7}{1:2310}
\utab{F\#m}{~:2120} \utab{F\#m}{~:2120}
@ -255,7 +298,7 @@
\utab*{F\#dim}{~:2020} \utab*{F\#dim}{~:2020}
\chordrule \chordrule
\chordname{G}{Sol} \chordname{\chordnameG}
\utab{G}{~:0232} \utab{G}{~:0232}
\utab{G7}{~:0212} \utab{G7}{~:0212}
\utab{Gm}{~:0231} \utab{Gm}{~:0231}
@ -267,7 +310,7 @@
\utab*{Gdim}{~:0131} \utab*{Gdim}{~:0131}
\chordrule \chordrule
\chordname{G\Sharp = A\Flat}{Sol\Sharp = La\Flat} \chordname{\chordnameGsharp}
\utab{G\#}{3:2010} \utab{G\#}{3:2010}
\utab{G\#7}{1:0212} \utab{G\#7}{1:0212}
\utab{G\#m}{1:0231} \utab{G\#m}{1:0231}
@ -279,7 +322,7 @@
\utab*{G\#dim}{1:0131} \utab*{G\#dim}{1:0131}
\chordrule \chordrule
\chordname{A}{La} \chordname{\chordnameA}
\utab{A}{~:2100} \utab{A}{~:2100}
\utab{A7}{~:0100} \utab{A7}{~:0100}
\utab{Am}{~:2000} \utab{Am}{~:2000}
@ -291,7 +334,7 @@
\utab*{Adim}{2:0131} \utab*{Adim}{2:0131}
\chordrule \chordrule
\chordname{A\Sharp = B\Flat}{La\Sharp = Si\Flat} \chordname{\chordnameAsharp}
\utab{A\#}{1:2100} \utab{A\#}{1:2100}
\utab{A\#7}{1:0100} \utab{A\#7}{1:0100}
\utab{A\#m}{1:2000} \utab{A\#m}{1:2000}
@ -303,7 +346,7 @@
\utab*{A\#dim}{~:3101} \utab*{A\#dim}{~:3101}
\chordrule \chordrule
\chordname{B}{Si} \chordname{\chordnameB}
\utab{B}{2:2100} \utab{B}{2:2100}
\utab{B7}{2:0100} \utab{B7}{2:0100}
\utab{Bm}{2:2000} \utab{Bm}{2:2000}

122
songbook_core/data/latex/crepbook.cls

@ -84,6 +84,60 @@
\fi \fi
% Start % Start
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Multilanguage management
\AtBeginDocument{
% Default names (english)
\newcommand{\songlistname}{Songs list}
\newcommand{\labelversionname}{version:}
\newcommand{\labeldatename}{date:}
\newcommand{\labelauthorname}{authors:}
\newcommand{\labelwebname}{web:}
\newcommand{\labelmailname}{mail:}
\newcommand{\originalsongname}{Original song:}
\newcommand{\introname}{intro}
\newcommand{\outroname}{outro}
\newcommand{\bridgename}{bridge}
\newcommand{\chorusname}{chorus}
\newcommand{\versename}{verse}
\newcommand{\soloname}{solo}
\newcommand{\patternname}{pattern}
\newcommand{\rythmname}{rythm}
\newcommand{\transpositionname}{transposition:}
\newcommand{\songindexname}{Songs Index}
\newcommand{\authorindexname}{Authors Index}
\newcommand{\chordlistname}{Chords list}
\IfStrEq{\mainlanguage}{french}{
% French names
\renewcommand{\songlistname}{Liste des chansons}{}
\renewcommand{\labelversionname}{version :}
\renewcommand{\labeldatename}{date :}
\renewcommand{\labelauthorname}{auteurs :}
\renewcommand{\labelwebname}{web :}
\renewcommand{\labelmailname}{mail :}
\renewcommand{\originalsongname}{Chanson originale :}
\renewcommand{\introname}{intro}
\renewcommand{\outroname}{outro}
\renewcommand{\bridgename}{pont}
\renewcommand{\chorusname}{refrain}
\renewcommand{\versename}{couplet}
\renewcommand{\soloname}{solo}
\renewcommand{\patternname}{motif}
\renewcommand{\rythmname}{rythme}
\renewcommand{\transpositionname}{transposition :}
\renewcommand{\songindexname}{Index des chansons}
\renewcommand{\authorindexname}{Index des auteurs}
\renewcommand{\chordlistname}{Liste des accords}
}{}
}
% End of multilanguage management
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\andname{and} \def\andname{and}
\def\lastandname{\unskip, and} \def\lastandname{\unskip, and}
@ -111,30 +165,9 @@
\def\picture#1{\gdef\@picture{#1}} \def\picture#1{\gdef\@picture{#1}}
\def\picturecopyright#1{\gdef\@picturecopyright{#1}} \def\picturecopyright#1{\gdef\@picturecopyright{#1}}
\def\footer#1{\gdef\@footer{#1}} \def\footer#1{\gdef\@footer{#1}}
\def\lang#1{\gdef\@lang{#1}} \def\lang#1{\gdef\mainlanguage{#1}}
\clearheadinfo \clearheadinfo
\newcommand{\l@belVersion}{
\IfStrEq{\@lang}{english}{\bf version:}{}
\IfStrEq{\@lang}{french}{\bf version :}{}
}
\newcommand{\l@belDate}{
\IfStrEq{\@lang}{english}{\bf date:}{}
\IfStrEq{\@lang}{french}{\bf date :}{}
}
\newcommand{\l@belAuthor}{
\IfStrEq{\@lang}{english}{\bf authors:}{}
\IfStrEq{\@lang}{french}{\bf auteurs :}{}
}
\newcommand{\l@belWeb}{
\IfStrEq{\@lang}{english}{\bf web:}{}
\IfStrEq{\@lang}{french}{\bf web :}{}
}
\newcommand{\l@belMail}{
\IfStrEq{\@lang}{english}{\bf mail:}{}
\IfStrEq{\@lang}{french}{\bf mail :}{}
}
\renewcommand\maketitle{ \renewcommand\maketitle{
\@maketitle \@maketitle
@ -172,11 +205,11 @@
\begin{flushleft} \begin{flushleft}
\begin{tabular}{l l} \begin{tabular}{l l}
\if!\@version!\else{\l@belVersion} & \@version \\ \fi \if!\@version!\else{\textbf{\labelversionname}} & \@version \\ \fi
\if!\@date!\else{\l@belDate} & \@date \\ \fi \if!\@date!\else{\textbf{\labeldatename}} & \@date \\ \fi
\if!\@author!\else{\l@belAuthor} & \@author \\ \fi \if!\@author!\else{\textbf{\labelauthorname}} & \@author \\ \fi
\if!\@web!\else{\l@belWeb} & \url{\@web} \\ \fi \if!\@web!\else{\textbf{\labelwebname}} & \url{\@web} \\ \fi
\if!\@mail!\else{\l@belMail} & \url{\@mail} \\ \fi \if!\@mail!\else{\textbf{\labelmailname}} & \url{\@mail} \\ \fi
\end{tabular} \end{tabular}
\end{flushleft} \end{flushleft}
@ -194,8 +227,6 @@
\thispagestyle{empty} \thispagestyle{empty}
} }
\makeatletter
\newlength{\coverheight} \newlength{\coverheight}
\setlength{\coverheight}{2cm} \setlength{\coverheight}{2cm}
\newlength{\coverspace} \newlength{\coverspace}
@ -229,7 +260,7 @@
\renewcommand{\extendpostlude}{ \renewcommand{\extendpostlude}{
{\footnotesize% {\footnotesize%
\IfStrEq{\songoriginal}{}{}{ \IfStrEq{\songoriginal}{}{}{
\IfStrEq{\@lang}{english}{Original song:}{Chanson originale :} \originalsongname
\songoriginal \songoriginal
} }
} }
@ -446,36 +477,28 @@
%% End of tabs.sty file %% End of tabs.sty file
\newcommand*{\Intro}{% \newcommand*{\Intro}{%
\IfStrEq{\@lang}{english}{intro}{}% \introname%
\IfStrEq{\@lang}{french}{intro}{}%
}% }%
\newcommand*{\Outro}{% \newcommand*{\Outro}{%
\IfStrEq{\@lang}{english}{outro}{}% \outroname%
\IfStrEq{\@lang}{french}{outro}{}%
}% }%
\newcommand*{\Bridge}{% \newcommand*{\Bridge}{%
\IfStrEq{\@lang}{english}{bridge}{}% \bridgename%
\IfStrEq{\@lang}{french}{pont}{}%
}% }%
\newcommand*{\Chorus}{% \newcommand*{\Chorus}{%
\IfStrEq{\@lang}{english}{chorus}{}% \chorusname%
\IfStrEq{\@lang}{french}{refrain}{}%
}% }%
\newcommand*{\Verse}{% \newcommand*{\Verse}{%
\IfStrEq{\@lang}{english}{verse}{}% \versename%
\IfStrEq{\@lang}{french}{couplet}{}%
}% }%
\newcommand*{\Solo}{% \newcommand*{\Solo}{%
\IfStrEq{\@lang}{english}{solo}{}% \soloname%
\IfStrEq{\@lang}{french}{solo}{}%
}% }%
\newcommand*{\Pattern}{% \newcommand*{\Pattern}{%
\IfStrEq{\@lang}{english}{pattern}{}% \patternname%
\IfStrEq{\@lang}{french}{motif}{}%
}% }%
\newcommand*{\Rythm}{% \newcommand*{\Rythm}{%
\IfStrEq{\@lang}{english}{rythm}{}% \rythmname%
\IfStrEq{\@lang}{french}{rythme}{}%
}% }%
\newcommand*{\Adlib}{% \newcommand*{\Adlib}{%
\emph{ad~lib.}% \emph{ad~lib.}%
@ -485,7 +508,7 @@
\renewcommand{\musicnote}[2][]{% \renewcommand{\musicnote}[2][]{%
\vspace{.1cm} \vspace{.1cm}
\IfStrEq{}{#1}{\musicnoteORIG{#2}}{ \IfStrEq{}{#1}{\musicnoteORIG{#2}}{
\IfStrEq{\@lang}{#1}{\musicnoteORIG{#2}}{} \iflanguage{#1}{\musicnoteORIG{#2}}{}
} }
} }
@ -493,7 +516,7 @@
\renewcommand{\textnote}[2][]{% \renewcommand{\textnote}[2][]{%
\vspace{.1cm} \vspace{.1cm}
\IfStrEq{}{#1}{\textnoteORIG{#2}}{ \IfStrEq{}{#1}{\textnoteORIG{#2}}{
\IfStrEq{\@lang}{#1}{\textnoteORIG{#2}}{} \iflanguage{#1}{\textnoteORIG{#2}}{}
} }
} }
@ -559,8 +582,7 @@
\newcommand{\transposition}[1]{% \newcommand{\transposition}[1]{%
\ifnorepeatchords% \ifnorepeatchords%
\musicnote{% \musicnote{%
\IfStrEq{\@lang}{english}{transposition:~}{}% \transpositionname~
\IfStrEq{\@lang}{french}{transposition~:~}{}%
\ifthenelse{#1>0}{#1$\Uparrow$}{\removefirstch@r#1$\Downarrow$}% \ifthenelse{#1>0}{#1$\Uparrow$}{\removefirstch@r#1$\Downarrow$}%
}% }%
\else% \else%

114
songbook_core/data/templates/default.tex

@ -1,47 +1,36 @@
(% comment %) (% variables %)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% [
% Template parameters {"name":"title", "description":"Title", "default":"Recueil de chansons pour guitare", "mandatory":true},
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% {"name":"author", "description":"Author", "default":"The Songbook Team", "mandatory":true},
%%:[ {"name":"booktype", "description":"Type", "type":"enum", "values":["chorded","lyric"], "default":"chorded", "mandatory":true},
%%: {"name":"title", "description":"Title", "default":"Recueil de chansons pour guitare", "mandatory":true}, {"name":"lang", "description":"Language", "default":"english"},
%%: {"name":"author", "description":"Author", "default":"The Songbook Team", "mandatory":true}, {"name":"instruments", "description":"Instruments", "type":"flag", "values":["guitar","ukulele"], "join":",", "mandatory":true, "default":["guitar"]},
%%: {"name":"booktype", "description":"Type", "type":"enum", "values":["chorded","lyric"], "default":"chorded", "mandatory":true}, {"name":"bookoptions", "description":"Options", "type":"flag", "values":["diagram","importantdiagramonly","lilypond","pictures","tabs","repeatchords","onesongperpage"], "join":",", "mandatory":true, "default":["diagram","pictures"]},
%%: {"name":"lang", "description":"Language", "default":"english"}, {"name":"version", "description":"Version", "default":"unknown"},
%%: {"name":"instruments", "description":"Instruments", "type":"flag", "values":["guitar","ukulele"], "join":",", "mandatory":true, "default":["guitar"]}, {"name":"subtitle", "description":"Subtitle"},
%%: {"name":"bookoptions", "description":"Options", "type":"flag", "values":["diagram","importantdiagramonly","lilypond","pictures","tabs","repeatchords","onesongperpage"], "join":",", "mandatory":true, "default":["diagram","pictures"]}, {"name":"web", "description":"Web", "default":"http://www.patacrep.com"},
%%: {"name":"version", "description":"Version", "default":"unknown"}, {"name":"mail", "description":"Email", "default":"crep@team-on-fire.com"},
%%: {"name":"subtitle", "description":"Subtitle"}, {"name":"picture", "description":"Picture", "type":"file", "default":"treble_a"},
%%: {"name":"web", "description":"Web", "default":"http://www.patacrep.com"}, {"name":"picturecopyright", "description":"Copyright", "default":"Dbolton \\url{http://commons.wikimedia.org/wiki/User:Dbolton}"},
%%: {"name":"mail", "description":"Email", "default":"crep@team-on-fire.com"}, {"name":"footer", "description":"Footer", "default":"\\begin{flushright}Generated using Songbook (\\url{http://www.patacrep.com})\\end{flushright}"},
%%: {"name":"picture", "description":"Picture", "type":"file", "default":"treble_a"}, {"name":"mainfontsize", "description":"Font Size", "type":"font", "default":"10"},
%%: {"name":"picturecopyright", "description":"Copyright", "default":"Dbolton \\url{http://commons.wikimedia.org/wiki/User:Dbolton}"}, {"name":"songnumberbgcolor", "description":"Number Shade", "type":"color", "default":"D1E4AE"},
%%: {"name":"footer", "description":"Footer", "default":"\\begin{flushright}Generated using Songbook (\\url{http://www.patacrep.com})\\end{flushright}"}, {"name":"notebgcolor", "description":"Note Shade", "type":"color", "default":"D1E4AE"},
%%: {"name":"mainfontsize", "description":"Font Size", "type":"font", "default":"10"}, {"name":"indexbgcolor", "description":"Index Shade", "type":"color", "default":"D1E4AE"},
%%: {"name":"songnumberbgcolor", "description":"Number Shade", "type":"color", "default":"D1E4AE"}, {"name":"titleprefixwords", "description":"Ignore some words in the beginning of song titles"},
%%: {"name":"notebgcolor", "description":"Note Shade", "type":"color", "default":"D1E4AE"}, {"name":"authwords", "descriptipn":"Set of options to process author string (LaTeX commands authsepword, authignoreword, authbyword)"},
%%: {"name":"indexbgcolor", "description":"Index Shade", "type":"color", "default":"D1E4AE"}, {"name":"languages", "description":"List of languages used by songs", "default":"english"}
%%: {"name":"titleprefixwords", "description":"Ignore some words in the beginning of song titles"}, ]
%%: {"name":"authwords", "descriptipn":"Set of options to process author string (LaTeX commands authsepword, authignoreword, authbyword)"}, (% endvariables %)
%%: {"name":"languages", "description":"List of languages used by songs", "default":"english"}
%%:]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
(% endcomment %)
(* extends "layout.tex" *) (* extends "songs.tex" *)
(* set indexes = "titleidx,authidx" *)
(* block songbookpreambule *)
(( super() ))
(* block extrapackages *)
\usepackage[
a4paper % paper size
,includeheadfoot % include header and footer into text size
,hmarginratio=1:1 % ratio between inner and outer margin (default)
,outer=1.8cm % outer margin (right)
,vmarginratio=1:1 % ratio between top and bottom margin
,bmargin=1.3cm % bottom margin
]{geometry}
\usepackage{chords} \usepackage{chords}
(* endblock extrapackages *)
(* block songbookpreambule *)
\title{((title))} \title{((title))}
\author{((author))} \author{((author))}
\subtitle{((subtitle))} \subtitle{((subtitle))}
@ -53,7 +42,6 @@
\picture{((picture))} \picture{((picture))}
\picturecopyright{((picturecopyright))} \picturecopyright{((picturecopyright))}
\footer{((footer))} \footer{((footer))}
\lang{((mainlang))}
\newindex{titleidx}{((filename))_title} \newindex{titleidx}{((filename))_title}
\newauthorindex{authidx}{((filename))_auth} \newauthorindex{authidx}{((filename))_auth}
@ -70,28 +58,16 @@
(* endif *) (* endif *)
(* endfor *) (* endfor *)
(* endfor*) (* endfor*)
(* endblock *)
\graphicspath{{((datadir))/img/}} (* block title *)
\pagestyle{empty} \maketitle
\definecolor{SongNumberBgColor}{HTML}{((songnumberbgcolor))}
\definecolor{NoteBgColor}{HTML}{((notebgcolor))}
\definecolor{IndexBgColor}{HTML}{((indexbgcolor))}
\renewcommand{\snumbgcolor}{SongNumberBgColor}
\renewcommand{\notebgcolor}{NoteBgColor}
\renewcommand{\idxbgcolor}{IndexBgColor}
(* endblock *) (* endblock *)
(* block index *) (* block index *)
(* if mainlang==english *) \showindex{\songindexname}{titleidx}
\showindex{Songs Index}{titleidx} \showindex{\authorindexname}{authidx}
\showindex{Authors Index}{authidx} (* if lang==french *)
(* else *)
\showindex{Index des chansons}{titleidx}
\showindex{Index des auteurs}{authidx}
(* endif *)
(* if mainlang==french *)
\notenamesin{A}{B}{C}{D}{E}{F}{G} \notenamesin{A}{B}{C}{D}{E}{F}{G}
\notenamesout{La}{Si}{Do}{}{Mi}{Fa}{Sol} \notenamesout{La}{Si}{Do}{}{Mi}{Fa}{Sol}
(* endif *) (* endif *)
@ -101,26 +77,8 @@
% list of chords % list of chords
\ifchorded \ifchorded
\phantomsection \phantomsection
(* if mainlang==english *) \addcontentsline{toc}{section}{\chordlistname}
\addcontentsline{toc}{section}{Chords list}
(* else *)
\addcontentsline{toc}{section}{Liste des accords}
(* endif *)
\chords \chords
\fi \fi
(* endblock *) (* endblock *)
(* block content *)
\phantomsection
(* if mainlang==english *)
\addcontentsline{toc}{section}{Songs list}
(* else *)
\addcontentsline{toc}{section}{Liste des chansons}
(* endif *)
\begin{songs}{titleidx,authidx}
(* for song in songlist.songs *)
\input{((song.path))}
(* endfor *)
\end{songs}
(* endblock *)

17
songbook_core/data/templates/layout.tex

@ -23,27 +23,19 @@
% Copyright (C) 2014 The Songbook team (www.patacrep.com) % Copyright (C) 2014 The Songbook team (www.patacrep.com)
(* block documentclass *)
\documentclass[((booktype)), \documentclass[((booktype)),
(* for option in bookoptions *)((option)), (* for option in bookoptions *)((option)),
(* endfor *) (* endfor *)
(* for instrument in instruments *)((instrument)), (* for instrument in instruments *)((instrument)),
(* endfor *) (* endfor *)
((mainfontsize))pt]{crepbook} ((mainfontsize))pt]{crepbook}
(* endblock *)
(* block packages *) (* block songbookpreambule *)
\usepackage[utf8]{inputenc} \usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc} \usepackage[T1]{fontenc}
\usepackage{lmodern} \usepackage{lmodern}
(* for lang in songlist.languages() *)
\PassOptionsToPackage{((lang))}{babel}
(* endfor *)
\usepackage{babel}
(* block extrapackages *)
(* endblock extrapackages *)
(* endblock packages *)
(* block songbookpreambule *)
(* endblock songbookpreambule *) (* endblock songbookpreambule *)
(* block preambule *) (* block preambule *)
@ -52,7 +44,6 @@
\begin{document} \begin{document}
(* block title *) (* block title *)
\maketitle
(* endblock *) (* endblock *)
(* block preface *) (* block preface *)
@ -64,7 +55,7 @@
(* block chords *) (* block chords *)
(* endblock *) (* endblock *)
(* block content *) (* block songs *)
(* endblock *) (* endblock *)
(* block postface *) (* block postface *)

53
songbook_core/data/templates/patacrep.tex

@ -0,0 +1,53 @@
(% comment %)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Template parameters
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%:[
%%: {"name":"title", "description":"Title", "default":"Recueil de chansons pour guitare", "mandatory":true},
%%: {"name":"author", "description":"Author", "default":"The Songbook Team", "mandatory":true},
%%: {"name":"booktype", "description":"Type", "type":"enum", "values":["chorded","lyric"], "default":"chorded", "mandatory":true},
%%: {"name":"lang", "description":"Language", "default":"english"},
%%: {"name":"instruments", "description":"Instruments", "type":"flag", "values":["guitar","ukulele"], "join":",", "mandatory":true, "default":["guitar"]},
%%: {"name":"bookoptions", "description":"Options", "type":"flag", "values":["diagram","importantdiagramonly","lilypond","pictures","tabs","repeatchords","onesongperpage"], "join":",", "mandatory":true, "default":["diagram","pictures"]},
%%: {"name":"version", "description":"Version", "default":"unknown"},
%%: {"name":"subtitle", "description":"Subtitle"},
%%: {"name":"web", "description":"Web", "default":"http://www.patacrep.com"},
%%: {"name":"mail", "description":"Email", "default":"crep@team-on-fire.com"},
%%: {"name":"picture", "description":"Picture", "type":"file", "default":"treble_a"},
%%: {"name":"picturecopyright", "description":"Copyright", "default":"Dbolton \\url{http://commons.wikimedia.org/wiki/User:Dbolton}"},
%%: {"name":"footer", "description":"Footer", "default":"\\begin{flushright}Generated using Songbook (\\url{http://www.patacrep.com})\\end{flushright}"},
%%: {"name":"mainfontsize", "description":"Font Size", "type":"font", "default":"10"},
%%: {"name":"songnumberbgcolor", "description":"Number Shade", "type":"color", "default":"D1E4AE"},
%%: {"name":"notebgcolor", "description":"Note Shade", "type":"color", "default":"D1E4AE"},
%%: {"name":"indexbgcolor", "description":"Index Shade", "type":"color", "default":"D1E4AE"},
%%: {"name":"titleprefixwords", "description":"Ignore some words in the beginning of song titles"},
%%: {"name":"authwords", "descriptipn":"Set of options to process author string (LaTeX commands authsepword, authignoreword, authbyword)"},
%%: {"name":"languages", "description":"List of languages used by songs", "default":"english"}
%%:]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
(% endcomment %)
(* extends "default.tex" *)
(* block songbookpreambule *)
\usepackage[
a4paper % paper size
,includeheadfoot % include header and footer into text size
,hmarginratio=1:1 % ratio between inner and outer margin (default)
,outer=1.8cm % outer margin (right)
,vmarginratio=1:1 % ratio between top and bottom margin
,bmargin=1.3cm % bottom margin
]{geometry}
(( super() ))
\pagestyle{empty}
\definecolor{SongNumberBgColor}{HTML}{((songnumberbgcolor))}
\definecolor{NoteBgColor}{HTML}{((notebgcolor))}
\definecolor{IndexBgColor}{HTML}{((indexbgcolor))}
\renewcommand{\snumbgcolor}{SongNumberBgColor}
\renewcommand{\notebgcolor}{NoteBgColor}
\renewcommand{\idxbgcolor}{IndexBgColor}
(* endblock *)

25
songbook_core/data/templates/songs.tex

@ -0,0 +1,25 @@
(* extends "layout.tex" *)
(* block songbookpreambule *)
(( super() ))
(* for lang in songlist.languages() *)
\PassOptionsToPackage{((lang))}{babel}
(* endfor *)
\usepackage[((lang))]{babel}
\lang{((lang))}
\graphicspath{{((datadir))/img/}}
(* endblock *)
(* block songs *)
\phantomsection
\addcontentsline{toc}{section}{\songlistname}
\begin{songs}{((indexes|default('')))}
(* for song in songlist.songs *)
\input{((song.path))}
(* endfor *)
\end{songs}
(* endblock *)

10
songbook_core/plastex.py

@ -17,6 +17,13 @@ def process_unbr_spaces(node):
will be rendered as unbreakable space. will be rendered as unbreakable space.
Return node object for convenience. Return node object for convenience.
This function is a workaround to a bug that has been solved since:
- https://github.com/tiarno/plastex/commit/76bb78d5fbaac48e68025a3545286cc63cb4e7ad
- https://github.com/tiarno/plastex/commit/682a0d223b99d6b949bacf1c974d24dc9bb1d18e
It can be deleted once this bug has been merged in production version of
PlasTeX.
""" """
if (type(node) == Sentences.InterWordSpace or if (type(node) == Sentences.InterWordSpace or
(type(node) == Sentences.NoLineBreak and node.source == '~ ')): (type(node) == Sentences.NoLineBreak and node.source == '~ ')):
@ -74,7 +81,8 @@ def parsetex(filename):
""" """
# /* BEGIN plasTeX patch # /* BEGIN plasTeX patch
# The following lines, and another line a few lines later, are used to # The following lines, and another line a few lines later, are used to
# circumvent a plasTeX bug. It has been reported, with a patch. # circumvent a plasTeX bug. It has been reported and corrected :
# https://github.com/tiarno/plastex/commit/8f4e5a385f3cb6a04d5863f731ce24a7e856f2a4
# To see if you can delete those lines, set your LC_TIME locale to French, # To see if you can delete those lines, set your LC_TIME locale to French,
# during a month containing diacritics (e.g. Février), and run songbook. If # during a month containing diacritics (e.g. Février), and run songbook. If
# no plasTeX bug appears, it is safe to remove those lines. # no plasTeX bug appears, it is safe to remove those lines.

5
songbook_core/plastex_patchedbabel.py

@ -11,8 +11,9 @@ en production. En attendant, nous utilisons cette version modifiée.
Dés que la correction sera entrée en production, il faudra supprimer ce Dés que la correction sera entrée en production, il faudra supprimer ce
fichier, et remplater l'occurence à "patchedbabel" par "babel" dans le fichier fichier, et remplater l'occurence à "patchedbabel" par "babel" dans le fichier
"plastex.py". "plastex.py".
La correction à suveiller est la révision 1.3 du fichier babel.py : La correction à suveiller est la révision
http://plastex.cvs.sourceforge.net/viewvc/plastex/plastex/plasTeX/Packages/babel.py?view=log 41a48c0c229dd46b69fb0e3720595000a71b17d8 du fichier babel.py :
https://github.com/tiarno/plastex/commit/41a48c0c229dd46b69fb0e3720595000a71b17d8
# Comment vérifier si on peut supprimer ce fichier ? # Comment vérifier si on peut supprimer ce fichier ?

65
songbook_core/templates.py

@ -3,8 +3,10 @@
"""Template for .tex generation settings and utilities""" """Template for .tex generation settings and utilities"""
from jinja2 import Environment, FileSystemLoader, ChoiceLoader, PackageLoader from jinja2 import Environment, FileSystemLoader, ChoiceLoader, PackageLoader
from jinja2.meta import find_referenced_templates as find_templates
import os import os
import re import re
import json
_LATEX_SUBS = ( _LATEX_SUBS = (
(re.compile(r'\\'), r'\\textbackslash'), (re.compile(r'\\'), r'\\textbackslash'),
@ -23,6 +25,7 @@ def _escape_tex(value):
newval = pattern.sub(replacement, newval) newval = pattern.sub(replacement, newval)
return newval return newval
class TexRenderer(object): class TexRenderer(object):
"""Render a template to a LaTeX file.""" """Render a template to a LaTeX file."""
@ -32,8 +35,6 @@ class TexRenderer(object):
Arguments: Arguments:
- datadir: location of the user-defined templates - datadir: location of the user-defined templates
''' '''
self.template = template
self.texenv = Environment( self.texenv = Environment(
loader=ChoiceLoader([ loader=ChoiceLoader([
FileSystemLoader( FileSystemLoader(
@ -42,31 +43,69 @@ class TexRenderer(object):
PackageLoader( PackageLoader(
'songbook_core', os.path.join('data', 'templates') 'songbook_core', os.path.join('data', 'templates')
), ),
]) ]),
) )
self.texenv.block_start_string = '(*' self.texenv.block_start_string = '(*'
self.texenv.block_end_string = '*)' self.texenv.block_end_string = '*)'
self.texenv.variable_start_string = '((' self.texenv.variable_start_string = '(('
self.texenv.variable_end_string = '))' self.texenv.variable_end_string = '))'
self.texenv.comment_start_string = '(% comment %)' self.texenv.comment_start_string = '(% variables %)'
self.texenv.comment_end_string = '(% endcomment %)' self.texenv.comment_end_string = '(% endvariables %)'
self.texenv.line_comment_prefix = '(%%)'
self.texenv.filters['escape_tex'] = _escape_tex self.texenv.filters['escape_tex'] = _escape_tex
self.texenv.trim_blocks = True self.texenv.trim_blocks = True
self.texenv.lstrip_blocks = True self.texenv.lstrip_blocks = True
def file_template(self): # TODO: catch the TemplateNotFound
"""Return the filename of the selected template.""" self.template = self.texenv.get_template(template)
return self.texenv.get_template(self.template).filename
def get_variables(self):
data = self.parse_templates()
variables = dict()
for param in data:
try:
variables[param["name"]] = param["default"]
except KeyError:
variables[param["name"]] = None
return variables
def parse_templates(self):
templates = self.get_templates(self.template)
templates |= set([self.template.name])
variables = []
regex = re.compile(r'\(% variables %\)(?P<variables>.*)'
'\(% endvariables %\)', re.DOTALL)
for template_name in templates:
filename = self.texenv.get_template(template_name).filename
with open(filename, 'r') as template_file:
content = template_file.read()
match = re.search(regex, content)
if match:
content = match.group('variables')
variables += json.loads(content)
return variables
def get_templates(self, template):
'''Recursively get a set of all the templates used
by a particular template.
'''
with open(template.filename, 'r') as template_file:
content = template_file.readlines()
new_templates = list(find_templates(self.texenv.parse(content)))
all_templates = set(new_templates)
if len(new_templates) > 0:
for new_template_name in new_templates:
new_template = self.texenv.get_template(new_template_name)
# union of the sets
all_templates |= self.get_templates(new_template)
return all_templates
def render_tex(self, output, context): def render_tex(self, output, context):
'''Render a template into a .tex file '''Render a template into a .tex file
Arguments: Arguments:
- output: a file object to write the result - output: a file object to write the result
- context: all the data to populate the template - context: a dict of all the data to populate the template
''' '''
#pylint: disable=star-args output.write(self.template.render(context))
output.write(
self.texenv.get_template(self.template).render(**context)
)

Loading…
Cancel
Save