Browse Source

Merge pull request #32 from patacrep/packages

Convertion de crepbook.cls en deux packages
pull/42/head
Luthaf 11 years ago
parent
commit
6306efa379
  1. 28
      songbook_core/build.py
  2. 9
      songbook_core/data/examples/example-layout.sb
  3. 9
      songbook_core/data/examples/example-patacrep.sb
  4. 9
      songbook_core/data/examples/example-songs.sb
  5. 9
      songbook_core/data/examples/example.sb
  6. 399
      songbook_core/data/latex/SongbookUtils.sty
  7. 596
      songbook_core/data/latex/crepbook.cls
  8. 205
      songbook_core/data/latex/crepbook.sty
  9. 82
      songbook_core/data/latex/tabs.sty
  10. 12
      songbook_core/data/templates/default.tex
  11. 12
      songbook_core/data/templates/layout.tex
  12. 28
      songbook_core/data/templates/patacrep.tex
  13. 27
      songbook_core/data/templates/songs.tex
  14. 50
      songbook_core/songs.py

28
songbook_core/build.py

@ -14,7 +14,7 @@ from songbook_core import __DATADIR__
from songbook_core import errors from songbook_core import errors
from songbook_core.files import recursive_find from songbook_core.files import recursive_find
from songbook_core.index import process_sxd from songbook_core.index import process_sxd
from songbook_core.songs import Song, SongsList from songbook_core.songs import Song, SongbookContent
from songbook_core.templates import TexRenderer from songbook_core.templates import TexRenderer
LOGGER = logging.getLogger(__name__) LOGGER = logging.getLogger(__name__)
@ -70,7 +70,10 @@ class Songbook(object):
- config : a dictionary containing the configuration - config : a dictionary containing the configuration
""" """
Song.sort = config['sort'] Song.sort = config['sort']
Song.prefixes = config['titleprefixwords'] if 'titleprefixwords' in config:
Song.prefixes = config['titleprefixwords']
else:
Song.prefixes = []
Song.authwords['after'] = [ Song.authwords['after'] = [
re.compile(r"^.*%s\b(.*)" % after) re.compile(r"^.*%s\b(.*)" % after)
for after for after
@ -95,17 +98,26 @@ class Songbook(object):
# Compute song list # Compute song list
if self.config['content'] is None: if self.config['content'] is None:
self.config['content'] = [ self.config['content'] = [(
"song",
os.path.relpath( os.path.relpath(
filename, filename,
os.path.join(self.config['datadir'], 'songs'), os.path.join(self.config['datadir'], 'songs'),
) ))
for filename for filename
in recursive_find( in recursive_find(
os.path.join(self.config['datadir'], 'songs'), os.path.join(self.config['datadir'], 'songs'),
'*.sg', '*.sg',
) )
] ]
else:
content = self.config["content"]
self.config["content"] = []
for elem in content:
if isinstance(elem, unicode):
self.config["content"].append(("song", elem))
else:
self.config["content"].append((elem[0], elem[1]))
# Ensure self.config['authwords'] contains all entries # Ensure self.config['authwords'] contains all entries
for (key, value) in DEFAULT_AUTHWORDS.items(): for (key, value) in DEFAULT_AUTHWORDS.items():
@ -113,9 +125,9 @@ class Songbook(object):
self.config['authwords'][key] = value self.config['authwords'][key] = value
def _parse_songs(self): def _parse_songs(self):
"""Parse songs included in songbook.""" """Parse content included in songbook."""
self.songslist = SongsList(self.config['datadir']) self.contentlist = SongbookContent(self.config['datadir'])
self.songslist.append_list(self.config['content']) self.contentlist.append_list(self.config['content'])
def write_tex(self, output): def write_tex(self, output):
"""Build the '.tex' file corresponding to self. """Build the '.tex' file corresponding to self.
@ -133,7 +145,7 @@ class Songbook(object):
context = renderer.get_variables() context = renderer.get_variables()
context.update(self.config) context.update(self.config)
context['titleprefixkeys'] = ["after", "sep", "ignore"] context['titleprefixkeys'] = ["after", "sep", "ignore"]
context['songlist'] = self.songslist context['content'] = self.contentlist
context['filename'] = output.name[:-4] context['filename'] = output.name[:-4]
self._set_songs_default(context) self._set_songs_default(context)

9
songbook_core/data/examples/example-layout.sb

@ -11,5 +11,12 @@
"authwords" : { "authwords" : {
"sep" : ["and", "et"] "sep" : ["and", "et"]
}, },
"datadir" : "." "datadir" : ".",
"content" : [["section", "Traditional"],
"chevaliers_de_la_table_ronde.sg",
"greensleeves.sg",
"vent_frais.sg",
["section", "Example"],
"example-fr.sg",
"example-en.sg"]
} }

9
songbook_core/data/examples/example-patacrep.sb

@ -11,5 +11,12 @@
"authwords" : { "authwords" : {
"sep" : ["and", "et"] "sep" : ["and", "et"]
}, },
"datadir" : "." "datadir" : ".",
"content" : [["section", "Traditional"],
"chevaliers_de_la_table_ronde.sg",
"greensleeves.sg",
"vent_frais.sg",
["section", "Example"],
"example-fr.sg",
"example-en.sg"]
} }

9
songbook_core/data/examples/example-songs.sb

@ -11,5 +11,12 @@
"authwords" : { "authwords" : {
"sep" : ["and", "et"] "sep" : ["and", "et"]
}, },
"datadir" : "." "datadir" : ".",
"content" : [["section", "Traditional"],
"chevaliers_de_la_table_ronde.sg",
"greensleeves.sg",
"vent_frais.sg",
["section", "Example"],
"example-fr.sg",
"example-en.sg"]
} }

9
songbook_core/data/examples/example.sb

@ -10,5 +10,12 @@
"authwords" : { "authwords" : {
"sep" : ["and", "et"] "sep" : ["and", "et"]
}, },
"datadir" : "." "datadir" : ".",
"content" : [["section", "Traditional"],
"chevaliers_de_la_table_ronde.sg",
"greensleeves.sg",
"vent_frais.sg",
["section", "Example"],
"example-fr.sg",
"example-en.sg"]
} }

399
songbook_core/data/latex/SongbookUtils.sty

