diff --git a/songbook_core/build.py b/songbook_core/build.py index 54287413..a471f07e 100644 --- a/songbook_core/build.py +++ b/songbook_core/build.py @@ -14,7 +14,7 @@ from songbook_core import __DATADIR__ from songbook_core import errors from songbook_core.files import recursive_find 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 LOGGER = logging.getLogger(__name__) @@ -70,7 +70,10 @@ class Songbook(object): - config : a dictionary containing the configuration """ Song.sort = config['sort'] - Song.prefixes = config['titleprefixwords'] + if 'titleprefixwords' in config: + Song.prefixes = config['titleprefixwords'] + else: + Song.prefixes = [] Song.authwords['after'] = [ re.compile(r"^.*%s\b(.*)" % after) for after @@ -95,17 +98,26 @@ class Songbook(object): # Compute song list if self.config['content'] is None: - self.config['content'] = [ + self.config['content'] = [( + "song", os.path.relpath( filename, os.path.join(self.config['datadir'], 'songs'), - ) + )) for filename in recursive_find( os.path.join(self.config['datadir'], 'songs'), '*.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 for (key, value) in DEFAULT_AUTHWORDS.items(): @@ -113,9 +125,9 @@ class Songbook(object): self.config['authwords'][key] = value def _parse_songs(self): - """Parse songs included in songbook.""" - self.songslist = SongsList(self.config['datadir']) - self.songslist.append_list(self.config['content']) + """Parse content included in songbook.""" + self.contentlist = SongbookContent(self.config['datadir']) + self.contentlist.append_list(self.config['content']) def write_tex(self, output): """Build the '.tex' file corresponding to self. @@ -133,7 +145,7 @@ class Songbook(object): context = renderer.get_variables() context.update(self.config) context['titleprefixkeys'] = ["after", "sep", "ignore"] - context['songlist'] = self.songslist + context['content'] = self.contentlist context['filename'] = output.name[:-4] self._set_songs_default(context) diff --git a/songbook_core/data/examples/example-layout.sb b/songbook_core/data/examples/example-layout.sb index 56e545de..e252ed5d 100644 --- a/songbook_core/data/examples/example-layout.sb +++ b/songbook_core/data/examples/example-layout.sb @@ -11,5 +11,12 @@ "authwords" : { "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"] } diff --git a/songbook_core/data/examples/example-patacrep.sb b/songbook_core/data/examples/example-patacrep.sb index bd722524..dcb27587 100644 --- a/songbook_core/data/examples/example-patacrep.sb +++ b/songbook_core/data/examples/example-patacrep.sb @@ -11,5 +11,12 @@ "authwords" : { "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"] } diff --git a/songbook_core/data/examples/example-songs.sb b/songbook_core/data/examples/example-songs.sb index 668eaca3..40ed8ebc 100644 --- a/songbook_core/data/examples/example-songs.sb +++ b/songbook_core/data/examples/example-songs.sb @@ -11,5 +11,12 @@ "authwords" : { "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"] } diff --git a/songbook_core/data/examples/example.sb b/songbook_core/data/examples/example.sb index 327ed801..a003440e 100644 --- a/songbook_core/data/examples/example.sb +++ b/songbook_core/data/examples/example.sb @@ -10,5 +10,12 @@ "authwords" : { "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"] +} \ No newline at end of file diff --git a/songbook_core/data/latex/SongbookUtils.sty b/songbook_core/data/latex/SongbookUtils.sty new file mode 100644 index 00000000..251e1063 --- /dev/null +++ b/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 diff --git a/songbook_core/data/latex/crepbook.cls b/songbook_core/data/latex/crepbook.cls deleted file mode 100644 index 78681d12..00000000 --- a/songbook_core/data/latex/crepbook.cls +++ /dev/null @@ -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 - \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 diff --git a/songbook_core/data/latex/crepbook.sty b/songbook_core/data/latex/crepbook.sty new file mode 100644 index 00000000..45d8735c --- /dev/null +++ b/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 diff --git a/songbook_core/data/latex/tabs.sty b/songbook_core/data/latex/tabs.sty new file mode 100644 index 00000000..28a7cd66 --- /dev/null +++ b/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 + \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 diff --git a/songbook_core/data/templates/default.tex b/songbook_core/data/templates/default.tex index 3a413cf0..491fb828 100644 --- a/songbook_core/data/templates/default.tex +++ b/songbook_core/data/templates/default.tex @@ -49,7 +49,7 @@ "default": {"default": "Dbolton \\url{http://commons.wikimedia.org/wiki/User:Dbolton}"} }, "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", "french": "Ignore des mots dans le classement des chansons"}, @@ -69,6 +69,7 @@ (* extends "songs.tex" *) (* set indexes = "titleidx,authidx" *) + (* block songbookpreambule *) (( super() )) @@ -76,15 +77,6 @@ \title{((title))} \author{((author))} - \subtitle{((subtitle))} - (* if version!="unknown" *) - \version{((version))} - (* endif *) - \mail{((mail))} - \web{((web))} - \picture{((picture))} - \picturecopyright{((picturecopyright))} - \footer{((footer))} \newindex{titleidx}{((filename))_title} \newauthorindex{authidx}{((filename))_auth} diff --git a/songbook_core/data/templates/layout.tex b/songbook_core/data/templates/layout.tex index 008420ad..b7897ceb 100644 --- a/songbook_core/data/templates/layout.tex +++ b/songbook_core/data/templates/layout.tex @@ -70,20 +70,16 @@ (* endvariables *) (* block documentclass *) -\documentclass[((booktype)), - (* for option in bookoptions *)((option)), - (* endfor *) - (* for instrument in instruments *)((instrument)), - (* endfor *) - ((mainfontsize))pt]{crepbook} +\documentclass[((mainfontsize))pt]{article} +(* endblock *) + +(* block songbookpackages *) (* endblock *) (* block songbookpreambule *) \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} \usepackage{lmodern} - - \lang{((lang))} (* endblock songbookpreambule *) (* block preambule *) diff --git a/songbook_core/data/templates/patacrep.tex b/songbook_core/data/templates/patacrep.tex index 94ba4db4..573e7051 100644 --- a/songbook_core/data/templates/patacrep.tex +++ b/songbook_core/data/templates/patacrep.tex @@ -43,6 +43,14 @@ (* extends "default.tex" *) +(* block songbookpackages *) +\usepackage[((booktype)), + (* for option in bookoptions *)((option)), + (* endfor *) + (* for instrument in instruments *)((instrument)), + (* endfor *)]{crepbook} +(* endblock *) + (* block songbookpreambule *) \usepackage[ a4paper % paper size @@ -64,4 +72,24 @@ \renewcommand{\snumbgcolor}{SongNumberBgColor} \renewcommand{\notebgcolor}{NoteBgColor} \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 *) diff --git a/songbook_core/data/templates/songs.tex b/songbook_core/data/templates/songs.tex index b630a919..a2b5ba7f 100644 --- a/songbook_core/data/templates/songs.tex +++ b/songbook_core/data/templates/songs.tex @@ -21,16 +21,29 @@ (* extends "layout.tex" *) +(* block songbookpackages *) +\usepackage[((booktype)), + (* for option in bookoptions *)((option)), + (* endfor *) + (* for instrument in instruments *)((instrument)), + (* endfor *)]{SongbookUtils} +(* endblock *) + (* block songbookpreambule *) (( super() )) - - (* for lang in songlist.languages() *) + (* for lang in content.languages() *) \PassOptionsToPackage{((lang))}{babel} (* endfor *) \usepackage[((lang))]{babel} + \lang{((lang))} + \usepackage{graphicx} \graphicspath{{((datadir))/img/}} + + \makeatletter + \@ifpackageloaded{hyperref}{}{\newcommand{\phantomsection}{}} + \makeatother (* endblock *) (* block songs *) @@ -38,8 +51,14 @@ \addcontentsline{toc}{section}{\songlistname} \begin{songs}{((indexes|default('')))} - (* for song in songlist.songs *) - \input{((song.path))} + (* for type, elem in content.content *) + (* if type=="song" *) + \input{((elem.path))} + (* elif type=="section" *) + \end{songs} + \songsection{((elem))} + \begin{songs}{((indexes|default('')))} + (* endif *) (* endfor *) \end{songs} (* endblock *) diff --git a/songbook_core/songs.py b/songbook_core/songs.py index ccb9c7fc..19d732af 100644 --- a/songbook_core/songs.py +++ b/songbook_core/songs.py @@ -87,16 +87,16 @@ def unprefixed_title(title, prefixes): return title -class SongsList(object): +class SongbookContent(object): """Manipulation et traitement de liste de chansons""" def __init__(self, library): self._songdir = os.path.join(library, 'songs') - # Liste triée des chansons - self.songs = [] + # Sorted list of the content + self.content = [] - def append(self, filename): + def append_song(self, filename): """Ajout d'une chanson à la liste Effets de bord : analyse syntaxique plus ou moins sommaire du fichier @@ -104,36 +104,36 @@ class SongsList(object): album, etc.). """ LOGGER.debug('Parsing file "{}"…'.format(filename)) - # Exécution de PlasTeX + # Data extraction from the song with plastex data = parsetex(filename) - song = Song(filename, data['languages'], data['titles'], data['args']) - low, high = 0, len(self.songs) - while low != high: - middle = (low + high) / 2 - if song < self.songs[middle]: - high = middle - else: - low = middle + 1 - self.songs.insert(low, song) + self.content.append(("song", song)) + + def append(self, type, value): + """ Append a generic element to the content list""" + self.content.append((type, value)) - def append_list(self, filelist): + def append_list(self, contentlist): """Ajoute une liste de chansons à la liste 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 le module glob. """ - for regexp in filelist: - before = len(self.songs) - for filename in glob.iglob(os.path.join(self._songdir, regexp)): - self.append(filename) - if len(self.songs) == before: - # No songs were added - LOGGER.warning( - "Expression '{}' did not match any file".format(regexp) - ) + for type, elem in contentlist: + if type == "song": + # Add all the songs matching the regex + before = len(self.content) + for filename in glob.iglob(os.path.join(self._songdir, elem)): + self.append_song(filename) + if len(self.content) == before: + # No songs were added + LOGGER.warning( + "Expression '{}' did not match any file".format(regexp) + ) + else: + self.append(type, elem) def languages(self): """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"])