@ -0,0 +1,399 @@
% Songbook Package -- version 0.1 for LaTeX2e
%
% This package provides macro for automatic songbook
% generation. See http://github.com/patacrep/songbook-core/
\NeedsTeXFormat{LaTeX2e}[1994/06/01]
\ProvidesPackage{SongbookUtils}[2014/04/13 Songbook Package, version 0.1]
\RequirePackage{graphicx,xcolor} %
\RequirePackage{epstopdf} %
\RequirePackage{fancybox}
\RequirePackage{xstring}
\RequirePackage{framed}
\RequirePackage{currfile}
\RequirePackage{ifthen}
\RequirePackage{tikz}
% tabs: display the guitar tabs
\newif{\iftabs}
\DeclareOption{tabs}{\tabstrue}
% lilypond: display Lilypond music sheets
\newif{\iflilypond}
\DeclareOption{lilypond}{\lilypondtrue}
\newif{\iflilypondauto}
\DeclareOption{lilypond}{\lilypondautotrue\lilypondtrue}
% diagram: display chord diagrams at the beginning
\newif{\ifdiagram}
\DeclareOption{diagram}{\diagramtrue}
% importantdiagramonly: only display important chords
\newif{\ifimportantdiagramonly}
\DeclareOption{importantdiagramonly}{\importantdiagramonlytrue\diagramtrue}
% pictures: display song covers and songbook titlepage picture
\newif{\ifpictures}
\DeclareOption{pictures}{\picturestrue}
% repeatchords: display chords in every verse if the song allows it
\newif{\ifrepeatchords}
\DeclareOption{repeatchords}{\repeatchordstrue}
% onesongperpage: force single page for each song
\newif{\ifonesongperpage}
\DeclareOption{onesongperpage}{\onesongperpagetrue}
%%% Instruments
% ukulele: display ukulele tabs
\newif{\ifukulele}
\DeclareOption{ukulele}{\ukuleletrue}
% guitar: display guitar tabs
\newif{\ifguitar}
\DeclareOption{guitar}{\guitartrue}
% Remaining options are passed to the songs package
\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{songs}}
\ProcessOptions\relax
\RequirePackage{songs} %
\iflyric
\tabsfalse %
\lilypondfalse%
\diagramfalse%
\picturesfalse%
\renewcommand{\colbotglue}{0pt plus .5\textheight minus 0pt}%
\fi
% Patch for Debian TeXLive 2012
% A bug may produce corrupted PDF
\pdfobjcompresslevel=0
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Multilanguage management
\def\lang#1{\def\mainlanguage{#1}}
\AtBeginDocument{
% Default names (english)
\def\songlistname{Songs list}
\def\originalsongname{Original song:}
\def\introname{intro}
\def\outroname{outro}
\def\bridgename{bridge}
\def\chorusname{chorus}
\def\versename{verse}
\def\soloname{solo}
\def\patternname{pattern}
\def\rythmname{rythm}
\def\transpositionname{transposition:}
\def\songindexname{Songs Index}
\def\authorindexname{Authors Index}
\def\chordlistname{Chords list}
\IfStrEq{\mainlanguage}{french}{
% French names
\def\songlistname{Liste des chansons}
\def\originalsongname{Chanson originale :}
\def\introname{intro}
\def\outroname{outro}
\def\bridgename{pont}
\def\chorusname{refrain}
\def\versename{couplet}
\def\soloname{solo}
\def\patternname{motif}
\def\rythmname{rythme}
\def\transpositionname{transposition :}
\def\songindexname{Index des chansons}
\def\authorindexname{Index des auteurs}
\def\chordlistname{Liste des accords}
}{}
}
\def\andname{and}
\def\lastandname{\unskip, and}
% End of multilanguage management
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Add some informations to the songs
\newlength{\coverheight}
\setlength{\coverheight}{2cm}
\newlength{\coverspace}
\setlength{\coverspace}{0.1cm}
\newcommand{\songcover}{}
\newcommand{\songalbum}{}
\newsongkey{cov}{\let\songcover\@empty}{\def\songcover{\currfiledir#1}}
\newsongkey{vcov}{\let\songcover\@empty}{\def\songcover{#1}}
\newsongkey{album}{\let\songalbum\@empty}{\def\songalbum{#1}}
\newsongkey{url}{\let\songurl\@empty}{\def\songurl{#1}}
\newsongkey{original}{\let\songoriginal\@empty}{\def\songoriginal{#1}}
% Insert cover pictures
\newcommand\cover{%
\ifpictures%
\ifx\songcover\@empty\else%
\mbox{%
\includegraphics[width=\coverheight]{\songcover}%
\hspace{\coverspace}%
}%
\fi%
\fi%
}
% display album in song header
\renewcommand{\extendprelude}{
{\bfseries\showauthors}
{\footnotesize\it\songalbum}
\IfStrEq{\songurl}{}{}{
\href{\songurl}{\includegraphics[width=.3cm]{internet}}
}
}
% display original song name in the postlude
\renewcommand{\extendpostlude}{
{\footnotesize%
\IfStrEq{\songoriginal}{}{}{
\originalsongname
\songoriginal
}
}
}
\let\utab\gtab
\let\utab@Original\utab
\newcommand{\utab@Hidden}[2]{}%
\let\gtab@Original\gtab
\newcommand{\gtab@Hidden}[2]{}%
\ifdiagram%
\ifimportantdiagramonly%
\renewcommand{\gtab}{\@ifstar
\gtab@Original%
\gtab@Hidden%
}
\renewcommand{\utab}{\@ifstar
\utab@Original%
\utab@Hidden%
}
\else%
\renewcommand{\gtab}{\@ifstar
\gtab@Original%
\gtab@Original%
}
\renewcommand{\utab}{\@ifstar
\utab@Original%
\utab@Original%
}
\fi%
\else%
\renewcommand{\gtab}{\@ifstar
\gtab@Hidden%
\gtab@Hidden%
}
\renewcommand{\utab}{\@ifstar
\utab@Hidden%
\utab@Hidden%
}
\fi%
\ifguitar%
\else
\renewcommand{\gtab}{\@ifstar
\gtab@Hidden%
\gtab@Hidden%
}
\fi%
\ifukulele%
\else
\renewcommand{\utab}{\@ifstar
\utab@Hidden%
\utab@Hidden%
}
\fi%
% End of the new informations
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Lilypond
% On-the-fly compilation of lilypond files
\iflilypondauto
\epstopdfDeclareGraphicsRule{.ly}{pdf}{.pdf}{lilypond --format=pdf --output=\Gin@base\ETE@suffix\space #1}
\AppendGraphicsExtensions{.ly}
\fi
% Conditional inclusion of lilypond sheet music.
\newcommand{\lilypond}[1]{%
\iflilypond%
\includegraphics{\currfiledir#1}%
\fi%
}
\newcommand{\vlilypond}[1]{%
\iflilypond%
\includegraphics{#1}%
\fi%
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Useful commands
\newcommand{\image}[2][]{%
\ifpictures%
\begin{flushright}%
\includegraphics[#1]{#2}%
\end{flushright}%
\fi%
}
\newcommand*{\Intro}{%
\introname%
}%
\newcommand*{\Outro}{%
\outroname%
}%
\newcommand*{\Bridge}{%
\bridgename%
}%
\newcommand*{\Chorus}{%
\chorusname%
}%
\newcommand*{\Verse}{%
\versename%
}%
\newcommand*{\Solo}{%
\soloname%
}%
\newcommand*{\Pattern}{%
\patternname%
}%
\newcommand*{\Rythm}{%
\rythmname%
}%
\newcommand*{\Adlib}{%
\emph{ad~lib.}%
}%
% Use a new framed command for bridges
\renewcommand{\FrameCommand}[1]{
\begin{tikzpicture}
\node[rectangle] (rect) {
\begin{minipage}{.8\textwidth}
#1
\end{minipage}
};
\draw[very thick, dashed] (rect.north west) -- (rect.south west);
\end{tikzpicture}
}
\newenvironment{bridge}
{%
\begin{framed}
\vspace{-.4cm}
\begin{verse*}
}
{%
\end{verse*}
\vspace{-.2cm}
\end{framed}
}
%% \SB@chordsoff with a greater for the line spacing
\newcommand{\CB@chordshidden}{%
\def\SB@bracket##1]{\ignorespaces}%
\let\SB@rechord\relax%
\let\SB@ch\SB@ch@off%
\ifSB@measurespec%
\ifmeasures\SB@measureson\else\SB@measuresoff\fi%
\else%
\SB@measuresoff%
\fi%
\ifSB@preamble\let\colbotglue{\z@\@plus.5\textheight}\fi%
\SB@setbaselineskip%
}
\newenvironment{repeatedchords}{%
\ifrepeatchords%
\else%
\CB@chordshidden%
\fi
}{}%
\def\removefirstch@r#1{}
\newcommand{\transposition}[1]{%
\ifrepeatchords%
\transpose{#1}
\else%
\musicnote{%
\transpositionname~
\ifthenelse{#1>0}{#1$\Uparrow$}{\removefirstch@r#1$\Downarrow$}%
}%
\fi%
}%
% Definition of environment "tab"
\iftabs
\RequirePackage{tabs}
\else
\RequirePackage{verbatim}
\newenvironment{tab}{\comment}{\endcomment}
\fi
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% One song per page?
\ifonesongperpage%
\renewcommand\songcolumns[1]{%
\SB@cnt#1\relax%
\ifSB@preamble\else{\SB@clearpage}\fi%
\SB@numcols\SB@cnt%
\ifnum\SB@numcols>\z@%
\SB@colwidth-\columnsep%
\multiply\SB@colwidth\SB@numcols%
\advance\SB@colwidth\columnsep%
\advance\SB@colwidth\textwidth%
\divide\SB@colwidth\SB@numcols%
\else%
\ifrepchorus\SB@warnrc\fi%
\fi%
}
\fi
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Enhance \textnote and \musicnote, to display them according to the current language.
\let\@textnoteold\textnote
\renewcommand{\textnote}[2][]{%
\vspace{.1cm}
\IfStrEq{}{#1}{\@textnoteold{#2}}{
\iflanguage{#1}{\@textnoteold{#2}}{}
}
}
\let\@musicnoteold\musicnote
\renewcommand{\musicnote}[2][]{%
\vspace{.1cm}
\IfStrEq{}{#1}{\@musicnoteold{#2}}{
\iflanguage{#1}{\@musicnoteold{#2}}{}
}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\endinput

596
songbook_core/data/latex/crepbook.cls

@ -1,596 +0,0 @@
% CREPBOOK DOCUMENT CLASS -- version 0.2.2
% for LaTeX2e
%
\NeedsTeXFormat{LaTeX2e}[1995/12/01]
\ProvidesClass{crepbook}[2012/02/19 v0.5.0 LaTeX document class for Crep
Books]
\makeatletter\def\input@path{{tex/}}
\newif{\iftabs}
\newif{\iflilypond}
\newif{\ifnodiagram}
\newif{\ifimportantdiagramonly}
\newif{\ifpictures}
\newif{\ifnorepeatchords}
\newif{\ifukulele}
\newif{\ifguitar}
\newif{\ifonesongperpage}
\tabsfalse
\lilypondfalse
\nodiagramtrue
\picturesfalse
\importantdiagramonlyfalse
\norepeatchordstrue
\ukulelefalse
\guitarfalse
\onesongperpagefalse
% Options
\DeclareOption{tabs}{\tabstrue}
\DeclareOption{notabs}{\tabsfalse}
\DeclareOption{lilypond}{\lilypondtrue}
\DeclareOption{nolilypond}{\lilypondfalse}
\DeclareOption{nodiagram}{\nodiagramtrue}
\DeclareOption{diagram}{\nodiagramfalse}
\DeclareOption{importantdiagramonly}{\importantdiagramonlytrue\nodiagramfalse}
\DeclareOption{pictures}{\picturestrue}
\DeclareOption{nopictures}{\picturesfalse}
\DeclareOption{norepeatchords}{\norepeatchordstrue}
\DeclareOption{repeatchords}{\norepeatchordsfalse}
\DeclareOption{ukulele}{\ukuleletrue}
\DeclareOption{noukulele}{\ukulelefalse}
\DeclareOption{guitar}{\guitartrue}
\DeclareOption{noguitar}{\guitarfalse}
\DeclareOption{onesongperpage}{\onesongperpagetrue}
\DeclareOption{10pt}{\PassOptionsToClass{\CurrentOption}{article}}
\DeclareOption{11pt}{\PassOptionsToClass{\CurrentOption}{article}}
\DeclareOption{12pt}{\PassOptionsToClass{\CurrentOption}{article}}
% Default options : pass to the songs package
\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{songs}}
\ProcessOptions
% Base class
\LoadClass{article}
% Main packages
\RequirePackage{graphicx,xcolor}
\RequirePackage{epstopdf}
\RequirePackage{songs}
\RequirePackage{fancybox}
\definecolor{tango-green-3}{HTML}{4e9a06}
\definecolor{tango-blue-3}{HTML}{204a87}
\RequirePackage[bookmarks,
bookmarksopen,
hyperfigures=true,
colorlinks=true,
linkcolor=tango-green-3,
urlcolor=tango-blue-3]{hyperref}
\RequirePackage{tikz}
\RequirePackage{xstring}
\RequirePackage{ifthen}
\RequirePackage{framed}
\RequirePackage{currfile}
\iflyric%
\tabsfalse%
\lilypondfalse%
\nodiagramtrue%
\picturesfalse%
\renewcommand{\colbotglue}{0pt plus .5\textheight minus 0pt}%
\fi
% Start
% Patch for Debian TeXLive 2012
% A bug may produce corrupted PDF
\pdfobjcompresslevel=0
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 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\lastandname{\unskip, and}
\newcounter{@inst}
\newcounter{@auth}
\newcounter{auco}
\def\clearheadinfo{
\gdef\@author{No Author Given}%
\gdef\@title{No Title Given}%
\gdef\@subtitle{}
\gdef\@version{}
\gdef\@web{}
\gdef\@mail{}
\gdef\@email{}
\gdef\@picture{}
\gdef\@picturecopyright{}
}
\def\subtitle#1{\gdef\@subtitle{#1}}
\def\version#1{\gdef\@version{#1}}
\def\web#1{\gdef\@web{#1}}
\def\mail#1{\gdef\@mail{#1}}
\def\email#1{\gdef\@email{#1}}
\def\picture#1{\gdef\@picture{#1}}
\def\picturecopyright#1{\gdef\@picturecopyright{#1}}
\def\footer#1{\gdef\@footer{#1}}
\def\lang#1{\gdef\mainlanguage{#1}}
\clearheadinfo
\renewcommand\maketitle{
\@maketitle
\thispagestyle{empty}
\clearheadinfo}
%
\def\@maketitle{\newpage
\markboth{}{}%
\def\lastand{\ifnum\value{@inst}=2\relax
\unskip{} \andname\
\else
\unskip \lastandname\
\fi}%
\def\and{\stepcounter{@auth}\relax
\ifnum\value{@auth}=\value{@inst}%
\lastand
\else
\unskip,
\fi}%
\begin{center}%
{\rule{\textwidth}{1mm}}
{\Huge \bfseries\boldmath\@title \par}
\if!\@subtitle!\else {\begin{flushright}\large \bfseries\boldmath
\@subtitle \par \end{flushright}}
\fi
{\rule{\textwidth}{1mm}}
\end{center}%
\vspace{1.5cm}
\begin{flushleft}
\begin{tabular}{l l}
\if!\@version!\else{\textbf{\labelversionname}} & \@version \\ \fi
\if!\@date!\else{\textbf{\labeldatename}} & \@date \\ \fi
\if!\@author!\else{\textbf{\labelauthorname}} & \@author \\ \fi
\if!\@web!\else{\textbf{\labelwebname}} & \url{\@web} \\ \fi
\if!\@mail!\else{\textbf{\labelmailname}} & \url{\@mail} \\ \fi
\end{tabular}
\end{flushleft}
\vspace{1.5cm}
\begin{center}
\includegraphics[keepaspectratio=true, width=14cm, height=14cm]{\@picture}
\begin{flushright}
{\flushright \small \@picturecopyright}
\end{flushright}
\end{center}
\@footer
\thispagestyle{empty}
}
\newlength{\coverheight}
\setlength{\coverheight}{2cm}
\newlength{\coverspace}
\setlength{\coverspace}{0.1cm}
\newcommand{\songcover}{}
\newcommand{\songalbum}{}
\newsongkey{cov}{\let\songcover\@empty}{\def\songcover{\currfiledir#1}}
\newsongkey{vcov}{\let\songcover\@empty}{\def\songcover{#1}}
\newsongkey{album}{\let\songalbum\@empty}{\def\songalbum{#1}}
\newsongkey{url}{\let\songurl\@empty}{\def\songurl{#1}}
\newsongkey{original}{\let\songoriginal\@empty}{\def\songoriginal{#1}}
\newcommand\cover{%
\ifpictures%
\ifx\songcover\@empty\else%
\mbox{%
\includegraphics[width=\coverheight]{\songcover}%
\hspace{\coverspace}%
}%
\fi%
\fi%
}
% display album in song header
\renewcommand{\extendprelude}{
{\bfseries\showauthors}
{\footnotesize\it\songalbum}
\IfStrEq{\songurl}{}{}{
\href{\songurl}{\includegraphics[width=.3cm]{internet}}
}
}
\renewcommand{\extendpostlude}{
{\footnotesize%
\IfStrEq{\songoriginal}{}{}{
\originalsongname
\songoriginal
}
}
}
\newlength{\capoheight}
\setlength{\capoheight}{1.5cm}
\renewcommand\capo[1]{%
\ifchorded%
\iftranscapos%
\transpose{#1}%
\else%
\ifpictures
\mbox{%
\includegraphics[height=\capoheight]{capodastre}%
\put(-22,8){\Large #1}
}%
\else
\musicnote{capo: #1}%
\fi
\hspace{\coverspace}%
\fi%
\fi%
}%
\let\utab\gtab
\let\utab@Original\utab
\newcommand{\utab@Hidden}[2]{}%
\let\gtab@Original\gtab
\newcommand{\gtab@Hidden}[2]{}%
\ifnodiagram%
\renewcommand{\gtab}{\@ifstar
\gtab@Hidden%
\gtab@Hidden%
}
\renewcommand{\utab}{\@ifstar
\utab@Hidden%
\utab@Hidden%
}
\else%
\ifimportantdiagramonly%
\renewcommand{\gtab}{\@ifstar
\gtab@Original%
\gtab@Hidden%
}
\renewcommand{\utab}{\@ifstar
\utab@Original%
\utab@Hidden%
}
\else%
\renewcommand{\gtab}{\@ifstar
\gtab@Original%
\gtab@Original%
}
\renewcommand{\utab}{\@ifstar
\utab@Original%
\utab@Original%
}
\fi%
\fi%
\ifguitar%
\else
\renewcommand{\gtab}{\@ifstar
\gtab@Hidden%
\gtab@Hidden%
}
\fi%
\ifukulele%
\else
\renewcommand{\utab}{\@ifstar
\utab@Hidden%
\utab@Hidden%
}
\fi%
% On-the-fly compilation of lilypond files
\epstopdfDeclareGraphicsRule{.ly}{pdf}{.pdf}{lilypond --format=pdf --output=\Gin@base\ETE@suffix\space #1}
\AppendGraphicsExtensions{.ly}
\newcommand{\lilypond}[1]{%
\iflilypond%
\includegraphics{\currfiledir#1}%
\fi%
}
\newcommand{\vlilypond}[1]{%
\iflilypond%
\includegraphics{#1}%
\fi%
}
\newcommand{\image}[2][]{%
\ifpictures%
\begin{flushright}%
\includegraphics[#1]{#2}%
\end{flushright}%
\fi%
}
% Configuration of the songs package
\titleprefixword{}
\renewcommand{\stitlefont}{\LARGE\bf}
\renewcommand{\printchord}[1]{\small{\it#1}}
\renewcommand{\chorusfont}{\it}
\renewcommand{\showauthors}{%
\hbox{\normalsize\songauthors}%
}
\renewcommand{\idxtitlefont}{\sffamily\bfseries}
\renewcommand{\idxauthfont}{\sffamily\bfseries}
\renewcommand{\idxheadfont}{\sffamily\it\LARGE}
\renewcommand{\idxrefsfont}{\bfseries}
% Paragraph indentation space
\setlength{\parindent}{0.3cm}
%
% songs class options
%
% Horizontal space reserved to verse number
\setlength{\versenumwidth}{1em}
% Modifier to the space between consecutive lines of lyrics
\baselineadj=-6pt plus 0pt minus 2pt
% Space between verses and chorus
\versesep=6pt plus 2pt minus 2pt
% lyrics font
\renewcommand{\lyricfont}{\normalfont\normalsize}
% color used to shade song numbers.
\definecolor{SongbookShade}{HTML}{d1e4ae}
%
\iftabs%
%% Code from tabs.sty
% Counters
\newcounter{tab-string}
\newcounter{tab-tempo}
\newcounter{tab-line}
% Length
\newlength{\tablen}
% Variables
\def\chordtuning{E,A,D,G,B,e}
\def\xunit{0.35}
\def\yunit{0.2}
% The tab environmant
% \begin{tab}
\newenvironment{tab}
{
\normalsize
\setcounter{tab-line}{0}
\setcounter{tab-tempo}{0}
\setlength{\tablen}{\xunit cm}
% A single note
% \single <string> <fret>
\newcommand{\single}[2]{
% draw tuning if we are at the beginining of a new tab line
\ifnum\value{tab-tempo}=0
\setcounter{tab-string}{6}
\foreach \tuning in \chordtuning
{
\node at (-1,\value{tab-line}+\value{tab-string}) {\tuning};
\addtocounter{tab-string}{-1}
}
\fi
% draw the 6 strings
\foreach \string in {1,...,6}
{
\draw[xshift=-0.5cm] (\value{tab-tempo},\value{tab-line}+\string) -- +(1,0);
}
\draw node[single] at (\value{tab-tempo},\value{tab-line}+##1) {##2};
\addtocounter{tab-tempo}{1}
\addtolength{\tablen}{\xunit cm}
\ifnum\hsize<\tablen
\addtocounter{tab-line}{8}
\setlength{\tablen}{\xunit cm}
\setcounter{tab-tempo}{0}
\end{tikzpicture}
\begin{tikzpicture}[
single/.style={},
cm={\xunit,0,0,-\yunit,(0,0)}
]
\fi
}
% A mesure bar
% \bar
\renewcommand{\bar}{
\draw[xshift=-0.5cm] (\value{tab-tempo},\value{tab-line}+1) --+(0,5);
}
\hspace{-\parindent}
\begin{tikzpicture}[
single/.style={},
cm={\xunit,0,0,-\yunit,(0,0)}
]
% draw the first bar
\draw[xshift=-0.5cm] (0,1) --+(0,5);
}
{
\end{tikzpicture}
}
\else%
\newenvironment{tab}{%
\newcommand{\single}[2]{}%
\renewcommand{\bar}{}%
}{}%
\fi%
%% End of tabs.sty file
\newcommand*{\Intro}{%
\introname%
}%
\newcommand*{\Outro}{%
\outroname%
}%
\newcommand*{\Bridge}{%
\bridgename%
}%
\newcommand*{\Chorus}{%
\chorusname%
}%
\newcommand*{\Verse}{%
\versename%
}%
\newcommand*{\Solo}{%
\soloname%
}%
\newcommand*{\Pattern}{%
\patternname%
}%
\newcommand*{\Rythm}{%
\rythmname%
}%
\newcommand*{\Adlib}{%
\emph{ad~lib.}%
}%
\let\musicnoteORIG\musicnote
\renewcommand{\musicnote}[2][]{%
\vspace{.1cm}
\IfStrEq{}{#1}{\musicnoteORIG{#2}}{
\iflanguage{#1}{\musicnoteORIG{#2}}{}
}
}
\let\textnoteORIG\textnote
\renewcommand{\textnote}[2][]{%
\vspace{.1cm}
\IfStrEq{}{#1}{\textnoteORIG{#2}}{
\iflanguage{#1}{\textnoteORIG{#2}}{}
}
}
\renewcommand{\FrameCommand}[1]{
\begin{tikzpicture}
\node[rectangle] (rect) {
\begin{minipage}{.8\textwidth}
#1
\end{minipage}
};
\draw[very thick, dashed] (rect.north west) -- (rect.south west);
\end{tikzpicture}
}
\newenvironment{bridge}{%
\begin{framed}
\vspace{-.4cm}
\begin{verse*}
}{
\end{verse*}
\vspace{-.2cm}
\end{framed}
}
%% \SB@chordsoff with a greater for the line spacing
\newcommand{\CB@chordshidden}{%
\def\SB@bracket##1]{\ignorespaces}%
\let\SB@rechord\relax%
\let\SB@ch\SB@ch@off%
\ifSB@measurespec%
\ifmeasures\SB@measureson\else\SB@measuresoff\fi%
\else%
\SB@measuresoff%
\fi%
\ifSB@preamble\let\colbotglue{\z@\@plus.5\textheight}\fi%
\SB@setbaselineskip%
}
\newenvironment{repeatedchords}{%
\ifnorepeatchords%
\CB@chordshidden%
\fi
}{}%
\ifonesongperpage%
\renewcommand\songcolumns[1]{%
\SB@cnt#1\relax%
\ifSB@preamble\else{\SB@clearpage}\fi%
\SB@numcols\SB@cnt%
\ifnum\SB@numcols>\z@%
\SB@colwidth-\columnsep%
\multiply\SB@colwidth\SB@numcols%
\advance\SB@colwidth\columnsep%
\advance\SB@colwidth\textwidth%
\divide\SB@colwidth\SB@numcols%
\else%
\ifrepchorus\SB@warnrc\fi%
\fi%
}
\fi
\def\removefirstch@r#1{}
\newcommand{\transposition}[1]{%
\ifnorepeatchords%
\musicnote{%
\transpositionname~
\ifthenelse{#1>0}{#1$\Uparrow$}{\removefirstch@r#1$\Downarrow$}%
}%
\else%
\transpose{#1}
\fi%
}%
\makeatother

205
songbook_core/data/latex/crepbook.sty

@ -0,0 +1,205 @@
% Crepbook Package -- version 0.1 for LaTeX2e
%
% This package is intended to be used with the songbook Python program (and its
% interfaces).
% It defines some layout for automatic songbook generation.
% See http://github.com/patacrep/songbook-core/
\NeedsTeXFormat{LaTeX2e}[1994/06/01]
\ProvidesPackage{crepbook}[2014/04/13 Crepbook Package, version 0.1]
% fancy-capo: When a capo is necessary, use a picture instead of text.
\newif{\iffancycapo}
\DeclareOption{fancy-capo}{\fancycapotrue}
% nocustomtitle: Disable title page fancy definition (back to LaTeX default)
\newif{\ifcustomtitle}
\customtitletrue
\DeclareOption{nocustomtitle}{\customtitlefalse}
% nocustomfonts: Disable fancy fonts definition (back to LaTeX default)
\newif{\ifcustomfonts}
\customfontstrue
\DeclareOption{nocustomfonts}{\customfontsfalse}
% Remaining options are passed to the SongbookUtils package
\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{SongbookUtils}}
\ProcessOptions\relax
\RequirePackage{SongbookUtils}
\ifpictures
\fancycapotrue
\fi
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Layout tweaks
% Configuration of the songs package
% Horizontal space reserved to verse number
\setlength{\versenumwidth}{1em}
% Modifier to the space between consecutive lines of lyrics
\baselineadj=-6pt plus 0pt minus 2pt
% Space between verses and chorus
\versesep=6pt plus 2pt minus 2pt
% Paragraph indentation space
\setlength{\parindent}{0.3cm}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Multilanguage management
\AtBeginDocument{
% Default names (english)
\def\labelversionname{Version:}
\def\labeldatename{Date:}
\def\labelauthorname{Authors:}
\def\labelwebname{Web:}
\def\labelmailname{Email:}
\IfStrEq{\mainlanguage}{french}{
% French names
\def\labelversionname{Version~:}
\def\labeldatename{Date~:}
\def\labelauthorname{Auteurs~:}
\def\labelwebname{Web~:}
\def\labelmailname{Mail~:}
}{}
}
% End of multilanguage management
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Title page
\long\def\subtitle#1{\long\def\@subtitle{#1}}
\def\version#1{\def\@version{#1}}
\def\web#1{\def\@web{#1}}
\def\mail#1{\def\@mail{#1}}
\def\email#1{\def\@email{#1}}
\def\picture#1{\def\@picture{#1}}
\def\picturecopyright#1{\def\@picturecopyright{#1}}
\def\footer#1{\def\@footer{#1}}
\def\clearheadinfo{
\author{}%
\title{No title}%
\subtitle{}%
\version{}%
\web{}%
\mail{}%
\email{}%
\picture{}%
\picturecopyright{}%
}
\clearheadinfo
\ifcustomtitle
\def\maketitle{
\@maketitle
\clearheadinfo
}
\fi
\newcounter{@inst}
\newcounter{@auth}
\newcounter{auco}
\ifcustomtitle
\def\@titlefont{\Huge\bfseries\boldmath}
\def\@subtitlefont{\large\bfseries\boldmath}
\def\@getelement#1{\csname @#1\endcsname}
\def\@labelelement#1{\csname label#1name\endcsname}
\def\@insertelement#1{\if!\@getelement{#1}!
\else %
\@labelelement{#1}& %
\@getelement{#1} \cr %
\fi %
}
\def\@maketitle{
\def\and{\unskip,\cr&}
\begin{titlepage}
\thispagestyle{empty}
\begin{center}
{\rule{\textwidth}{1mm}}
{\@titlefont\@title\par}
\if!\@subtitle!\else
{\hfil\@subtitlefont\@subtitle\par}
\fi
{\rule{\textwidth}{1mm}}
\end{center}
\vfil
\ialign{
\bf{##} \hfil & ## \hfil \cr % Lines definition
\@insertelement{version} %
\@insertelement{date} %
\@insertelement{author} %
\@insertelement{web} %
\@insertelement{mail} %
}
\vfil
\begin{center}
\includegraphics[keepaspectratio=true, width=12cm, height=12cm]{\@picture}
\vskip1em
{\hfil\hbox{\small \@picturecopyright}}
\end{center}
\begin{flushright}
\vfil
{\hfil\rule{.4\textwidth}{.75pt}\par}
\@footer
\end{flushright}
\end{titlepage}
}
\fi
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Fancy capo
\iffancycapo %
\newlength{\capoheight}
\setlength{\capoheight}{1.5cm}
\renewcommand\capo[1]{%
\iftranscapos%
\transpose{#1}%
\fi%
\mbox{%
\includegraphics[height=\capoheight]{capodastre}%
\put(-22,8){\Large #1}
}%
}
\fi
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Fonts definitions
\ifcustomfonts
\def\chordfont#1{\gdef\@chordfont{#1}}
\def\@chordfont{\small\it}
\renewcommand{\idxtitlefont}{\sffamily\bfseries}
\renewcommand{\idxauthfont}{\sffamily\bfseries}
\renewcommand{\idxheadfont}{\sffamily\it\LARGE}
\renewcommand{\idxrefsfont}{\bfseries}
\renewcommand{\stitlefont}{\LARGE\bf}
\renewcommand{\printchord}[1]{\@chordfont #1}
\renewcommand{\chorusfont}{\it}
\renewcommand{\lyricfont}{\normalfont\normalsize}
\renewcommand{\showauthors}{%
\hbox{\normalsize\songauthors}%
}
\fi
\titleprefixword{}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\endinput

82
songbook_core/data/latex/tabs.sty

@ -0,0 +1,82 @@
% Tabs Package -- version 0.1 for LaTeX2e
%
% This package provide macros for tablatures creations
\NeedsTeXFormat{LaTeX2e}[1994/06/01]
\ProvidesPackage{tabs}[2014/04/13 Tabs Package, version 0.1]
\RequirePackage{tikz}
% Counters
\newcounter{tab-string}
\newcounter{tab-tempo}
\newcounter{tab-line}
% Length
\newlength{\tablen}
% Variables
\def\chordtuning{E,A,D,G,B,e}
\def\xunit{0.35}
\def\yunit{0.2}
% The tab environmant
% \begin{tab}
\newenvironment{tab}
{
\normalsize
\setcounter{tab-line}{0}
\setcounter{tab-tempo}{0}
\setlength{\tablen}{\xunit cm}
% A single note
% \single <string> <fret>
\newcommand{\single}[2]{
% draw tuning if we are at the beginining of a new tab line
\ifnum\value{tab-tempo}=0
\setcounter{tab-string}{6}
\foreach \tuning in \chordtuning
{
\node at (-1,\value{tab-line}+\value{tab-string}) {\tuning};
\addtocounter{tab-string}{-1}
}
\fi
% draw the 6 strings
\foreach \string in {1,...,6}
{
\draw[xshift=-0.5cm] (\value{tab-tempo},\value{tab-line}+\string) -- +(1,0);
}
\draw node[single] at (\value{tab-tempo},\value{tab-line}+##1) {##2};
\addtocounter{tab-tempo}{1}
\addtolength{\tablen}{\xunit cm}
\ifnum\hsize<\tablen
\addtocounter{tab-line}{8}
\setlength{\tablen}{\xunit cm}
\setcounter{tab-tempo}{0}
\end{tikzpicture}
\begin{tikzpicture}[
single/.style={},
cm={\xunit,0,0,-\yunit,(0,0)}
]
\fi
}
% A mesure bar
% \bar
\renewcommand{\bar}{
\draw[xshift=-0.5cm] (\value{tab-tempo},\value{tab-line}+1) --+(0,5);
}
\hspace{-\parindent}
\begin{tikzpicture}[
single/.style={},
cm={\xunit,0,0,-\yunit,(0,0)}
]
% draw the first bar
\draw[xshift=-0.5cm] (0,1) --+(0,5);
}
{
\end{tikzpicture}
}
\fi%
\endinput

12
songbook_core/data/templates/default.tex

@ -49,7 +49,7 @@
"default": {"default": "Dbolton \\url{http://commons.wikimedia.org/wiki/User:Dbolton}"} "default": {"default": "Dbolton \\url{http://commons.wikimedia.org/wiki/User:Dbolton}"}
}, },
"footer": {"description": {"english": "Footer", "french": "Pied de page"}, "footer": {"description": {"english": "Footer", "french": "Pied de page"},
"default": {"default": "\\begin{flushright}Generated using Songbook (\\url{http://www.patacrep.com})\\end{flushright}"} "default": {"default": "Generated using Songbook (\\url{http://www.patacrep.com})"}
}, },
"titleprefixwords": {"description": {"english": "Ignore some words in the beginning of song titles", "titleprefixwords": {"description": {"english": "Ignore some words in the beginning of song titles",
"french": "Ignore des mots dans le classement des chansons"}, "french": "Ignore des mots dans le classement des chansons"},
@ -69,6 +69,7 @@
(* extends "songs.tex" *) (* extends "songs.tex" *)
(* set indexes = "titleidx,authidx" *) (* set indexes = "titleidx,authidx" *)
(* block songbookpreambule *) (* block songbookpreambule *)
(( super() )) (( super() ))
@ -76,15 +77,6 @@
\title{((title))} \title{((title))}
\author{((author))} \author{((author))}
\subtitle{((subtitle))}
(* if version!="unknown" *)
\version{((version))}
(* endif *)
\mail{((mail))}
\web{((web))}
\picture{((picture))}
\picturecopyright{((picturecopyright))}
\footer{((footer))}
\newindex{titleidx}{((filename))_title} \newindex{titleidx}{((filename))_title}
\newauthorindex{authidx}{((filename))_auth} \newauthorindex{authidx}{((filename))_auth}

12
songbook_core/data/templates/layout.tex

@ -70,20 +70,16 @@
(* endvariables *) (* endvariables *)
(* block documentclass *) (* block documentclass *)
\documentclass[((booktype)), \documentclass[((mainfontsize))pt]{article}
(* for option in bookoptions *)((option)), (* endblock *)
(* endfor *)
(* for instrument in instruments *)((instrument)), (* block songbookpackages *)
(* endfor *)
((mainfontsize))pt]{crepbook}
(* endblock *) (* endblock *)
(* block songbookpreambule *) (* block songbookpreambule *)
\usepackage[utf8]{inputenc} \usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc} \usepackage[T1]{fontenc}
\usepackage{lmodern} \usepackage{lmodern}
\lang{((lang))}
(* endblock songbookpreambule *) (* endblock songbookpreambule *)
(* block preambule *) (* block preambule *)

28
songbook_core/data/templates/patacrep.tex

@ -43,6 +43,14 @@
(* extends "default.tex" *) (* extends "default.tex" *)
(* block songbookpackages *)
\usepackage[((booktype)),
(* for option in bookoptions *)((option)),
(* endfor *)
(* for instrument in instruments *)((instrument)),
(* endfor *)]{crepbook}
(* endblock *)
(* block songbookpreambule *) (* block songbookpreambule *)
\usepackage[ \usepackage[
a4paper % paper size a4paper % paper size
@ -64,4 +72,24 @@
\renewcommand{\snumbgcolor}{SongNumberBgColor} \renewcommand{\snumbgcolor}{SongNumberBgColor}
\renewcommand{\notebgcolor}{NoteBgColor} \renewcommand{\notebgcolor}{NoteBgColor}
\renewcommand{\idxbgcolor}{IndexBgColor} \renewcommand{\idxbgcolor}{IndexBgColor}
\definecolor{tango-green-3}{HTML}{4e9a06}
\definecolor{tango-blue-3}{HTML}{204a87}
\usepackage[bookmarks,
bookmarksopen,
hyperfigures=true,
colorlinks=true,
linkcolor=tango-green-3,
urlcolor=tango-blue-3]{hyperref}
\subtitle{((subtitle))}
(* if version!="unknown" *)
\version{((version))}
(* endif *)
\mail{((mail))}
\web{((web))}
\picture{((picture))}
\picturecopyright{((picturecopyright))}
\footer{((footer))}
(* endblock *) (* endblock *)

27
songbook_core/data/templates/songs.tex

@ -21,16 +21,29 @@
(* extends "layout.tex" *) (* extends "layout.tex" *)
(* block songbookpackages *)
\usepackage[((booktype)),
(* for option in bookoptions *)((option)),
(* endfor *)
(* for instrument in instruments *)((instrument)),
(* endfor *)]{SongbookUtils}
(* endblock *)
(* block songbookpreambule *) (* block songbookpreambule *)
(( super() )) (( super() ))
(* for lang in content.languages() *)
(* for lang in songlist.languages() *)
\PassOptionsToPackage{((lang))}{babel} \PassOptionsToPackage{((lang))}{babel}
(* endfor *) (* endfor *)
\usepackage[((lang))]{babel} \usepackage[((lang))]{babel}
\lang{((lang))}
\usepackage{graphicx}
\graphicspath{{((datadir))/img/}} \graphicspath{{((datadir))/img/}}
\makeatletter
\@ifpackageloaded{hyperref}{}{\newcommand{\phantomsection}{}}
\makeatother
(* endblock *) (* endblock *)
(* block songs *) (* block songs *)
@ -38,8 +51,14 @@
\addcontentsline{toc}{section}{\songlistname} \addcontentsline{toc}{section}{\songlistname}
\begin{songs}{((indexes|default('')))} \begin{songs}{((indexes|default('')))}
(* for song in songlist.songs *) (* for type, elem in content.content *)
\input{((song.path))} (* if type=="song" *)
\input{((elem.path))}
(* elif type=="section" *)
\end{songs}
\songsection{((elem))}
\begin{songs}{((indexes|default('')))}
(* endif *)
(* endfor *) (* endfor *)
\end{songs} \end{songs}
(* endblock *) (* endblock *)

50
songbook_core/songs.py

@ -87,16 +87,16 @@ def unprefixed_title(title, prefixes):
return title return title
class SongsList(object): class SongbookContent(object):
"""Manipulation et traitement de liste de chansons""" """Manipulation et traitement de liste de chansons"""
def __init__(self, library): def __init__(self, library):
self._songdir = os.path.join(library, 'songs') self._songdir = os.path.join(library, 'songs')
# Liste triée des chansons # Sorted list of the content
self.songs = [] self.content = []
def append(self, filename): def append_song(self, filename):
"""Ajout d'une chanson à la liste """Ajout d'une chanson à la liste
Effets de bord : analyse syntaxique plus ou moins sommaire du fichier Effets de bord : analyse syntaxique plus ou moins sommaire du fichier
@ -104,36 +104,36 @@ class SongsList(object):
album, etc.). album, etc.).
""" """
LOGGER.debug('Parsing file "{}"'.format(filename)) LOGGER.debug('Parsing file "{}"'.format(filename))
# Exécution de PlasTeX # Data extraction from the song with plastex
data = parsetex(filename) data = parsetex(filename)
song = Song(filename, data['languages'], data['titles'], data['args']) song = Song(filename, data['languages'], data['titles'], data['args'])
low, high = 0, len(self.songs) self.content.append(("song", song))
while low != high:
middle = (low + high) / 2 def append(self, type, value):
if song < self.songs[middle]: """ Append a generic element to the content list"""
high = middle self.content.append((type, value))
else:
low = middle + 1
self.songs.insert(low, song)
def append_list(self, filelist): def append_list(self, contentlist):
"""Ajoute une liste de chansons à la liste """Ajoute une liste de chansons à la liste
L'argument est une liste de chaînes, représentant des noms de fichiers L'argument est une liste de chaînes, représentant des noms de fichiers
sous la forme d'expressions régulières destinées à être analysées avec sous la forme d'expressions régulières destinées à être analysées avec
le module glob. le module glob.
""" """
for regexp in filelist: for type, elem in contentlist:
before = len(self.songs) if type == "song":
for filename in glob.iglob(os.path.join(self._songdir, regexp)): # Add all the songs matching the regex
self.append(filename) before = len(self.content)
if len(self.songs) == before: for filename in glob.iglob(os.path.join(self._songdir, elem)):
# No songs were added self.append_song(filename)
LOGGER.warning( if len(self.content) == before:
"Expression '{}' did not match any file".format(regexp) # No songs were added
) LOGGER.warning(
"Expression '{}' did not match any file".format(regexp)
)
else:
self.append(type, elem)
def languages(self): def languages(self):
"""Renvoie la liste des langues utilisées par les chansons""" """Renvoie la liste des langues utilisées par les chansons"""
return set().union(*[set(song.languages) for song in self.songs]) return set().union(*[set(song.languages) for type, song in self.content if type=="song"])

Loading…
Cancel
Save