diff --git a/.gitignore b/.gitignore
index 4dad550c..aa63b736 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,10 +1,7 @@
+deb_dist
+build
+dist
.gitignore
-data/
-perso/
-staging/
-utils/release.sh
-utils/tarball.sh
-utils/send.sh
*~
*.aux
*.sbd
@@ -13,15 +10,6 @@ utils/send.sh
*.sxc
*.log
*.out
-*.d
*.pdf
*.pyc
*.tar.gz
-default.sb
-default.tex
-french.sb
-english.sb
-tmp.sb
-utils/version.sh
-/*.tex
-/covers/
diff --git a/NEWS b/NEWS
index 1a473109..21a6af78 100644
--- a/NEWS
+++ b/NEWS
@@ -1,806 +1,18 @@
+songbook 3.7.2
-version 3.7.2
+ (Louis) Undocumented bug corrections and improvements.
-Louis:
-Narz:
- Hubert-Félix Thiéfaine - Sweet amanit phalloide queen
- Georges Brassens - Les trompettes de la renommée
-Romain Goffe:
-m@rco:
- Hubert-Félix Thiéfaine - Alligators 427
- Thomas Fersen - Borborygmes
- Thomas Fersen - Cosmos
-spalax:
+songbook 3.4.7 to 3.7.1
-version 3.7.1
-
-JBB:
- Buddy Holly - Everyday
- Cranberries - Dreaming my dreams
- Cranberries - Linger
- Cranberries - No need to argue
- Cranberries - Ode to my family
- Daniel Powter - Bad day
- Eddy Mitchell - La dernière séance
- Grégoire - Toi + moi
- Hoobastank - The reason
- Joe Dassin - À toi
- Kenny Rogers - The greatest
- Monty Python - Always look on the bright side of life
- Renaud - La médaille
- Roch Voisine - La légende oochigeas
- Suzanne Vega - Luka
- Terry Bush - Maybe tomorrow
-Romain Goffe:
- Traditionnel - Sur le pont d'Avignon
- Traditionnel - Il pleut bergère
-
-version 3.7.0
-
-Alexandre Dupas:
-Dominique Goffe:
-Pipiou:
- Charles Aznavour - Comme ils disent
- Gilbert Bécaud - Et maintenant
- Michel Polnareff - Goodbye Maryloo
- Michel Polnareff - L'amour avec toi
- Michel Polnareff - Lettre à France
- Michel Polnareff - Love me, please love me
-Romain Goffe:
-broph:
- Soan - En chemin
- Axel Bauer - Éteins la lumière
- Soan - The storm
- Étienne Daho - Comme un boomerang
-m@rco:
- Hubert-Félix Thiéfaine - 542 lunes et 7 jours environ
- Hubert-Félix Thiéfaine - Ad orgasmum aeternum
- Hubert-Félix Thiéfaine - Autorisation de délirer
- Hubert-Félix Thiéfaine - La dèche, le twist et le reste
- Hubert-Félix Thiéfaine - La fille du coupeur de joints
- Hubert-Félix Thiéfaine - La fin du Saint Empire Romain-germanique
- Hubert-Félix Thiéfaine - La môme kaléidoscope
- Hubert-Félix Thiéfaine - Le chant du fou
- Hubert-Félix Thiéfaine - Lorelei Sebasto Cha
- Hubert-Félix Thiéfaine - Maison Borniol
- Mano Solo - Je suis venu vous voir
- Mano Solo - Pas du gâteau
-
-version 3.6.7
-
-Mickael Chazaux:
- Jean-Jacques Goldman - Et l'on y peut rien
-Olive:
- Manu Chao - El viente
-Pipiou:
- Georges Brassens - L'orage
-Romain Goffe:
- Michael Jackson - We are the world
- Crep - Ptit pingouin
- Adele - Rolling in the deep
-broph:
- Pink Floyd - Comfortably numb
- The Rolling Stones - Mother's little helper
- Pink Floyd - Hey you
-
-version 3.6.6
-
-Charles Flèche:
- Noir Désir - Un jour en France
- Creedence Clearwater Revival - Bad moon rising
-Olive:
- Manu chao - Bongo bong
- Manu Chao - Je ne t'aime plus
- Renaud - Morgane de toi
- Les Ogres de Barback - Le voyageur
- La Rue Kétanou - Où je vais
-Romain Goffe:
- John Denver - The last hobo
- La chanson du dimanche - Super pouvoir d'achat
- Georges Brassens - Quatre-vingt-quinze pour cent
-
-version 3.6.5
-
-JBB:
- 3 doors down - Here without you
- Arlo Guthrie - Hobos lullaby
- Ralph McTell - Streets of London
- Raphael - Caravane
-Romain Goffe:
- Booze Brothers - I'm sorry
- Charlie Winston - Like a hobo
- Tom Petty - American girl
-karagrat:
- Les Innocents - Un homme extraordinaire
- Balbino Medellin - Super héros
-
-version 3.6.4
-
-Romain Goffe:
- Green Day - Misery
- Jacques Brel - Au suivant
- Debout sur le zinc - Se dire adieu
- Graeme Allwright - La ligne Holworth
- La maison Tellier - Babouin
- Antoine - Les élucubrations
- Iggy Pop - In the death car
- Vincent Malone - Bad Bili
- Soul Asylum - Runaway train
- Traditionnel - Greensleeves
- Billy Ray Cyrus - Achy breaky heart
- Bob Seger - Against the wind
- Johnny Hallyday - Gabrielle
- Yves Simon - Diabolo menthe
-broph:
- The Rolling Stones - Gimme shelter
- Parabellum - La belle
- Parabellum - Osmose 99
-
-version 3.6.3
-
-Alexandre Dupas:
-Romain Goffe:
- Karpatt - La chose qui dort dans mon lit
- Bob Dylan - I want you
- Pink Floyd - Another brick in the wall
-broph:
- Parabellum - Le dernier trocson
- Noir Désir - Lola
- Noir Désir - The holy economic war
- Pink Floyd - Mother
- REM - Losing my religion
-
-version 3.6.2
-
-Alexandre Dupas:
- Gotye - Somebody that I used to know
-Romain Goffe:
- Debout sur le zinc - Aller simple
- Debout sur le zinc - Je cherche encore
- HK & Les Saltimbanks - Indignez-vous
- HK & Les Saltimbanks - Niquons la planète
- Yves Jamait - Etc
- Yves Jamait - Jean-Louis
- The Beach Boys - Surfin' USA
-olivier desrobert:
- The Kingston Trio - Greenback dollar
-
-version 3.6.1
-
-Romain Goffe:
- Le Donjon de Naheulbeuk - Chicken quest
- Le Donjon de Naheulbeuk - Crom
- Le Donjon de Naheulbeuk - Hé, la petite dame
- Le Donjon de Naheulbeuk - La hache Durandil
- Le Donjon de Naheulbeuk - Le petit gobelin
- Le Donjon de Naheulbeuk - Tralala du nain
- Les Amis d'ta femme - Le tango du viagra
-olivier desrobert:
- Thomas Fersen - Au café de la paix
- Thomas Fersen - Saint-Jean-du-Doigt
- Renan Luce - Le Lacrymal Circus
- Les Wriggles - Petit bonhomme
-
-version 3.6.0
-
-Romain Goffe:
- Bloodhound Gang - Fire water burn
- Pascale Picard - Smilin'
- Coluche - Sois fainéant
-yoyoma:
- Razorlight - America
- U2 - One
- America - A Horse With No Name
-
-version 3.5.9
-
-broph:
- Patrick Coutin - J'aime regarder les filles
- Noir Désir - Où veux-tu que je regarde ?
- Calvin RUssell - 5m2
- Dire Straits - Brothers in arms
- Noir Désir - Toujours être ailleurs
-Olivier Desrobert:
- As de Trefle - Pauvre planete
- As de trefle - La revolution
- Les cowboys fringants - Hannah
- Les Ogres de Barback - Rue Mazarine
-
-version 3.5.8
-
-Kaosun:
- As de Trèfle - À l'oreille de ta femme
- As de Trefle - Pauvre planete
- As de trefle - La revolution
- Les cowboys fringants - Hannah
-Romain Goffe:
- Tournée Générale - Avancer mes grolles
-
-version 3.5.7
-
-Hanarka:
- Alain Souchon - La ballade de Jim
- Francis Cabrel - Octobre
- Maxime Le Forestier - Passer ma route
- Alain Souchon - Sous les jupes des filles
- Phil Barney - Un enfant de toi
- Roch Voisine - Hélène
- Téléphone - Le jour s'est levé
-Romain Goffe:
- Gerry Rafferty - To each and everyone
- Le Donjon de Naheulbeuk - Maître du donjon
-broph:
- Jean-Jacques Goldman - On ira
-
-version 3.5.6
-
-Hanarka:
- Belyscendre - Hélas madame
- Francis Cabrel - La corrida
-Romain Goffe:
- The Bloody Irish Boys - Drunk tonight
- Jacques Dutronc - La fille du Père Noël
-broph:
- Calvin Russel - Down down down
-Kaosun:
- Debout sur le zinc - J'ai déjà donné
- Debout sur le zinc - Comme un frisson
- Debout sur le Zinc - Sur le fil
- Debout sur le zinc - Elle m'ennuie
- Debout sur le zinc - Les angles
-
-version 3.5.5
-
-Kaosun:
- Thomas Fersen - Bambi
- Thomas Fersen - Croque
- Thomas Fersen - Irène
- Thomas Fersen - L'histoire d'une heure
- Thomas Fersen - Les cravates
- Thomas Fersen - Louise
- Gary Jules - Mad world
- Les Fatals Picards - Au mariage de Kévin et de ma soeur
- Thomas Fersen - Rititi, ratata
- Thomas Fersen - Le bouton
- Anis - Dans tes yeux
- Les Cowboys Fringants - Ces temps-ci
- Le clandestin - Rue Grenelle
- Jali - Española
- La rue kétanou - Sao Loucas
- Les Cowboys Fringants - 8 secondes
- Debout sur le Zinc - Scylla
-Romain Goffe:
- Les Booze Brothers - Fields of Athenry
- The Dubliners - The wild rover
-
-version 3.5.4
-
-BeXa:
- Jeanne Moreau - Les mots de rien
- Israel Kamakawiwo - Over the rainbow
- Francis Cabrel - Les vidanges du diable
- Crash Test Dummies - mmmm
- Compay Segundo - Chan Chan
- Bill Withers - Just two of us
- Louis Chedid - Tout le monde se presse
- Ridan - Ulysse
- Rose - La liste
- Sixpence None the richer - Kiss me
-Kaosun:
- La Rue Kétanou - Bonhomme de chien
- Soldat Louis - C'est un pays
- Thomas Fersen - Deux pieds
- Thomas Fersen - Diane de Poitiers
- Thomas Fersen - Dugenou
- Thomas Fersen - Le chat botté
- Thomas Fersen - Les malheurs du lion
- Thomas Fersen - Monsieur
- Thomas Fersen - Que l'on est bete
-
-version 3.5.3
-
-BeXa:
- Vincent Delerm - La natation synchronisée
-Kaosun:
- Renaud - Ma gonzesse
- Renaud - It is not because you are
- Renaud - Je suis une bande de jeunes
- Renaud - La chanson du loubard
- Renaud - Mort les enfants
- Thomas Fersen - Chocolat
- Thomas Fersen - J'ai pas la gale
- Thomas Fersen - La malle
- Thomas Fersen - Le balafré
- Thomas Fersen - Mon iguanodon
- Thomas Fersen - Mon macabre
- Thomas Fersen - Je suis au paradis
- Thomas Fersen - Pégase
- Thomas Fersen - Zaza
- Thomas Fersen - Punaise
-Matteo Cypriani:
- Fleetwood Mac - Temporary One
- Jean Leloup - Sang d'encre
- Nirvana - Dumb
-Romain Goffe:
- Les Cowboys Fringants - Paris-Montréal
- Les Cowboys Fringants - L'horloge
- HK & Les Saltimbanks - On lâche rien
- HK & Les Saltimbanks - Passer ma vie
- HK & Les Saltimbanks - Citoyen du monde
- Astérix et Cléopâtre - Le pudding à l'arsenic
-broph:
- Jean-Pierre Mader - Macumba
- Noir Désir - Les écorchés
- Louis Bertignac - Ces idées là Â
- Rita Mitsouko - C'est comme ça
- Calvin Russel - Baby I love you
- Calvin Russel - Crossroad
- Calvin Russel - One meat ball
- Eddy Mitchell - Il ne rentre pas ce soir
- Jean-Jacques Goldman - Comme toi
- Roger Glover - Love is all
- Calvin Russel - Midnite man
-
-version 3.5.2
-
-broph:
- Noir Désir - Lazy
- William Baldé - Rayon de soleil
-
-version 3.5.1
-
-broph:
- M - La Seine
- Noir Désir - Charlie
- Noir Désir - Elle va où elle veut
- Noir Désir - Joey I
- Noir Désir - La chaleur
- Noir Désir - La rage
- Noir Désir - Le fleuve
- Noir Désir - Si rien ne bouge
- Noir Désir - Tu m'donnes le mal
- Pigalle - Le chaland
- Eddy Mitchell - Pas de boogie woogie
- Eddy Mitchell - Tu peux préparer le café noir
- Georges Brassens - À l'ombre des maris
- Georges Brassens - Supplique pour être enterré sur la plage de Sète
- Jimi Hendrix - The wind cries Mary
- Johnny Hallyday - Le pénitencier
- Julien Doré - Kiss me forever
- R.E.M. - Everybody hurts
- Renaud - La ballade nord-irlandaise
- Soan - Pas pour lui
- Soan - Putain de ballerine
- Stealers Wheel - Stuck in the middle with you
- Téléphone - New York avec toi
-
-version 3.5.0
-
-Matteo Cypriani:
- Jean Leloup - Promeneur
- Maxime Le Forestier - Parachutiste
- Yves Simon - Les bateaux du métro
- Soldat Louis - Du rhum des femmes
- Soldat Louis - Tirer des caisses
- Soldat Louis - Savannah
- Thiéfaine - Sentiments numériques revisités
- Leonard Cohen - Winter Lady
- Leonard Cohen - A Bunch of Lonesome Heroes
- Leonard Cohen - The Old Revolution
- Jacques Higelin - Je ne peux plus dire je t'aime
-Romain Goffe:
- Ben E.King - Stand by me
- Coldplay - Paradise
-
-version 3.4.8
-
-Romain Goffe:
- Gérald De Palmas - Sur la route
- Tonton David - Chacun sa route
- Les Hurlements d'Léo - La malle en mai
- Philippe Chatel & Robert Charlebois - La compagnie des lapins bleus
- Oldelaf - Les mains froides
- Soggy Bottom Boys - I am a man of constant sorrow
- Pierre Perret - Bernard Pivot
-
-version 3.4.7
-
-Pipiou:
- Lucienne Delyle - Mon amant de Saint-Jean
- Francis Cabrel - L'encre de tes yeux
- Daniel Guichard - Mon vieux
- Soan - Emily
-Romain Goffe:
- Marie Cherrier - Les baleines
- Marie Cherrier - Manouche
+ Mainly new songs in the data (which was included in songbook-core at this
+ time), and a few undocumented bug corrections and improvements.
songbook (v0.8)
- (various authors) Add songs
- Alexandre Dupas:
- Sheepbox - Not scared to die
- Avenue Q - The internet is for porn
- Johk - La reine de France
- La Maison Tellier - La chambre rose
- Lylloo - Ma soirée MSN
- The Rolling Stones - You can't always get what you want
- Outkast - Hey Ya
- BeXa:
- Alanis Morissette - Ironic
- Alanis Morissette - Ironic
- Benoit Gaüzère:
- The Rolling Stones - Route 66
- Elvis Presley - Don't be cruel
- Eddie Vedder - Guaranteed
- The Beautiful Girls - La Mar
- Dominique Goffe:
- Graeme Allwright - Le jour de clarté
- Hugues Aufray - Alouette
- Hugues Aufray - Hasta Luego
- Hugues Aufray - L'épervier
- Jeanette - Porque te vas
- Maxime Le Forestier - Je ne sais rien faire
- Daniel Lanois - Jolie Louise
- Grégoire Goffe:
- Paco Ibanez - A galopar
- Matthias Bussonnier:
- Alex Beaupain - Je n'aime que toi
- Pierre Caserta:
- Oasis - I'm outta time
- Red Hot Chili Peppers - By the time
- Red Hot Chili Peppers - Californication
- Red Hot Chili Peppers - Can't stop
- Red Hot Chili Peppers - Dani California
- Red Hot Chili Peppers - Road trippin'
- Red Hot Chili Peppers - Under the bridge
- Red Hot Chili Peppers - Snow
- Elton John - Can you fell the love tonight?
- Pipiou:
- Matticus - Le p'tit gars
- Bob Marley - Redemption song
- Christophe - Les mots bleus
- Pep's - Liberta
- Alain Souchon - Bidon
- Maxime Le Forestier - L'auto-stop
- Édith Piaf - Padam-Padam
- Maxime Le Forestier - Entre 14 et 40 ans
- Maxime Le Forestier - Fontenay-aux-Roses
- Catherine Le Forestier - La petite fugue
- Tracy Chapman - Talkin' about the revolution
- Jeanne Moreau - Le tourbillon de la vie
- Charles Aznavour - Mes emmerdes
- Oldelaf et Monsieur D - Super héros
- Pigalle - Dans la salle du bar-tabac de la rue des martyrs
- Renan Luce - La lettre
- Renan Luce - Monsieur Marcel
- Michel Fugain - Forteresse
- Romain Goffe:
- Antsy Pants - Vampire
- Leonard Cohen - If it be your will
- Bob Dylan - The times they are a-changin
- Joan Baez - Here's to you
- Joe Dassin - Les petits pains au chocolat
- Renaud - Chanson pour Pierrot
- Renaud - En cloque
- The Doors - Light my fire
- The Rolling Stones - Paint it black
- The Rolling Stones - Angie
- The Rolling Stones - Ruby Tuesday
- Simon & Garfunkel - Me and Julio down by the schoolyard
- Georges Brassens - À l'ombre du coeur de ma mie
- Georges Brassens - Je me suis fait tout petit
- Yuki Kajiura - Jr
- Crep - Kartopo
- Crep - Mélancolie
- Crep - Les ptits chemins
- Bobby McFerrin - Don't worry, be happy
- Karpatt - Lino
- Les Amis d'ta femme - Laisse tomber, gros
- Mon côté punk - Youssef
- The Nightwatchman - California's dark
- Karpatt - Fan de maman
- Karpatt - Soulève ta jupe
- Gipsy Kings - Baila me
- Gipsy Kings - Bamboleo
- Debout sur le zinc - Le tanticide
- Gogol Bordello - Alcohol
- Boby Lapointe - Framboise
- Boby Lapointe - Méli-Mélodie
- Crep - Nostalgeek
- Les Booze Brothers - I want sex
- Dropkick Murphys - Dirty glass
- The Pogues - The Irish Rover
- Crep - Encore
- La Rue Kétanou - Les tontons
- Les VRP - Ramon Perez
- Mes souliers sont rouges - Cahin-Caha
- Mes souliers sont rouges - L'arbre est dans ses feuilles
- Mes souliers sont rouges - Sortis du bois
- Les Ogres de Barback - L'ennui et le jour
- Gogol Bordello - Supertheory of supereverything
- Tri Yann - Les filles de Redon
- Tri Yann - Kiss the children for me Mary
- Les Fatals Picards - Goldorak est mort
- Charles Aznavour - Les comédiens
- Matmatah - L'apologie
- Philippe Lavil - Il tape sur des bambous
- Les Ogres de Barback - Comment je suis devenu voyageur
- Jean-Jacques Goldman - Le coureur
- Bruce Springsteen - Old Dan Tucker
- Renaud - La blanche
- Renaud - Salut manouche
- Pierre Perret - Les jolies colonies de vacances
- The Connells - '74-'75
- Noir Désir - L'homme pressé
- Noir Désir - Le vent nous portera
- La Tête à Toto - Petit bonhomme
- La Tête à Toto - Les projets
- Renaud - C'est quand qu'on va où ?
- Bruce Springsteen - Mrs McGrath
- Henri Salvador - Une chanson douce
- Nirvana - Come as you are
- Michel Fugain - Je n'aurai pas le temps
- Michel Fugain - Les Acadiens
- Bob Dylan - One more cup of coffee
- Johnny Cash - It ain't me, babe
- Johnny Cash - I walk the line
- Le Donjon de Naheulbeuk - Le laridé du poulet
- Le Donjon de Naheulbeuk - Nanana de l'elfe
- Cat Stevens - Wild world
- Maxime Le Forestier - Mon frère
- Loic Lantoine - Côté punk
- Mon côté punk - Inch-Allah
- Pierre Perret - Au café du canal
- Pierre Perret - Mon p'tit loup
- La Rue Kétanou - Almarita
- Hugues Aufray - Céline
- Hugues Aufray - Le jour où le bateau viendra
- Hugues Aufray - Les couleurs
- Hugues Aufray - Stewball
- Les Ogres de Barback - Little gentleman
- Les hurlements d'Léo - Une danseuse
- Les hurlements d'Léo - À bout d'souffle
- Jacques Brel - Amsterdam
- Jacques Brel - Ces gens-là Â
- Jacques Brel - La valse à mille temps
- Cookie Dingler - Femme libérée
- Jacques Higelin - Poil dans la main
- Jacques Higelin - Tombé du ciel
- La Rue Kétanou - Personne n'a l'prénom d'ma femme
- Les Innocents - L'autre finistère
- Mes souliers sont rouges - Tape la galoche
- Tit Patapons - Marchand de couleurs
- Hervé Cristiani - Il est libre Max
- Los Lobos - Rango theme song
- Herman Düne - Tell me something I don't know
- Herman Düne - Bristol
- Herman Düne - Pure heart
- Herman Düne - When the water gets cold
- Herman Düne - Your name, my game
- Elton John - Crocodile rock
- Manau - La tribu de Dana
- Daniel Balavoine - Vivre ou survivre
- Vivre ou mourir
- France Gall - Il jouait du piano debout
- Louise Attaque - Je t'emmène au vent
- Louise Attaque - Ton invitation
- Crep - SNCeuFeu
- Gérard Lenorman - La ballade des gens heureux
- Gérard Lenorman - Si j'étais président
- Les hurlements d'Léo - Fabulous and luxury holidays for todos in Barbados
- Les blérots de R.A.V.E.L - Dans les gares
- Les blérots de R.A.V.E.L - Le retour de Petrouchka
- Les blérots de R.A.V.E.L - Les ptits plaisirs
- Les hurlements d'Léo - Ici, d'ailleurs
- François Corbier - Les vieux copains de la télé
- Bob Dylan - Ballad of Hollis Brown
- Bob Dylan - Don't think twice, it's all right
- Emiliana Torrini - Jungle drum
- Herman Düne - My friends kill my folks
- Herman Düne - Be a doll and take my heart
- Bob Dylan - Hurricane
- Karpatt - Les vieilles
- Cesaria Evora - Petit pays
- Hugues Aufray - Le joueur de pipeau
- Jean-Jacques Goldman - Il changeait la vie
- Johnny Cash - Jackson
- Johnny Cash - The ring of fire
- Joe Dassin - Les Champs-Élysées
- JCFrog - Je t'emmène dedans
- JCFrog - La mauvaise eréputation
- JCFrog - Russians
- Sting - Russians
- Elvis Presley - Love me tender
- Traditionnel - L'homme de cromagnon
- Jean-Jacques Goldman - Encore un matin
- Georges Brassens - Chanson pour l'Auvergnat
- La compagnie créole - Ça fait rire les oiseaux
- La compagnie créole - La machine à danser
- La compagnie créole - Le bal masqué
- Karpatt - En pleine mer
- Karpatt - Le déménagement
- Les Fatals Picards - L'amour à la française
- Les Fatals Picards - La sécurité de l'emploi
- Joe Dassin - Ma bonne étoile
- Julien Clerc - Travailler, c'est trop dur
- Julien Clerc - Mélissa
- Julien Clerc - Ce n'est rien
- Laura Veirs - Ballad of John Vogelin
- Laura Veirs - Jailhouse fire
- Bob Marley - No woman, no cry
- Laura Veirs - Black-eyed Susan
- Téléphone - Cendrillon
- Négresses vertes - Sous le soleil de Bodega
- Yves Duteil - Le petit pont de bois
- Oldelaf - Mamy blue
- Christophe - Aline
- Nino Ferrer - Mirza
- Laura Veirs - Icebound stream
- Herman's Hermits - No milk today
- Oldelaf - Courseulles-sur-Mer
- Oldelaf - Mon testament
- Oldelaf - Vendredi
- Oldelaf - Le monde est beau
- Oldelaf et Monsieur D - Nous, les vedettes
- Leonard Cohen - Suzanne
- Les Fatals Picards - Mon père était tellement de gauche
- Les Fatals Picards - Seul et célibataire
- Damien Rice - Cannonball
- Jean-Jacques Goldman - Long is the road
- La crevette d'acier - Moi si un jour
- Les Ogres de Barback - La gare de Caen
- Boby Lapointe - Aragon et Castille
- Francis Cabrel - Je t'aimais, je t'aime et je t'aimerai
- Neil Young - Heart of gold
- Green Day - Minority
- Les Ogres de Barback - Touche pas à mon école
- Yuki Kajiura - Vanity
- Bruce Springsteen - John Henry
- Gogol Bordello - Oh no
- Dessins Animés - Boumbo
- Dessins Animés - Denver, le dernier dinosaure
- Dessins Animés - Dragon Ball
- Dessins Animés - Dragon Ball Z
- Dessins Animés - Les chevaliers du zodiaque
- Dessins Animés - Lucky Luke
- Dessins Animés - Sherlock Holmes
- Debout sur le Zinc - Ma petite chérie
- Les Cowboys Fringants - Quand tu pars
- Gilles Servat - La blanche hermine
- Édith Piaf - L'homme à la moto
- Karpatt - Le fil
- Le Donjon de Naheulbeuk - Marche barbare
- Le Donjon de Naheulbeuk - Massacrons-nous dans la taverne
- Maxime Le Forestier - Comme un arbre
- Maxime Le Forestier - Le steak
- Georges Brassens - Ballade des dames du temps jadis
- Maxime Le Forestier - Éducation sentimentale
- The mamas and the papas - California dream
- Jean-Jacques Goldman - Je te donne
- Traditionnel - V'la l'bon vent
- Barbara - L'aigle noir
- Les Ogres de Barback - Ma fille
- Alain Souchon - L'amour à la machine
- Fool's Garden - Lemon tree
- The Innocence Mission - The lakes of Canada
- Crep - Fichu doctorat
- Crep - Soirée pépère
- Crep - iScream
- Crep - Bioman
- Crep - Caliméro
- Oldelaf - Michel
- Karpatt - Histoires de famille
+
+ Undocumented.
songbook (v0.7)
- (various authors) Add songs
- Alexandre Dupas:
- Alexis HK - Gaspard
- The White Stripes - Well It's True That We Love One Another
- Yodelice - Sunday with a flu
- The Calling - Wherever you will go
- The Nightwatchman - Let Freedom Ring
- MC Solaar - Caroline
- System of a Down - Roulette
- The Fray - How to save a life
- The Beatles - Twist and shout
- John Lennon - Working Class Hero
- Les Wriggles - Plouf
- Dominique Goffe:
- Mes souliers sont rouges - Le cycle du vin
- Michel Sardou - Les lacs du Connemara
- Dorian Goffe:
- Le Donjon de Naheulbeuk - Geste héroïque
- Jeanne Dupas:
- AaRON - U-Turn
- Ben Harper - Waiting on an angel
- Pierre Caserta:
- Alicia Keys - If I ain't got you
- Jason Marz - I'm yours
- Jack Johnson - Taylor
- Romain Goffe:
- The Beatles - Octopus Garden
- Bob Dylan - Mr Tambourine Man
- Cat Stevens - Here comes my baby
- Cat Stevens - Father and Son
- Karpatt - Des gnons pour des pelles
- Karpatt - Les canards en plastique
- Les Cowboys Fringants - 1994
- Les Ogres de Barback - Jojo
- Simon & Garfunkel - April come she will
- Simon & Garfunkel - Kathy's song
- The Carpenters - Breaking up is hard to do
- The Dubliners - Whiskey in the jar
- Mes souliers sont rouges - Nuit humide
- Ritchie Valens - Come on, let's go!
- Claude Nougaro - Armstrong
- Maxime Le Forestier - San Francisco
- Simon & Garfunkel - Mrs. Robinson
- Les Fatals Picards - La ferme
- Beau Dommage - La complainte du phoque en Alaska
- Anny et Jean-Marc Versini - La danse des esquimaux
- Debout sur le Zinc - Poil aux yeux
- Georges Brassens - Le petit cheval
- Les ogres de barback - Le temps
- Vincent Malone - L'escargot malheureux
- Boby Lapointe - La maman des poissons
- La Famille Maestro - Le rat de l'opéra
- Jonathan Coulton - Still alive
- Los Lobos - Cancion del Mariachi
- Renaud - Société tu m'auras pas
- Renaud - Amoureux de Paname
- Henri Dès - Mon cheval gris
- Henri Dès - Les bêtises à l'école
- Le Donjon de Naheulbeuk - Noel en Mordor
- Joe Dassin - La fleur aux dents
- Pierre Bachelet - En l'an 2001
- Pierre Bachelet - Vingt ans
- La Rue Kétanou - La chance
- La Rue Kétanou - Les hommes que j'aime
- Joe Dassin - Le moustique
- Graeme Allwright - Henrik
- Graeme Allwright - Le clochard américain
- Hugues Aufray - Elle descend de la montagne
- Traditionnel - Chevaliers de la table ronde
- Hugues Aufray - Debout les gars
- Indochine - L'aventurier
- Indochine - J'ai demandé à la lune
- Traditionnel - Vent frais
- Traditionnel - La cucaracha
- Parabellum - Saturnin
- Dessins Animés - Inspecteur Gadget
- Dessins Animés - L'oiseau bleu
- Alain Souchon - Foule sentimentale
- Les Ogres de Barback - Bumbaia
- Francine Pohl - La sorcière Grabouilla
- Francine Pohl - La sorcière Grabouilla
- La Rue Kétanou - La fiancée de l'eau
- Debout sur le Zinc - La déclaration
- Debout sur le Zinc - Les mots d'amour
- Les Ogres de Barback - Rue du temps
- Les Amis d'ta femme - A las barricadas
- Mes souliers sont rouges - Bassin d'Irlande
- Debout sur le Zinc - Rester debout
- Simon & Garfunkel - The only living boy in New-York
- Les Cowboys Fringants - Plus rien
- Les Cowboys Fringants - Plus rien
- Maxime Le Forestier - La rouille
- Les Petites Bourettes - Et si je t'aime
- Les Cowboys Fringants - La bonne pomme
- Les Cowboys Fringants - Entre deux taxis
- Les Petites Bourrettes - Dans la tête
- Les Petites Bourrettes - La vieille
- As de Trêfle - Jessica
- Le Colporteur - Comme on dit
- Les Vieilles Valises - Émilie
- Sansévérino - Dimanche dernier
- I wanna be like you
- La Rue Kétanou - Sur les chemins de la bohème
- Louise Attaque - Les nuits parisiennes
- Marie Laforêt - Ivan, Boris et moi
- Lila Downs - La cumbia del mole
- Les Petites Bourrettes - Notre monde
- Thomas Bellet:
- Sheepbox - Devil's way.
(lohrun) New songbook format (not compatible with older version).
Changes have been made to the compilation toolchain that prevent
compilation of old format songbook.
@@ -810,30 +22,6 @@ songbook (v0.7)
songbook (v0.6)
- (crep, Jeanne Dupas, lohrun) Add songs
- Alexandre Dupas:
- Ben Harper - Widow of a Living Man Song requested by Jeanne Dupas
- Jeanne Dupas:
- The Animals - The house of rising sun
- The Beatles - Let it be
- Romain Goffe:
- Oldelaf et Monsieur D. - David Crockett
- Steve Waring - La baleine bleue
- Ritchie Valens - La bamba
- Pornophonique - Sad robot
- Les Naufragés - L'harmonica
- Steve Waring - La baleine bleue
- Ritchie Valens - La bamba
- Pornophonique - Sad robot
- Les Naufragés - L'harmonica
- Thémis et Nono
- Les Cowboys Fringants - Ti-Cul
- Bruce Springsteen - Pay me my money down
- Karpatt - Des idées
- Karpatt - Léon
- Les Cowboys Fringants - La Reine
- Les Ogres de Barback - Ptit chat
- Yuki Kajiura - Fake Wings
(crep, lohrun) Corrections of mistakes and typos.
(lohrun) Use plain songs package v2.9
(lohrun) Replace makeindex script with a new python version
@@ -846,23 +34,6 @@ songbook (v0.6)
songbook (0.5)
- (crep, lohrun, Grégoire Goffe) New songs:
- Belyscendre - Mon père veut me marier
- Belyscendre - Prend farge au loup
- Britney Spears - ...Baby one more time
- Cranberries - Animal Instinct
- Cranberries - Zombie
- Green Day - American Idiot
- Le Donjon de Naheulbeuk - La compagnie du chien rugissant
- Le Donjon de Naheulbeuk - La complainte de la serveuse
- Le Donjon de Naheulbeuk - La polka du menestrel
- Le Donjon de Naheulbeuk - Les chaussettes du nain
- Le Donjon de Naheulbeuk - Même pas mage
- Negro Spiritual - Lord I want
- Oldelaf - J'veux être musclé
- Oldelaf - Mon ange
- Rise Against - Hero of War
- U2 - Sunday Bloody Sunday
(crep, lohrun) Corrections of mistakes and typos.
(lohrun) Add a proper volume mechanism
(lohrun) Add volume-1 source containing about 165 songs
@@ -875,52 +46,6 @@ songbook (0.5)
songbook (0.4)
- (crep, lohrun, Grégoire Goffe) New songs:
- Alain Bashung - Gaby, oh Gaby
- Avril Lavigne - Things I'll never say
- Bob Dylan - Blowin in the wind
- Carter Family - In the highways + Keep on the sunny side
- Cat Stevens - Sad Lisa
- Cat Stevens - The wind
- Eels - Dirty girl
- Eels - Hey man
- Eels - I like birds
- Eels - Packing blankets
- Garfunkel and Oates - Fuck You.
- Georges Brassens - Cupidon s'en fout
- Georges Brassens - Grand-père
- Georges Brassens - Le gorille
- Georges Brassens - Les copains d'abord
- Graeme Allwright - Johnny
- Graeme Allwright - La mouche bleue
- Graeme Allwright - Petit garcon
- Green Day - Boulevard of Broken Dreams
- Howie Day - Collide
- Kana - Plantation
- La Rue Ketanou - La Rue Ketanou
- Les Cowboys Fringants - La manifestation
- Les Cowboys Fringants - Toune d'Automne
- Les Tit's Nassels - Les Tit's ballades
- Linkin Park - Numb
- Moriarty - Jimmy
- Oasis - Wonderwall
- Oldelaf et Monsieur.D - Nathalie
- Patrick Bouchitey - Jesus reviens
- Pierre Perret - Lily
- Pow Wow - Le lion est mort ce soir
- Radiohead - Creep
- Renaud - Petite fille des sombres rues
- Simon & Garfunkel - Cecilia
- Simon & Garfunkel - El condor pasa
- Simon & Garfunkel - Feeling groovy
- Terra Naomi - Say it's possible
- The Beatles - Ob-la-di ob-la-da
- The Beatles - Yellow submarine
- The Beatles - Yesterday
- The Eagles - Hotel California
- The Pogues - Fairytale of New-York
- Tri Yann - Les prisons de Nantes
- Tri Yann - Si Mors A Mors
(crep, lohrun) Corrections of mistakes and typos.
(crep, lohrun) Add cover picture to each song
(lohrun) Update to the Songs Package v2.8
@@ -930,7 +55,6 @@ songbook (0.4)
songbook (0.3)
- (crep, lohrun) Major update with many new songs.
(crep) Corrections of a lot of mistakes.
(crep) Include image support.
(lohrun) Add make-html utility.
diff --git a/books/lyricbook.sb b/books/lyricbook.sb
deleted file mode 100644
index 1bb3af51..00000000
--- a/books/lyricbook.sb
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-"template" : "patacrep.tmpl",
-"lang" : "french",
-"bookoptions" : [],
-"booktype" : "lyric",
-"author" : "Crep (R.Goffe) \\and Lohrun (A.Dupas)",
-"subtitle" : "parolier",
-"title" : "Recueil de chansons",
-"songs" : "all"
-}
diff --git a/books/lyricbook_en.sb b/books/lyricbook_en.sb
deleted file mode 100644
index 95feb9f8..00000000
--- a/books/lyricbook_en.sb
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-"template" : "patacrep.tmpl",
-"lang" : "english",
-"bookoptions" : [],
-"booktype" : "lyric",
-"author" : "Crep (R.Goffe) \\and Lohrun (A.Dupas)",
-"subtitle" : "lyrics",
-"songs" : "all"
-}
diff --git a/books/lyricbook_fr.sb b/books/lyricbook_fr.sb
deleted file mode 100644
index 0eca7415..00000000
--- a/books/lyricbook_fr.sb
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-"template" : "patacrep.tmpl",
-"lang" : "french",
-"bookoptions" : [],
-"booktype" : "lyric",
-"author" : "Crep (R.Goffe) \\and Lohrun (A.Dupas)",
-"subtitle" : "parolier",
-"songs" : "all"
-}
diff --git a/books/matteo.sb b/books/matteo.sb
deleted file mode 100644
index 020e5b35..00000000
--- a/books/matteo.sb
+++ /dev/null
@@ -1,24 +0,0 @@
-{
-"template" : "patacrep.tmpl",
-"lang" : "french",
-"bookoptions" : [
- "importantdiagramonly",
- "repeatchords",
- "lilypond",
- "pictures"
- ],
-"booktype" : "chorded",
-"subtitle" : "Matteo's songs",
-"songs" : [
- "hubert-felix_thiefaine/sentiments_numeriques_revisites.sg",
- "jean_leloup/promeneur.sg",
- "maxime_le_forestier/parachutiste.sg",
- "yves_simon/les_bateaux_du_metro.sg",
- "soldat_louis/du_rhum_des_femmes.sg",
- "soldat_louis/tirer_des_caisses.sg",
- "soldat_louis/savannah.sg",
- "leonard_cohen/winter_lady.sg",
- "leonard_cohen/a_bunch_of_lonesome_heroes.sg",
- "leonard_cohen/the_old_revolution.sg",
- "jacques_higelin/je_ne_peux_plus_dire_je_t_aime.sg"]
-}
diff --git a/books/naheulbeuk.sb b/books/naheulbeuk.sb
deleted file mode 100644
index 68173b2e..00000000
--- a/books/naheulbeuk.sb
+++ /dev/null
@@ -1,51 +0,0 @@
-{
-"template" : "ancient.tmpl",
-"lang" : "french",
-"bookoptions" : [
- "diagram",
- "lilypond",
- "pictures"
- ],
-"booktype" : "chorded",
-"footer" : "Musique du Naheulband: \\url{http://www.penofchaos.com/warham/donjon-groupe.htm}",
-"license" : "license-nb.tex",
-"picture" : "nb_cover",
-"picturecopyright" : "Personnages par \\emph{Pen Of Chaos} / Illustrations par \\emph{Marion Poinsot}",
-"subtitle" : "Recueil de chansons non-officiel",
-"title" : "Le Donjon de Naheulbeuk",
-"version" : "0.5",
-"songs" : [
- "belyscendre/helas_madame.sg",
- "belyscendre/mon_pere_veut_me_marier.sg",
- "belyscendre/prends_garde_au_loup.sg",
- "le_donjon_de_naheulbeuk/10_sous_dans_ma_poche.sg",
- "le_donjon_de_naheulbeuk/chicken_quest.sg",
- "le_donjon_de_naheulbeuk/crom.sg",
- "le_donjon_de_naheulbeuk/la_hache_durandil.sg",
- "le_donjon_de_naheulbeuk/le_petit_gobelin.sg",
- "le_donjon_de_naheulbeuk/he_la_petite_dame.sg",
- "le_donjon_de_naheulbeuk/tralala_du_nain.sg",
- "le_donjon_de_naheulbeuk/bugger_off.sg",
- "le_donjon_de_naheulbeuk/la_biere_du_donjon.sg",
- "le_donjon_de_naheulbeuk/la_compagnie_du_chien_rugissant.sg",
- "le_donjon_de_naheulbeuk/la_complainte_de_la_serveuse.sg",
- "le_donjon_de_naheulbeuk/geste_heroique.sg",
- "le_donjon_de_naheulbeuk/la_polka_du_menestrel.sg",
- "le_donjon_de_naheulbeuk/la_vie_d_aventurier.sg",
- "le_donjon_de_naheulbeuk/le_laride_du_poulet.sg",
- "le_donjon_de_naheulbeuk/les_chaussettes_du_nain.sg",
- "le_donjon_de_naheulbeuk/les_elfes_de_greenelven.sg",
- "le_donjon_de_naheulbeuk/les_souliers_de_lady_fae.sg",
- "le_donjon_de_naheulbeuk/les_epees_durandil.sg",
- "le_donjon_de_naheulbeuk/maitre_du_donjon.sg",
- "le_donjon_de_naheulbeuk/marche_barbare.sg",
- "le_donjon_de_naheulbeuk/massacrons_nous_dans_la_taverne.sg",
- "le_donjon_de_naheulbeuk/mon_ancetre_gurdil.sg",
- "le_donjon_de_naheulbeuk/meme_pas_mage.sg",
- "le_donjon_de_naheulbeuk/nanana_de_l_elfe.sg",
- "le_donjon_de_naheulbeuk/noel_en_mordor.sg",
- "le_donjon_de_naheulbeuk/troll_farceur_et_elfe_farci.sg",
- "le_donjon_de_naheulbeuk/un_boulet_dans_le_groupe.sg",
- "le_donjon_de_naheulbeuk/a_l_aventure_compagnons.sg"
- ]
-}
diff --git a/books/songbook.sb b/books/songbook.sb
deleted file mode 100644
index dd929c82..00000000
--- a/books/songbook.sb
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-"template" : "patacrep.tmpl",
-"lang" : "french",
-"songs" : "all"
-}
diff --git a/books/songbook_en.sb b/books/songbook_en.sb
deleted file mode 100644
index 8893f0fc..00000000
--- a/books/songbook_en.sb
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-"template" : "patacrep.tmpl",
-"lang" : "english",
-"bookoptions" : [
- "diagram",
- "lilypond",
- "pictures"
- ],
-"songs" : "all"
-}
diff --git a/books/songbook_fr.sb b/books/songbook_fr.sb
deleted file mode 100644
index ae70574b..00000000
--- a/books/songbook_fr.sb
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-"template" : "patacrep.tmpl",
-"lang" : "french",
-"bookoptions" : [
- "diagram",
- "lilypond",
- "pictures"
- ],
-"songs" : "all"
-}
diff --git a/books/volume-1.sb b/books/volume-1.sb
deleted file mode 100644
index c765eae6..00000000
--- a/books/volume-1.sb
+++ /dev/null
@@ -1,185 +0,0 @@
-{
-"template" : "patacrep.tmpl",
-"lang" : "french",
-"bookoptions" : [
- "diagram",
- "lilypond",
- "pictures"
- ],
-"booktype" : "chorded",
-"picture" : "feel-the-music",
-"picturecopyright" : "foxygamergirl @ deviantart.com",
-"subtitle" : "Tome 1",
-"songs" : [
- "alain_bashung/gaby_oh_gaby.sg",
- "amy_macdonald/mr._rock_n_roll.sg",
- "amy_macdonald/this_is_the_life.sg",
- "anais/mon_coeur_mon_amour.sg",
- "avril_lavigne/things_i_ll_never_say.sg",
- "barry_louis_polisar/all_i_want_is_you.sg",
- "belle_sebastian/piazza_new_york_catcher.sg",
- "bob_dylan/blowin_in_the_wind.sg",
- "bob_dylan/knocking_on_heavens_door.sg",
- "bruce_springsteen/bring_em_home.sg",
- "bruce_springsteen/buffalo_gals.sg",
- "bruce_springsteen/o_mary_don_t_you_weep.sg",
- "benabar/le_diner.sg",
- "benabar/quatre_murs_et_un_toit.sg",
- "benabar/y_a_une_fille_qu_habite_chez_moi.sg",
- "carter_family/in_the_highways.sg",
- "carter_family/keep_on_the_sunny_side.sg",
- "cat_stevens/my_lady_d_arbanville.sg",
- "cat_stevens/sad_lisa.sg",
- "cat_stevens/the_wind.sg",
- "charles_aznavour/emmenez-moi.sg",
- "dessins_animes/l_histoire_d_actarus.sg",
- "dessins_animes/les_mysterieuses_cites_d_or.sg",
- "dessins_animes/nicky_larson.sg",
- "dessins_animes/tom_sawyer_debut.sg",
- "dessins_animes/tom_sawyer_fin.sg",
- "eels/dirty_girl.sg",
- "eels/hey_man.sg",
- "eels/i_like_birds.sg",
- "eels/packing_blankets.sg",
- "francis_cabrel/je_l_aime_a_mourir.sg",
- "francis_cabrel/petite_marie.sg",
- "garfunkel_and_oates/fuck_you.sg",
- "georges_brassens/cupidon_s_en_fout.sg",
- "georges_brassens/grand_pere.sg",
- "georges_brassens/la_mauvaise_reputation.sg",
- "georges_brassens/le_gorille.sg",
- "georges_brassens/les_copains_d_abord.sg",
- "philippe_chatel/la_chanson_du_herisson.sg",
- "graeme_allwright/il_faut_que_je_m_en_aille.sg",
- "graeme_allwright/johnny.sg",
- "graeme_allwright/jolie_bouteille.sg",
- "graeme_allwright/jusqu_a_la_ceinture.sg",
- "graeme_allwright/la_mouche_bleue.sg",
- "graeme_allwright/petit_garcon.sg",
- "graeme_allwright/petites_boites.sg",
- "graeme_allwright/ca_je_l_ai_jamais_vu.sg",
- "green_day/boulevard_of_broken_dreams.sg",
- "herman_dune/i_wish_i_could_see_you_soon.sg",
- "howie_day/collide.sg",
- "hugues_aufray/je_reviens.sg",
- "hugues_aufray/le_bon_dieu_s_enervait.sg",
- "hugues_aufray/le_petit_ane_gris.sg",
- "hugues_aufray/n_y_pense_plus_tout_est_bien.sg",
- "hugues_aufray/santiano.sg",
- "hugues_aufray/tu_sens_bon_la_terre.sg",
- "jacques_brel/vesoul.sg",
- "jeff_buckley/hallelujah.sg",
- "joe_dassin/le_chemin_de_papa.sg",
- "joe_dassin/siffler_sur_la_colline.sg",
- "kana/plantation.sg",
- "karpatt/le_magicien.sg",
- "karpatt/les_ptits_cailloux.sg",
- "karpatt/melisande.sg",
- "kimya_dawson/tree_hugger.sg",
- "la_rue_ketanou/impossible.sg",
- "la_rue_ketanou/la_rue_ketanou.sg",
- "la_rue_ketanou/les_cigales.sg",
- "la_rue_ketanou/les_mots.sg",
- "la_rue_ketanou/ma_faute_a_toi.sg",
- "la_rue_ketanou/tu_parles_trop.sg",
- "le_donjon_de_naheulbeuk/10_sous_dans_ma_poche.sg",
- "le_donjon_de_naheulbeuk/bugger_off.sg",
- "le_donjon_de_naheulbeuk/la_biere_du_donjon.sg",
- "le_donjon_de_naheulbeuk/la_vie_d_aventurier.sg",
- "le_donjon_de_naheulbeuk/les_elfes_de_greenelven.sg",
- "le_donjon_de_naheulbeuk/les_souliers_de_lady_fae.sg",
- "le_donjon_de_naheulbeuk/les_epees_durandil.sg",
- "le_donjon_de_naheulbeuk/mon_ancetre_gurdil.sg",
- "le_donjon_de_naheulbeuk/troll_farceur_et_elfe_farci.sg",
- "le_donjon_de_naheulbeuk/un_boulet_dans_le_groupe.sg",
- "le_donjon_de_naheulbeuk/a_l_aventure_compagnons.sg",
- "les_amis_d_ta_femme/cayenne.sg",
- "les_amis_d_ta_femme/maree_basse.sg",
- "les_cowboys_fringants/droit_devant.sg",
- "les_cowboys_fringants/histoire_de_peche.sg",
- "les_cowboys_fringants/la_manifestation.sg",
- "les_cowboys_fringants/les_hirondelles.sg",
- "les_cowboys_fringants/toune_d_automne.sg",
- "les_cowboys_fringants/etoiles_filantes.sg",
- "les_fatals_picards/chasse_peche_et_nature.sg",
- "les_hurlements_d_leo/poemes.sg",
- "les_momes_du_ce2/mamadou_avait_mal_aux_dents.sg",
- "les_ogres_de_barback/accordeon_pour_les_cons.sg",
- "les_ogres_de_barback/contes_vents_et_marees.sg",
- "les_ogres_de_barback/grand-mere.sg",
- "les_ogres_de_barback/l_air_bete.sg",
- "les_ogres_de_barback/petite_societe.sg",
- "les_ogres_de_barback/rue_de_panam.sg",
- "les_ogres_de_barback/3_-_0.sg",
- "les_ogres_de_barback/la_premiere_fois.sg",
- "les_tit_s_nassels/les_tit_s_ballades.sg",
- "les_tetes_raides/l_iditente.sg",
- "les_tetes_raides/patalo.sg",
- "les_vrp/leo.sg",
- "les_wriggles/julie_la_petite_olive.sg",
- "les_wriggles/monolithe.sg",
- "les_wriggles/poupine_et_thierry.sg",
- "linkin_park/numb.sg",
- "louise_attaque/depuis_toujours.sg",
- "louise_attaque/lea.sg",
- "mano_negra/out_of_time_man.sg",
- "manu_chao/bienvenida_a_tijuana.sg",
- "manu_chao/clandestino.sg",
- "manu_chao/desaparecido.sg",
- "maurice_dulac/dis_a_ton_fils.sg",
- "mes_souliers_sont_rouges/les_souliers_rouges.sg",
- "mes_souliers_sont_rouges/sainte-cecile.sg",
- "mes_souliers_sont_rouges/the_rooster.sg",
- "moriarty/jimmy.sg",
- "noir_desir/aux_sombres_heros_de_l_amer.sg",
- "norah_jones/somewhere_over_the_rainbow.sg",
- "oasis/wonderwall.sg",
- "oldelaf_et_monsieur_d/cafe.sg",
- "oldelaf_et_monsieur_d/nathalie.sg",
- "oldelaf_et_monsieur_d/petit_pierrot.sg",
- "oldelaf_et_monsieur_d/raoul_le_pitbull.sg",
- "oldelaf_et_monsieur_d/rue_de_nantes.sg",
- "oldelaf_et_monsieur_d/trahis.sg",
- "patrick_bouchitey/jesus_reviens.sg",
- "pierre_perret/lily.sg",
- "pixies/where_is_my_mind.sg",
- "pow_wow/le_lion_est_mort_ce_soir.sg",
- "radiohead/creep.sg",
- "renaud/des_que_le_vent_soufflera.sg",
- "renaud/hexagone.sg",
- "renaud/laisse_beton.sg",
- "renaud/manu.sg",
- "renaud/marche_a_l_ombre.sg",
- "renaud/mistral_gagnant.sg",
- "renaud/petite_fillle_des_sombres_rues.sg",
- "simon_garfunkel/cecilia.sg",
- "simon_garfunkel/el_condor_pasa.sg",
- "simon_garfunkel/feeling_groovy.sg",
- "simon_garfunkel/scarborough_fair.sg",
- "simon_garfunkel/the_boxer.sg",
- "simon_garfunkel/the_leaves_that_are_green.sg",
- "simon_garfunkel/the_sounds_of_silence.sg",
- "simon_garfunkel/wednesday_morning_3a.m.sg",
- "sinsemilia/j_prefere_100_fois.sg",
- "steve_waring/le_matou.sg",
- "terra_naomi/say_it_s_possible.sg",
- "the_beatles/hey_jude.sg",
- "the_beatles/ob-la-di_ob-la-da.sg",
- "the_beatles/yellow_submarine.sg",
- "the_beatles/yesterday.sg",
- "the_eagles/hotel_california.sg",
- "the_moldy_peaches/anyone_else_but_you.sg",
- "the_pogues/dirty_old_town.sg",
- "the_pogues/fairytale_of_new_york.sg",
- "tri_yann/la_jument_de_michao.sg",
- "tri_yann/la_ville_que_j_ai_tant_aimee.sg",
- "tri_yann/les_prisons_de_nantes.sg",
- "tri_yann/si_mort_a_mors.sg",
- "tryo/ce_que_l_on_s_aime.sg",
- "tryo/l_hymne_de_nos_campagnes.sg",
- "tryo/le_petit_chose.sg",
- "yves_jamait/et_je_bois.sg",
- "yvon_etienne/chemise_rouge.sg",
- "yvon_etienne/y_a_des_nouilles_et_du_nougat.sg"
- ]
-}
diff --git a/books/volume-2.sb b/books/volume-2.sb
deleted file mode 100644
index 818da205..00000000
--- a/books/volume-2.sb
+++ /dev/null
@@ -1,192 +0,0 @@
-{
-"template" : "patacrep.tmpl",
-"lang" : "french",
-"bookoptions" : [
- "diagram",
- "lilypond",
- "pictures"
- ],
-"booktype" : "chorded",
-"picture" : "sound",
-"picturecopyright" : "ellesh @ deviantart.com",
-"subtitle" : "Tome 2",
-"songs" : [
- "aaron/u_turn_lili.sg",
- "alain_souchon/foule_sentimentale.sg",
- "alex_beaupain/je_n_aime_que_toi.sg",
- "alexis_hk/gaspard.sg",
- "alicia_keys/if_aint_got_you.sg",
- "anny_et_jean-marc_versini/la_danse_des_esquimaux.sg",
- "antsy_pants/vampire.sg",
- "as_de_trefle/jessica.sg",
- "avenue_q/the_internet_is_for_porn.sg",
- "beau_dommage/la_complainte_du_phoque_en_alaska.sg",
- "belyscendre/mon_pere_veut_me_marier.sg",
- "belyscendre/prends_garde_au_loup.sg",
- "ben_harper/waiting_on_an_angel.sg",
- "ben_harper/widow_of_a_living_man.sg",
- "bob_dylan/mr_tambourine_man.sg",
- "bob_dylan/the_times_they_are_a-changin.sg",
- "boby_lapointe/la_maman_des_poissons.sg",
- "britney_spears/baby_one_more_time.sg",
- "bruce_springsteen/john_henry.sg",
- "bruce_springsteen/pay_me_my_money_down.sg",
- "cat_stevens/father_and_son.sg",
- "cat_stevens/here_comes_my_baby.sg",
- "claude_nougaro/armstrong.sg",
- "cranberries/animal_instinct.sg",
- "cranberries/zombie.sg",
- "debout_sur_le_zinc/la_declaration.sg",
- "debout_sur_le_zinc/les_mots_d_amour.sg",
- "debout_sur_le_zinc/ma_petite_cherie.sg",
- "debout_sur_le_zinc/rester_debout.sg",
- "dessins_animes/boumbo.sg",
- "dessins_animes/denver.sg",
- "dessins_animes/dragon_ball.sg",
- "dessins_animes/dragon_ball_z.sg",
- "dessins_animes/inspecteur_gadget.sg",
- "dessins_animes/l_oiseau_bleu.sg",
- "dessins_animes/i_wanna_be_like_you.sg",
- "dessins_animes/les_chevaliers_du_zodiaque.sg",
- "dessins_animes/lucky_luke.sg",
- "dessins_animes/sherlock_holmes.sg",
- "dessins_animes/themis_et_nono.sg",
- "georges_brassens/ballade_des_dames_du_temps_jadis.sg",
- "georges_brassens/je_me_suis_fait_tout_petit.sg",
- "georges_brassens/le_petit_cheval.sg",
- "georges_brassens/a_l_ombre_du_coeur_de_ma_mie.sg",
- "gilles_servat/la_blanche_hermine.sg",
- "gogol_bordello/oh_no.sg",
- "graeme_allwright/henrik.sg",
- "graeme_allwright/le_clochard_americain.sg",
- "green_day/american_idiot.sg",
- "green_day/minority.sg",
- "henri_des/les_betises_a_l_ecole.sg",
- "henri_des/mon_cheval_gris.sg",
- "hugues_aufray/debout_les_gars.sg",
- "hugues_aufray/elle_descend_de_la_montagne.sg",
- "indochine/j_ai_demande_a_la_lune.sg",
- "indochine/l_aventurier.sg",
- "jack_johnson/taylor.sg",
- "jason_marz/i_m_yours.sg",
- "jean-jacques_goldman/je_te_donne.sg",
- "joan_baez/here_s_to_you.sg",
- "joe_dassin/la_fleur_aux_dents.sg",
- "joe_dassin/le_moustique.sg",
- "joe_dassin/les_petits_pains_au_chocolat.sg",
- "johk/la_reine_de_france.sg",
- "john_lennon/working_class_hero.sg",
- "jonathan_coulton/still_alive.sg",
- "karpatt/des_gnons_pour_des_pelles.sg",
- "karpatt/des_idees.sg",
- "karpatt/le_fil.sg",
- "karpatt/les_canards_en_plastique.sg",
- "karpatt/leon.sg",
- "la_famille_maestro/le_rat_de_l_opera.sg",
- "la_rue_ketanou/la_chance.sg",
- "la_rue_ketanou/la_fiancee_de_l_eau.sg",
- "la_rue_ketanou/les_hommes_que_j_aime.sg",
- "la_rue_ketanou/sur_les_chemins_de_la_boheme.sg",
- "le_donjon_de_naheulbeuk/la_compagnie_du_chien_rugissant.sg",
- "le_donjon_de_naheulbeuk/la_complainte_de_la_serveuse.sg",
- "le_donjon_de_naheulbeuk/geste_heroique.sg",
- "le_donjon_de_naheulbeuk/la_polka_du_menestrel.sg",
- "le_donjon_de_naheulbeuk/les_chaussettes_du_nain.sg",
- "le_donjon_de_naheulbeuk/marche_barbare.sg",
- "le_donjon_de_naheulbeuk/massacrons_nous_dans_la_taverne.sg",
- "le_donjon_de_naheulbeuk/meme_pas_mage.sg",
- "le_donjon_de_naheulbeuk/noel_en_mordor.sg",
- "leonard_cohen/if_it_be_your_will.sg",
- "les_amis_d_ta_femme/a_las_barricadas.sg",
- "les_cowboys_fringants/1994.sg",
- "les_cowboys_fringants/entre_deux_taxis.sg",
- "les_cowboys_fringants/la_bonne_pomme.sg",
- "les_cowboys_fringants/la_reine.sg",
- "les_cowboys_fringants/plus_rien.sg",
- "les_cowboys_fringants/quand_tu_pars.sg",
- "les_cowboys_fringants/ti-cul.sg",
- "les_fatals_picards/la_ferme.sg",
- "les_naufrages/l_harmonica.sg",
- "les_ogres_de_barback/bumbaia.sg",
- "les_ogres_de_barback/jojo.sg",
- "les_ogres_de_barback/le_temps.sg",
- "les_ogres_de_barback/poil_aux_yeux.sg",
- "les_ogres_de_barback/ptit_chat.sg",
- "les_ogres_de_barback/rue_du_temps.sg",
- "les_ogres_de_barback/touche_pas_a_mon_ecole.sg",
- "les_petites_bourrettes/dans_la_tete.sg",
- "les_petites_bourrettes/et_si_je_t_aime.sg",
- "les_petites_bourrettes/la_vieille.sg",
- "les_petites_bourrettes/notre_monde.sg",
- "les_vieilles_valises/emilie.sg",
- "les_wriggles/plouf.sg",
- "lila_downs/la_cumbia_del_mole.sg",
- "los_lobos/cancion_del_mariachi.sg",
- "louise_attaque/les_nuits_parisiennes.sg",
- "mc_solaar/caroline.sg",
- "marie_laforet/ivan_boris_et_moi.sg",
- "maxime_le_forestier/comme_un_arbre.sg",
- "maxime_le_forestier/la_rouille.sg",
- "maxime_le_forestier/le_steak.sg",
- "maxime_le_forestier/san_fransico.sg",
- "maxime_le_forestier/education_sentimentale.sg",
- "mes_souliers_sont_rouges/bassin_d_irlande.sg",
- "mes_souliers_sont_rouges/le_cycle_du_vin.sg",
- "mes_souliers_sont_rouges/nuit_humide.sg",
- "michel_sardou/les_lacs_du_connemara.sg",
- "neil_young/heart_of_gold.sg",
- "oldelaf_et_monsieur_d/davy_crockett.sg",
- "oldelaf_et_monsieur_d/j_veux_etre_muscle.sg",
- "oldelaf_et_monsieur_d/michel.sg",
- "oldelaf_et_monsieur_d/mon_ange.sg",
- "parabellum/saturnin.sg",
- "pierre_bachelet/en_l_an_2001.sg",
- "pierre_bachelet/vingt_ans.sg",
- "pornophonique/sad_robot.sg",
- "renaud/amoureux_de_paname.sg",
- "renaud/chanson_pour_pierrot.sg",
- "renaud/docteur_renaud_mister_renard.sg",
- "renaud/en_cloque.sg",
- "renaud/manatthan-kaboul.sg",
- "renaud/societe_tu_m_auras_pas.sg",
- "rise_against/hero_of_war.sg",
- "ritchie_valens/come_on_let_s_go.sg",
- "ritchie_valens/la_bamba.sg",
- "sanseverino/dimanche_dernier.sg",
- "sheepbox/devil_s_way.sg",
- "sheepbox/not_scared_to_die.sg",
- "simon_garfunkel/april_come_she_will.sg",
- "simon_garfunkel/kathy_s_song.sg",
- "simon_garfunkel/me_and_julio_down_by_the_schoolyard.sg",
- "simon_garfunkel/mrs_robinson.sg",
- "simon_garfunkel/the_only_living_boy_in_new_york.sg",
- "steve_waring/la_baleine_bleue.sg",
- "system_of_a_down/roulette.sg",
- "the_animals/the_house_of_rising_sun.sg",
- "the_beatles/let_it_be.sg",
- "the_beatles/octopus_garden.sg",
- "the_beatles/twist_and_shout.sg",
- "the_calling/wherever_you_will_go.sg",
- "the_carpenters/breaking_up_is_hard_to_do.sg",
- "the_doors/light_my_fire.sg",
- "the_dubliners/whiskey_in_the_jar.sg",
- "the_fray/how_to_save_a_life.sg",
- "the_nightwatchman/let_freedom_ring.sg",
- "the_rolling_stones/angie.sg",
- "the_rolling_stones/paint_it_black.sg",
- "the_rolling_stones/ruby_tuesday.sg",
- "the_white_stripes/well_it_s_true_that_we_love_one_another.sg",
- "the_mamas_and_the_papas/california_dream.sg",
- "traditionnel/chevaliers_de_la_table_ronde.sg",
- "traditionnel/la_cucaracha.sg",
- "traditionnel/v_la_l_bon_vent.sg",
- "traditionnel/vent_frais.sg",
- "u2/sunday_bloody_sunday.sg",
- "vincent_malone/l_escargot_malheureux.sg",
- "yodelice/sunday_with_a_flu.sg",
- "yuki_kajiura/fake_wings.sg",
- "yuki_kajiura/jr.sg",
- "yuki_kajiura/vanity.sg",
- "edith_piaf/l_homme_a_la_moto.sg"
- ]
-}
diff --git a/books/volume-3.sb b/books/volume-3.sb
deleted file mode 100644
index f0204b1c..00000000
--- a/books/volume-3.sb
+++ /dev/null
@@ -1,180 +0,0 @@
-{
-"template" : "patacrep.tmpl",
-"lang" : "french",
-"bookoptions" : [
- "diagram",
- "lilypond",
- "pictures"
- ],
-"booktype" : "chorded",
-"picture" : "Mousey_Band_by_Duffzilla",
-"picturecopyright" : "duffzilla @ deviantart.com",
-"subtitle" : "Tome 3",
-"songs" : [
- "alain_souchon/l_amour_a_la_machine.sg",
- "alanis_morissette/ironic.sg",
- "alex_beaupain/as_tu_deja_aime.sg",
- "alex_beaupain/de_bonnes_raisons.sg",
- "alex_beaupain/les_yeux_au_ciel.sg",
- "alex_beaupain/ma_memoire_sale.sg",
- "barbara/l_aigle_noir.sg",
- "bobby_mcferrin/don_t_worry_be_happy.sg",
- "bob_dylan/ballad_of_hollis_brown.sg",
- "bob_dylan/don_t_think_twice_it_s_all_right.sg",
- "bob_dylan/hurricane.sg",
- "bob_dylan/one_more_cup_of_coffee.sg",
- "boby_lapointe/framboise.sg",
- "boby_lapointe/meli-melodie.sg",
- "bruce_springsteen/mrs_mcgrath.sg",
- "bruce_springsteen/old_dan_tucker.sg",
- "cat_stevens/wild_world.sg",
- "cesaria_evora/petit_pays.sg",
- "charles_aznavour/les_comediens.sg",
- "cookie_dingler/femme_liberee.sg",
- "crep/bioman.sg",
- "crep/calimero.sg",
- "crep/encore.sg",
- "crep/fichu_doctorat.sg",
- "crep/iscream.sg",
- "crep/kartopo.sg",
- "crep/les_ptits_chemins.sg",
- "crep/melancolie.sg",
- "crep/nostalgeek.sg",
- "crep/snceufeu.sg",
- "crep/soiree_pepere.sg",
- "daniel_balavoine/vivre_ou_survivre.sg",
- "debout_sur_le_zinc/le_tanticide.sg",
- "dropkick_murphys/dirty_glass.sg",
- "eddie_vedder/guaranteed.sg",
- "elton_john/can_you_fell_the_love_tonight.sg",
- "elton_john/crocodile_rock.sg",
- "elvis_presley/don_t_be_cruel.sg",
- "elvis_presley/love_me_tender.sg",
- "emiliana_torrini/jungle_drum.sg",
- "fools_garden/lemon_tree.sg",
- "france_gall/il_jouait_du_piano_debout.sg",
- "francois_corbier/les_vieux_copains_de_la_tele.sg",
- "georges_brassens/chanson_pour_l_auvergnat.sg",
- "gerard_lenorman/la_ballade_des_gens_heureux.sg",
- "gerard_lenorman/si_j_etais_president.sg",
- "gipsy_kings/baila_me.sg",
- "gipsy_kings/bamboleo.sg",
- "gogol_bordello/alcohol.sg",
- "gogol_bordello/supertheory_of_supereverything.sg",
- "graeme_allwright/le_jour_de_clarte.sg",
- "henri_salvador/une_chanson_douce.sg",
- "herman_dune/be_a_doll_and_take_my_heart.sg",
- "herman_dune/bristol.sg",
- "herman_dune/my_friends_kill_my_folks.sg",
- "herman_dune/pure_heart.sg",
- "herman_dune/tell_me_something_i_don_t_know.sg",
- "herman_dune/when_the_water_gets_cold.sg",
- "herman_dune/your_name_my_game.sg",
- "herve_cristiani/il_est_libre_max.sg",
- "hugues_aufray/celine.sg",
- "hugues_aufray/hasta_luego.sg",
- "hugues_aufray/le_joueur_de_pipeau.sg",
- "hugues_aufray/le_jour_ou_le_bateau_viendra.sg",
- "hugues_aufray/l_epervier.sg",
- "hugues_aufray/les_couleurs.sg",
- "hugues_aufray/stewball.sg",
- "jacques_brel/amsterdam.sg",
- "jacques_brel/ces_gens_la.sg",
- "jacques_brel/la_valse_a_mille_temps.sg",
- "jacques_higelin/poil_dans_la_main.sg",
- "jacques_higelin/tombe_du_ciel.sg",
- "jcfrog/hadopi_song_iii.sg",
- "jcfrog/je_t_emmene_dedans.sg",
- "jcfrog/la_mauvaise_ereputation.sg",
- "jcfrog/russians.sg",
- "jeanette/porque_te_vas.sg",
- "jean-jacques_goldman/encore_un_matin.sg",
- "jean-jacques_goldman/il_changeait_la_vie.sg",
- "jean-jacques_goldman/le_coureur.sg",
- "joe_dassin/les_champs_elysees.sg",
- "johnny_cash/it_aint_me_babe.sg",
- "johnny_cash/i_walk_the_line.sg",
- "johnny_cash/jackson.sg",
- "johnny_cash/the_ring_of_fire.sg",
- "karpatt/fan_de_maman.sg",
- "karpatt/histoire_de_famille.sg",
- "karpatt/les_vieilles.sg",
- "karpatt/lino.sg",
- "karpatt/souleve_ta_jupe.sg",
- "la_compagnie_creole/ca_fait_rire_les_oiseaux.sg",
- "la_compagnie_creole/la_machine_a_danser.sg",
- "la_compagnie_creole/le_bal_masque.sg",
- "la_maison_tellier/la_chambre_rose.sg",
- "la_rue_ketanou/almarita.sg",
- "la_rue_ketanou/les_tontons.sg",
- "la_rue_ketanou/personne_n_a_l_prenom_d_ma_femme.sg",
- "la_tete_a_toto/les_projets.sg",
- "la_tete_a_toto/petit_bonhomme.sg",
- "le_donjon_de_naheulbeuk/le_laride_du_poulet.sg",
- "le_donjon_de_naheulbeuk/nanana_de_l_elfe.sg",
- "les_amis_d_ta_femme/laisse_tomber_gros.sg",
- "les_blerots_de_ravel/dans_les_gares.sg",
- "les_blerots_de_ravel/le_retour_de_petrouchka.sg",
- "les_blerots_de_ravel/les_ptits_plaisirs.sg",
- "les_booze_brothers/i_want_sex.sg",
- "les_fatals_picards/goldorak_est_mort.sg",
- "les_hurlements_d_leo/a_bout_d_souffle.sg",
- "les_hurlements_d_leo/ici_d_ailleurs.sg",
- "les_hurlements_d_leo/le_cafe_des_jours_heureux.sg",
- "les_hurlements_d_leo/une_danseuse.sg",
- "les_innocents/l_autre_finistere.sg",
- "les_ogres_de_barback/comment_je_suis_devenu_voyageur.sg",
- "les_ogres_de_barback/l_ennui_et_le_jour.sg",
- "les_ogres_de_barback/little_gentleman.sg",
- "les_ogres_de_barback/ma_fille.sg",
- "les_vrp/ramon_perez.sg",
- "loic_lantoine/cote_punk.sg",
- "los_lobos/rango_theme_song.sg",
- "louise_attaque/je_t_emmene_au_vent.sg",
- "louise_attaque/ton_invitation.sg",
- "lylloo/ma_soiree_msn.sg",
- "manau/la_tribu_de_dana.sg",
- "matmatah/l_apologie.sg",
- "maxime_le_forestier/mon_frere.sg",
- "mes_souliers_sont_rouges/cahin_caha.sg",
- "mes_souliers_sont_rouges/l_arbre_est_dans_ses_feuilles.sg",
- "mes_souliers_sont_rouges/sortis_du_bois.sg",
- "mes_souliers_sont_rouges/tape_la_galoche.sg",
- "michel_fugain/je_n_aurai_pas_le_temps.sg",
- "michel_fugain/les_acadiens.sg",
- "mon_cote_punk/inch_allah.sg",
- "mon_cote_punk/youssef.sg",
- "nirvana/come_as_you_are.sg",
- "noir_desir/le_vent_nous_portera.sg",
- "noir_desir/l_homme_presse.sg",
- "oasis/im_outta_time.sg",
- "outkast/hey_ya.sg",
- "paco_ibanez/a_galopar.sg",
- "philippe_lavil/il_tape_sur_des_bambous.sg",
- "pierre_perret/au_cafe_du_canal.sg",
- "pierre_perret/les_jolies_colonies_de_vacances.sg",
- "pierre_perret/mon_ptit_loup.sg",
- "red_hot_chili_peppers/by_the_way.sg",
- "red_hot_chili_peppers/californication.sg",
- "red_hot_chili_peppers/can_t_stop.sg",
- "red_hot_chili_peppers/dani_california.sg",
- "red_hot_chili_peppers/road_trippin.sg",
- "red_hot_chili_peppers/snow.sg",
- "red_hot_chili_peppers/under_the_bridge.sg",
- "renaud/c_est_quand_qu_on_va_ou.sg",
- "renaud/la_blanche.sg",
- "renaud/salut_manouche.sg",
- "sting/russians.sg",
- "the_beautiful_girls/la_mar.sg",
- "the_connells/74_75.sg",
- "the_innocence_mission/the_lakes_of_canada.sg",
- "the_nightwatchman/california_s_dark.sg",
- "the_pogues/the_irish_rover.sg",
- "the_rolling_stones/route_66.sg",
- "the_rolling_stones/you_cant_always_get_what_you_want.sg",
- "tit_patapons/marchand_de_couleurs.sg",
- "traditionnel/l_homme_de_cromagnon.sg",
- "tri_yann/kiss_the_cildren_for_me_mary.sg",
- "tri_yann/les_filles_de_redon.sg"
- ]
-}
\ No newline at end of file
diff --git a/books/volume-4.sb b/books/volume-4.sb
deleted file mode 100644
index 1d4e1cbf..00000000
--- a/books/volume-4.sb
+++ /dev/null
@@ -1,174 +0,0 @@
-{
-"template" : "patacrep.tmpl",
-"lang" : "french",
-"bookoptions" : [
- "diagram",
- "lilypond",
- "pictures"
- ],
-"booktype" : "chorded",
-"picture" : "music_by_lauratheartist",
-"picturecopyright" : "LauraTheArtist @ deviantart.com",
-"subtitle" : "Tome 4",
-"songs" : [
- "alain_souchon/bidon.sg",
- "ben_e_king/stand_by_me.sg",
- "bill_withers/just_two_of_us.sg",
- "bob_marley/no_woman_no_cry.sg",
- "bob_marley/redemption_song.sg",
- "boby_lapointe/aragon_et_castille.sg",
- "buena_vista_social_club/chan_chan.sg",
- "calvin_russell/baby_i_love_you.sg",
- "calvin_russell/crossroad.sg",
- "calvin_russell/midnite_man.sg",
- "calvin_russell/one_meat_ball.sg",
- "catherine_le_forestier/la_petite_fugue.sg",
- "charles_aznavour/mes_emmerdes.sg",
- "christophe/aline.sg",
- "christophe/les_mots_bleus.sg",
- "coldplay/paradise.sg",
- "crash_test_dummies/mmm_mmm.sg",
- "damien_rice/cannonball.sg",
- "daniel_guichard/mon_vieux.sg",
- "daniel_lanois/jolie_louise.sg",
- "dessins_animes/le_pudding_a_l_arsenic.sg",
- "eddy_mitchell/il_ne_rentre_pas_ce_soir.sg",
- "eddy_mitchell/pas_de_boogie_woogie.sg",
- "eddy_mitchell/tu_peux_preparer_le_cafe_noir.sg",
- "edith_piaf/padam_padam.sg",
- "fleetwood_mac/temporary_one.sg",
- "francis_cabrel/je_t_aimais_je_t_aime_et_je_t_aimerai.sg",
- "francis_cabrel/l_encre_de_tes_yeux.sg",
- "francis_cabrel/les_vidanges_du_diables.sg",
- "georges_brassens/a_l_ombre_des_maris.sg",
- "georges_brassens/supplique_pour_etre_enterre_sur_la_plage_de_sete.sg",
- "gerald_de_palmas/sur_la_route.sg",
- "herman_s_hermits/no_milk_today.sg",
- "hk_saltimbanks/citoyen_du_monde.sg",
- "hk_saltimbanks/on_lache_rien.sg",
- "hk_saltimbanks/passer_ma_vie.sg",
- "hubert-felix_thiefaine/sentiments_numeriques_revisites.sg",
- "israel_kamakawiwo_ole/somewhere_over_the_rainbow.sg",
- "jacques_higelin/je_ne_peux_plus_dire_je_t_aime.sg",
- "jean-jacques_goldman/comme_toi.sg",
- "jean-jacques_goldman/long_is_the_road.sg",
- "jean_leloup/promeneur.sg",
- "jean_leloup/sang_d_encre.sg",
- "jeanne_moreau/les_mots_de_rien_du_tout.sg",
- "jeanne_moreau/le_tourbillon_de_la_vie.sg",
- "jean_pierre_mader/macumba.sg",
- "jimi_hendrix/the_wind_cries_mary.sg",
- "joe_dassin/ma_bonne_etoile.sg",
- "johnny_hallyday/le_penitencier.sg",
- "julien_clerc/ce_n_est_rien.sg",
- "julien_clerc/melissa.sg",
- "julien_clerc/travailler_c_est_trop_dur.sg",
- "julien_dore/kiss_me_forever.sg",
- "karpatt/en_pleine_mer.sg",
- "karpatt/le_demenagement.sg",
- "la_crevette_d_acier/moi_si_un_jour.sg",
- "la_rue_ketanou/bonhomme_de_chien.sg",
- "laura_veirs/ballad_of_john_vogelin.sg",
- "laura_veirs/black_eyed_susan.sg",
- "laura_veirs/icebound_stream.sg",
- "laura_veirs/jailhouse_fire.sg",
- "leonard_cohen/a_bunch_of_lonesome_heroes.sg",
- "leonard_cohen/suzanne.sg",
- "leonard_cohen/the_old_revolution.sg",
- "leonard_cohen/winter_lady.sg",
- "les_cowboys_fringants/l_horloge.sg",
- "les_cowboys_fringants/paris_montreal.sg",
- "les_fatals_picards/l_amour_a_la_francaise.sg",
- "les_fatals_picards/la_securite_de_l_emploi.sg",
- "les_fatals_picards/mon_pere_etait_tellement_de_gauche.sg",
- "les_fatals_picards/seul_et_celibataire.sg",
- "les_hurlements_d_leo/la_malle_en_mai.sg",
- "les_ogres_de_barback/la_gare_de_caen.sg",
- "louis_bertignac/ces_idees_la.sg",
- "louis_chedid/tout_le_monde_se_presse.sg",
- "lucienne_delyle/mon_amant_de_saint_jean.sg",
- "marie_cherrier/les_baleines.sg",
- "marie_cherrier/manouche.sg",
- "matticus/le_p_tit_gars.sg",
- "maxime_le_forestier/entre_14_et_40_ans.sg",
- "maxime_le_forestier/fontenay_aux_roses.sg",
- "maxime_le_forestier/je_ne_sais_rien_faire.sg",
- "maxime_le_forestier/l_auto_stop.sg",
- "maxime_le_forestier/parachutiste.sg",
- "michel_fugain/forteresse.sg",
- "m/la_seine.sg",
- "negresses_vertes/sous_le_soleil_de_bodega.sg",
- "nino_ferrer/mirza.sg",
- "nirvana/dumb.sg",
- "noir_desir/charlie.sg",
- "noir_desir/elle_va_ou_elle_veut.sg",
- "noir_desir/joey_i.sg",
- "noir_desir/la_chaleur.sg",
- "noir_desir/la_rage.sg",
- "noir_desir/lazy.sg",
- "noir_desir/le_fleuve.sg",
- "noir_desir/les_ecorches.sg",
- "noir_desir/si_rien_ne_bouge.sg",
- "noir_desir/tu_m_donnes_le_mal.sg",
- "oldelaf_et_monsieur_d/courseulles_sur_mer.sg",
- "oldelaf_et_monsieur_d/le_monde_est_beau.sg",
- "oldelaf_et_monsieur_d/les_mains_froides.sg",
- "oldelaf_et_monsieur_d/mamy_blue.sg",
- "oldelaf_et_monsieur_d/mon_testament.sg",
- "oldelaf_et_monsieur_d/nous_les_vedettes.sg",
- "oldelaf_et_monsieur_d/super_heros.sg",
- "oldelaf_et_monsieur_d/vendredi.sg",
- "pep_s/liberta.sg",
- "philippe_chatel/la_compagnie_des_lapins_bleus.sg",
- "pierre_perret/bernard_pivot.sg",
- "pigalle/dans_la_salle_du_bar_tabac_de_la_rue_des_martyrs.sg",
- "pigalle/le_chaland.sg",
- "r_e_m/everybody_hurts.sg",
- "renan_luce/la_lettre.sg",
- "renan_luce/monsieur_marcel.sg",
- "renaud/it_is_not_because_you_are.sg",
- "renaud/je_suis_une_bande_de_jeunes.sg",
- "renaud/la_ballade_nord_irlandaise.sg",
- "renaud/la_chanson_du_loubard.sg",
- "renaud/ma_gonzesse.sg",
- "renaud/mort_les_enfants.sg",
- "ridan/ulysse.sg",
- "rita_mitsouko/c_est_comme_ca.sg",
- "roger_glover/love_is_all.sg",
- "rose/la_liste_de_rose.sg",
- "sixpence_none_the_richer/kiss_me.sg",
- "soan/emilie.sg",
- "soan/pas_pour_lui.sg",
- "soan/putain_de_ballerine.sg",
- "soggy_bottom_boys/i_am_a_man_of_constant_sorrow.sg",
- "soldat_louis/c_est_un_pays.sg",
- "soldat_louis/du_rhum_des_femmes.sg",
- "soldat_louis/savannah.sg",
- "soldat_louis/tirer_des_caisses.sg",
- "stealers_wheel/stuck_in_the_middle_with_you.sg",
- "telephone/cendrillon.sg",
- "telephone/new_york_avec_toi.sg",
- "thomas_fersen/chocolat.sg",
- "thomas_fersen/deux_pieds.sg",
- "thomas_fersen/diane_de_poitiers.sg",
- "thomas_fersen/dugenou.sg",
- "thomas_fersen/je_n_ai_pas_la_gale.sg",
- "thomas_fersen/la_malle.sg",
- "thomas_fersen/le_balafre.sg",
- "thomas_fersen/le_chat_botte.sg",
- "thomas_fersen/les_malheurs_du_lion.sg",
- "thomas_fersen/mon_iguanodon.sg",
- "thomas_fersen/mon_macabre.sg",
- "thomas_fersen/monsieur.sg",
- "thomas_fersen/parfois_au_clair_de_lune.sg",
- "thomas_fersen/pegase.sg",
- "thomas_fersen/punaise.sg",
- "thomas_fersen/que_l_on_est_bete.sg",
- "thomas_fersen/zaza.sg",
- "tonton_david/chacun_sa_route.sg",
- "tracy_chapman/talkin_about_the_revolution.sg",
- "vincent_delerm/la_natation_synchronisee.sg",
- "william_balde/rayon_de_soleil.sg",
- "yves_duteil/le_petit_pont_de_bois.sg",
- "yves_simon/les_bateaux_du_metro.sg"]
-}
diff --git a/books/volume-5.sb b/books/volume-5.sb
deleted file mode 100644
index a5ae5f62..00000000
--- a/books/volume-5.sb
+++ /dev/null
@@ -1,195 +0,0 @@
-{
-"template" : "patacrep.tmpl",
-"lang" : "french",
-"bookoptions" : [
- "diagram",
- "lilypond",
- "pictures"
- ],
-"booktype" : "chorded",
-"picture" : "The_Music_Machine_by_hit_squad",
-"picturecopyright" : "hit-squad @ deviantart.com",
-"subtitle" : "Tome 5",
-"songs" : [
- "3_doors_down/here_without_you.sg",
- "adele/rolling_in_the_deep.sg",
- "alain_souchon/la_ballade_de_jim.sg",
- "alain_souchon/sous_les_jupes_des_filles.sg",
- "america/a_horse_with_no_name.sg",
- "anis/dans_tes_yeux.sg",
- "antoine/les_elucubrations.sg",
- "arlo_guthrie/hobos_lullaby.sg",
- "as_de_trefle/a_l_oreille_de_ta_femme.sg",
- "as_de_trefle/chanson_d_amur.sg",
- "as_de_trefle/la_revolution.sg",
- "as_de_trefle/pauvre_planete.sg",
- "as_de_trefle/toi_toi_toi.sg",
- "axel_bauer/eteins_la_lumiere.sg",
- "balbino_medellin/super_heros.sg",
- "belyscendre/helas_madame.sg",
- "billy_ray_cyrus/achy_breaky_heart.sg",
- "bloodhound_gang/fire_water_burn.sg",
- "bob_dylan/i_want_you.sg",
- "bob_seger/against_the_wind.sg",
- "buddy_holly/everyday.sg",
- "calvin_russell/5m2.sg",
- "calvin_russell/down_down_down.sg",
- "charles_aznavour/comme_ils_disent.sg",
- "charlie_winston/like_a_hobo.sg",
- "coluche/sois_faineant.sg",
- "cranberries/dreaming_my_dreams.sg",
- "cranberries/linger.sg",
- "cranberries/no_need_to_argue.sg",
- "cranberries/ode_to_my_family.sg",
- "creedence_clearwater_revival/bad_moon_rising.sg",
- "crep/ptit_pingouin.sg",
- "daniel_powter/bad_day.sg",
- "debout_sur_le_zinc/aller_simple.sg",
- "debout_sur_le_zinc/comme_un_frisson.sg",
- "debout_sur_le_zinc/elle_m_ennuie.sg",
- "debout_sur_le_zinc/j_ai_deja_donne.sg",
- "debout_sur_le_zinc/je_cherche_encore.sg",
- "debout_sur_le_zinc/les_angles.sg",
- "debout_sur_le_zinc/scylla.sg",
- "debout_sur_le_zinc/se_dire_adieu.sg",
- "debout_sur_le_zinc/sur_le_fil.sg",
- "dire_straits/brothers_in_arms.sg",
- "eddy_mitchell/la_derniere_seance.sg",
- "etienne_daho/comme_un_boomerang.sg",
- "francis_cabrel/la_corrida.sg",
- "francis_cabrel/octobre.sg",
- "gary_jules/mad_world.sg",
- "georges_brassens/les_trompettes_de_la_renommee.sg",
- "georges_brassens/l_orage.sg",
- "georges_brassens/pour_me_rendre_a_mon_bureau.sg",
- "georges_brassens/quatre-vingt-quinze-pour-cent.sg",
- "gerard_dalton/la_sorciere_grabouilla.sg",
- "gerry_rafferty/to_each_and_everyone.sg",
- "gilbert_becaud/et_maintenant.sg",
- "gilles_dreu/alouette.sg",
- "gospel/lord_i_want_to_be_a_christian.sg",
- "gotye/somebody_that_i_used_to_know.sg",
- "graeme_allwright/la_ligne_holworth.sg",
- "green_day/misery.sg",
- "gregoire/toi_moi.sg",
- "hk_saltimbanks/indignez-vous.sg",
- "hk_saltimbanks/niquons_la_planete.sg",
- "hoobastank/the_reason.sg",
- "hubert-felix_thiefaine/542_lunes_et_7_jours_environ.sg",
- "hubert-felix_thiefaine/ad_orgasmum_aeternum.sg",
- "hubert-felix_thiefaine/alligators_427.sg",
- "hubert-felix_thiefaine/la_deche_le_twist_et_le_reste.sg",
- "hubert-felix_thiefaine/la_fille_du_coupeur_de_joints.sg",
- "hubert-felix_thiefaine/la_fin_du_saint_empire_romain_germanique.sg",
- "hubert-felix_thiefaine/la_mome_kaleidoscope.sg",
- "hubert-felix_thiefaine/le_chant_du_fou.sg",
- "hubert-felix_thiefaine/lorelei_Sebasto_Cha.sg",
- "hubert-felix_thiefaine/maison_borniol.sg",
- "hubert-felix_thiefaine/sweet_amanite_phalloide_queen.sg",
- "iggy_pop/in_the_death_car.sg",
- "jacques_brel/au_suivant.sg",
- "jacques_dutronc/la_fille_du_pere_noel.sg",
- "jali/espanola.sg",
- "jean-jacques_goldman/et_l_on_y_peut_rien.sg",
- "jean-jacques_goldman/on_ira.sg",
- "joe_dassin/a_toi.sg",
- "john_denver/last_hobo.sg",
- "johnny_hallyday/gabrielle.sg",
- "karpatt/la_chose_qui_dort_dans_mon_lit.sg",
- "kenny_rogers/the_greatest.sg",
- "la_chanson_du_dimanche/super_pouvoir_d_achat.sg",
- "la_maison_tellier/babouin.sg",
- "la_rue_ketanou/ou_je_vais.sg",
- "la_rue_ketanou/sao_loucas.sg",
- "le_clandestin/rue_grenelle.sg",
- "le_donjon_de_naheulbeuk/chicken_quest.sg",
- "le_donjon_de_naheulbeuk/crom.sg",
- "le_donjon_de_naheulbeuk/he_la_petite_dame.sg",
- "le_donjon_de_naheulbeuk/la_hache_durandil.sg",
- "le_donjon_de_naheulbeuk/le_petit_gobelin.sg",
- "le_donjon_de_naheulbeuk/maitre_du_donjon.sg",
- "le_donjon_de_naheulbeuk/tralala_du_nain.sg",
- "les_amis_d_ta_femme/le_tango_du_viagra.sg",
- "les_booze_brothers/fields_of_athenry.sg",
- "les_booze_brothers/i_m_sorry.sg",
- "les_cowboys_fringants/8_secondes.sg",
- "les_cowboys_fringants/ces_temps_ci.sg",
- "les_cowboys_fringants/hannah.sg",
- "les_fatals_picards/au_mariage_de_kevin_et_de_ma_soeur.sg",
- "les_innocents/un_homme_extraordinaire.sg",
- "les_ogres_de_barback/le_voyageur.sg",
- "les_ogres_de_barback/rue_mazarine.sg",
- "les_wriggles/petit_bonhomme.sg",
- "mano_solo/je_suis_venu_vous_voir.sg",
- "mano_solo/pas_du_gateau.sg",
- "manu_chao/bongo_bong.sg",
- "manu_chao/el_viento.sg",
- "manu_chao/je_ne_t_aime_plus.sg",
- "maxime_le_forestier/passer_ma_route.sg",
- "michael_jackson/we_are_the_world.sg",
- "michel_polnareff/goodbye_maryloo.sg",
- "michel_polnareff/l_amour_avec_toi.sg",
- "michel_polnareff/lettre_a_france.sg",
- "michel_polnareff/love_me_please_love_me.sg",
- "monty_python/always_look_on_the_bright_side_of_life.sg",
- "noir_desir/lola.sg",
- "noir_desir/ou_veux_tu_qu_je_regarde.sg",
- "noir_desir/the_holy_economic_war.sg",
- "noir_desir/toujours_etre_ailleurs.sg",
- "noir_desir/un_jour_en_france.sg",
- "parabellum/la_belle.sg",
- "parabellum/le_dernier_trocson.sg",
- "parabellum/osmose_99.sg",
- "pascale_picard/smilin.sg",
- "patrick_coutin/j_aime_regarder_les_filles.sg",
- "phil_barney/un_enfant_de_toi.sg",
- "pink_floyd/another_brick_in_the_wall.sg",
- "pink_floyd/comfortably_numb.sg",
- "pink_floyd/hey_you.sg",
- "pink_floyd/mother.sg",
- "ralph_mctell/streets_of_london.sg",
- "raphael/caravane.sg",
- "razorlight/america.sg",
- "r_e_m/losing_my_religion.sg",
- "renan_luce/le_lacrymal_circus.sg",
- "renaud/la_medaille.sg",
- "renaud/morgane_de_toi.sg",
- "roch_voisine/helene.sg",
- "roch_voisine/la_legende_oochigeas.sg",
- "soan/en_chemin.sg",
- "soan/the_storm.sg",
- "soul_asylum/runaway_train.sg",
- "suzanne_vega/luka.sg",
- "telephone/le_jour_s_est_leve.sg",
- "terry_bush/maybe_tomorrow.sg",
- "the_beach_boys/surfin_usa.sg",
- "the_bloody_irish_boys/drunk_tonight.sg",
- "the_dubliners/the_wild_rover.sg",
- "the_kingston_trio/greenback_dollar.sg",
- "the_rolling_stones/gimme_shelter.sg",
- "the_rolling_stones/mother_s_little_helper.sg",
- "thomas_fersen/au_cafe_de_la_paix.sg",
- "thomas_fersen/bambi.sg",
- "thomas_fersen/borborygmes.sg",
- "thomas_fersen/cosmos.sg",
- "thomas_fersen/croque.sg",
- "thomas_fersen/irene.sg",
- "thomas_fersen/le_bouton.sg",
- "thomas_fersen/les_cravates.sg",
- "thomas_fersen/l_histoire_d_une_heure.sg",
- "thomas_fersen/louise.sg",
- "thomas_fersen/rititi_ratata_il_parait_qu_elles_aiment_.sg",
- "thomas_fersen/saint_jean_du_doigt.sg",
- "tom_petty/american_girl.sg",
- "tournee_generale/avancer_mes_grolles.sg",
- "traditionnel/greensleeves.sg",
- "traditionnel/il_pleut_bergere.sg",
- "traditionnel/sur_le_pont_d_avignon.sg",
- "u2/one.sg",
- "vincent_malone/bad_bili.sg",
- "walz/comme_on_dit.sg",
- "yves_jamait/etc.sg",
- "yves_jamait/jean-louis.sg",
- "yves_simon/diabolo_menthe.sg",
- "yves_simon/les_bateaux_du_metro.sg"]
-}
diff --git a/img/Mousey_Band_by_Duffzilla.jpg b/img/Mousey_Band_by_Duffzilla.jpg
deleted file mode 100644
index f1b821c3..00000000
Binary files a/img/Mousey_Band_by_Duffzilla.jpg and /dev/null differ
diff --git a/img/Music_by_Katie8594.jpg b/img/Music_by_Katie8594.jpg
deleted file mode 100644
index 7f7fa154..00000000
Binary files a/img/Music_by_Katie8594.jpg and /dev/null differ
diff --git a/img/The_Music_Machine_by_hit_squad.jpg b/img/The_Music_Machine_by_hit_squad.jpg
deleted file mode 100644
index e59148a2..00000000
Binary files a/img/The_Music_Machine_by_hit_squad.jpg and /dev/null differ
diff --git a/img/by.pdf b/img/by.pdf
deleted file mode 100644
index cf506f74..00000000
Binary files a/img/by.pdf and /dev/null differ
diff --git a/img/capodastre.pdf b/img/capodastre.pdf
deleted file mode 100644
index 9b281f28..00000000
Binary files a/img/capodastre.pdf and /dev/null differ
diff --git a/img/feel-the-music.jpg b/img/feel-the-music.jpg
deleted file mode 100644
index f2e61100..00000000
Binary files a/img/feel-the-music.jpg and /dev/null differ
diff --git a/img/internet.png b/img/internet.png
deleted file mode 100644
index 43299f17..00000000
Binary files a/img/internet.png and /dev/null differ
diff --git a/img/license.pdf b/img/license.pdf
deleted file mode 100644
index 8260786a..00000000
Binary files a/img/license.pdf and /dev/null differ
diff --git a/img/music_by_lauratheartist.jpg b/img/music_by_lauratheartist.jpg
deleted file mode 100644
index d43f7f63..00000000
Binary files a/img/music_by_lauratheartist.jpg and /dev/null differ
diff --git a/img/nb_barbarian.jpg b/img/nb_barbarian.jpg
deleted file mode 100644
index 162651c9..00000000
Binary files a/img/nb_barbarian.jpg and /dev/null differ
diff --git a/img/nb_chest.jpg b/img/nb_chest.jpg
deleted file mode 100644
index 86dd1d5d..00000000
Binary files a/img/nb_chest.jpg and /dev/null differ
diff --git a/img/nb_cover.jpg b/img/nb_cover.jpg
deleted file mode 100644
index 71c0a438..00000000
Binary files a/img/nb_cover.jpg and /dev/null differ
diff --git a/img/nb_dwarf_01.jpg b/img/nb_dwarf_01.jpg
deleted file mode 100644
index 8589d41c..00000000
Binary files a/img/nb_dwarf_01.jpg and /dev/null differ
diff --git a/img/nb_dwarf_02.jpg b/img/nb_dwarf_02.jpg
deleted file mode 100644
index b709fccc..00000000
Binary files a/img/nb_dwarf_02.jpg and /dev/null differ
diff --git a/img/nb_elf_01.jpg b/img/nb_elf_01.jpg
deleted file mode 100644
index f7bb81a6..00000000
Binary files a/img/nb_elf_01.jpg and /dev/null differ
diff --git a/img/nb_elf_02.jpg b/img/nb_elf_02.jpg
deleted file mode 100644
index 15e09619..00000000
Binary files a/img/nb_elf_02.jpg and /dev/null differ
diff --git a/img/nb_ogre.jpg b/img/nb_ogre.jpg
deleted file mode 100644
index e39b09f3..00000000
Binary files a/img/nb_ogre.jpg and /dev/null differ
diff --git a/img/nb_ranger.jpg b/img/nb_ranger.jpg
deleted file mode 100644
index b85949ff..00000000
Binary files a/img/nb_ranger.jpg and /dev/null differ
diff --git a/img/nb_wizard.jpg b/img/nb_wizard.jpg
deleted file mode 100644
index 7f4fb120..00000000
Binary files a/img/nb_wizard.jpg and /dev/null differ
diff --git a/img/on-fire.pdf b/img/on-fire.pdf
deleted file mode 100644
index e46f6463..00000000
Binary files a/img/on-fire.pdf and /dev/null differ
diff --git a/img/remix.pdf b/img/remix.pdf
deleted file mode 100644
index d78c6e65..00000000
Binary files a/img/remix.pdf and /dev/null differ
diff --git a/img/sa.pdf b/img/sa.pdf
deleted file mode 100644
index 51b76be2..00000000
Binary files a/img/sa.pdf and /dev/null differ
diff --git a/img/share.pdf b/img/share.pdf
deleted file mode 100644
index ebef7d2f..00000000
Binary files a/img/share.pdf and /dev/null differ
diff --git a/img/sound.jpg b/img/sound.jpg
deleted file mode 100644
index 7742c080..00000000
Binary files a/img/sound.jpg and /dev/null differ
diff --git a/img/src/by-sa.svg b/img/src/by-sa.svg
deleted file mode 100644
index 882db970..00000000
--- a/img/src/by-sa.svg
+++ /dev/null
@@ -1,176 +0,0 @@
-
-
-
-
diff --git a/img/src/by.svg b/img/src/by.svg
deleted file mode 100644
index f0829098..00000000
--- a/img/src/by.svg
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/img/src/capodastre.svg b/img/src/capodastre.svg
deleted file mode 100644
index fc42972d..00000000
--- a/img/src/capodastre.svg
+++ /dev/null
@@ -1,253 +0,0 @@
-
-
-
-
diff --git a/img/src/internet.svg b/img/src/internet.svg
deleted file mode 100644
index aeec764a..00000000
--- a/img/src/internet.svg
+++ /dev/null
@@ -1,216 +0,0 @@
-
-
-
-
diff --git a/img/src/remix.svg b/img/src/remix.svg
deleted file mode 100644
index 739fac9c..00000000
--- a/img/src/remix.svg
+++ /dev/null
@@ -1,59 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/img/src/sa.svg b/img/src/sa.svg
deleted file mode 100644
index 5d10a13e..00000000
--- a/img/src/sa.svg
+++ /dev/null
@@ -1,59 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/img/src/share.svg b/img/src/share.svg
deleted file mode 100644
index c49a2a70..00000000
--- a/img/src/share.svg
+++ /dev/null
@@ -1,59 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/lilypond/10_sous_dans_ma_poche-1.ly b/lilypond/10_sous_dans_ma_poche-1.ly
deleted file mode 100644
index 7c481034..00000000
--- a/lilypond/10_sous_dans_ma_poche-1.ly
+++ /dev/null
@@ -1,13 +0,0 @@
-\include "header"
-\paper{paper-height = 2.5\cm}
-
-\new \songbookstaff
-{
- \relative c'
- {
- \time 2/4
- a'4~ a8 a16 b %\break
- \repeat volta 2 {d8 c16 b~ b8 a16 b d8 c16 b~ b4 e,8 a16\trill g a8 b16 g \break d'8. c16 b8\trill a16 b }
- \alternative { {c8 b\trill a8 b16 c} {c16 a b g a4\trill} }
- }
-}
diff --git a/lilypond/10_sous_dans_ma_poche-2.ly b/lilypond/10_sous_dans_ma_poche-2.ly
deleted file mode 100644
index b52d8218..00000000
--- a/lilypond/10_sous_dans_ma_poche-2.ly
+++ /dev/null
@@ -1,30 +0,0 @@
-\include "header"
-\paper{paper-height = 4\cm}
-
-\new \songbookstaff
-{
- \relative c'
- {
- \key a \minor
- \time 2/4
- \partial 8 e8
-
- \repeat volta 2
- {
- a8\trill a16 a g8 a16 b c8 c b16\trill a b g
- a8 a16 b g8 a16 b c16 a b g a4
- }
-
- \repeat volta 2
- {
- c8 c b8.\trill a16 b16 a g fis e4
- a8 a16 b g8 a16 b
- }
-
- \alternative
- {
- {c8 c b16\trill a b8}
- {c16 a b g a4\trill}
- }
- }
-}
diff --git a/lilypond/8_secondes.ly b/lilypond/8_secondes.ly
deleted file mode 100644
index 91a48a80..00000000
--- a/lilypond/8_secondes.ly
+++ /dev/null
@@ -1,19 +0,0 @@
-\include "header"
-\paper {
- paper-width = 8.5\cm
- line-width = 8\cm
- paper-height = 3\cm
-}
-
-\score
-{ <<
-
- \relative c'''
- { \key a \major
- cis8\accent b\accent a\accent gis\accent a\accent gis\accent fis\accent e\accent
- fis4 a cis,4. fis8 fis8 fis fis a gis8. fis16 e8 fis cis4 \times 2/3 {b8 cis b} a4_^ e_^
- b'8 b b cis d4 cis8 b b a b e a a a4
- a8\accent a\accent a\accent a\accent a\accent a\accent b\accent a\accent cis4\accent b\accent a\accent gis\accent
- }
- >>
-}
\ No newline at end of file
diff --git a/lilypond/A_l_aventure_compagnons.ly b/lilypond/A_l_aventure_compagnons.ly
deleted file mode 100644
index d11a340a..00000000
--- a/lilypond/A_l_aventure_compagnons.ly
+++ /dev/null
@@ -1,16 +0,0 @@
-\include "header"
-\paper{paper-height = 5.6\cm}
-
-\new \songbookstaff
-{
- \key ees \major
- \time 2/4
- \relative c''
- {
- << {g'2 f8. g16 aes4~ aes4 g8. f16 ees8. d16} \\ {bes'2 aes8. g16 f4~ f4 ees8. d16 c8. bes16} >>
- << {c4}\\{aes4} >> bes2
- c8. bes16 c8. d16 ees8. g16 f8. d16 ees4 << {g4~ g4}\\{bes4~ bes} >> ees,8. g16
- \repeat volta 4 { bes8. g16 ees8. g16 bes8. g16 ees8. g16 }
- \alternative { {bes8. g16 \times 2/3 { bes,8 c d } \times 2/3 { ees f g } ees8. g16} { bes4 << {g4~ g2}\\{bes4~ bes2} >> } }
- }
-}
diff --git a/lilypond/Bonhomme_de_chien.ly b/lilypond/Bonhomme_de_chien.ly
deleted file mode 100644
index 4da2b221..00000000
--- a/lilypond/Bonhomme_de_chien.ly
+++ /dev/null
@@ -1,18 +0,0 @@
-\include "header"
-\paper{
- paper-height = 2.4\cm
- paper-width = 13.0\cm
- line-width = 12.0\cm
-}
-
-\new \songbookstaff
-{
- \time 4/4
- \relative c''
- {
- {a4. g16 f16 g4. f16 e16 f8 g16 f e8 d e16 d c d e8}
- {f16 e d4. e16 f g4. f16 e f e f e f8 e16 d e d c d e8 d}
- {a'4. g16 f16 g4. f16 e16 f8 g16 f e8 d e16 d c d e8 d16 e}
- {f4. g16 f g4. f16 e f4. e16 d e d c d e4}
- }
-}
diff --git a/lilypond/C_est_un_pays.ly b/lilypond/C_est_un_pays.ly
deleted file mode 100644
index 8b7e5dd7..00000000
--- a/lilypond/C_est_un_pays.ly
+++ /dev/null
@@ -1,9 +0,0 @@
-\include "header"
-\paper{paper-height = 2.6\cm}
-
-{
- \time 4/4
- \relative c''
- {
- a2 e' d c4 b a2 e' d c4 b c2 g' f e4 d c2 g' f1 g1}
-}
diff --git a/lilypond/Chanson_d_amur.ly b/lilypond/Chanson_d_amur.ly
deleted file mode 100644
index 95a57e4c..00000000
--- a/lilypond/Chanson_d_amur.ly
+++ /dev/null
@@ -1,20 +0,0 @@
-\include "header"
-\paper{paper-height = 2.4\cm}
-
-
-
-
-{
- \key g \minor \time 4/4
- \relative c'
-
- {
- \repeat volta 2 {c8 d ees g f a c a
- bes d bes g bes4 g8 d
- c d ees g f a c a}
- \alternative {
- {bes d4. bes8 d4 bes8}
- {bes1}}
- }
-
-}
diff --git a/lilypond/Chanson_pour_Pierrot.ly b/lilypond/Chanson_pour_Pierrot.ly
deleted file mode 100644
index d2f672ad..00000000
--- a/lilypond/Chanson_pour_Pierrot.ly
+++ /dev/null
@@ -1,13 +0,0 @@
-\include "header"
-\paper{paper-height = 2.4\cm}
-
-\new \songbookstaff
-{
- \key fis \minor
- \relative c'
- {
- \time 6/8
- r8 fis8 gis a8 b cis d8 e fis gis8 a b cis2.
- r8 cis8 b a8 gis fis fis8 e d d8 cis b cis2.
- }
-}
diff --git a/lilypond/Cupidon_s_en_fout.ly b/lilypond/Cupidon_s_en_fout.ly
deleted file mode 100644
index 72078f78..00000000
--- a/lilypond/Cupidon_s_en_fout.ly
+++ /dev/null
@@ -1,17 +0,0 @@
-\include "header"
-\paper{paper-height = 3.6\cm}
-
-\new \songbookstaff
-{
- \key a \minor
- \time 2/4
- \relative c''
- {
- r8 a16 b c8 a c a b g e
- c16 d e8 c d d e e a
- a16 b c a e'8~ e c b g e
- c16 d e c e c d8 d e e a2
- }
-}
-
-
diff --git a/lilypond/Dans_la_tete.ly b/lilypond/Dans_la_tete.ly
deleted file mode 100644
index 085e7229..00000000
--- a/lilypond/Dans_la_tete.ly
+++ /dev/null
@@ -1,20 +0,0 @@
-\include "header"
-\paper{paper-height = 2.4\cm}
-
-\new \songbookstaff
-{
- \relative c''
- {
- \key a \minor
- \time 6/8
- a4.~ a8 g a
- a4.~ a8 g a
- a4.~ a8 g a
- b4.~ b8 a g
- a4 c8 c4 b8
- c4.~ c8 b a e2.
- b'4.~ b8 a g
- c4 d8 c4 b8
- c4.~ c8 b c c2.
- }
-}
diff --git a/lilypond/Droit_devant-1.ly b/lilypond/Droit_devant-1.ly
deleted file mode 100644
index b772ec97..00000000
--- a/lilypond/Droit_devant-1.ly
+++ /dev/null
@@ -1,16 +0,0 @@
-\include "header"
-\paper{paper-height = 2.4\cm}
-
-\new \songbookstaff
-{
- \key d \minor
- \relative c''
- {
- \repeat volta 2
- {
- a8. bes16 c8 d c bes a4 a8. bes16 a8 g a g f4
- e8. f16 g8 a g f e4 e8. f16 e8 d e d c4
- }
- }
-}
-
diff --git a/lilypond/Droit_devant-2.ly b/lilypond/Droit_devant-2.ly
deleted file mode 100644
index 687b1cd9..00000000
--- a/lilypond/Droit_devant-2.ly
+++ /dev/null
@@ -1,12 +0,0 @@
-\include "header"
-\paper{paper-height = 1.1\cm}
-
-\new \songbookstaff
-{
- \key d \minor
- \relative c''
- {
- e4 c g c8 b a4 c e f d1
- }
-
-}
diff --git a/lilypond/Education_sentimentale.ly b/lilypond/Education_sentimentale.ly
deleted file mode 100644
index 71fcd877..00000000
--- a/lilypond/Education_sentimentale.ly
+++ /dev/null
@@ -1,20 +0,0 @@
-\include "header"
-\paper{paper-height = 2.5\cm}
-
-\new \songbookstaff
-{
- \key c \major
- \time 3/4
- \relative c''{
- e8 f e d c b a gis a b c a d e f e
- <<
- {d4 r2. } \\
- {r8 g,8 f' e d4 g,4}
- >>
- <<
- {e'8 f e d c b a g a b c a d c b4. c8 c2.} \\
- {g'8 a g f e d c b c d e c f e d4. c8 c2.}
- >>
- }
-}
-
diff --git a/lilypond/En_chemin.ly b/lilypond/En_chemin.ly
deleted file mode 100644
index a1531a99..00000000
--- a/lilypond/En_chemin.ly
+++ /dev/null
@@ -1,50 +0,0 @@
-\include "header"
-\paper{
- paper-height =3\cm
- paper-width= 10\cm
- line-width= 10\cm
-}
-
-TAB = \markup {
- \raise #1.5
- \sans
- \bold
- \huge
- \override #'(baseline-skip . 2.5)
- \left-align
- \center-column {
- T
- A
- B
- }
-}
-
-symbols = {
- \key e \minor
- \numericTimeSignature
- \time 4/4
- \repeat volta 2 {
- 4-. b'\2-. g'\3-. e'\3-. dis'\3-. e'\3-. fis'\3-. 8-. fis'\3-.
- 4-. b'\2-. g'\3-. e'\3-. dis'\3-. e'\3-. 2\prall
- }
- 8. 16 8 8 4. 8~
- 1\prall
- % 8. 16 8 8 4. 8~
- % 1\prall
-}
-\score {
- <<
-
- \new Staff
-
- {
- \override Staff.StringNumber #'transparent =
-##t
- \clef "G_8" \symbols }
- %\chords { e1:m }
- \new TabStaff {
- \override Staff.Clef #'stencil = #(lambda (grob)
- (grob-interpret-markup grob TAB))
- \symbols }
- >>
-}
diff --git a/lilypond/Entre_deux_taxis.ly b/lilypond/Entre_deux_taxis.ly
deleted file mode 100644
index 67cd6a1b..00000000
--- a/lilypond/Entre_deux_taxis.ly
+++ /dev/null
@@ -1,16 +0,0 @@
-\include "header"
-\paper{paper-height = 2.4\cm}
-
-\new \songbookstaff
-{
- \key c \major
- \time 4/4
- \relative c''
- {
- g4 g g a8. b16 b2.
- g4 a a8. a16 a8 a g a b1
- e4 e8. e16 e8 e d c b2.
- b8. b16 a4 b2 a8. g16 e1
- }
-}
-
diff --git a/lilypond/Et_si_je_t_aime.ly b/lilypond/Et_si_je_t_aime.ly
deleted file mode 100644
index f92b5f8f..00000000
--- a/lilypond/Et_si_je_t_aime.ly
+++ /dev/null
@@ -1,27 +0,0 @@
-\include "header"
-\paper{paper-height = 5.2\cm}
-
-\new \songbookstaff
-{
- \relative c'''
- {
- \key c \major
- \time 2/4
- \partial 8 g8
- %harmonica
- c4. g8 a8 g4 e8 f2~ f4 g8 f8 e2 f8 e4 c8 d2~ d8
- d16 e16 f8 d8 e8 d4 c8 f8 e4 c8 d2~ d8
- d16 e16 f8 d8 e8 d4 c8 f8 e4 c8 g'2
-
- %guitare
- \repeat volta 2
- {
- g8 f4 e8 c8 d4 e8 d4~ d8 d16 e16 f8 e4 d8
- }
- e8 d4 c8 f8 e4 c8 d4~ d8 d16 e16 f8 e4 d8 e8 d4 c8 f8 e4 c8 g'2
-
- }
-
-
-}
-
diff --git a/lilypond/Eteins_la_lumiere.ly b/lilypond/Eteins_la_lumiere.ly
deleted file mode 100644
index 43b5e430..00000000
--- a/lilypond/Eteins_la_lumiere.ly
+++ /dev/null
@@ -1,47 +0,0 @@
-\include "header"
-\paper{
- paper-height =3.5\cm
- paper-width= 10\cm
- line-width= 10\cm
-}
-
-TAB = \markup {
- \raise #1.5
- \sans
- \bold
- \huge
- \override #'(baseline-skip . 2.5)
- \left-align
- \center-column {
- T
- A
- B
- }
-}
-
-symbols = {
- \key a \minor
- \numericTimeSignature
- \time 4/4
- \repeat volta 2 {
- 8 g,\6 a, c\5 a, g,\6 ~
- 8 g,\6 a, c\5 a, g,\6
- 4 4 84 8~
- 8 8 4 84 8 }
-}
-\score {
- <<
-
- \new Staff
-
- {
- \override Staff.StringNumber #'transparent =
-##t
- \clef "G_8" \symbols }
- \chords { \set chordChanges = ##t \powerChords a1:1.5 | a1:1.5 | d4 d4.:sus4 d4. | d4 d4.:sus4 d4. }
- \new TabStaff {
- \override Staff.Clef #'stencil = #(lambda (grob)
- (grob-interpret-markup grob TAB))
- \symbols }
- >>
-}
diff --git a/lilypond/Etoiles_filantes-1.ly b/lilypond/Etoiles_filantes-1.ly
deleted file mode 100644
index 9672860d..00000000
--- a/lilypond/Etoiles_filantes-1.ly
+++ /dev/null
@@ -1,13 +0,0 @@
-\include "header"
-\paper{paper-height = 1.1\cm}
-
-\new \songbookstaff
-{
- \relative c'
- {
- \repeat volta 2
- {
- e'8 d e a, e' d e a, d c d g, d' c d g,
- }
- }
-}
diff --git a/lilypond/Etoiles_filantes-2.ly b/lilypond/Etoiles_filantes-2.ly
deleted file mode 100644
index 1b2c0c13..00000000
--- a/lilypond/Etoiles_filantes-2.ly
+++ /dev/null
@@ -1,20 +0,0 @@
-\include "header"
-\paper{paper-height = 2.3\cm}
-
-\new \songbookstaff
-{
- \relative c''
- {
- \repeat volta 2
- {
- a4 a8. b16 c8 d e d b4 b8. b16 b8 c b a
- g4 g8. g16 g8 a b a
- }
-
- \alternative
- {
- {a4. a8 g' f4 e8} {a,1}
- }
- }
-}
-
diff --git a/lilypond/Everybody_hurts.ly b/lilypond/Everybody_hurts.ly
deleted file mode 100644
index 11b62b16..00000000
--- a/lilypond/Everybody_hurts.ly
+++ /dev/null
@@ -1,28 +0,0 @@
-\include "header"
-\paper{
- paper-height = 3.1\cm
- paper-width= 7.1\cm
-}
-
-symbols = {
-
- d8 a d' fis' d' a d a d' fis' d' a
- g, g d' g' d' g g, g d' fis, g d'
- e, b, e e' b g e, b, e e' b g
- a, e a e' b g a, e a a, g, fis,
-}
-
-\score {
-
- <<
-
- %\new Staff { \clef "G_8" \symbols }
- \chords {d1. g e:m a }
- \new TabStaff {
- \numericTimeSignature
- \time 12/8
- \symbols }
-
- >>
-}
-
diff --git a/lilypond/Fairytale_of_New_York.ly b/lilypond/Fairytale_of_New_York.ly
deleted file mode 100644
index 7848edf1..00000000
--- a/lilypond/Fairytale_of_New_York.ly
+++ /dev/null
@@ -1,27 +0,0 @@
-\include "header"
-\paper{paper-height = 2.8\cm}
-
-\new \songbookstaff
-{
- \key d \major
- \time 2/4
- \partial 8 a'8
- \relative c''
- {
- b8 g cis e a, d, g fis e8. d16 d4
- }
-
- \time 6/8
- a'8.^\markup {
- (
- \smaller \general-align #Y #DOWN \note #"4" #1
- =
- \smaller \general-align #Y #DOWN \note #"4." #1
- ) }
-
- \relative c''
- {
- b16 a8 fis d fis a8. b16 a8 e8. fis16 e8
- fis e d b a b a b cis d4.
- }
-}
diff --git a/lilypond/Fuck_you.ly b/lilypond/Fuck_you.ly
deleted file mode 100644
index 121435f4..00000000
--- a/lilypond/Fuck_you.ly
+++ /dev/null
@@ -1,15 +0,0 @@
-\include "header"
-\paper{paper-height = 1.1\cm}
-
-\new \songbookstaff
-{
- \key c \major
- \time 4/4
- \relative c''{
- c4 g8 e4 c'8 g4
- b4 g8 g4 b8 g4
- f4 f8 c4 f8 a4
- b4 g8 g4 b8 g4
- }
-}
-
diff --git a/lilypond/Geste_heroique-1.ly b/lilypond/Geste_heroique-1.ly
deleted file mode 100644
index 45e97bfd..00000000
--- a/lilypond/Geste_heroique-1.ly
+++ /dev/null
@@ -1,38 +0,0 @@
-\include "header"
-\paper{paper-height = 5.0\cm}
-
-
-musique =
-{
- \parallelMusic #'(voiceA voiceB voiceC voiceD)
- {
- \repeat volta 2 {a'2 a'4 g' a' b' c''2 c''4 e'' d'' c'' c'' b' c''2 } |
- \repeat volta 2 {e'2 e'4 d' e' g' g'2 g'4 g' fis' g' a' g' g'2 } |
- \repeat volta 2 {c'2 c'4 b c' d' e'2 e'4 c' a e' d' d' e'2 } |
- \repeat volta 2 {a2 a4 e a g c2 c4 c d e f g c2 } |
-
- \repeat volta 2 {c''2 b'4 b' a' a' gis'2 gis' fis'8 gis' a'4 a' gis' a'2 } |
- \repeat volta 2 {g'2 g'4 g' e' f' e'2 e' d'4 e'4 e' e' cis'2 } |
- \repeat volta 2 {e'2 d'4 e' c' d' b2 c' a4 c'4 b b a2 } |
- \repeat volta 2 {c'2 g4 e a d e2 c d4 a,4 e e a,2 } |
- }
-}
-\score
-{
- \new PianoStaff
- <<
- \musique
- \new Staff
- {
- \key a \minor
- << \voiceA \\ \voiceB >>
- }
- \new Staff
- {
- \key a \minor
- \clef bass
- << \voiceC \\ \voiceD >>
- }
- >>
-}
-
diff --git a/lilypond/Geste_heroique-2.ly b/lilypond/Geste_heroique-2.ly
deleted file mode 100644
index e77682bc..00000000
--- a/lilypond/Geste_heroique-2.ly
+++ /dev/null
@@ -1,22 +0,0 @@
-\include "header"
-\paper{paper-height = 2.4\cm}
-
-\new \songbookstaff
-{
- \relative c''
- {
- \time 2/4
- \key c \major
- \repeat volta 2
- {
- e8 f g8 e d4 e8 g c,4 d8 f e d16 c b4
- c8. d16 c d c b a8 b c e b c b4
- }
- \alternative
- {
- {a8. b16 cis4}
- {a2\trill}
- }
- }
-}
-
diff --git a/lilypond/Hannah_1.ly b/lilypond/Hannah_1.ly
deleted file mode 100644
index 1d87155a..00000000
--- a/lilypond/Hannah_1.ly
+++ /dev/null
@@ -1,16 +0,0 @@
-\include "header"
-\paper{paper-height = 1.2\cm}
-
-
-
-
-{
- \key d \major \time 4/4
- \relative c''
- {
- d8. cis16 d8 a' g2
- cis,4 d8 e fis e d cis
- b4 d e fis8 g
- cis,2 b}
-
-}
diff --git a/lilypond/Hannah_2.ly b/lilypond/Hannah_2.ly
deleted file mode 100644
index e9b1781a..00000000
--- a/lilypond/Hannah_2.ly
+++ /dev/null
@@ -1,16 +0,0 @@
-\include "header"
-\paper{paper-height = 2.4\cm}
-
-
-
-
-{
- \key d \major \time 4/4
- \relative c''
- {
- e4. d16 e fis8 e d d
- e4. a16 e g8 fis e4
- fis4. b8 b a16 g fis4
- fis4. cis'8 b2}
-
-}
diff --git a/lilypond/Heart_of_gold.ly b/lilypond/Heart_of_gold.ly
deleted file mode 100644
index 712c4c0d..00000000
--- a/lilypond/Heart_of_gold.ly
+++ /dev/null
@@ -1,16 +0,0 @@
-\include "header"
-\paper{paper-height = 3.6\cm}
-
-\new \songbookstaff
-{
- \key g \major
- \time 2/4
- \partial 4 {g'8 b'}
- \relative c''
- {
- d4 c16 b8. a4 g8 d8~ d2
- r4 d'4 g4 e16 d8. e4 d8 b8~ b2
- r4 g16 g8 g16 b16 b8 b16 b16 b8 b16 a4 b8 g8~ g2
- }
-}
-
diff --git a/lilypond/Holy_economic_war.ly b/lilypond/Holy_economic_war.ly
deleted file mode 100644
index 94f3f742..00000000
--- a/lilypond/Holy_economic_war.ly
+++ /dev/null
@@ -1,51 +0,0 @@
-\include "header"
-\paper{
- paper-height = 3 \cm
- paper-width= 13.4\cm
- line-width= 13.2\cm
-}
-
-TAB = \markup {
- \raise #1.5
- \sans
- \bold
- \huge
- \override #'(baseline-skip . 2.5)
- \left-align
- \center-column {
- T
- A
- B
- }
-}
-
-symbols = {
- \numericTimeSignature
- \time 4/4
- \repeat volta 2 {
- 8 g,
- 8 g, }
- \alternative {
- { a,4 g,16 a, \bendAfter#1 c8 a,8 4. }
- { a,4 c16 a, \bendAfter#1 g,8 a,8 4. }
-}
-\repeat volta 2 {
- a,16^"riff" e a e c8 a, c16 e a e c16 e a e }
-}
-
-\score {
- <<
-
- \new Staff
-
- {
- \override Staff.StringNumber #'transparent =
-##t
- \clef "G_8" \symbols }
- \chords { c4 g c g | a1:m | a1:m | a2:m c4 g4 }
- \new TabStaff {
- \override Staff.Clef #'stencil = #(lambda (grob)
- (grob-interpret-markup grob TAB))
- \symbols }
- >>
-}
diff --git a/lilypond/Il_pleut_bergere.ly b/lilypond/Il_pleut_bergere.ly
deleted file mode 100644
index f28e6f3c..00000000
--- a/lilypond/Il_pleut_bergere.ly
+++ /dev/null
@@ -1,18 +0,0 @@
-\include "header"
-\paper{paper-height = 4.8\cm}
-
-\new \songbookstaff
-{
- \relative c''
- {
- \time 6/8
- \key g \major
- \partial 8 b8
- d4 b8 d4 b8 g4. d4.
- g8. fis16 g8 a4 a8 b2.
- b8. a16 b8 c4 c8 d4. b4. d8. e16 d8 d (c) b b4. (a4.)
- a8. b16 a8 a4 c8 b4. d4.
- c8. b16 a8 b4 g8 b4. (a4) b8
- d4 b8 d4 b8 c4. e4. d8. e16 d8 a4 b8 g2.
- }
-}
diff --git a/lilypond/J_ai_deja_donne.ly b/lilypond/J_ai_deja_donne.ly
deleted file mode 100644
index e9a3a120..00000000
--- a/lilypond/J_ai_deja_donne.ly
+++ /dev/null
@@ -1,18 +0,0 @@
-\include "header"
-\paper {
- paper-width = 8.5\cm
- line-width = 8\cm
- paper-height = 2.5\cm
-}
-
-\score
-{ <<
-
- \relative c''
- { \key g \major
- \repeat volta 2 {g16 fis e4 d8 e4. fis16 g b c a4 g8 fis8. g16 a4}
- b4 e,8. b'16 c4 e,8. b'16 a4. g8 a16 b16 a4.~ a2
- r8 a16 g fis8 g a2 r8 a16 g fis8 e dis1
- }
- >>
-}
\ No newline at end of file
diff --git a/lilypond/Jessica.ly b/lilypond/Jessica.ly
deleted file mode 100644
index ff57850d..00000000
--- a/lilypond/Jessica.ly
+++ /dev/null
@@ -1,18 +0,0 @@
-\include "header"
-\paper{paper-height = 1.2\cm}
-
-\new \songbookstaff
-{
- \key c \major
- \time 2/4
- \relative c''
- {
- \repeat volta 2
- {
- c2 d2 e8. f16 g8. f16~ f8. e16 d4
- c2 d2 e8. f16 g8. c16~ c8. g16 e8. d16
- }
- c2
- }
-}
-
diff --git a/lilypond/Keep_on_the_sunny_side.ly b/lilypond/Keep_on_the_sunny_side.ly
deleted file mode 100644
index 157d133c..00000000
--- a/lilypond/Keep_on_the_sunny_side.ly
+++ /dev/null
@@ -1,17 +0,0 @@
-\include "header"
-\paper{paper-height = 3.6\cm}
-
-\new \songbookstaff
-{
- \key bes \major
- \time 2/4
- \relative c'
- {
- r8 f g a bes4 d8. bes16 c8 bes a g f2~
- f4 bes8 d f4 f8. g16 f8 d bes d c2~
- c4 c8 d ees4 d8 c f8. g16 f8 ees d8. d16 d8 c bes4
- bes8 d c8. c16 d8 c a f g a bes2
- }
-}
-
-
diff --git a/lilypond/Kiss_me_forever.ly b/lilypond/Kiss_me_forever.ly
deleted file mode 100644
index b51dc272..00000000
--- a/lilypond/Kiss_me_forever.ly
+++ /dev/null
@@ -1,20 +0,0 @@
-\include "header"
-\paper{
- paper-height = 0.8\cm
- paper-width = 3\cm
- line-width = 2.7\cm
-}
-
-<<
- \new RhythmicStaff {
- \new Voice = "myRhythm" {
- \numericTimeSignature
- \time 4/4
- \autoBeamOff
- a8[ a]
- \override NoteHead #'style = #'cross a[ \revert NoteHead #'style a]
- a8[ a]
- \override NoteHead #'style = #'cross a[ \revert NoteHead #'style a]
- }
- }
->>
\ No newline at end of file
diff --git a/lilypond/Kiss_the_children.ly b/lilypond/Kiss_the_children.ly
deleted file mode 100644
index e7a11c95..00000000
--- a/lilypond/Kiss_the_children.ly
+++ /dev/null
@@ -1,17 +0,0 @@
-\include "header"
-\paper{paper-height = 2.4\cm}
-
-\new \songbookstaff
-{
- \key c \minor
- \time 6/8
- \relative c'
- {
- \partial 8 c8
- g'4 g8 f8. d16 f8 g4. r4
- c,8 c'4 bes8 d4 f,8 g4. r8.
- g16 g bes c4 bes16 g bes4 d,8 f4. r4
- g8 g4 g8 f4 d8 c2.
- }
-}
-
diff --git a/lilypond/L_harmonica.ly b/lilypond/L_harmonica.ly
deleted file mode 100644
index cb3b62cc..00000000
--- a/lilypond/L_harmonica.ly
+++ /dev/null
@@ -1,17 +0,0 @@
-\include "header"
-\paper{paper-height = 5.0\cm}
-
-\new \songbookstaff
-{
- \key a \minor
- \time 2/4
- \partial 4 e''8. d''16
- \relative c''
- {
- c8 a a g e a a c b g16 a b8 g a4.
- e'16 d c8 a a g e a a e' e8. d16 c8 b a4.
- g8 c8. c16 c8 e d8. d16 d8 e c c a c b4.
- e16 d c8 a a g e a a e' e8. d16 c8 b a2
- }
-}
-
diff --git a/lilypond/La_biere_du_donjon.ly b/lilypond/La_biere_du_donjon.ly
deleted file mode 100644
index 4ec50f10..00000000
--- a/lilypond/La_biere_du_donjon.ly
+++ /dev/null
@@ -1,15 +0,0 @@
-\include "header"
-\paper{paper-height = 1.1\cm}
-
-\new \songbookstaff
-{
- \relative c''
- {
- \time 6/8
- \key a \minor
- \partial 8 e8
- b4 e8 c4 e8 e16 d c8 b c a e' %\break
- b4 e8 c4 e8 e16 d c8 b a4.
- }
-}
-
diff --git a/lilypond/La_blanche.ly b/lilypond/La_blanche.ly
deleted file mode 100644
index 58856201..00000000
--- a/lilypond/La_blanche.ly
+++ /dev/null
@@ -1,15 +0,0 @@
-\include "header"
-\paper{paper-height = 2.3\cm}
-
-\new \songbookstaff
-{
- \key d \major
- \relative c''
- {
- \time 6/8
- e16 fis g a g fis e4.
- e16 fis g a g fis e4.
- b'16 a g a g fis e4.
- e16 fis g a g fis e fis e d cis b ais8 ais cis fis4. dis8 dis fis b4.
- }
-}
diff --git a/lilypond/La_compagnie_du_chien_rugissant.ly b/lilypond/La_compagnie_du_chien_rugissant.ly
deleted file mode 100644
index 0cc95317..00000000
--- a/lilypond/La_compagnie_du_chien_rugissant.ly
+++ /dev/null
@@ -1,14 +0,0 @@
-\include "header"
-\paper{paper-height = 1.1\cm}
-
-\new \songbookstaff
-{
- \relative c''
- {
- \key c \minor
- \time 6/8
- \partial 8 c8
- ees8. f16 g8 f8. ees16 d8 c d bes c4.
- }
-}
-
diff --git a/lilypond/La_cumbia_del_mole.ly b/lilypond/La_cumbia_del_mole.ly
deleted file mode 100644
index 573330fc..00000000
--- a/lilypond/La_cumbia_del_mole.ly
+++ /dev/null
@@ -1,22 +0,0 @@
-\include "header"
-\paper{paper-height = 2.5\cm}
-
-\new \songbookstaff
-{
- \key e \minor
- \time 2/2
- \relative c'''
- {
- \repeat volta 2
- {
- g2 fis8 e4 dis8 e4. b8~ b4 e4
- }
- \alternative
- {
- { dis4. c4 b4 a8 b1 }
-
- { dis4. e4 fis4 dis8 e4. b4 g4 fis8 e1 }
- }
- }
-}
-
diff --git a/lilypond/La_danse_des_esquimaux.ly b/lilypond/La_danse_des_esquimaux.ly
deleted file mode 100644
index 16982618..00000000
--- a/lilypond/La_danse_des_esquimaux.ly
+++ /dev/null
@@ -1,20 +0,0 @@
-\include "header"
-\paper{paper-height = 2.3\cm}
-
-\new \songbookstaff
-{
- \key e \major
- \time 2/4
- \relative c''
- {
- \repeat volta 2
- {
- e8 e16 fis gis8 e a fis gis e dis fis e dis cis2
- }
- \repeat volta 2
- {
- a'8 \times 2/3{a16 gis fis} f8 gis fis cis fis gis fis8 fis4 d8 cis2
- }
- }
-}
-
diff --git a/lilypond/La_declaration.ly b/lilypond/La_declaration.ly
deleted file mode 100644
index e1eaacae..00000000
--- a/lilypond/La_declaration.ly
+++ /dev/null
@@ -1,19 +0,0 @@
-\include "header"
-\paper{paper-height = 1.1\cm}
-
-\new \songbookstaff
-{
- \key e \minor
- \time 4/4
- \relative c''
- {
- \repeat volta 2
- {
- b4 g8 e c' a~ a4
- r8 b g e dis e fis g
- e4. b'8 a4. g16 fis
- g2 fis2
- }
- }
-}
-
diff --git a/lilypond/La_fiancee_de_l_eau.ly b/lilypond/La_fiancee_de_l_eau.ly
deleted file mode 100644
index 33e23022..00000000
--- a/lilypond/La_fiancee_de_l_eau.ly
+++ /dev/null
@@ -1,17 +0,0 @@
-\include "header"
-\paper{paper-height = 3.7\cm}
-
-\new \songbookstaff
-{
- \key d \minor
- \time 6/8
- \relative c'''{
- a4. g f e8 d e
- d4. e f4 g8 a bes c
- bes4. a bes c8 bes a
- a4. g f8 e d
- e d c b c d
- e d c b4 a8 b4. c d e2.
- }
-}
-
diff --git a/lilypond/La_jument_de_Michao.ly b/lilypond/La_jument_de_Michao.ly
deleted file mode 100644
index ce17d5d5..00000000
--- a/lilypond/La_jument_de_Michao.ly
+++ /dev/null
@@ -1,90 +0,0 @@
-\include "header"
-\paper{paper-height = 13.7\cm}
-
-\new \songbookstaff
-{
- \key a \minor
- \relative c''
- {
- \time 2/4
- a8. d16 c8 b
- \repeat volta 2
- {
- a8. b16 a8 g
- a8. d16 c8 b a8 a16 b a8 g
- }
- \alternative
- {
- {a8. d16 c8 b } {a4 a8 a8}
- }
-
- \repeat volta 2
- {
- a8 a16 b c8 b16 a g4
- c8 b16 c d8 c16 b a8 g
- }
-
- \alternative
- {
- {a4 a8 a8} {a8. d16 c8 b}
- }
-
- a8. b16 a8 g
- a8. g16 a8 b c8. b16 a8 g a4 e8 a16 a
-
- \repeat volta 2
- {
- a8 a16 b c8 b16 a g4
- c8 b16 c d8 c16 b a8 g
- }
- \alternative
- {
- {a4 e8 a} {a8 a16 a16 d8 c8}
- }
-
- \repeat volta 2
- {
- a8 a16 a d8 c
- b8. b16 a8 b c8. b16 a8 g
- }
- \alternative
- {
- {a8. a16 d8 c8} {a4 e'4}
- }
-
- \repeat volta 2
- {
- e4 d8 f e4
- e4 d4 c8 b
- }
- \alternative
- {
- {e4 e4} {a,4 c4}
- }
-
- \repeat volta 2
- {
- e4 c8 a b4
- c4 d4 c8 b
- }
- \alternative
- {
- {e4 c4} {a2}
- }
-
- a'2 f2 c4 d
-
- \repeat volta 2
- {
- e4 c e4 d8 c b4 e4
- }
- \alternative
- {
- {f4 d8 c} {d4 b8 c}
- }
-
- a2 c2 d2 f4 e c2
- c2 d2 f4 g4 e2
- }
-}
-
diff --git a/lilypond/La_premiere_fois.ly b/lilypond/La_premiere_fois.ly
deleted file mode 100644
index 47f43b12..00000000
--- a/lilypond/La_premiere_fois.ly
+++ /dev/null
@@ -1,15 +0,0 @@
-\include "header"
-\paper{paper-height = 2.3\cm}
-
-\new \songbookstaff
-{
- \key ees \major
- \time 6/8
- \partial 4. c'8 d' ees'
- \relative c''
- {
- g2.~ g8 bes bes bes aes g g4. ees~ ees8 ees d c d ees \break
- g2.~ g8 c c c bes aes g2.
- }
-}
-
diff --git a/lilypond/La_reine.ly b/lilypond/La_reine.ly
deleted file mode 100644
index f19cb640..00000000
--- a/lilypond/La_reine.ly
+++ /dev/null
@@ -1,36 +0,0 @@
-\include "header"
-\paper{paper-height = 8.8\cm}
-
-
-\new \songbookstaff
-{
- \key e \minor
- \time 2/2
- \relative c''{
- b8 e4 b8 e4 b4 c b b b
- b8 e4 b8 e4 b c b\trill a2
- a2 fis'2 g4 fis\trill e e fis2 g4 fis\trill e1
-
- fis1 g e2 g4 fis8 e d1
- e2. d8 c b2. g4 a4. b16 a g4 fis
-
- e8 e16 e e8 g c b4 g8
- e8 e16 e e8 g fis'4 e
-
- <<
- {fis1 | g | e2 g4 fis8 e | d1 |
- e2. d8 c | b2. g4 | a4. b16 a g4 fis |
- e8 e16 e e8 g c b4 g8}
- \\
- {
- d'4. g8 g4 d' | c b2 a4 | g4 e g a |
- \times 2/3 {b8 [c b]} \times 2/3{ a8 [b a]} g4 g |
- a8 g a4 b c | b e e e | dis2 b2 | e1}
- >>
-
- e,,8 e16 e e8 g c b4 g8
- e8 e16 e e8 g c b4 g8
- e4 b e b
- }
-}
-
diff --git a/lilypond/La_revolution.ly b/lilypond/La_revolution.ly
deleted file mode 100644
index ecf08bc3..00000000
--- a/lilypond/La_revolution.ly
+++ /dev/null
@@ -1,6 +0,0 @@
-\include "header"
-\paper{paper-height = 1.2\cm} {
- \key bes \minor \time 4/4
- \relative c'
-{
- \repeat volta 2 {f8( bes4.) \times 2/3 {c8( des c)} bes8\staccato ges\staccato bes8\staccato ges2 \times 2/3 {ees8( f ges)} ees8}}}
diff --git a/lilypond/La_seine_riff1.ly b/lilypond/La_seine_riff1.ly
deleted file mode 100644
index a2c89bba..00000000
--- a/lilypond/La_seine_riff1.ly
+++ /dev/null
@@ -1,11 +0,0 @@
-\include "header"
-\paper{
- paper-height = 1.1\cm
- paper-width = 2.5\cm
- line-width = 2.2\cm
-}
-
-\new TabStaff \relative c, {
- \numericTimeSignature
- r2 f8 e f gis
-}
\ No newline at end of file
diff --git a/lilypond/La_seine_rythm.ly b/lilypond/La_seine_rythm.ly
deleted file mode 100644
index 1b77a74b..00000000
--- a/lilypond/La_seine_rythm.ly
+++ /dev/null
@@ -1,18 +0,0 @@
-\include "header"
-\paper{
- paper-height = 2.4\cm
- paper-width = 7.1\cm
-}
-
-<<
- \new RhythmicStaff {
- \new Voice = "myRhythm" {
- \numericTimeSignature
- \time 4/4
- a8^"Rythm verse" a~ a16 a a a a8 a~ a16 a a a
- a8^"Rythm chorus" a16 a \override NoteHead #'style = #'cross a8. \revert NoteHead #'style a16 a8 a16 a \override NoteHead #'style = #'cross a8. \revert NoteHead #'style a16
- a4.^"Rythm bridge" a8~ a2
-
- }
- }
->>
\ No newline at end of file
diff --git a/lilypond/La_sorciere_Grabouilla.ly b/lilypond/La_sorciere_Grabouilla.ly
deleted file mode 100644
index 83d4e60b..00000000
--- a/lilypond/La_sorciere_Grabouilla.ly
+++ /dev/null
@@ -1,28 +0,0 @@
-\include "header"
-\paper{paper-height = 6.1\cm}
-
-\new \songbookstaff
-{
- \key e \minor
- \time 2/4
- \relative c'
- {
- r4 r8 e8
- \repeat volta 2
- {
- b'8 b a b g4. g8 fis fis g fis e4
- dis8 e e4 dis8 e e4 dis8 e e4 dis8 e e4. e8
- }
-
- a8 a a fis g4. g8 fis fis g a b4. b8
- c c c a b4. g8 fis fis g fis e4
- dis8 e e4 dis8 e e4 dis8 e e4 dis8 e e4. e8
-
- \repeat volta 2
- {
- c'4 a b g a8 a g a b2
- c4 a b g a8 a g fis e2
- }
- }
-}
-
diff --git a/lilypond/La_tribu_de_Dana.ly b/lilypond/La_tribu_de_Dana.ly
deleted file mode 100644
index 1236ad1b..00000000
--- a/lilypond/La_tribu_de_Dana.ly
+++ /dev/null
@@ -1,27 +0,0 @@
-\include "header"
-\paper
-{
- paper-width = 15\cm
- line-width = 14.5\cm
- paper-height = 1.4\cm
-}
-
-\new \songbookstaff
-{
- \key c \minor
- \time 2/4
- \partial 8 g'8
- \relative c''
- {
- \repeat volta 2
- {
- c8\trill bes c d ees4. d16 ees f8 ees d\trill c
- }
- \alternative
- {
- {ees4 d8 g,8} {ees'8 f ees d\trill }
- }
- c4. c8 bes4 ees8 d c4 c8 bes16 a16 g8 a bes\trill g
- c4. d8 bes bes ees8 d c c\trill bes4 c2
- }
-}
diff --git a/lilypond/La_vie_d_aventurier.ly b/lilypond/La_vie_d_aventurier.ly
deleted file mode 100644
index ac05e84c..00000000
--- a/lilypond/La_vie_d_aventurier.ly
+++ /dev/null
@@ -1,16 +0,0 @@
-\include "header"
-\paper{paper-height = 2.4\cm}
-
-\new \songbookstaff
-{
- \key a \minor
- \partial 8 e'8
- \relative c''
- {
- a4. b8 c8 d4 c8 b8 a4 g8 a4. e8 %\break
- a4. c16 b c8 d4 e8 d2~ d4. d8 %\break
- e4. d16 e d8 c4 b8 c8 b4 g8 a4. e8 %\break
- a4. b16 a g8 e4 g8 a1
- }
-}
-
diff --git a/lilypond/Le_cafe_des_jours_heureux.ly b/lilypond/Le_cafe_des_jours_heureux.ly
deleted file mode 100644
index 6f09347a..00000000
--- a/lilypond/Le_cafe_des_jours_heureux.ly
+++ /dev/null
@@ -1,14 +0,0 @@
-\include "header"
-\paper{paper-height = 2.3\cm}
-
-\new \songbookstaff
-{
- \relative c'
- {
- \time 2/2
- \key e \minor
- e8. fis16 g8. a16 b4 e b2.
- b4 c2. c4 b2. g4 a2. a4 g2~ g8. e16 fis8. g16 fis2~ fis8. e16 g8. fis16 e1
- }
-}
-
diff --git a/lilypond/Le_dernier_troscon.ly b/lilypond/Le_dernier_troscon.ly
deleted file mode 100644
index 95890e01..00000000
--- a/lilypond/Le_dernier_troscon.ly
+++ /dev/null
@@ -1,48 +0,0 @@
-\include "header"
-\paper{
- paper-height = 2 \cm
- paper-width= 6.7\cm
- line-width= 8\cm
-}
-
-TAB = \markup {
- \raise #1.5
- \sans
- \bold
- \huge
- \override #'(baseline-skip . 2.5)
- \left-align
- \center-column {
- T
- A
- B
- }
-}
-
-symbols = {
- \numericTimeSignature
- \time 4/4
- \repeat volta 4 {
- 4 f\5 e\5 g\4
- f\4 a\4 g\4 8 e\4
- d4 f\4 e\4 g\4
- f\4 e\4 d c\5
-}
-}
-
-\score {
- <<
-
- \new Staff
-
- {
- \override Staff.StringNumber #'transparent =
-##t
- \clef "G_8" \symbols }
- %\chords { d2 c | f c | d c | f c }
- \new TabStaff {
- \override Staff.Clef #'stencil = #(lambda (grob)
- (grob-interpret-markup grob TAB))
- \symbols }
- >>
-}
diff --git a/lilypond/Le_joueur_de_pipeau.ly b/lilypond/Le_joueur_de_pipeau.ly
deleted file mode 100644
index 0c00b089..00000000
--- a/lilypond/Le_joueur_de_pipeau.ly
+++ /dev/null
@@ -1,12 +0,0 @@
-\include "header"
-\paper{paper-height = 1.1\cm}
-
-\new \songbookstaff
-{
- \key d \minor
- \relative c''
- {
- \time 3/4
- a4.( bes8 a g) f4.( g8 a c) a4.( bes8 c d) a2.
- }
-}
diff --git a/lilypond/Le_jour_s_est_leve.ly b/lilypond/Le_jour_s_est_leve.ly
deleted file mode 100644
index c487dffb..00000000
--- a/lilypond/Le_jour_s_est_leve.ly
+++ /dev/null
@@ -1,52 +0,0 @@
-\include "header"
-\paper{
- paper-height = 4\cm
- paper-width= 8\cm
- line-width= 8\cm
-}
-
-TAB = \markup {
- \raise #1.5
- \sans
- \bold
- \huge
- \override #'(baseline-skip . 2.5)
- \left-align
- \center-column {
- T
- A
- B
- }
-}
-
-symbols = {
- \numericTimeSignature
- \time 4/4
- 2
- 2
- 2
- d16\5 dis\5 f8\4 f16\4 g16\4 gis8\4
-
- 2
- 2
- 2
- d8\5 dis\5 f\4 d8\5
-
-}
-
-\score {
- <<
-
- \new Staff
-
- {
- \override Staff.StringNumber #'transparent =
-##t
- \clef "G_8" \symbols }
- %\chords { c2 | f2| g1 | c2 | f2| g1 }
- \new TabStaff {
- \override Staff.Clef #'stencil = #(lambda (grob)
- (grob-interpret-markup grob TAB))
- \symbols }
- >>
-}
diff --git a/lilypond/Le_laride_du_poulet.ly b/lilypond/Le_laride_du_poulet.ly
deleted file mode 100644
index 44faffc4..00000000
--- a/lilypond/Le_laride_du_poulet.ly
+++ /dev/null
@@ -1,21 +0,0 @@
-\include "header"
-\paper{paper-height = 2.4\cm}
-
-\new \songbookstaff
-{
- \key a \minor
- \time 2/4
- \relative c''
- {
- \partial 8 a8
- \repeat volta 2
- {
- a8 b c8. c16 b8 b a g a b c8. c16 b8 b a a
- }
- \repeat volta 2
- {
- a8 a e'8. d16 c8 d b a a a e'8. d16 c8 d b a
- }
- }
-}
-
diff --git a/lilypond/Le_moustique.ly b/lilypond/Le_moustique.ly
deleted file mode 100644
index 12699771..00000000
--- a/lilypond/Le_moustique.ly
+++ /dev/null
@@ -1,21 +0,0 @@
-\include "header"
-\paper{paper-height = 2.4\cm}
-
-\new \songbookstaff
-{
- \relative c''
- {
- \key f \major
- \time 2/4
- \partial 8 c8
- \repeat volta 2
- {
- f4 d e c8 d8\(d8\) d4 a8 bes4. c8 e8 e c4 d a8 c8\(c8\) bes4 g8
- }
- \alternative
- {
- { f4. c'8 }
- { f,2 }
- }
- }
-}
diff --git a/lilypond/Le_p_tit_gars.ly b/lilypond/Le_p_tit_gars.ly
deleted file mode 100644
index b7eba149..00000000
--- a/lilypond/Le_p_tit_gars.ly
+++ /dev/null
@@ -1,23 +0,0 @@
-\include "header"
-\paper{
- paper-height = 1.1\cm
- line-width = 14.5\cm
- paper-width = 15\cm
-}
-
-\new \songbookstaff
-{
- \relative c''
- {
- \key a \minor
- \time 2/4
- \repeat volta 2
- {
- a8 c a c e d c b
- b g b d g f e d
- c b a b c d c b
- c d e d b d c b
- a2
- }
- }
-}
diff --git a/lilypond/Le_rat_de_l_opera-1.ly b/lilypond/Le_rat_de_l_opera-1.ly
deleted file mode 100644
index 70f5e8c2..00000000
--- a/lilypond/Le_rat_de_l_opera-1.ly
+++ /dev/null
@@ -1,18 +0,0 @@
-\include "header"
-\paper{paper-height = 6.0\cm}
-
-\new \songbookstaff
-{
- \key a \major
- \time 3/8
- \relative c''
- {
- r4 cis16 b a gis a b cis d e8. eis16 fis gis
- a8. gis16 b a gis4 fis16 r
- fis4 d16 cis cis b b a gis a b ais b e dis e cis8
- r16 d cis b a gis a b cis d e dis e eis fis gis
- a gis a cis b a gis4 fis16 r
- fis4 d16 cis cis b b a gis a b ais b e dis e a,4.
- }
-}
-
diff --git a/lilypond/Le_rat_de_l_opera-2.ly b/lilypond/Le_rat_de_l_opera-2.ly
deleted file mode 100644
index f15946a7..00000000
--- a/lilypond/Le_rat_de_l_opera-2.ly
+++ /dev/null
@@ -1,17 +0,0 @@
-\include "header"
-\paper{paper-height = 3.8\cm}
-
-\new \songbookstaff
-{
- \key a \major
- \time 3/8
- \relative c''
- {
- r4 r16 cis-. d-. e-. fis-. gis-. a-. b-.
- cis4.~ cis16 cis cis cis cis cis
- cis (b) b b b b b (a) a a a a
- a (gis) gis gis gis gis gis (fis) fis fis fis fis
- fis (e) e e e e dis8 dis dis d4.
- }
-}
-
diff --git a/lilypond/Le_vent_nous_portera.ly b/lilypond/Le_vent_nous_portera.ly
deleted file mode 100644
index bdb2e557..00000000
--- a/lilypond/Le_vent_nous_portera.ly
+++ /dev/null
@@ -1,19 +0,0 @@
-\include "header"
-\paper{paper-height = 2.6\cm}
-
-\new \songbookstaff
-{
- \key e \minor
- \time 2/4
- \relative c''
- {
- \repeat volta 2
- {
- b8( g b g b g b c)
- b( g b g b g a fis)
- a( fis a fis a fis a c)
- b( g b g b g b c)
- }
- }
-}
-
diff --git a/lilypond/Lea.ly b/lilypond/Lea.ly
deleted file mode 100644
index 5a6f0e2c..00000000
--- a/lilypond/Lea.ly
+++ /dev/null
@@ -1,13 +0,0 @@
-\include "header"
-\paper{paper-height = 2.4\cm}
-
-\new \songbookstaff
-{
- \key a \minor
- \time 2/4
- \relative c''
- {
- e8. f16 g8 a g f e4 e16 f e d e8 c b c a4
- e'8. f16 g8 a g16 a g f e4 e16 f e d e8 c << {e2} \\ {b2} >>
- }
-}
diff --git a/lilypond/Les_hommes_que_j_aime.ly b/lilypond/Les_hommes_que_j_aime.ly
deleted file mode 100644
index 1e77ff33..00000000
--- a/lilypond/Les_hommes_que_j_aime.ly
+++ /dev/null
@@ -1,16 +0,0 @@
-\include "header"
-\paper{paper-height = 2.4\cm}
-
-\new \songbookstaff
-{
- \relative c''
- {
- \key d \minor
- \time 2/4
- \repeat volta 2
- {
- a8 a4 f8 e4. d16 e16 f8 d16 e f8 e d8 d e f
- a8 a4 bes8 c4. bes8 c16 bes a8\(a8\) g a2
- }
- }
-}
diff --git a/lilypond/Les_mains_froides.ly b/lilypond/Les_mains_froides.ly
deleted file mode 100644
index 727ce529..00000000
--- a/lilypond/Les_mains_froides.ly
+++ /dev/null
@@ -1,14 +0,0 @@
-\include "header"
-\paper{paper-height = 2.3\cm}
-
-\new \songbookstaff
-{
- \relative c''
- {
- \time 4/4
- \key d \minor
- \partial 2. a4 f d
- e e8 e e4 d8. c16 d4 a'4 f d e e8 e e4 d8. c16 d1
- }
-}
-
diff --git a/lilypond/Les_souliers_de_Lady_Fae-1.ly b/lilypond/Les_souliers_de_Lady_Fae-1.ly
deleted file mode 100644
index 9cbdead5..00000000
--- a/lilypond/Les_souliers_de_Lady_Fae-1.ly
+++ /dev/null
@@ -1,14 +0,0 @@
-\include "header"
-\paper{paper-height = 2.4\cm}
-
-\new \songbookstaff
-{
- \key e \minor
- \time 6/8
- \relative c'
- {
- b'8. a16 g fis e8 fis16 g a8 b a g a g16 fis e8 %\break
- b'8. a16 g fis e8 fis16 g a8 c b a b4.
- }
-}
-
diff --git a/lilypond/Les_souliers_de_Lady_Fae-2.ly b/lilypond/Les_souliers_de_Lady_Fae-2.ly
deleted file mode 100644
index 92a5335a..00000000
--- a/lilypond/Les_souliers_de_Lady_Fae-2.ly
+++ /dev/null
@@ -1,16 +0,0 @@
-\include "header"
-\paper{paper-height = 3.6\cm}
-
-\new \songbookstaff
-{
- \key a \minor
- \time 6/8
- \relative c''
- {
- a8 b16 c d8 e8 d e f e d e4.
- a,8 b16 c d8 e8 c e d8 b d c8 b16 a g8
-
- a8 b16 c d8 e8 d e f e d e4.
- d8 b d c8 b16 a g8 a8 b c a4.
- }
-}
diff --git a/lilypond/Les_souliers_rouges.ly b/lilypond/Les_souliers_rouges.ly
deleted file mode 100644
index aabd84cc..00000000
--- a/lilypond/Les_souliers_rouges.ly
+++ /dev/null
@@ -1,27 +0,0 @@
-\include "header"
-\paper{paper-height = 3.6\cm}
-
-\new \songbookstaff
-{
- \key g \major
- \time 2/4
- \relative c''
- {
- r8 g'16 fis e d b a g2
- r8 g'16 fis e d b a g'2
-
- \new Voice
- {
- \set countPercentRepeats = ##t
- \repeat "percent" 3 { a,16 b b b a b b b }
- }
-
- \repeat volta 2
- {
- g8 g16 g g8 e d8 g16 g a8 a16 a b8
- g16 g g8 e d8 g16 g a8 a16 a
- }
- g2
- }
-}
-
diff --git a/lilypond/Lino.ly b/lilypond/Lino.ly
deleted file mode 100644
index 0f24266f..00000000
--- a/lilypond/Lino.ly
+++ /dev/null
@@ -1,19 +0,0 @@
-\include "header"
-\paper{paper-height = 1.4\cm}
-
-\new \songbookstaff
-{
- \key d \minor
- \time 4/4
- \relative c''
- {
- \repeat volta 2
- {
- d2~ d8 e4 f8 a1
- }
- \alternative
- {
- {g2. f4 e2. f8 e} {g2. bes4 a1}
- }
- }
-}
diff --git a/lilypond/Losing_my_religion_bridge.ly b/lilypond/Losing_my_religion_bridge.ly
deleted file mode 100644
index d124eb7e..00000000
--- a/lilypond/Losing_my_religion_bridge.ly
+++ /dev/null
@@ -1,52 +0,0 @@
-\include "header"
-\paper{
- paper-height = 1.5 \cm
- paper-width= 5.2\cm
- line-width= 5\cm
-}
-
-TAB = \markup {
- \raise #1.5
- \sans
- \bold
- \huge
- \override #'(baseline-skip . 2.5)
- \left-align
- \center-column {
- T
- A
- B
- }
-}
-
-symbols = {
- \numericTimeSignature
- \time 4/4
- \repeat volta 2 {
-
-
- e'8 e' e' d' d' d' d' d'
- c' c' c' a a a a a
- }
-
-
-}
-
-\score {
- <<
- \chords { c1| a1:m }
- \new Staff
-
- {
-
- \override Staff.StringNumber #'transparent =
-##t
-
- \clef "G_8" \symbols }
-
- % \new TabStaff {
- % \override Staff.Clef #'stencil = #(lambda (grob)
- % (grob-interpret-markup grob TAB))
- % \symbols }
- >>
-}
diff --git a/lilypond/Losing_my_religion_intro.ly b/lilypond/Losing_my_religion_intro.ly
deleted file mode 100644
index a8dbdef2..00000000
--- a/lilypond/Losing_my_religion_intro.ly
+++ /dev/null
@@ -1,64 +0,0 @@
-\include "header"
-\paper{
- paper-height = 5.5 \cm
- paper-width= 8\cm
- line-width= 7.5\cm
-}
-
-TAB = \markup {
- \raise #1.5
- \sans
- \bold
- \huge
- \override #'(baseline-skip . 2.5)
- \left-align
- \center-column {
- T
- A
- B
- }
-}
-
-symbols = {
- \numericTimeSignature
- \time 4/4
- r2 8 d a, |
- \repeat volta 2 {
-
- \improvisationOn
- 4~ 8 ~ ~
-
- \improvisationOff
- 8 d a,
- }
- \alternative {
- { \improvisationOn
- 4~ 8 ~ ~
-
- \improvisationOff
- 8 d a, }
- { \improvisationOn
- 4 8 ~
- 4 8 ~ }
-}
-
-}
-
-\score {
- <<
- \chords { r1| f1 | f1 | a1:m | a1:m a1:m g1 }
- \new Staff
-
- {
-
- \override Staff.StringNumber #'transparent =
-##t
-
- \clef "G_8" \symbols }
-
- %\new TabStaff {
- % \override Staff.Clef #'stencil = #(lambda (grob)
- % (grob-interpret-markup grob TAB))
- % \symbols }
- >>
-}
diff --git a/lilypond/Ma_gonzesse.ly b/lilypond/Ma_gonzesse.ly
deleted file mode 100644
index 5bd56d07..00000000
--- a/lilypond/Ma_gonzesse.ly
+++ /dev/null
@@ -1,12 +0,0 @@
-\include "header"
-\paper{paper-height = 2.4\cm}
-
-\new \songbookstaff
-{
- \key c \major
- \time 4/4
- \relative c''
- {
- g4 c4. g8 a c g' f f e c4 g8 a e4~ e4. e8 f g f4 d2 c8 d f g a b c4 a g f e2 d8 e f a4. b4 a2 g2
- }
-}
diff --git a/lilypond/Macumba.ly b/lilypond/Macumba.ly
deleted file mode 100644
index f46cbdb9..00000000
--- a/lilypond/Macumba.ly
+++ /dev/null
@@ -1,20 +0,0 @@
-\include "header"
-\paper{
- paper-height = 0.9\cm
- paper-width = 3.0\cm
- line-width = 2.7\cm
-}
-
-<<
- \new RhythmicStaff {
- \new Voice = "myRhythm" {
- \numericTimeSignature
- \time 4/4
- \autoBeamOff
- a8[ a]
- \override NoteHead #'style = #'cross a[ \revert NoteHead #'style a]
- a8[ a]
- \override NoteHead #'style = #'cross a[ \revert NoteHead #'style a]
- }
- }
->>
\ No newline at end of file
diff --git a/lilypond/Mamadou_avait_mal_aux_dents.ly b/lilypond/Mamadou_avait_mal_aux_dents.ly
deleted file mode 100644
index 7c6279a2..00000000
--- a/lilypond/Mamadou_avait_mal_aux_dents.ly
+++ /dev/null
@@ -1,20 +0,0 @@
-\include "header"
-\paper{paper-height = 5.0\cm}
-
-\new \songbookstaff
-{
- \key c \major
- \time 2/4
- \relative c''
- {
- c8 d e8 e16 e~ e8 f16 e d4
- b8 c d8 d16 d~ d8 e16 d c4
- a8 b c8 c16 c~ c8 d16 c b4
- gis8 a b8 b16 b~ b8 c16 b a4
-
- a8 a a8 a16 a~ a8 a16 a d4
- d8 d d8 d16 d~ d8 e16 f e4
- r8 e8 e4 d4 e4
- }
-}
-
diff --git a/lilypond/Marchand_de_couleurs.ly b/lilypond/Marchand_de_couleurs.ly
deleted file mode 100644
index 7ea1e689..00000000
--- a/lilypond/Marchand_de_couleurs.ly
+++ /dev/null
@@ -1,16 +0,0 @@
-\include "header"
-\paper{paper-height = 2.4\cm}
-
-\new \songbookstaff
-{
- \key a \minor
- \time 12/8
- \relative c''
- {
- a4. e' c f
- a,4. e' c g'
- a,4 a'8 e4. c8 e c f4.
- a,4 a'8 e4. c8 e c g'4.
- }
-}
-
diff --git a/lilypond/Midnite_man.ly b/lilypond/Midnite_man.ly
deleted file mode 100644
index 08531be9..00000000
--- a/lilypond/Midnite_man.ly
+++ /dev/null
@@ -1,24 +0,0 @@
-\include "header"
-\paper{
- paper-height = 1.4\cm
- paper-width= 4.0\cm
- line-width= 3.7\cm
-}
-
-symbols = {
- \numericTimeSignature
- \time 4/4
- \autoBeamOff
- \partial 4. e,8
- g,[ gis,] |
- \autoBeamOn a,4
- \autoBeamOff
- \repeat percent 3 { 8[ ]}
-}
-
-\score {
- <<
- \new Staff { \clef "G_8" \symbols }
- % \new TabStaff { \symbols }
- >>
-}
diff --git a/lilypond/Morgane_de_toi.ly b/lilypond/Morgane_de_toi.ly
deleted file mode 100644
index 91972e28..00000000
--- a/lilypond/Morgane_de_toi.ly
+++ /dev/null
@@ -1,12 +0,0 @@
-\include "header"
-\paper{paper-height = 1.2\cm}
-
-\new \songbookstaff
-{
- \key c \major
- \time 4/4
- \relative c'
- {
- r4 f8 g a g f4 e8 e f e~ e2 r4 e8 f g f e4 d8 d d d~ d4
- }
-}
diff --git a/lilypond/Mrs_McGrath.ly b/lilypond/Mrs_McGrath.ly
deleted file mode 100644
index 99c796ed..00000000
--- a/lilypond/Mrs_McGrath.ly
+++ /dev/null
@@ -1,17 +0,0 @@
-\include "header"
-\paper{paper-height = 2.4\cm}
-
-\new \songbookstaff
-{
- \key d \minor
- \time 6/8
- \relative c''
- {
- \partial 8 { d,8}
- d4 a'8 a4 a8 a8 g f a4.
- a4 a8 a8 g f g4 c,8 c4.~ c4.
- r4 c8 c4 g'8 g4 g8 g8 f e g4.
- g4 g8 g8 f e f4 d8 d4.~ d2.
- }
-}
-
diff --git a/lilypond/New_york_avec_toi.ly b/lilypond/New_york_avec_toi.ly
deleted file mode 100644
index 9f3ee872..00000000
--- a/lilypond/New_york_avec_toi.ly
+++ /dev/null
@@ -1,22 +0,0 @@
-\include "header"
-\paper{
- paper-height = 1.1\cm
- line-width = 5.8\cm
- paper-width = 5.6\cm
-}
-
-symbols = {
- \numericTimeSignature
- \time 4/4
- \repeat volta 2 {
- 8 c cis
- r2
-}
-}
-
-\score {
- <<
- %\new Staff { \clef "G_8" \symbols }
- \new TabStaff { \symbols }
- >>
-}
\ No newline at end of file
diff --git a/lilypond/Noel_en_Mordor.ly b/lilypond/Noel_en_Mordor.ly
deleted file mode 100644
index 65430ca0..00000000
--- a/lilypond/Noel_en_Mordor.ly
+++ /dev/null
@@ -1,22 +0,0 @@
-\include "header"
-\paper{paper-height = 2.4\cm}
-
-\new \songbookstaff
-{
- \key c \minor
- \time 2/4
- \partial 4 g'8 g'
- \relative c''
- {
- c bes c d ees4
- d8 ees f4 ees8 d ees4
- g,8 g c bes c d ees 4
- d8 ees f f ees d c2
- \repeat volta 4
- {
- g4 g8 g f4. g8 aes g f ees d2
- }
- }
-}
-
-
diff --git a/lilypond/Notre_monde.ly b/lilypond/Notre_monde.ly
deleted file mode 100644
index 7ff92e2a..00000000
--- a/lilypond/Notre_monde.ly
+++ /dev/null
@@ -1,16 +0,0 @@
-\include "header"
-\paper{paper-height = 2.4\cm}
-
-\new \songbookstaff
-{
- \key e \minor
- \time 4/4
- \relative c'
- {
- \repeat volta 2
- {r8 e g a b4 d b g' b, d8 b8~ b8 d4 b8 a4 b8 a8~ a1}
- \repeat volta 2
- {r8 a4 b8 c2~ c8 b4 a8 b2~ b8 a4 g8 a4 b8 a8~ a1}
- }
-}
-
diff --git a/lilypond/Nuit_humide_1.ly b/lilypond/Nuit_humide_1.ly
deleted file mode 100644
index b4832bf2..00000000
--- a/lilypond/Nuit_humide_1.ly
+++ /dev/null
@@ -1,17 +0,0 @@
-\include "header"
-\paper{paper-height = 4.0\cm}
-
-\new \songbookstaff
-{
- \key e \minor
- \time 2/4
- \tempo 2 = 60
- \relative c''
- {
- b8 c d g, a b d, e fis g a4 b2
- b8 c d g, a b d, e fis g a b a g fis4
- b8 c d g, a b d, e fis g a4 b2
- b8 c d g, a b a g fis e d4 e2
- }
-}
-
diff --git a/lilypond/Nuit_humide_2.ly b/lilypond/Nuit_humide_2.ly
deleted file mode 100644
index f54c9bf7..00000000
--- a/lilypond/Nuit_humide_2.ly
+++ /dev/null
@@ -1,18 +0,0 @@
-\include "header"
-\paper{paper-height = 4.0\cm}
-
-\new \songbookstaff
-{
- \key e \minor
- \time 4/4
- \tempo 2 = 60
- \relative c''
- {
- e4 b8 e e4 \times 2/3{g8 fis e} d4 e4 <<{e2}\\{b2}>>
- g8 a b a g fis e d e fis g a b4 c8 b
- e4 b8 e e4 \times 2/3{g8 fis e} d4 e4 <<{e2}\\{b2}>>
- g8 a b a g fis g a b b \times 2/3{a' g fis} e2
- }
-}
-
-
diff --git a/lilypond/One_more_cup_of_coffee.ly b/lilypond/One_more_cup_of_coffee.ly
deleted file mode 100644
index 422a4e2c..00000000
--- a/lilypond/One_more_cup_of_coffee.ly
+++ /dev/null
@@ -1,28 +0,0 @@
-\include "header"
-\paper
-{
- paper-width = 15.5\cm
- line-width = 15\cm
- paper-height = 1.5\cm
-}
-
-\new \songbookstaff
-{
- \key a \minor
- \time 2/4
- \partial 8 a'8
- \relative c''
- {
- b8 a4 g8 f4.\trill g8
- <<
- {a8 g4 f8 e2}
- \\
- {f4 f' e2}
- >>
- r4 c16 b a e
- c4. a8 g8 g'8~ g4~ g8 b4 a16 g
- | f16 a c f a8 c8~ c8 d4 c8 | b4.\trill a8 | gis2 |
- r4 c,4 | d4. c8 | b16 a g4 a8 | e2 |
- }
-}
-
diff --git a/lilypond/Ou_je_vais.ly b/lilypond/Ou_je_vais.ly
deleted file mode 100644
index 3444b93b..00000000
--- a/lilypond/Ou_je_vais.ly
+++ /dev/null
@@ -1,14 +0,0 @@
-\include "header"
-\paper{paper-height = 1.2\cm}
-
-\new \songbookstaff
-{
- \key d \minor
- \relative c'{
- \repeat volta 2 {
- d8 e f g a4 g8 f g4 f8 e d2
- d8 e f g a4 c bes a8 g a2
- }
- }
-}
-
diff --git a/lilypond/Pauvre_planete.ly b/lilypond/Pauvre_planete.ly
deleted file mode 100644
index f6e3ba58..00000000
--- a/lilypond/Pauvre_planete.ly
+++ /dev/null
@@ -1,21 +0,0 @@
-\include "header"
-\paper{paper-height = 2.4\cm}
-
-
-
-
-{
- \key d \major \time 4/4
- \relative c'
-'
- {
- \repeat volta 4 {g8 fis e fis g fis g a b1
- fis8 e d e fis2}
- \alternative{
- {e8 fis g fis e4}
- {e8 fis e d cis b}
- {e8 fis g fis e4}
- {e8 fis e d cis b}
- }
- }
-}
diff --git a/lilypond/Petit_Pierrot.ly b/lilypond/Petit_Pierrot.ly
deleted file mode 100644
index 6d138a45..00000000
--- a/lilypond/Petit_Pierrot.ly
+++ /dev/null
@@ -1,35 +0,0 @@
-\include "header"
-\paper{
- paper-height = 2.6\cm
-}
-
-\new \songbookstaff
-{
- \relative c''
- {
- \key a \minor
- \time 6/8
-
- \repeat volta 2
- {
- b4. b8 d b c4. c8 d c b4. b8 c b
- }
- \alternative
- {
- {a4 a16 b c8 b a} {a2.}
- }
-
- \repeat volta 2
- {
- <<
- {e'4.~ e8 f e f4.~ f8 e d f4. e4 d8 e2. }
- \\
- {c4.~ c8 d c d4.~ d8 c b d4. c4 b8 a4 a16 b c8 b a}
- >>
- }
-
-% e f e f e d e d e c
-
-
- }
-}
diff --git a/lilypond/Rue_de_Paname.ly b/lilypond/Rue_de_Paname.ly
deleted file mode 100644
index 4cac5e18..00000000
--- a/lilypond/Rue_de_Paname.ly
+++ /dev/null
@@ -1,15 +0,0 @@
-\include "header"
-\paper{paper-height = 3.6\cm}
-
-\new \songbookstaff
-{
- \key bes \major
- \time 6/8
- \relative c''
- {
- bes4 bes8 bes a bes c4. d4 c8 bes4. d4 bes8 << {c2.}\\{r4. f,8 g a} >>
- bes4 bes8 bes a bes c4. d4 c8 d4 d8 bes4 d8 c4. a4.
- \repeat volta 2 {bes4 g8 g a bes a2.}
- bes4 g8 g a bes a4. a4 bes8 c4. d4 bes8 c2.
- }
-}
diff --git a/lilypond/Rue_de_Paname_acc.ly b/lilypond/Rue_de_Paname_acc.ly
deleted file mode 100644
index 88868536..00000000
--- a/lilypond/Rue_de_Paname_acc.ly
+++ /dev/null
@@ -1,12 +0,0 @@
-\include "header"
-\paper{paper-height = 3.6\cm}
-
-\new \songbookstaff
-{
- \key bes \major
- \time 6/8
- \relative c''
- {
- d4. f4 d8 c4.~ c8 bes c d4. d8 f d c4. a8 bes c d4. d8 g d c4. a8 bes c d4 d8 d ees d c c d ees d c \repeat volta 2 {d8 g, bes d g d c2.} d8 g, bes d g d c4.~ c8 bes a bes4. ees4 bes8 a2.
- }
-}
diff --git a/lilypond/Rue_du_temps.ly b/lilypond/Rue_du_temps.ly
deleted file mode 100644
index e223ff32..00000000
--- a/lilypond/Rue_du_temps.ly
+++ /dev/null
@@ -1,16 +0,0 @@
-\include "header"
-\paper{paper-height = 1.1\cm}
-
-\new \songbookstaff
-{
- \key d \minor
- \time 6/8
- \relative c''
- {
- \repeat volta 2
- {
- a4. a8 g f e4. e8 f e d4 a'8 a g f e2.
- }
- }
-}
-
diff --git a/lilypond/Sad_Lisa.ly b/lilypond/Sad_Lisa.ly
deleted file mode 100644
index ccb9df29..00000000
--- a/lilypond/Sad_Lisa.ly
+++ /dev/null
@@ -1,19 +0,0 @@
-\include "header"
-\paper{paper-height = 5.0\cm}
-
-\new \songbookstaff
-{
- \key e \minor
- \time 4/4
- \partial 4 b'4
- \relative c''
- {
- e4 fis8 g4 fis4~ fis8 e8 fis g4 fis4. g16 fis e2~ e4.
- g8 fis4 d8 e4 fis8 g4 a2 b2~ b4
- g8 a b4. a8~ a8 b8 d4 g,2 a1
- g8 fis g8 a8~ a4 g4 fis8 e fis g8~ g4.
- g8 fis e d e8~ e4 fis8 g a4. b8~ b2~ b2.
- g8 a b4. a8~ a8 b8 d4 g,2 a2
- }
-}
-
diff --git a/lilypond/Sad_robot.ly b/lilypond/Sad_robot.ly
deleted file mode 100644
index db911656..00000000
--- a/lilypond/Sad_robot.ly
+++ /dev/null
@@ -1,14 +0,0 @@
-\include "header"
-\paper{paper-height = 2.4\cm}
-
-\new \songbookstaff
-{
- \key d \minor
- \time 2/4
- \relative c''
- {
- d8 a' d, a e' f c' a, e' a, a a~ a2
- c8 g' c, g d' e b' d, a' d, d d~ d2
- }
-}
-
diff --git a/lilypond/Saint-Jean-du-Doigt.ly b/lilypond/Saint-Jean-du-Doigt.ly
deleted file mode 100644
index e17f2e80..00000000
--- a/lilypond/Saint-Jean-du-Doigt.ly
+++ /dev/null
@@ -1,16 +0,0 @@
-\include "header"
-\paper{paper-height = 3.6\cm}
-
-
-
-
-{
- \key f \major \time 4/4
- \relative c'
- {
- \repeat volta 2 {f8 g a8. g16 f8 e f d f g a8. g16 f8 e f4}
- \alternative {
-{g8 a bes8. g16 g8 bes a f f f e g f e d4} {a'8 d c8. bes16 f8 g a a f f a g f g e4}}
- }
-
-}
diff --git a/lilypond/Sainte_Cecile.ly b/lilypond/Sainte_Cecile.ly
deleted file mode 100644
index 60037949..00000000
--- a/lilypond/Sainte_Cecile.ly
+++ /dev/null
@@ -1,26 +0,0 @@
-\include "header"
-\paper{paper-height = 5.0\cm}
-
-\new \songbookstaff
-{
- \key d \minor
- \time 2/4
- \relative c'{
- \repeat volta 2
- {
- d8.\trill e16 f8 d g16 f e8 f4
- d8.\trill e16 f8 d e16 f e d c4
- d8.\trill e16 f8 d g16 f e8 f4
- d8.\trill e16 f8 bes a16 g f e d4
- }
-
- \repeat volta 2
- {
- d'8. bes16\trill a8 bes g16 a bes g a4
- d8. bes16\trill a8 bes c16 d c bes a4
- d8. bes16\trill a8 bes g16 a bes g a4
- d,8.\trill e16 f8 bes a16 g f e d4
- }
- }
-}
-
diff --git a/lilypond/Saturnin.ly b/lilypond/Saturnin.ly
deleted file mode 100644
index b6ec48a0..00000000
--- a/lilypond/Saturnin.ly
+++ /dev/null
@@ -1,17 +0,0 @@
-\include "header"
-\paper{paper-height = 3.8\cm}
-
-\new \songbookstaff
-{
- \relative c''
- {
- \key a \major
- \time 2/4
- \partial 4 a4
- fis4. fis8 fis4 a4 fis4. e8 e2
- d4. d8 e8 d cis d e2 cis4 a'4
- fis4. fis8 fis4 a4 fis4. e8 e2
- dis4. dis8 e dis e fis gis4 fis4 e4 d4 cis2
- }
-}
-
diff --git a/lilypond/Souleve_ta_jupe.ly b/lilypond/Souleve_ta_jupe.ly
deleted file mode 100644
index e690479f..00000000
--- a/lilypond/Souleve_ta_jupe.ly
+++ /dev/null
@@ -1,21 +0,0 @@
-\include "header"
-\paper{paper-height = 5.0\cm}
-
-\new \songbookstaff
-{
- \key d \minor
- \time 4/4
- \relative c''
- {
- \partial 4 a16 a a' g
-
- a8. f16~ f8 f8 g8. f16~ f8 g8 a8. f16~ f2
- a,16 a a' g
- a8. f16~ f8 f8 g8. f16~ f8 e8\trill d2.
- a16 a a' g
- a8. f16~ f8 f8 g8. c16~ c8 bes8 bes8. a16~ a2
- a,16 a a' g
- a8. f16~ f8 f8 g8. f16~ f8 e8\trill d1
- }
-}
-
diff --git a/lilypond/Stuck_in_the_middle.ly b/lilypond/Stuck_in_the_middle.ly
deleted file mode 100644
index 0c00afa5..00000000
--- a/lilypond/Stuck_in_the_middle.ly
+++ /dev/null
@@ -1,20 +0,0 @@
-\include "header"
-\paper{
- paper-height = 0.9\cm
- line-width = 2.7\cm
- paper-width = 3.0\cm
-}
-
-<<
- \new RhythmicStaff {
- \new Voice = "myRhythm" {
- \numericTimeSignature
- \time 4/4
- \autoBeamOff
- a8[ a]
- \override NoteHead #'style = #'cross a[ \revert NoteHead #'style a]
- \override NoteHead #'style = #'cross a[ \revert NoteHead #'style a]
- \override NoteHead #'style = #'cross a[ \revert NoteHead #'style a]
- }
- }
->>
\ No newline at end of file
diff --git a/lilypond/Sur_le_pont_d_avignon.ly b/lilypond/Sur_le_pont_d_avignon.ly
deleted file mode 100644
index 73ee3571..00000000
--- a/lilypond/Sur_le_pont_d_avignon.ly
+++ /dev/null
@@ -1,16 +0,0 @@
-\include "header"
-\paper{paper-height = 2.6\cm}
-
-\new \songbookstaff
-{
- \relative c''
- {
- \time 2/4
- \key g \major
- \partial 4 g8 g8
- g4 a8 a a4 b8 c d g, fis g a d,
- g g g4 a8 a a4 b8 c d g, a fis g4
- g8 g g g g a8~ a8 g8~ g4
- g8 g g g a4 g
- }
-}
diff --git a/lilypond/The_boxer.ly b/lilypond/The_boxer.ly
deleted file mode 100644
index 6bc30cfe..00000000
--- a/lilypond/The_boxer.ly
+++ /dev/null
@@ -1,13 +0,0 @@
-\include "header"
-\paper{paper-height = 2.4\cm}
-
-\new \songbookstaff
-{
- \key c \major
- \time 4/4
- \relative c'
- {
- e2 g c,4 d e2 d2~ d4. g8 g2~ g4. f8 e4 g c4. g8 e4 g a e g2 f2 f2 e8 e d c d2 c2
- }
-}
-
diff --git a/lilypond/The_ring_of_fire.ly b/lilypond/The_ring_of_fire.ly
deleted file mode 100644
index dc6ff83f..00000000
--- a/lilypond/The_ring_of_fire.ly
+++ /dev/null
@@ -1,15 +0,0 @@
-\include "header"
-\paper{paper-height = 2.3\cm}
-
-\new \songbookstaff
-{
- \key g \major
- \relative c''
- {
- \time 3/4
- \partial 2
- r8 b8 c cis
- d8 d16 d r8 d16 d e8 c d2.
- b8 b16 b r8 b16 b c8 a b2.
- }
-}
diff --git a/lilypond/Toi_toi_toi.ly b/lilypond/Toi_toi_toi.ly
deleted file mode 100644
index becf62b0..00000000
--- a/lilypond/Toi_toi_toi.ly
+++ /dev/null
@@ -1,20 +0,0 @@
-\include "header"
-\paper{paper-height = 2.4\cm}
-
-
-
-
-{
- \time 4/4
- \relative c''
-
- {
- \partial 8 {g8} \repeat volta 2 {a8 a a a b a4 d8
- d e d b d4. b8
- c c c c d c4 c8}
- \alternative {
- {c8 a b c d c b g}
- {c8 a b c d c b4}}
- }
-
-}
diff --git a/lilypond/Tom_Sawyer_1.ly b/lilypond/Tom_Sawyer_1.ly
deleted file mode 100644
index bac999bc..00000000
--- a/lilypond/Tom_Sawyer_1.ly
+++ /dev/null
@@ -1,14 +0,0 @@
-\include "header"
-\paper{
- paper-height = 1.1\cm
-}
-
-\new \songbookstaff
-{
- \key c \major
- \time 2/4
- \relative c''
- {
- e,4 c g'2 a4 c8. d16 e8 c4 g8 a4 c8. d16 e8 c d4 c2
- }
-}
diff --git a/lilypond/Tom_Sawyer_2.ly b/lilypond/Tom_Sawyer_2.ly
deleted file mode 100644
index a41ae481..00000000
--- a/lilypond/Tom_Sawyer_2.ly
+++ /dev/null
@@ -1,13 +0,0 @@
-\include "header"
-\paper{paper-height = 3.8\cm}
-
-\new \songbookstaff
-{
- \key c \major
- \time 2/4
- \relative c''{
- e4 c g'2 a4 a8. a16 g8 e4 c8 a'4 a8. a16 g8 e d c d2~ d4
- e8 f g4 g8. g16 f8 e d c a c4 a8 g4 c8 d e8 g4 g,8 e' e d d c2
- }
-}
-
diff --git a/lilypond/Ton_invitation_1.ly b/lilypond/Ton_invitation_1.ly
deleted file mode 100644
index aea18219..00000000
--- a/lilypond/Ton_invitation_1.ly
+++ /dev/null
@@ -1,17 +0,0 @@
-\include "header"
-\paper{paper-height = 1.1\cm}
-
-\new \songbookstaff
-{
- \relative c''
- {
- \time 4/4
- \key b \minor
- \repeat volta 2
- {
- g8 a4 ais8 b2 g8 b4 ais8 fis2
- }
-
- }
-}
-
diff --git a/lilypond/Ton_invitation_2.ly b/lilypond/Ton_invitation_2.ly
deleted file mode 100644
index a45fb5d8..00000000
--- a/lilypond/Ton_invitation_2.ly
+++ /dev/null
@@ -1,29 +0,0 @@
-\include "header"
-\paper{paper-height = 3.8\cm}
-
-\new \songbookstaff
-{
- \relative c''
- {
- \time 4/4
- \key b \minor
- \repeat volta 2
- {
- g8 a4 ais8 b2 g8 b4 ais8 fis2
- }
- fis8\trill d4 cis8 b2
- d8 d4 e8 cis2
- d8 d4 cis8 b4. d16 d
- d8 e4 d8 cis4 d'8 d
-
- \repeat volta 2
- {
- cis8 d16 cis~ cis8 d16 cis b4 a b4. g8 fis2
- }
- \alternative
- {
- {fis8\trill a4 ais8 b2 g8 b4 g8 fis4 d'8 d8} {fis,1}
- }
- }
-}
-
diff --git a/lilypond/Toujours_etre_ailleurs_rythm.ly b/lilypond/Toujours_etre_ailleurs_rythm.ly
deleted file mode 100644
index 5f5889be..00000000
--- a/lilypond/Toujours_etre_ailleurs_rythm.ly
+++ /dev/null
@@ -1,17 +0,0 @@
-\include "header"
-\paper{
- paper-height = 1.1\cm
- paper-width = 5.2\cm
-}
-
-<<
- \chords { d1:m | f2 g2 }
- \new RhythmicStaff {
- \new Voice = "myRhythm" {
- \numericTimeSignature
- \time 4/4
- a4 a8 a~ a a a a
- a4 a a a
- }
- }
->>
\ No newline at end of file
diff --git a/lilypond/V_la_l_bon_vent.ly b/lilypond/V_la_l_bon_vent.ly
deleted file mode 100644
index 345182ff..00000000
--- a/lilypond/V_la_l_bon_vent.ly
+++ /dev/null
@@ -1,22 +0,0 @@
-\include "header"
-\paper{paper-height = 2.5\cm}
-
-\new \songbookstaff
-{
- \relative c'
- {
- \key a \minor
- \time 2/4
- \repeat volta 2
- {
- e8 a a4 e8 a16 a a4
- e8 a a8 a16 b
- }
- \alternative
- {
- {c8 c b8 b } {c8 b a4}
- }
- r8 e8 a c b a g b a e a c b a g b a
- e a c b a a g e2
- }
-}
diff --git a/lilypond/Vanity.ly b/lilypond/Vanity.ly
deleted file mode 100644
index 2c25d028..00000000
--- a/lilypond/Vanity.ly
+++ /dev/null
@@ -1,17 +0,0 @@
-\include "header"
-\paper{paper-height = 1.1\cm}
-
-\new \songbookstaff
-{
- \key a \minor
- \time 2/4
- \relative c''
- {
- \repeat volta 2
- {
- a8 b c e8~ e8 c d4 b2
- a8 b c e8~ e8 c d c b a g4
- }
- }
-}
-
diff --git a/lilypond/comfortably_numb.ly b/lilypond/comfortably_numb.ly
deleted file mode 100644
index f605ca73..00000000
--- a/lilypond/comfortably_numb.ly
+++ /dev/null
@@ -1,57 +0,0 @@
-\include "header"
-\paper{
- paper-height = 2.5 \cm
- paper-width= 8\cm
- line-width= 7.5\cm
-}
-
-TAB = \markup {
- \raise #1.5
- \sans
- \bold
- \huge
- \override #'(baseline-skip . 2.5)
- \left-align
- \center-column {
- T
- A
- B
- }
-}
-
-symbols = {
- \numericTimeSignature
- \time 4/4
-
-
-
- \improvisationOn
- 4 8 16 88 16
- 4 8 16 88 16
- 4 8 8 4 8 16
- 4 8 16 88 16
- \improvisationOff
-
-
-
-
-}
-
-\score {
- <<
- \chords { b1:m | a1 | g4. fis8 e2:m | b1:m }
- \new Staff
-
- {
-
- \override Staff.StringNumber #'transparent =
-##t
-
- \clef "G_8" \symbols }
-
- %\new TabStaff {
- % \override Staff.Clef #'stencil = #(lambda (grob)
- % (grob-interpret-markup grob TAB))
- % \symbols }
- >>
-}
diff --git a/lilypond/gimme_shelter_rythm.ly b/lilypond/gimme_shelter_rythm.ly
deleted file mode 100644
index fdc346e2..00000000
--- a/lilypond/gimme_shelter_rythm.ly
+++ /dev/null
@@ -1,17 +0,0 @@
-\include "header"
-\paper{
- paper-height = 0.6\cm
- paper-width = 4.5\cm
-}
-
-<<
- \new RhythmicStaff {
- \new Voice = "myRhythm" {
- \numericTimeSignature
- \time 4/4
- a4^"" a a8 a a a~ a a a a a a a a
-
-
- }
- }
->>
\ No newline at end of file
diff --git a/lilypond/greensleeves.ly b/lilypond/greensleeves.ly
deleted file mode 100644
index 63c040f5..00000000
--- a/lilypond/greensleeves.ly
+++ /dev/null
@@ -1,21 +0,0 @@
-\include "header"
-\paper{paper-height = 6.5\cm}
-
-%\new \songbookstaff
-{
- \key a \minor
- \time 6/8
- \partial 8 a'8
- \relative c''{
- c4 d8 e8. (f16) e8 d4 b8 g8. (a16) b8
- c4 a8 a8. (gis16) a8 b4 gis8 e4 a8
- c4 d8 e8. (f16 e8) d4 b8 g8. (a16) b8
- 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.
- }
-}
-
diff --git a/lilypond/hey_you.ly b/lilypond/hey_you.ly
deleted file mode 100644
index 6fcd1b6d..00000000
--- a/lilypond/hey_you.ly
+++ /dev/null
@@ -1,47 +0,0 @@
-\include "header"
-\paper{
- paper-height =2.5\cm
- paper-width= 10\cm
- line-width= 10\cm
-}
-
-TAB = \markup {
- \raise #1.5
- \sans
- \bold
- \huge
- \override #'(baseline-skip . 2.5)
- \left-align
- \center-column {
- T
- A
- B
- }
-}
-
-symbols = {
- \numericTimeSignature
- \time 4/4
- \repeat volta 2 {
- 16 b\4 e'\3 g'\2 e'\3 b\4 g'\2 e'\3
- 16 b\4 e'\3 g'\2 e'\3 b\4 g'\2 e'\3
- e'\2 a\4 d'\3 a'\1 f'\2 d'\3 a'\1 d'\3
- e'\2 a\4 d'\3 a'\1 f'\2 d'\3 a'\1 d'\3
- }
-}
-\score {
- <<
-
- \new Staff
-
- {
- \override Staff.StringNumber #'transparent =
-##t
- \clef "G_8" \symbols }
- %\chords { c2 | f2| g1 | c2 | f2| g1 }
- \new TabStaff {
- \override Staff.Clef #'stencil = #(lambda (grob)
- (grob-interpret-markup grob TAB))
- \symbols }
- >>
-}
diff --git a/lilypond/in_the_death_car.ly b/lilypond/in_the_death_car.ly
deleted file mode 100644
index f10983c1..00000000
--- a/lilypond/in_the_death_car.ly
+++ /dev/null
@@ -1,17 +0,0 @@
-\include "header"
-\paper{paper-height = 2.4\cm}
-
-\new \songbookstaff
-{
- \key e \minor
- \time 4/4
- \relative c''
- {
- r8 b8 b b g g e e c1
- r8 a'8 a a fis fis c c b1
- r8 b'8 b b g g e e
- r8 a a g fis4 e
- r8 dis dis e fis e e dis e1
- }
-}
-
diff --git a/lilypond/les_ecorches.ly b/lilypond/les_ecorches.ly
deleted file mode 100644
index 2d2a8fb2..00000000
--- a/lilypond/les_ecorches.ly
+++ /dev/null
@@ -1,23 +0,0 @@
-\include "header"
-\paper{
- paper-height = 2.5\cm
- paper-width= 7.2\cm
-}
-
-symbols = {
- \numericTimeSignature
- \time 12/8
- \repeat volta 4 {
- a,4 a,8 eis (e) e c (a,) a, g, (e,) e8
-}
- \repeat volta 4 {
- g,4 g,8 eis (d) d c (b,) b, g,4 d8
- }
-}
-
-\score {
- <<
- \new Staff { \clef "G_8" \symbols }
- \new TabStaff { \symbols }
- >>
-}
\ No newline at end of file
diff --git a/lilypond/mothers_little_helper.ly b/lilypond/mothers_little_helper.ly
deleted file mode 100644
index bb77cd52..00000000
--- a/lilypond/mothers_little_helper.ly
+++ /dev/null
@@ -1,17 +0,0 @@
-\include "header"
-\paper{
- paper-height = 1\cm
- paper-width = 6\cm
-}
-
-<<
- \new RhythmicStaff {
- \new Voice = "myRhythm" {
- \numericTimeSignature
- \time 4/4
- a4^"verse" a8-> a a8 a a-> a
- a4^"chorus" a-> a8 a a-> a
-
- }
- }
->>
\ No newline at end of file
diff --git a/macos/clean.sh b/macos/clean.sh
deleted file mode 100755
index 0cda9a79..00000000
--- a/macos/clean.sh
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-#
-echo "manually performs 'make clean'"
-rm -rf *.aux *.d *.toc *.out *.log *.nav *.snm *.sbx *.sxd
-echo "remove temporary covers"
-rm -rf covers/
diff --git a/macos/cleanall.sh b/macos/cleanall.sh
deleted file mode 100755
index ef3ca003..00000000
--- a/macos/cleanall.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-#
-echo "manually performs 'make cleanall'"
-`dirname $0`/clean.sh
-rm -rf *.pdf
diff --git a/macos/make.sh b/macos/make.sh
deleted file mode 100755
index 6a1ad16c..00000000
--- a/macos/make.sh
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/bin/sh
-#
-echo "build tex file from songbook file"
-./songbook.py --songbook=books/$1.sb --output=$1.tex
-
-echo "first pdf compilation"
-/usr/texbin/pdflatex $1.tex
-
-echo "build indexes"
-./songbook-makeindex.py $1_title.sxd > $1_title.sbx
-./songbook-makeindex.py $1_auth.sxd > $1_auth.sbx
-
-echo "second compilation to include indexes"
-/usr/texbin/pdflatex $1.tex
diff --git a/makefile b/makefile
deleted file mode 100644
index bbe65c1f..00000000
--- a/makefile
+++ /dev/null
@@ -1,112 +0,0 @@
-# Copyright (c) 2008-2010 Alexandre Dupas
-#
-# This program is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any later
-# version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
-# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-
-BOOKS_DIR=books/
-SONGBOOKS := $(wildcard $(BOOKS_DIR)/*.sb)
-TARGETS = $(SONGBOOKS:$(BOOKS_DIR)/%.sb=%)
-LIBRARY=./
-
-PDF = $(TARGETS:%=%.pdf)
-
-#CHORDS = chords.tex
-#CHORDS_SRC = $(shell ls $(LIBRARY)/songs/*/*.sg)
-
-DATE = $(shell date +%d)-$(shell date +%m)-$(shell date +%Y)
-
-PRINT=printf "%s\n"
-PRINTTAB=printf "\t%s\n"
-
-MAKE_SONGBOOK=./songbook.py
-MAKE_INDEX=./songbook-makeindex.py
-MAKE_CHORDS=./utils/songbook-gtab.py
-
-ifeq ($(shell which lilypond),)
- LILYPOND=$(ECHO) "** lilypond not found" >&2 ; $(ECHO) lilypond
- LILYFILE=''
-else
- LILYPOND=lilypond
- LILY_SRC:=$(wildcard $(LIBRARY)/lilypond/*.ly)
- LILYFILE=$(LILY_SRC:%.ly=%.pdf)
-endif
-
-LATEX=pdflatex $(LATEX_OPTIONS)
-############################################################
-### Targets
-
-default: songbook.pdf
-
-all: $(PDF)
-
-pdf: $(PDF)
- xpdf $<
-
-lilypond: $(LILYFILE)
-
-clean:
- @rm -f $(TARGETS:%=%.d) $(TARGETS:%=%.tex) $(TARGETS:%=%.aux) \
- $(TARGETS:%=%.toc) $(TARGETS:%=%.out) $(TARGETS:%=%.log) \
- $(TARGETS:%=%.nav) $(TARGETS:%=%.snm)
- @rm -f *.sbx *.sxd *.sxc
- @rm -f *.pyc
-
-cleanall: clean
- @rm -f $(PDF)
- @rm -f $(LILYFILE)
-
-depend:
-
-############################################################
-
-
-$(PDF): %.pdf: %.tex %.aux
-
-%.aux: %.tex
- $(LATEX) $<
-
-%.sbx: %.sxd
- $(MAKE_INDEX) $< > $@
-
-%.tex: $(BOOKS_DIR)/%.sb
- $(MAKE_SONGBOOK) --library=$(LIBRARY) -s $< -o $@
-
-%.d: $(BOOKS_DIR)/%.sb
- $(MAKE_SONGBOOK) --library=$(LIBRARY) -s $< -d -o $@
-
-%.pdf: %.ly
- @$(LILYPOND) --format=pdf -e '(define-public songbookstaff "$(SONGBOOKSTAFF)")' --output=$(@:%.pdf=%) $<
-
-#$(CHORDS): $(CHORDS_SRC)
-# $(MAKE_CHORDS) -o $@
-
-archive: cleanall
- tar -czvf songbook.tar.gz \
- --exclude-vcs \
- --exclude=$(BOOKS_DIR)/default.sb \
- --exclude=perso/* --exclude=perso \
- --exclude=build/* --exclude=build \
- --exclude=data/* --exclude=data \
- --exclude=*tar.gz \
- --transform 's/songbook/songbook-$(DATE)/1' \
- ../songbook
-
-ifeq (.pdf,$(suffix $(MAKECMDGOALS)))
-include $(MAKECMDGOALS:%.pdf=%.d)
-else ifneq ($(MAKECMDGOALS),clean)
- ifneq ($(MAKECMDGOALS),cleanall)
- include $(TARGETS:%=%.d)
- endif
-endif
diff --git a/readme.md b/readme.md
index 0d242703..f07e4787 100644
--- a/readme.md
+++ b/readme.md
@@ -1,6 +1,7 @@
Songbook Compilation Chain
# Description
+
This package provides a compilation toolchain that produce LaTeX
songbook using the LaTeX songs package. A new LaTeX document class is
provided to allow specific customisation and new command like embedded
@@ -13,21 +14,40 @@ to the CC-BY-SA licence.
Other document are subject to the GNU GPLv2 except if another licence
is precised in the header.
-# Clone Patacrep repos
+# Python version
+
+Songbook is compatible with Python 2.7 (no Python3 since [one of the
+library](http://plastex.sourceforge.net/) we are using is not).
+
+# Download
+
+Clone Patacrep repos:
> git clone git://github.com/crep4ever/songbook-core.git
> git clone git://github.com/crep4ever/songbook-data.git
-> mv songbook-data songbook-core/songs
# Run
-> cd songbook-core
-> make
+> /songbook
>
+Look for existing songbook files in /books. For example:
+
+> /songbook /books/songbook_en.sb
+> songbook_en.pdf
+
+# Quick and dirty deb packages
+
+Install `python-stdeb`, then:
+
+> python setup.py --command-packages=stdeb.command bdist_deb
+> sudo dpkg -i deb_dist/python-songbook-core_-1_all.deb
+
# Documentation
+
http://www.patacrep.com/data/documents/doc_en.pdf
# Contact & Forums
+
* http://www.patacrep.com
* crep@team-on-fire.com
diff --git a/setup.cfg b/setup.cfg
new file mode 100644
index 00000000..5d58cdcf
--- /dev/null
+++ b/setup.cfg
@@ -0,0 +1,10 @@
+[bdist_rpm]
+requires = python >= 2.7
+ python-unidecode
+ python-jinja2
+ texlive
+ texlive-framed
+ texlive-nfssext-cfr
+ lilypond
+
+
diff --git a/setup.py b/setup.py
new file mode 100755
index 00000000..9afb38db
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,81 @@
+#!/usr/bin/env python
+
+"""Installation script for songbook.
+
+$ python setup.py install
+"""
+from distutils.core import setup
+from distutils.command.install import install as _install
+from songbook_core import __STR_VERSION__
+
+import sys
+import os
+import site
+
+
+def link_songbook():
+ if sys.platform.startswith('darwin'):
+ source = os.path.join(site.PREFIXES[0],
+ 'bin',
+ 'songbook')
+ dest = '/usr/local/bin/songbook'
+ if os.path.isfile(dest):
+ print("File {dest} already exist, skipping.".format(dest=dest))
+ else:
+ os.symlink(source, dest)
+ elif sys.platform.startswith('win32'):
+ script = os.path.join(site.PREFIXES[0],
+ 'Scripts',
+ 'songbook')
+ dest = script + '.py'
+ bat_name = script + '.bat'
+ if os.path.isfile(dest):
+ os.unlink(dest)
+ os.rename(script, dest)
+ content = "python {songbook} %* \n".format(songbook=dest)
+ with open(bat_name, 'w') as bat_file:
+ bat_file.write(content)
+
+
+class install(_install):
+ def run(self):
+ _install.run(self)
+ link_songbook()
+
+
+setup(cmdclass={'install': install},
+ name='songbook-core',
+ version=__STR_VERSION__,
+ description='Songbook compilation chain',
+ author='The Songbook team',
+ author_email='crep@team-on-fire.com',
+ url='https://github.com/patacrep/songbook-core',
+ packages=['songbook_core'],
+ license="GPLv2 or any later version",
+ scripts=['songbook'],
+ requires=[
+ "argparse", "codecs", "distutils", "fnmatch", "glob", "json",
+ "locale", "logging", "os", "plasTeX", "re", "subprocess", "sys",
+ "textwrap", "unidecode", "jinja2"
+ ],
+ package_data={'songbook_core': ['data/latex/*',
+ 'data/templates/*',
+ 'data/examples/*.sb',
+ 'data/examples/*/*.sg',
+ 'data/examples/*/*.ly',
+ 'data/examples/*/*.jpg',
+ 'data/examples/*/*.png',
+ 'data/examples/*/*.png',
+ 'data/examples/*/*/header']},
+ classifiers=[
+ "Environment :: Console",
+ "License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)",
+ "Natural Language :: English",
+ "Operating System :: POSIX :: Linux",
+ "Operating System :: Microsoft :: Windows",
+ "Operating System :: MacOS :: MacOS X"
+ "Programming Language :: Python :: 2.7",
+ "Topic :: Utilities",
+ ],
+ platforms=["GNU/Linux", "Windows", "MacOsX"],
+)
diff --git a/songbook b/songbook
new file mode 100755
index 00000000..678e243e
--- /dev/null
+++ b/songbook
@@ -0,0 +1,137 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+
+"""Command line tool to compile songbooks using the songbook library."""
+
+import argparse
+import json
+import locale
+import logging
+import os.path
+import textwrap
+import sys
+
+from songbook_core.build import SongbookBuilder, DEFAULT_STEPS
+from songbook_core import __STR_VERSION__
+from songbook_core import errors
+
+# Logging configuration
+logging.basicConfig(level=logging.INFO)
+LOGGER = logging.getLogger()
+
+# pylint: disable=too-few-public-methods
+class ParseStepsAction(argparse.Action):
+ """Argparse action to split a string into a list."""
+ def __call__(self, __parser, namespace, values, __option_string=None):
+ if not getattr(namespace, self.dest):
+ setattr(namespace, self.dest, [])
+ setattr(
+ namespace,
+ self.dest,
+ (
+ getattr(namespace, self.dest)
+ + [value.strip() for value in values[0].split(',')]
+ ),
+ )
+
+class VerboseAction(argparse.Action):
+ """Set verbosity level with option --verbose."""
+ def __call__(self, *_args, **_kwargs):
+ LOGGER.setLevel(logging.DEBUG)
+
+def argument_parser(args):
+ """Parse argumnts"""
+ parser = argparse.ArgumentParser(description="A song book compiler")
+
+ parser.add_argument('--version', help='Show version', action='version',
+ version='%(prog)s ' + __STR_VERSION__)
+
+ parser.add_argument('book', nargs=1, help=textwrap.dedent("""\
+ Book to compile.
+ """))
+
+ parser.add_argument('--datadir', '-d', nargs=1, type=str, action='store',
+ help=textwrap.dedent("""\
+ Data location. Expected (not necessarily required)
+ subdirectories are 'songs', 'img', 'latex', 'templates'.
+ """))
+
+ parser.add_argument('--verbose', '-v', nargs=0, action=VerboseAction,
+ help=textwrap.dedent("""\
+ Show details about the compilation process.
+ """))
+
+ parser.add_argument('--steps', '-s', nargs=1, type=str,
+ action=ParseStepsAction,
+ help=textwrap.dedent("""\
+ Steps to run. Default is "{steps}".
+ Available steps are:
+ "tex" produce .tex file from templates;
+ "pdf" compile .tex file;
+ "sbx" compile index files;
+ "clean" remove temporary files;
+ any string beginning with '%%' (in this case, it will be run
+ in a shell). Several steps (excepted the custom shell
+ command) can be combinend in one --steps argument, as a
+ comma separated string.
+ """.format(steps=','.join(DEFAULT_STEPS))),
+ default=None,
+ )
+
+ options = parser.parse_args(args)
+
+ return options
+
+
+def main():
+ """Main function:"""
+
+ # set script locale to match user's
+ try:
+ locale.setlocale(locale.LC_ALL, '')
+ except locale.Error as error:
+ # Locale is not installed on user's system, or wrongly configured.
+ sys.stderr.write("Locale error: {}\n".format(error.message))
+
+ options = argument_parser(sys.argv[1:])
+
+ songbook_path = options.book[0]
+
+ basename = os.path.basename(songbook_path)[:-3]
+
+ try:
+ with open(songbook_path) as songbook_file:
+ songbook = json.load(songbook_file)
+ except Exception as error: # pylint: disable=broad-except
+ LOGGER.error(error)
+ LOGGER.error("Error while loading file '{}'.".format(songbook_path))
+ sys.exit(1)
+
+
+ if options.datadir is not None:
+ songbook['datadir'] = options.datadir[0]
+ elif 'datadir' in songbook.keys():
+ if not os.path.isabs(songbook['datadir']):
+ songbook['datadir'] = os.path.join(os.path.dirname(songbook_path),
+ songbook['datadir']
+ )
+ else:
+ songbook['datadir'] = os.path.dirname(songbook_path)
+
+ try:
+ sb_builder = SongbookBuilder(songbook, basename)
+ sb_builder.unsafe = True
+
+ sb_builder.build_steps(options.steps)
+ except errors.SongbookError as error:
+ LOGGER.error(error)
+ LOGGER.error(
+ "Running again with option '-v' may give more information."
+ )
+ sys.exit(1)
+
+ sys.exit(0)
+
+if __name__ == '__main__':
+ main()
diff --git a/songbook-client.png b/songbook-client.png
deleted file mode 100644
index 48ad445c..00000000
Binary files a/songbook-client.png and /dev/null differ
diff --git a/songbook-makeindex.py b/songbook-makeindex.py
deleted file mode 100755
index 494b9889..00000000
--- a/songbook-makeindex.py
+++ /dev/null
@@ -1,138 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-# Generate indexes files for the Crep's chordbook compilation. This is
-# a replacement for the original makeindex program written in C that
-# produces an index file (.sbx) from a file generated by the latex
-# compilation of the songbook (.sxd).
-#
-# Usage : songbook-makeindex.py src
-# src is the .sxd file generated by latex
-#
-
-import sys
-import os.path
-import glob
-import re
-from optparse import OptionParser
-import sortindex
-import locale
-
-# Pattern set to ignore latex command in title prefix
-keywordPattern = re.compile(r"^%(\w+)\s?(.*)$")
-firstLetterPattern = re.compile(r"^(?:\{?\\\w+\}?)*[^\w]*(\w)")
-
-class index:
- data = dict()
- keywords = dict()
-
- def filter(self, key):
- letter = firstLetterPattern.match(key).group(1)
- if re.match('\d',letter):
- letter = '0-9'
- return (letter.upper(), key)
-
- def keyword(self, key, word):
- if not self.keywords.has_key(key):
- self.keywords[key] = []
- self.keywords[key].append(word)
-
- def compileKeywords(self):
- self.prefix_patterns = []
- if 'prefix' in self.keywords:
- for prefix in self.keywords['prefix']:
- self.prefix_patterns.append(re.compile(r"^(%s)\b\s*(.*)$" % prefix))
-
- def add(self, key, number, link):
- for pattern in self.prefix_patterns:
- match = pattern.match(key)
- if match:
- key = "%s (%s)" % (match.group(2), match.group(1))
- break # Only one match per key
- (first, key) = self.filter(key)
- if not self.data.has_key(first):
- self.data[first] = dict()
- if not self.data[first].has_key(key):
- self.data[first][key] = []
- self.data[first][key].append({'num':number, 'link':link})
-
- def refToStr(self, ref):
- if sys.version_info >= (2,6):
- return '\\hyperlink{{{0[link]}}}{{{0[num]}}}'.format(ref)
- else:
- return '\\hyperlink{%(link)s}{%(num)s}' % ref
-
- def entryToStr(self, key, entry):
- if sys.version_info >= (2,6):
- return '\\idxentry{{{0}}}{{{1}}}\n'.format(key, '\\\\'.join(map(self.refToStr, entry)))
- else:
- return '\\idxentry{%s}{%s}\n' % (key, '\\\\'.join(map(self.refToStr, entry)))
-
- def idxBlockToStr(self, letter, entries):
- str = '\\begin{idxblock}{'+letter+'}'+'\n'
- for key in sorted(entries.keys(), key=sortindex.sortkey):
- str += self.entryToStr(key, entries[key])
- str += '\\end{idxblock}'+'\n'
- return str
-
- def entriesToStr(self):
- str = ""
- for letter in sorted(self.data.keys()):
- str += self.idxBlockToStr(letter, self.data[letter])
- return str
-
-def processSXDEntry(tab):
- return (tab[0], tab[1], tab[2])
-
-def processSXD(filename):
- file = open(filename)
- data = []
- for line in file:
- data.append(line.strip())
- file.close()
-
- type = data[0]
- i = 1
- idx = index()
-
- if len(data) > 1:
- while data[i].startswith('%'):
- keywords = keywordPattern.match(data[i]).groups()
- idx.keyword(keywords[0],keywords[1])
- i += 1
-
- idx.compileKeywords()
- for i in range(i,len(data),3):
- entry = processSXDEntry(data[i:i+3])
- idx.add(entry[0],entry[1],entry[2])
- return idx
-
-def usage(exitCode=None):
- print "usage: songbook-makeindex.py [options] source"
- sys.exit(exitCode)
-
-def main():
- locale.setlocale(locale.LC_ALL, '')
- usage = "usage: %prog [options] FILE"
- parser = OptionParser(usage)
- parser.add_option("-o", "--output", dest="filename",
- help="write result into FILE", metavar="FILE")
- (options, args) = parser.parse_args()
-
- # Args processing
- if len(args) != 1:
- parser.error("incorrect number of arguments")
- if not os.path.exists(args[0]):
- parser.error("inexistant input file")
-
- # Options processing
- if options.filename:
- output = open(options.filename,"w")
- else:
- output = sys.stdout
-
- # Actual processing
- idx = processSXD(args[0])
- output.write(idx.entriesToStr())
-
-if __name__ == '__main__':
- main()
diff --git a/songbook.py b/songbook.py
deleted file mode 100755
index 0ac8255b..00000000
--- a/songbook.py
+++ /dev/null
@@ -1,257 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-#
-
-import getopt, sys
-import os.path
-import re
-import json
-import locale
-import shutil
-import locale
-import platform
-
-from utils.utils import recursiveFind
-
-reTitle = re.compile('(?<=beginsong\\{)(.(? 0:
- out.write(formatDefinition('songslist', songslist(library, songs, prefixes)))
- out.write('\\makeatother\n')
-
- # output template
- commentPattern = re.compile(r"^\s*%")
- f = open("templates/"+template)
- content = [ line for line in f if not commentPattern.match(line) ]
-
- for index, line in enumerate(content):
- if re.compile("getLibraryImgDirectory").search(line):
- line = line.replace("\\getLibraryImgDirectory", library + "img/")
- content[index] = line
- if re.compile("getLibraryLilypondDirectory").search(line):
- line = line.replace("\\getLibraryLilypondDirectory", library + "lilypond/")
- content[index] = line
-
- f.close()
- out.write(''.join(content))
-
- out.close()
-
-def makeDepend(sb, library, output):
- name = output[:-2]
-
- indexPattern = re.compile(r"^[^%]*\\(?:newauthor|new)index\{.*\}\{(.*?)\}")
- lilypondPattern = re.compile(r"^[^%]*\\(?:lilypond)\{(.*?)\}")
-
- # check for deps (in sb data)
- deps = [];
- if sb["songs"] == "all":
- deps += recursiveFind(os.path.join(library, 'songs'), '*.sg')
- else:
- deps += map(lambda x: library + "songs/" + x, sb["songs"])
-
- # check for lilypond deps (in songs data) if necessary
- lilypond = []
- if "bookoptions" in sb and "lilypond" in sb["bookoptions"]:
- for filename in deps:
- tmpl = open(filename)
- lilypond += matchRegexp(lilypondPattern, tmpl)
- tmpl.close()
-
- # check for index (in template file)
- if "template" in sb:
- filename = sb["template"]
- else:
- filename = "patacrep.tmpl"
- tmpl = open("templates/"+filename)
- idx = map(lambda x: x.replace("\getname", name), matchRegexp(indexPattern, tmpl))
- tmpl.close()
-
- # write .d file
- out = open(output, 'w')
- out.write('{0} {1} : {2}\n'.format(output, name+".tex", ' '.join(deps)))
- out.write('{0} : {1}\n'.format(name+".pdf", ' '.join(map(lambda x: x+".sbx",idx)+map(lambda x: library+"lilypond/"+x+".pdf", lilypond))))
- out.write('\t$(LATEX) {0}\n'.format(name+".tex"))
- out.write('{0} : {1}\n'.format(' '.join(map(lambda x: x+".sxd",idx)), name+".aux"))
- out.close()
-
-def usage():
- print "No usage information yet."
-
-def main():
- locale.setlocale(locale.LC_ALL, '') # set script locale to match user's
- try:
- opts, args = getopt.getopt(sys.argv[1:],
- "hs:o:l:d",
- ["help","songbook=","output=","depend","library="])
- except getopt.GetoptError, err:
- # print help and exit
- print str(err)
- usage()
- sys.exit(2)
-
- songbook = None
- depend = False
- output = None
- library = './'
-
- for o, a in opts:
- if o in ("-h", "--help"):
- usage()
- sys.exit()
- elif o in ("-s", "--songbook"):
- songbook = a
- elif o in ("-d", "--depend"):
- depend = True
- elif o in ("-o", "--output"):
- output = a
- elif o in ("-l", "--library"):
- if not a.endswith('/'):
- a += '/'
- library = a
- else:
- assert False, "unhandled option"
-
- if songbook and output:
- f = open(songbook)
- sb = json.load(f)
- f.close()
-
- if depend:
- makeDepend(sb, library, output)
- else:
- makeTexFile(sb, library, output)
-
-if __name__ == '__main__':
- main()
diff --git a/songbook_core/__init__.py b/songbook_core/__init__.py
new file mode 100644
index 00000000..96f0724e
--- /dev/null
+++ b/songbook_core/__init__.py
@@ -0,0 +1,14 @@
+"""Global variables."""
+
+from pkg_resources import resource_filename
+import os
+
+# Version
+
+__VERSION__ = (3, 7, 2)
+__STR_VERSION__ = '.'.join([str(number) for number in __VERSION__])
+
+# Directory containing shared data (default templates, custom LaTeX packages,
+# etc.)
+
+__DATADIR__ = os.path.abspath(resource_filename(__name__, 'data'))
diff --git a/songbook_core/authors.py b/songbook_core/authors.py
new file mode 100644
index 00000000..cea20439
--- /dev/null
+++ b/songbook_core/authors.py
@@ -0,0 +1,203 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""Authors string management."""
+
+def split_author_names(string):
+ r"""Split author between first and last name.
+
+ The last space separates first and last name, but spaces following a
+ backslash or a command are not separators.
+ Examples:
+ - Edgar Allan Poe => Poe, Edgar Allan
+ - Edgar Allan \emph {Poe} => \emph {Poe}, Edgar Allan
+ - The Rolling\ Stones => Rolling\ Stones, The
+ - The {Rolling Stones} => {Rolling Stones}, The
+ """
+ ignore_space = False
+ last_space = index = 0
+ brace_count = 0
+ for char in string:
+ index += 1
+ if brace_count == 0:
+ if char == "\\":
+ ignore_space = True
+ elif not char.isalnum() and ignore_space:
+ ignore_space = False
+ elif char == " ":
+ last_space = index
+ if char == "}":
+ brace_count += 1
+ if char == "{":
+ brace_count -= 1
+ return string[:last_space], string[last_space:]
+
+
+def split_sep_author(string, sep):
+ """Split authors string according to separators.
+
+ Arguments:
+ - string: string containing authors names ;
+ - sep: regexp matching a separator.
+
+ >>> split_sep_author("Tintin and Milou", '^(.*) and (.*)$')
+ ["Tintin", "Milou"]
+ """
+ authors = []
+ match = sep.match(string)
+ while match:
+ authors.append(match.group(2))
+ string = match.group(1)
+ match = sep.match(string)
+ authors.append(string)
+ return authors
+
+################################################################################
+### Process authors tools.
+################################################################################
+
+def processauthors_removeparen(authors_string):
+ """Remove parentheses
+
+ See docstring of processauthors() for more information.
+ """
+ opening = 0
+ dest = ""
+ for char in authors_string:
+ if char == '(':
+ opening += 1
+ elif char == ')' and opening > 0:
+ opening -= 1
+ elif opening == 0:
+ dest += char
+ return dest
+
+def processauthors_split_string(authors_string, sep):
+ """Split strings
+
+ See docstring of processauthors() for more information.
+ """
+ authors_list = [authors_string]
+ for sepword in sep:
+ dest = []
+ for author in authors_list:
+ dest.extend(split_sep_author(author, sepword))
+ authors_list = dest
+ return authors_list
+
+def processauthors_remove_after(authors_list, after):
+ """Remove stuff before "after"
+
+ See docstring of processauthors() for more information.
+ """
+ dest = []
+ for author in authors_list:
+ for afterword in after:
+ match = afterword.match(author)
+ if match:
+ author = match.group(1)
+ break
+ dest.append(author)
+ return dest
+
+def processauthors_ignore_authors(authors_list, ignore):
+ """Ignore ignored authors
+
+ See docstring of processauthors() for more information.
+ """
+ dest = []
+ for author in authors_list:
+ ignored = False
+ for ignoreword in ignore:
+ if author.find(str(ignoreword)) != -1:
+ ignored = True
+ break
+ if not ignored:
+ dest.append(author)
+ return dest
+
+def processauthors_clean_authors(authors_list):
+ """Clean: remove empty authors and unnecessary spaces
+
+ See docstring of processauthors() for more information.
+ """
+ return [
+ author.lstrip()
+ for author
+ in authors_list
+ if author.lstrip()
+ ]
+
+def processauthors_invert_names(authors_list):
+ """Move first names after last names
+
+ See docstring of processauthors() for more information.
+ """
+ dest = []
+ for author in authors_list:
+ first, last = split_author_names(author)
+ if first:
+ dest.append("%(last)s, %(first)s" % {
+ 'first': first.lstrip(),
+ 'last': last.lstrip(),
+ })
+ else:
+ dest.append(last.lstrip())
+ return dest
+
+def processauthors(authors_string, after=None, ignore=None, sep=None):
+ r"""Return a list of authors
+
+ For example, we are processing:
+ # processauthors(
+ # "Lyrics by William Blake (from Milton, 1808),
+ music by Hubert Parry (1916),
+ and sung by The Royal\ Choir~of~Nowhere
+ (just here to show you how processing is done)",
+ # after = ["by"],
+ # ignore = ["anonymous"],
+ # sep = [re.compile('^(.*) and (.*)$')],
+ # )
+
+
+ The "authors_string" string is processed as:
+
+ 1) First, parenthesis (and its content) are removed.
+ # "Lyrics by William Blake, music by Hubert Parry,
+ and sung by The Royal\ Choir~of~Nowhere"
+
+ 2) String is split, separators being comma and words from "sep".
+ # ["Lyrics by William Blake", "music by Hubert Parry",
+ "sung by The Royal\ Choir~of~Nowhere"]
+
+ 3) Everything before words in "after" is removed.
+ # ["William Blake", "Hubert Parry", "The Royal\ Choir~of~Nowhere"]
+
+ 4) Strings containing words of "ignore" are dropped.
+ # ["William Blake", "Hubert Parry", The Royal\ Choir~of~Nowhere"]
+
+ 5) First names are moved after last names
+ # ["Blake, William", "Parry, Hubert", Royal\ Choir~of~Nowhere, The"]
+ """
+
+ if not sep:
+ sep = []
+ if not after:
+ after = []
+ if not ignore:
+ ignore = []
+
+ return processauthors_invert_names(
+ processauthors_clean_authors(
+ processauthors_ignore_authors(
+ processauthors_remove_after(
+ processauthors_split_string(
+ processauthors_removeparen(
+ authors_string
+ ),
+ sep),
+ after),
+ ignore)
+ )
+ )
+
diff --git a/songbook_core/build.py b/songbook_core/build.py
new file mode 100644
index 00000000..9adaa79d
--- /dev/null
+++ b/songbook_core/build.py
@@ -0,0 +1,297 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""Build a songbook, according to parameters found in a .sb file."""
+
+import codecs
+import glob
+import logging
+import os.path
+import re
+from subprocess import Popen, PIPE, call
+
+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, SongbookContent
+from songbook_core.templates import TexRenderer
+
+LOGGER = logging.getLogger(__name__)
+EOL = "\n"
+DEFAULT_AUTHWORDS = {
+ "after": ["by"],
+ "ignore": ["unknown"],
+ "sep": ["and"],
+ }
+DEFAULT_STEPS = ['tex', 'pdf', 'sbx', 'pdf', 'clean']
+GENERATED_EXTENSIONS = [
+ "_auth.sbx",
+ "_auth.sxd",
+ ".aux",
+ ".log",
+ ".out",
+ ".sxc",
+ ".tex",
+ "_title.sbx",
+ "_title.sxd",
+ ]
+
+
+
+# pylint: disable=too-few-public-methods
+class Songbook(object):
+ """Represent a songbook (.sb) file.
+
+ - Low level: provide a Python representation of the values stored in the
+ '.sb' file.
+ - High level: provide some utility functions to manipulate these data.
+ """
+
+ def __init__(self, raw_songbook, basename):
+ super(Songbook, self).__init__()
+ self.basename = basename
+ # Default values: will be updated while parsing raw_songbook
+ self.config = {
+ 'template': "default.tex",
+ 'lang': 'english',
+ 'sort': [u"by", u"album", u"@title"],
+ 'content': None,
+ 'datadir': os.path.abspath('.'),
+ }
+ self.songslist = None
+ self._parse_raw(raw_songbook)
+
+ @staticmethod
+ def _set_songs_default(config):
+ """Set the default values for the Song() class.
+
+ Argument:
+ - config : a dictionary containing the configuration
+ """
+ Song.sort = config['sort']
+ if 'titleprefixwords' in config:
+ Song.prefixes = config['titleprefixwords']
+ else:
+ Song.prefixes = []
+ Song.authwords['after'] = [
+ re.compile(r"^.*%s\b(.*)" % after)
+ for after
+ in config['authwords']["after"]
+ ]
+ Song.authwords['ignore'] = config['authwords']['ignore']
+ Song.authwords['sep'] = [
+ re.compile(r"^(.*)%s (.*)$" % sep)
+ for sep in ([
+ " %s" % sep for sep in config['authwords']["sep"]
+ ] + [','])
+ ]
+
+ def _parse_raw(self, raw_songbook):
+ """Parse raw_songbook.
+
+ The principle is: some special keys have their value processed; others
+ are stored verbatim in self.config.
+ """
+ self.config.update(raw_songbook)
+ self.config['datadir'] = os.path.abspath(self.config['datadir'])
+
+ # Compute song list
+ if self.config['content'] is None:
+ 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, str) or isinstance(elem, unicode):
+ self.config["content"].append(("song", elem))
+ elif isinstance(elem, list):
+ self.config["content"].append((elem[0], elem[1]))
+ else:
+ raise errors.SBFileError(
+ "Syntax error: could not decode the content "
+ "of {0}".format(self.basename)
+ )
+
+ # Ensure self.config['authwords'] contains all entries
+ for (key, value) in DEFAULT_AUTHWORDS.items():
+ if key not in self.config['authwords']:
+ self.config['authwords'][key] = value
+
+ def _parse_songs(self):
+ """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.
+
+ Arguments:
+ - output: a file object, in which the file will be written.
+ """
+ self._parse_songs()
+ renderer = TexRenderer(
+ self.config['template'],
+ self.config['datadir'],
+ self.config['lang'],
+ )
+
+ context = renderer.get_variables()
+ context.update(self.config)
+ context['titleprefixkeys'] = ["after", "sep", "ignore"]
+ context['content'] = self.contentlist
+ context['filename'] = output.name[:-4]
+
+ self._set_songs_default(context)
+ renderer.render_tex(output, context)
+
+
+class SongbookBuilder(object):
+ """Provide methods to compile a songbook."""
+
+ # if False, do not expect anything from stdin.
+ interactive = False
+ # if True, allow unsafe option, like adding the --shell-escape to pdflatex
+ unsafe = False
+ # Options to add to pdflatex
+ _pdflatex_options = []
+ # Dictionary of functions that have been called by self._run_once(). Keys
+ # are function; values are return values of functions.
+ _called_functions = {}
+
+ def __init__(self, raw_songbook, basename):
+ # Representation of the .sb songbook configuration file.
+ self.songbook = Songbook(raw_songbook, basename)
+ # Basename of the songbook to be built.
+ self.basename = basename
+
+ def _run_once(self, function, *args, **kwargs):
+ """Run function if it has not been run yet.
+
+ If it as, return the previous return value.
+ """
+ if function not in self._called_functions:
+ self._called_functions[function] = function(*args, **kwargs)
+ return self._called_functions[function]
+
+ def _set_latex(self):
+ """Set TEXINPUTS and LaTeX options."""
+ if not 'TEXINPUTS' in os.environ.keys():
+ os.environ['TEXINPUTS'] = ''
+ os.environ['TEXINPUTS'] += os.pathsep + os.path.join(
+ __DATADIR__,
+ 'latex',
+ )
+ os.environ['TEXINPUTS'] += os.pathsep + os.path.join(
+ self.songbook.config['datadir'],
+ 'latex',
+ )
+
+ if self.unsafe:
+ self._pdflatex_options.append("--shell-escape")
+ if not self.interactive:
+ self._pdflatex_options.append("-halt-on-error")
+
+ def build_steps(self, steps=None):
+ """Perform steps on the songbook by calling relevant self.build_*()
+
+ Arguments:
+ - steps: list of steps to perform to compile songbook. Available steps
+ are:
+ - tex: build .tex file from templates;
+ - pdf: compile .tex using pdflatex;
+ - sbx: compile song and author indexes;
+ - clean: remove temporary files,
+ - any string beginning with a sharp sign (#): it is interpreted as a
+ command to run in a shell.
+ """
+ if not steps:
+ steps = DEFAULT_STEPS
+
+ for step in steps:
+ if step == 'tex':
+ self.build_tex()
+ elif step == 'pdf':
+ self.build_pdf()
+ elif step == 'sbx':
+ self.build_sbx()
+ elif step == 'clean':
+ self.clean()
+ elif step.startswith("#"):
+ self.build_custom(step[1:])
+ else:
+ # Unknown step name
+ raise errors.UnknownStep(step)
+
+ def build_tex(self):
+ """Build .tex file from templates"""
+ LOGGER.info("Building '{}.tex'…".format(self.basename))
+ with codecs.open(
+ "{}.tex".format(self.basename), 'w', 'utf-8',
+ ) as output:
+ self.songbook.write_tex(output)
+
+ def build_pdf(self):
+ """Build .pdf file from .tex file"""
+ LOGGER.info("Building '{}.pdf'…".format(self.basename))
+ self._run_once(self._set_latex)
+ process = Popen(
+ ["pdflatex"] + self._pdflatex_options + [self.basename],
+ stdin=PIPE,
+ stdout=PIPE,
+ stderr=PIPE)
+ if not self.interactive:
+ process.stdin.close()
+ log = ''
+ line = process.stdout.readline()
+ while line:
+ log += line
+ line = process.stdout.readline()
+ LOGGER.debug(log)
+
+ process.wait()
+
+ if process.returncode:
+ raise errors.LatexCompilationError(self.basename)
+
+ def build_sbx(self):
+ """Make index"""
+ LOGGER.info("Building indexes…")
+ sxd_files = glob.glob("%s_*.sxd" % self.basename)
+ for sxd_file in sxd_files:
+ LOGGER.debug("Processing " + sxd_file)
+ idx = process_sxd(sxd_file)
+ with codecs.open(sxd_file[:-3] + "sbx", "w", "utf-8") as index_file:
+ index_file.write(idx.entries_to_str())
+
+ @staticmethod
+ def build_custom(command):
+ """Run a shell command"""
+ LOGGER.info("Running '{}'…".format(command))
+ exit_code = call(command, shell=True)
+ if exit_code:
+ raise errors.StepCommandError(command, exit_code)
+
+ def clean(self):
+ """Clean (some) temporary files used during compilation.
+
+ Depending of the LaTeX modules used in the template, there may be others
+ that are not deleted by this function."""
+ LOGGER.info("Cleaning…")
+ for ext in GENERATED_EXTENSIONS:
+ if os.path.isfile(self.basename + ext):
+ try:
+ os.unlink(self.basename + ext)
+ except Exception as exception:
+ raise errors.CleaningError(self.basename + ext, exception)
diff --git a/songbook_core/data/examples/README b/songbook_core/data/examples/README
new file mode 100644
index 00000000..942bbf37
--- /dev/null
+++ b/songbook_core/data/examples/README
@@ -0,0 +1,3 @@
+Run the following command to build an example song book.
+
+$ PATH/TO/songbook.py example.sb
diff --git a/songbook_core/data/examples/example-layout.sb b/songbook_core/data/examples/example-layout.sb
new file mode 100644
index 00000000..e252ed5d
--- /dev/null
+++ b/songbook_core/data/examples/example-layout.sb
@@ -0,0 +1,22 @@
+{
+"template" : "layout.tex",
+"bookoptions" : [
+ "importantdiagramonly",
+ "repeatchords",
+ "lilypond",
+ "pictures"
+ ],
+"booktype" : "chorded",
+"lang" : "french",
+"authwords" : {
+ "sep" : ["and", "et"]
+ },
+ "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
new file mode 100644
index 00000000..dcb27587
--- /dev/null
+++ b/songbook_core/data/examples/example-patacrep.sb
@@ -0,0 +1,22 @@
+{
+"template" : "patacrep.tex",
+"bookoptions" : [
+ "importantdiagramonly",
+ "repeatchords",
+ "lilypond",
+ "pictures"
+ ],
+"booktype" : "chorded",
+"lang" : "french",
+"authwords" : {
+ "sep" : ["and", "et"]
+ },
+ "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
new file mode 100644
index 00000000..40ed8ebc
--- /dev/null
+++ b/songbook_core/data/examples/example-songs.sb
@@ -0,0 +1,22 @@
+{
+"template" : "songs.tex",
+"bookoptions" : [
+ "importantdiagramonly",
+ "repeatchords",
+ "lilypond",
+ "pictures"
+ ],
+"booktype" : "chorded",
+"lang" : "french",
+"authwords" : {
+ "sep" : ["and", "et"]
+ },
+ "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
new file mode 100644
index 00000000..a003440e
--- /dev/null
+++ b/songbook_core/data/examples/example.sb
@@ -0,0 +1,21 @@
+{
+"bookoptions" : [
+ "importantdiagramonly",
+ "repeatchords",
+ "lilypond",
+ "pictures"
+ ],
+"booktype" : "chorded",
+"lang" : "french",
+"authwords" : {
+ "sep" : ["and", "et"]
+ },
+ "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/examples/img/README b/songbook_core/data/examples/img/README
new file mode 100644
index 00000000..ae8a29d8
--- /dev/null
+++ b/songbook_core/data/examples/img/README
@@ -0,0 +1,3 @@
+This repository is automatically included as LaTeX graphics path. That is, any
+image in this directory can be included in your LaTeX document specifying only
+its base name.
diff --git a/songbook_core/data/examples/img/treble_a.png b/songbook_core/data/examples/img/treble_a.png
new file mode 100644
index 00000000..88383972
Binary files /dev/null and b/songbook_core/data/examples/img/treble_a.png differ
diff --git a/songbook_core/data/examples/latex/README b/songbook_core/data/examples/latex/README
new file mode 100644
index 00000000..2cf69445
--- /dev/null
+++ b/songbook_core/data/examples/latex/README
@@ -0,0 +1 @@
+This directory is automatically included in LaTeX path. Thus you can add custom modules in it.
diff --git a/songbook_core/data/examples/songs/README b/songbook_core/data/examples/songs/README
new file mode 100644
index 00000000..523c8e4a
--- /dev/null
+++ b/songbook_core/data/examples/songs/README
@@ -0,0 +1 @@
+Songs, as .sg files, are expected to be in this directory.
diff --git a/lilypond/header b/songbook_core/data/examples/songs/_lilypond/header
similarity index 100%
rename from lilypond/header
rename to songbook_core/data/examples/songs/_lilypond/header
diff --git a/songbook_core/data/examples/songs/chevaliers_de_la_table_ronde.sg b/songbook_core/data/examples/songs/chevaliers_de_la_table_ronde.sg
new file mode 100644
index 00000000..77dfa869
--- /dev/null
+++ b/songbook_core/data/examples/songs/chevaliers_de_la_table_ronde.sg
@@ -0,0 +1,70 @@
+\selectlanguage{french}
+\songcolumns{2}
+\beginsong{Chevaliers de la table ronde}
+ [by={Traditionnel},cov={traditionnel},album={France}]
+
+ \cover
+ \gtab{C}{X32010}
+ \gtab{G7}{320001}
+ \gtab{F}{1:022100}
+
+ \begin{verse}
+ Cheva\[C]liers de la Table Ronde
+ Goûtons \[G7]voir si le vin est \[C]bon
+ \rep{2}
+ \end{verse}
+
+ \begin{chorus}
+ Goûtons \[F]voir, \echo{oui, oui, oui}
+ Goûtons \[C]voir, \echo{non, non, non}
+ Goûtons \[G7]voir si le vin est bon
+ \rep{2}
+ \end{chorus}
+
+ \begin{verse}
+ S'il est bon, s'il est agréable
+ J'en boirai jusqu'Ã mon plaisir
+ \end{verse}
+
+ \begin{verse}
+ J'en boirai cinq à six bouteilles
+ Et encore, ce n'est pas beaucoup
+ \end{verse}
+
+ \begin{verse}
+ Si je meurs, je veux qu'on m'enterre
+ Dans une cave où il y a du bon vin
+ \end{verse}
+
+ \begin{verse}
+ Les deux pieds contre la muraille
+ Et la tête sous le robinet
+ \end{verse}
+
+ \begin{verse}
+ Et les quatre plus grands ivrognes
+ Porteront les quatre coins du drap
+ \end{verse}
+
+ \begin{verse}
+ Pour donner le discours d'usage
+ On prendra le bistrot du coin
+ \end{verse}
+
+ \begin{verse}
+ Et si le tonneau se débouche
+ J'en boirai jusqu'Ã mon plaisir
+ \end{verse}
+
+ \begin{verse}
+ Et s'il en reste quelques gouttes
+ Ce sera pour nous rafraîchir
+ \end{verse}
+
+ \begin{verse}
+ Sur ma tombe, je veux qu'on inscrive
+ \emph{Ici gît le roi des buveurs}
+ \end{verse}
+
+\endsong
+
diff --git a/examples/example-en.sg b/songbook_core/data/examples/songs/example-en.sg
similarity index 91%
rename from examples/example-en.sg
rename to songbook_core/data/examples/songs/example-en.sg
index 33c9e477..7009cc68 100644
--- a/examples/example-en.sg
+++ b/songbook_core/data/examples/songs/example-en.sg
@@ -21,10 +21,10 @@
% Sad robot: the song's title
% Pornophonique : the artist's name
-% 8-bit-lagerfeuer : the file "8-bit-lagerfeuer.jpg" that corresponds to the album art
+% traditionnel : the file "8-bit-lagerfeuer.jpg" that corresponds to the album art
% 8 bit lagerfeuer : the album whose song is extracted from
\beginsong{Sad robot}
- [by={Pornophonique},cov={8-bit-lagerfeuer},album={8 bit lagerfeuer}]
+ [by={Pornophonique},cov={traditionnel},album={8 bit lagerfeuer}]
% inserts the album art (8-bit-lagerfeuer.jpg)
\cover
@@ -45,7 +45,7 @@
% use the \rep{n} macro for a sentence repeated n times
% use the \echo{text} macro for background singing lyrics
- \lilypond{Sad_robot} % inserts the music sheet corresponding to the Sad_robot.ly file in the ./lilypond directory
+ %\lilypond{Sad_robot} % inserts the music sheet corresponding to the Sad_robot.ly file in the same directory as this .sg file.
% verse environments are automatically numbered
\begin{verse}
diff --git a/examples/example-fr.sg b/songbook_core/data/examples/songs/example-fr.sg
similarity index 90%
rename from examples/example-fr.sg
rename to songbook_core/data/examples/songs/example-fr.sg
index 2eeddd95..c9264096 100644
--- a/examples/example-fr.sg
+++ b/songbook_core/data/examples/songs/example-fr.sg
@@ -23,10 +23,10 @@
% Sad robot: le titre de la chanson
% Pornophonique : le nom de l'artiste
-% 8-bit-lagerfeuer : le fichier "8-bit-lagerfeuer.jpg" correspondant à la pochette de l'album
+% traditionnel : le fichier "8-bit-lagerfeuer.jpg" correspondant à la pochette de l'album
% 8 bit lagerfeuer : le nom de l'album dont la chanson est extraite
\beginsong{Sad robot}
- [by={Pornophonique},cov={8-bit-lagerfeuer},album={8 bit lagerfeuer}]
+ [by={Pornophonique},cov={traditionnel},album={8 bit lagerfeuer}]
% insère la pochette de l'album (8-bit-lagerfeuer.jpg)
\cover
@@ -47,7 +47,7 @@
% utilisez la macro \rep{n} pour une phrase répétée n fois
% utilisez la macro \echo{text} pour les phrases chantées en arrière plan
- \lilypond{Sad_robot} % insère la partition correspondant au fichier Sad_robot.ly du répertoire ./lilypond
+ %\lilypond{Sad_robot} % insère la partition correspondant au fichier Sad_robot.ly du répertoire de ce fichier .sg
\begin{verse}
His \[Dm]steely skin is covered
@@ -64,14 +64,14 @@
\[F]Can you feel the pain
Of the \[C]sad, sad robot
And it's \[Dm]driving him insane
- \end{verse}
+ \end{verse*}
\begin{verse*}
He can't \[Dm]turn back time nor history
So his \[F]life became a misery
He \[C]has to face the destiny
Nobody \[Dm]cares anymore
- \end{verse}
+ \end{verse*}
\end{repeatedchords}
\begin{chorus}
diff --git a/songbook_core/data/examples/songs/greensleeves.ly b/songbook_core/data/examples/songs/greensleeves.ly
new file mode 100644
index 00000000..1fd2bccb
--- /dev/null
+++ b/songbook_core/data/examples/songs/greensleeves.ly
@@ -0,0 +1,19 @@
+\include "_lilypond/header"
+\paper{paper-height = 6.5\cm}
+
+{
+ \key a \minor
+ \time 6/8
+ \partial 8 a'8
+ \relative c''{
+ c4 d8 e8. (f16) e8 d4 b8 g8. (a16) b8
+ c4 a8 a8. (gis16) a8 b4 gis8 e4 a8
+ c4 d8 e8. (f16 e8) d4 b8 g8. (a16) b8
+ 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.
+ }
+}
diff --git a/songbook_core/data/examples/songs/greensleeves.sg b/songbook_core/data/examples/songs/greensleeves.sg
new file mode 100644
index 00000000..469fab99
--- /dev/null
+++ b/songbook_core/data/examples/songs/greensleeves.sg
@@ -0,0 +1,150 @@
+\selectlanguage{english}
+\songcolumns{2}
+\beginsong{Greensleeves}
+ [by={Traditionnel},cov={traditionnel},album={Angleterre}]
+
+ \cover
+ \gtab{Am}{X02210}
+ \gtab{G}{320003}
+ \gtab{E}{022100}
+ \gtab{C}{X32010}
+
+ \lilypond{greensleeves}
+
+ \begin{verse}
+ A\[Am]las, my love, ye \[G]do me wrong
+ To \[Am]cast me oft dis\[E]curteously
+ And \[Am]{I have} loved \[G]you so long
+ De\[Am]lighting \[E]in your \[Am]companie
+ \end{verse}
+
+ \begin{chorus}
+ \[C]Greensleeves was \[G]all my joy
+ \[Am]Greensleeves was \[E]my delight
+ \[C]Greensleeves was my \[G]heart of gold
+ And \[Am]who but \[E]Ladie \[Am]Greensleeves
+ \end{chorus}
+
+ \begin{repeatedchords}
+ \begin{verse}
+ I \[Am]have been readie \[G]at your hand
+ To \[Am]grant what ever \[E]you would crave
+ I \[Am]have both waged \[G]life and land
+ Your \[Am]love and \[E]good will \[Am]for to have
+ \end{verse}
+
+ \begin{verse}
+ I \[Am]bought thee kerchers \[G]to thy head
+ That \[Am]were wrought fine and \[E]gallantly
+ I \[Am]kept thee both at \[G]boord and bed
+ Which \[Am]cost my \[E]purse well \[Am]favouredly
+ \end{verse}
+
+ \begin{verse}
+ I \[Am]bought thee peticotes \[G]of the best
+ The \[Am]cloth so fine as \[E]fine might be
+ I \[Am]gave thee jewels \[G]for thy chest
+ And \[Am]all this \[E]cost I \[Am]spent on thee
+ \end{verse}
+
+ \begin{verse}
+ Thy \[Am]smock of silke, both \[G]faire and white
+ With \[Am]gold embrodered \[E]gorgeously
+ Thy \[Am]peticote of \[G]sendall right
+ And \[Am]this I \[E]bought thee \[Am]gladly
+ \end{verse}
+
+ \begin{verse}
+ Thy \[Am]girdle of gold \[G]so red
+ With \[Am]pearles bed\[E]ecked sumtuously
+ The \[Am]like no other \[G]lasses had
+ And \[Am]yet thou \[E]wouldest not \[Am]love me
+ \end{verse}
+
+ \begin{verse}
+ Thy \[Am]purse, and eke thy gay \[G]guilt knives
+ Thy \[Am]pincase, gallant \[E]to the eie
+ No \[Am]better wore the \[G]burgesse wives
+ And \[Am]yet thou \[E]wouldst not \[Am]love me
+ \end{verse}
+
+ \begin{verse}
+ Thy \[Am]crimson stockings, \[G]all of silk
+ With \[Am]golde all \[E]wrought above the knee
+ Thy \[Am]pumps, as white as \[G]was the milk
+ And \[Am]yet thou \[E]wouldst not \[Am]love me
+ \end{verse}
+
+ \begin{verse}
+ Thy \[Am]gown was of the \[G]grassie green
+ Thy \[Am]sleeves of satten \[E]hanging by
+ Which \[Am]made thee be our \[G]harvest queen
+ And \[Am]yet thou \[E]wouldst not \[Am]love me
+ \end{verse}
+
+ \begin{verse}
+ Thy \[Am]garters fringed \[G]with the golde
+ And \[Am]silver aglets \[E]hanging by
+ Which \[Am]made thee blithe for \[G]to beholde
+ And \[Am]yet thou \[E]wouldst not \[Am]love me
+ \end{verse}
+
+ \begin{verse}
+ My gayest gelding I thee gave
+ To ride where ever liked thee
+ No ladie ever was so brave
+ And \[Am]yet thou \[E]wouldst not \[Am]love me
+ And yet thou wouldst not love me
+ \end{verse}
+
+ \begin{verse}
+ My \[Am]men were clothed \[G]all in green
+ And \[Am]they did ever \[E]wait on thee
+ All \[Am]this was gallant \[G]to be seen
+ And \[Am]yet thou \[E]wouldst not \[Am]love me
+ \end{verse}
+
+ \begin{verse}
+ They \[Am]set thee up, they \[G]took thee downe
+ They \[Am]served thee with hu\[E]militie
+ Thy \[Am]foote might not once \[G]touch the ground
+ And \[Am]yet thou \[E]wouldst not \[Am]love me
+ \end{verse}
+
+ \begin{verse}
+ For \[Am]everie morning, \[G]when thou rose
+ I \[Am]sent thee dainties, \[E]orderly
+ To \[Am]cheare thy stomack from \[G]all woes
+ And \[Am]yet thou \[E]wouldst not \[Am]love me
+ \end{verse}
+
+ \begin{verse}
+ Thou \[Am]couldst desire no \[G]earthly thing
+ But \[Am]stil thou hadst it \[E]readily
+ Thy \[Am]musicke still to \[G]play and sing
+ And \[Am]yet thou \[E]wouldst not \[Am]love me
+ \end{verse}
+
+ \begin{verse}
+ And \[Am]who did pay for \[G]all this geare
+ That \[Am]thou didst spend when \[E]pleased thee?
+ Even \[Am]{I that} am re\[G]jected here
+ And \[Am]thou dis\[E]dainst to \[Am]love me
+ \end{verse}
+
+ \begin{verse}
+ Wei, \[Am]{I wil} pray to \[G]God on hie
+ That \[Am]thou my constancie \[E]maist see
+ And \[Am]that yet once be\[G]fore I die
+ Thou \[Am]will vouch\[E]safe to \[Am]love me
+ \end{verse}
+
+ \begin{chorus}
+ \[C]Greensleeves, now \[G]farewel, adue!
+ \[Am]God I pray to \[E]prosper thee
+ \[C]For I am stil thy \[G]lover true
+ Come \[Am]once a\[E]gaine, and \[Am]love me!
+ \end{chorus}
+ \end{repeatedchords}
+
+\endsong
diff --git a/songbook_core/data/examples/songs/traditionnel.jpg b/songbook_core/data/examples/songs/traditionnel.jpg
new file mode 100644
index 00000000..e7d441cb
Binary files /dev/null and b/songbook_core/data/examples/songs/traditionnel.jpg differ
diff --git a/songbook_core/data/examples/songs/vent_frais.sg b/songbook_core/data/examples/songs/vent_frais.sg
new file mode 100644
index 00000000..36584ad7
--- /dev/null
+++ b/songbook_core/data/examples/songs/vent_frais.sg
@@ -0,0 +1,19 @@
+\selectlanguage{french}
+\songcolumns{2}
+\beginsong{Vent frais}
+ [by={Traditionnel},cov={traditionnel},album={France}]
+
+ \cover
+ \gtab{Dm}{XX0231}
+ \gtab{Am}{X02210}
+
+ \begin{verse}
+ \[Dm]Vent \[Am]frais
+ \[Dm]Vent du ma\[Am]tin
+ \[Dm]Vent qui \[Am]souffle
+ Au \[Dm]sommet des grands \[Am]pins
+ \[Dm]Joie du \[Am]vent qui \[Dm]souffle
+ A\[Am]llons dans le grand \dots
+ \end{verse}
+
+\endsong
diff --git a/songbook_core/data/examples/templates/README b/songbook_core/data/examples/templates/README
new file mode 100644
index 00000000..95fb96d1
--- /dev/null
+++ b/songbook_core/data/examples/templates/README
@@ -0,0 +1 @@
+Templates are looked for in this directory.
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/chords.sty b/songbook_core/data/latex/chords.sty
new file mode 100644
index 00000000..c3c05caf
--- /dev/null
+++ b/songbook_core/data/latex/chords.sty
@@ -0,0 +1,354 @@
+% Chords package for patacrep songbook
+% Define command \chords to display list of chords, for guitar or ukulele
+\ProvidesPackage{chords}
+\RequirePackage{songs}
+\newcommand*{\Sharp}{\nolinebreak\hspace{-.05em}\raisebox{.6ex}{\,\small\bf \#}}
+\newcommand*{\Flat}{\nolinebreak\hspace{-.05em}\raisebox{.6ex}{\,\small$\mathbf{\flat}$}}
+\newcommand*{\chordrule}{\mbox{\hspace{1cm}\rule[0.5cm]{15cm}{0.02cm}}\vspace{-.4cm}}
+\newcommand*{\chordname}[1]{\makebox[3cm]{\raisebox{.5cm}{\large \textbf{#1}}}}
+
+\newcommand{\chordnameAsharp}{\printnoteA{}\Sharp = \printnoteB{}\Flat}
+\newcommand{\chordnameA}{\printnoteA{}}
+\newcommand{\chordnameB}{\printnoteB{}}
+\newcommand{\chordnameCsharp}{\printnoteC{}\Sharp = \printnoteD{}\Flat}
+\newcommand{\chordnameC}{\printnoteC{}}
+\newcommand{\chordnameDsharp}{\printnoteD{}\Sharp = \printnoteE{}\Flat}
+\newcommand{\chordnameD}{\printnoteD{}}
+\newcommand{\chordnameE}{\printnoteE{}}
+\newcommand{\chordnameFsharp}{\printnoteF{}\Sharp = \printnoteG{}\Flat}
+\newcommand{\chordnameF}{\printnoteF{}}
+\newcommand{\chordnameGsharp}{\printnoteG{}\Sharp = \printnoteA{}\Flat}
+\newcommand{\chordnameG}{\printnoteG{}}
+
+\AtBeginDocument{
+ % Default names (english)
+ \newcommand{\guitarchordsname}{Guitar chords}
+ \newcommand{\ukulelechordsname}{Ukulele chords}
+
+ \IfStrEq{\mainlanguage}{french}{
+ % French names
+ \renewcommand{\guitarchordsname}{Accords de guitare}
+ \renewcommand{\ukulelechordsname}{Accords de ukulélé}
+ }{}
+}
+
+
+\newcommand{\chords}{
+ \begin{songs}{}
+ %hide song number
+ \definecolor{SongNumberBgColor}{HTML}{FFFFFF}
+ \renewcommand{\snumbgcolor}{SongNumberBgColor}
+ \renewcommand{\printsongnum}[1]{}
+ \setlength{\songnumwidth}{0.1cm}
+ \songcolumns{1}
+
+ \ifguitar
+ \beginsong{\guitarchordsname}
+ \chordname{\chordnameC}
+ \gtab{\printnoteC{}}{~:X32010}
+ \gtab{\printnoteC{}7}{~:X32310}
+ \gtab{\printnoteC{}m}{3:X02210}
+ \gtab{\printnoteC{}m7}{3:X02010}
+ \hspace{1cm}
+ \gtab*{\printnoteC{}7M}{~:332000}
+ \gtab*{\printnoteC{}4}{~:X32011}
+ \gtab*{\printnoteC{}7}{1:X2120X}
+ \gtab*{\printnoteC{}6}{~:XX2213}
+ \chordrule
+
+ \chordname{\chordnameCsharp}
+ \gtab{\printnoteC{}\#}{4:X02220}
+ \gtab{\printnoteC{}\#7}{4:X02020}
+ \gtab{\printnoteC{}\#m}{4:X02210}
+ \gtab{\printnoteC{}\#m7}{5:XX2213}
+ \hspace{1cm}
+ \gtab*{\printnoteC{}\#7M}{1:X32000}
+ \gtab*{\printnoteC{}\#4}{2:X21000}
+ \gtab*{\printnoteC{}\#7}{2:X2120X}
+ \gtab*{\printnoteC{}\#6}{1:X02010}
+ \chordrule
+
+ \chordname{\chordnameD}
+ \gtab{\printnoteD{}}{~:XX0232}
+ \gtab{\printnoteD{}7}{~:XX0212}
+ \gtab{\printnoteD{}m}{~:XX0231}
+ \gtab{\printnoteD{}m7}{~:XX0211}
+ \hspace{1cm}
+ \gtab*{\printnoteD{}7M}{~:X00222}
+ \gtab*{\printnoteD{}4}{~:X00233}
+ \gtab*{\printnoteD{}7}{3:X2120X}
+ \gtab*{\printnoteD{}6}{~:X00202}
+ \chordrule
+
+ \chordname{\chordnameDsharp}
+ \gtab{\printnoteD{}\#}{6:X02220}
+ \gtab{\printnoteD{}\#7}{6:X02020}
+ \gtab{\printnoteD{}\#m}{6:X02210}
+ \gtab{\printnoteD{}\#m7}{~:XX1322}
+ \hspace{1cm}
+ \gtab*{\printnoteD{}\#7M}{3:022010}
+ \gtab*{\printnoteD{}\#4}{4:X21000}
+ \gtab*{\printnoteD{}\#7}{4:X2120X}
+ \gtab*{\printnoteD{}\#6}{1:X00202}
+ \chordrule
+
+ \chordname{\chordnameE}
+ \gtab{\printnoteE{}}{~:022100}
+ \gtab{\printnoteE{}7}{~:020100}
+ \gtab{\printnoteE{}m}{~:022000}
+ \gtab{\printnoteE{}m7}{~:022030}
+ \hspace{1cm}
+ \gtab*{\printnoteE{}7M}{~:021100}
+ \gtab*{\printnoteE{}4}{~:02220}
+ \gtab*{\printnoteE{}7}{5:X2120X}
+ \gtab*{\printnoteE{}6}{~:022120}
+ \chordrule
+
+ \chordname{\chordnameF}
+ \gtab{\printnoteF{}}{1:022100}
+ \gtab{\printnoteF{}7}{1:020100}
+ \gtab{\printnoteF{}m}{1:022000}
+ \gtab{\printnoteF{}m7}{1:020000}
+ \hspace{1cm}
+ \gtab*{\printnoteF{}7M}{~:XX3210}
+ \gtab*{\printnoteF{}4}{1:022200}
+ \gtab*{\printnoteF{}7}{6:X2120X}
+ \gtab*{\printnoteF{}6}{~:XX0211}
+ \chordrule
+
+ \chordname{\chordnameFsharp}
+ \gtab{\printnoteF{}\#}{2:022100}
+ \gtab{\printnoteF{}\#7}{2:020100}
+ \gtab{\printnoteF{}\#m}{2:022000}
+ \gtab{\printnoteF{}\#m7}{2:020000}
+ \hspace{1cm}
+ \gtab*{\printnoteF{}\#7M}{~:XX4321}
+ \gtab*{\printnoteF{}\#4}{2:022200}
+ \gtab*{\printnoteF{}\#7}{7:X2120X}
+ \gtab*{\printnoteF{}\#6}{~:XX1322}
+ \chordrule
+
+ \chordname{\chordnameG}
+ \gtab{\printnoteG{}}{~:320003}
+ \gtab{\printnoteG{}7}{~:320001}
+ \gtab{\printnoteG{}m}{3:022000}
+ \gtab{\printnoteG{}m7}{3:020000}
+ \hspace{1cm}
+ \gtab*{\printnoteG{}7M}{~:XX0002}
+ \gtab*{\printnoteG{}4}{3:022200}
+ \gtab*{\printnoteG{}7}{3:020200}
+ \gtab*{\printnoteG{}6}{~:320000}
+ \chordrule
+
+ \chordname{\chordnameGsharp}
+ \gtab{\printnoteG{}\#}{4:022100}
+ \gtab{\printnoteG{}\#7}{4:020100}
+ \gtab{\printnoteG{}\#m}{4:022000}
+ \gtab{\printnoteG{}\#m7}{4:020000}
+ \hspace{1cm}
+ \gtab*{\printnoteG{}\#7M}{3:XX4321}
+ \gtab*{\printnoteG{}\#4}{4:022200}
+ \gtab*{\printnoteG{}\#7}{~:XX1122}
+ \gtab*{\printnoteG{}\#6}{~:XX1111}
+ \chordrule
+
+ \chordname{\chordnameA}
+ \gtab{\printnoteA{}}{~:X02220}
+ \gtab{\printnoteA{}7}{~:X02020}
+ \gtab{\printnoteA{}m}{~:X02210}
+ \gtab{\printnoteA{}m7}{~:X02213}
+ \hspace{1cm}
+ \gtab*{\printnoteA{}7M}{~:X02120}
+ \gtab*{\printnoteA{}4}{~:X02230}
+ \gtab*{\printnoteA{}7}{~:X02233}
+ \gtab*{\printnoteA{}6}{~:XX2222}
+ \chordrule
+
+ \chordname{\chordnameAsharp}
+ \gtab{\printnoteA{}\#}{1:X02220}
+ \gtab{\printnoteA{}\#7}{1:X02020}
+ \gtab{\printnoteA{}\#m}{1:X02210}
+ \gtab{\printnoteA{}\#m7}{1:X02010}
+ \hspace{1cm}
+ \gtab*{\printnoteA{}\#7M}{1:X02120}
+ \gtab*{\printnoteA{}\#4}{1:X02230}
+ \gtab*{\printnoteA{}\#7}{~:XX3344}
+ \gtab*{\printnoteA{}\#6}{~:XX3333}
+ \chordrule
+
+ \chordname{\chordnameB}
+ \gtab{\printnoteB{}}{2:X02220}
+ \gtab{\printnoteB{}7}{X21202}
+ \gtab{\printnoteB{}m}{2:X02210}
+ \gtab{\printnoteB{}m7}{~:X00202}
+ \hspace{1cm}
+ \gtab*{\printnoteB{}7M}{2:X02120}
+ \gtab*{\printnoteB{}4}{2:X02230}
+ \gtab*{\printnoteB{}7}{~:X22202}
+ \gtab*{\printnoteB{}6}{~:XX4444}
+
+ \begin{verse*}
+ \musicnote[french]{Accordage standard : {\nolyrics \[\printnoteE{} \printnoteA{} \printnoteD{} \printnoteG{} \printnoteB{} \printnoteE{}]}}
+ \musicnote[english]{Standard tuning: {\nolyrics \[\printnoteE{} \printnoteA{} \printnoteD{} \printnoteG{} \printnoteB{} \printnoteE{}]}}
+ \end{verse*}
+
+ \endsong
+ \fi
+
+ \ifukulele
+ \beginsong{\ukulelechordsname}
+
+ \chordname{\chordnameC}
+ \utab{\printnoteC{}}{~:0003}
+ \utab{\printnoteC{}7}{~:0001}
+ \utab{\printnoteC{}m}{~:0333}
+ \utab{\printnoteC{}m7}{3:0000}
+ \hspace{1cm}
+ \utab*{\printnoteC{}7M}{~:0002}
+ \utab*{\printnoteC{}6}{~:0000}
+ \utab*{\printnoteC{}aug}{~:1003}
+ \utab*{\printnoteC{}dim}{2:3101}
+ \chordrule
+
+ \chordname{\chordnameCsharp}
+ \utab{\printnoteC{}\#}{1:0003}
+ \utab{\printnoteC{}\#7}{1:0001}
+ \utab{\printnoteC{}\#m}{~:1104}
+ \utab{\printnoteC{}\#m7}{4:0000}
+ \hspace{1cm}
+ \utab*{\printnoteC{}\#7M}{1:0002}
+ \utab*{\printnoteC{}\#6}{1:0000}
+ \utab*{\printnoteC{}\#aug}{~:2110}
+ \utab*{\printnoteC{}\#dim}{~:0104}
+ \chordrule
+
+ \chordname{\chordnameD}
+ \utab{\printnoteD{}}{~:2220}
+ \utab{\printnoteD{}7}{2:0001}
+ \utab{\printnoteD{}m}{~:2210}
+ \utab{\printnoteD{}m7}{1:1102}
+ \hspace{1cm}
+ \utab*{\printnoteD{}7M}{2:0002}
+ \utab*{\printnoteD{}6}{2:0000}
+ \utab*{\printnoteD{}aug}{1:2110}
+ \utab*{\printnoteD{}dim}{1:0104}
+ \chordrule
+
+ \chordname{\chordnameDsharp}
+ \utab{\printnoteD{}\#}{1:2220}
+ \utab{\printnoteD{}\#7}{3:0001}
+ \utab{\printnoteD{}\#m}{1:2210}
+ \utab{\printnoteD{}\#m7}{2:1102}
+ \hspace{1cm}
+ \utab*{\printnoteD{}\#7M}{3:0002}
+ \utab*{\printnoteD{}\#6}{3:0000}
+ \utab*{\printnoteD{}\#aug}{~:0332}
+ \utab*{\printnoteD{}\#dim}{~:2320}
+ \chordrule
+
+ \chordname{\chordnameE}
+ \utab{\printnoteE{}}{2:2220}
+ \utab{\printnoteE{}7}{~:1202}
+ \utab{\printnoteE{}m}{~:0432}
+ \utab{\printnoteE{}m7}{~:0202}
+ \hspace{1cm}
+ \utab*{\printnoteE{}7M}{~:1302}
+ \utab*{\printnoteE{}6}{~:1102}
+ \utab*{\printnoteE{}aug}{1:0000}
+ \utab*{\printnoteE{}dim}{1:2320}
+ \chordrule
+
+ \chordname{\chordnameF}
+ \utab{\printnoteF{}}{~:2010}
+ \utab{\printnoteF{}7}{~:2310}
+ \utab{\printnoteF{}m}{~:1013}
+ \utab{\printnoteF{}m7}{1:0202}
+ \hspace{1cm}
+ \utab*{\printnoteF{}7M}{1:1302}
+ \utab*{\printnoteF{}6}{1:1102}
+ \utab*{\printnoteF{}aug}{~:2110}
+ \utab*{\printnoteF{}dim}{2:2320}
+ \chordrule
+
+ \chordname{\chordnameFsharp}
+ \utab{\printnoteF{}\#}{1:2010}
+ \utab{\printnoteF{}\#7}{1:2310}
+ \utab{\printnoteF{}\#m}{~:2120}
+ \utab{\printnoteF{}\#m7}{2:0202}
+ \hspace{1cm}
+ \utab*{\printnoteF{}\#7M}{2:1302}
+ \utab*{\printnoteF{}\#6}{~:0202}
+ \utab*{\printnoteF{}\#aug}{1:2110}
+ \utab*{\printnoteF{}\#dim}{~:2020}
+ \chordrule
+
+ \chordname{\chordnameG}
+ \utab{\printnoteG{}}{~:0232}
+ \utab{\printnoteG{}7}{~:0212}
+ \utab{\printnoteG{}m}{~:0231}
+ \utab{\printnoteG{}m7}{~:0211}
+ \hspace{1cm}
+ \utab*{\printnoteG{}7M}{~:0222}
+ \utab*{\printnoteG{}6}{~:0202}
+ \utab*{\printnoteG{}aug}{~:0332}
+ \utab*{\printnoteG{}dim}{~:0131}
+ \chordrule
+
+ \chordname{\chordnameGsharp}
+ \utab{\printnoteG{}\#}{3:2010}
+ \utab{\printnoteG{}\#7}{1:0212}
+ \utab{\printnoteG{}\#m}{1:0231}
+ \utab{\printnoteG{}\#m7}{1:0211}
+ \hspace{1cm}
+ \utab*{\printnoteG{}\#7M}{1:0222}
+ \utab*{\printnoteG{}\#6}{1:0202}
+ \utab*{\printnoteG{}\#aug}{~:1003}
+ \utab*{\printnoteG{}\#dim}{1:0131}
+ \chordrule
+
+ \chordname{\chordnameA}
+ \utab{\printnoteA{}}{~:2100}
+ \utab{\printnoteA{}7}{~:0100}
+ \utab{\printnoteA{}m}{~:2000}
+ \utab{\printnoteA{}m7}{~:0000}
+ \hspace{1cm}
+ \utab*{\printnoteA{}7M}{~:1100}
+ \utab*{\printnoteA{}6}{2:0202}
+ \utab*{\printnoteA{}aug}{~:2110}
+ \utab*{\printnoteA{}dim}{2:0131}
+ \chordrule
+
+ \chordname{\chordnameAsharp}
+ \utab{\printnoteA{}\#}{1:2100}
+ \utab{\printnoteA{}\#7}{1:0100}
+ \utab{\printnoteA{}\#m}{1:2000}
+ \utab{\printnoteA{}\#m7}{1:0000}
+ \hspace{1cm}
+ \utab*{\printnoteA{}\#7M}{1:1100}
+ \utab*{\printnoteA{}\#6}{~:0211}
+ \utab*{\printnoteA{}\#aug}{1:2110}
+ \utab*{\printnoteA{}\#dim}{~:3101}
+ \chordrule
+
+ \chordname{\chordnameB}
+ \utab{\printnoteB{}}{2:2100}
+ \utab{\printnoteB{}7}{2:0100}
+ \utab{\printnoteB{}m}{2:2000}
+ \utab{\printnoteB{}m7}{2:0000}
+ \hspace{1cm}
+ \utab*{\printnoteB{}7M}{2:1100}
+ \utab*{\printnoteB{}6}{1:0211}
+ \utab*{\printnoteB{}aug}{~:0332}
+ \utab*{\printnoteB{}dim}{1:3101}
+
+ \begin{verse*}
+ \musicnote[french]{Accordage standard : {\nolyrics \[\printnoteG{} \printnoteC{} \printnoteE{} \printnoteA{}]}}
+ \musicnote[english]{Standard tuning: {\nolyrics \[\printnoteG{} \printnoteC{} \printnoteE{} \printnoteA{}]}}
+ \end{verse*}
+
+ \endsong
+ \fi
+
+ \end{songs}
+}
+\endinput
diff --git a/songbook_core/data/latex/crepbook.sty b/songbook_core/data/latex/crepbook.sty
new file mode 100644
index 00000000..879c4d9e
--- /dev/null
+++ b/songbook_core/data/latex/crepbook.sty
@@ -0,0 +1,221 @@
+% 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\@metainfos{%
+ \ialign{%
+ \bf{##} \hfil & ## \hfil \cr % Lines definition
+ \@insertelement{version} %
+ \@insertelement{date} %
+ \@insertelement{author} %
+ \@insertelement{web} %
+ \@insertelement{mail} %
+ }
+ }
+ \def\@placepicture[#1, #2]{%
+ \includegraphics[keepaspectratio=true, #1, #2]{\@picture}
+ \vskip1em
+ {\hfil\hbox{\small \@picturecopyright}}
+ }
+
+ \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
+ \ifdim \paperwidth < \paperheight
+ \@metainfos
+ \vfill
+ \begin{center}
+ \@placepicture[width=.8\textwidth, height=.5\textheight]
+ \end{center}
+ \else
+ \begin{minipage}{.3\textwidth}
+ \@metainfos
+ \end{minipage}
+ \begin{minipage}{.7\textwidth}
+ \hfill%
+ \@placepicture[width=\textwidth, height=.6\textheight]
+ \end{minipage}
+ \fi
+ \vfil
+ \begin{flushright}
+ {\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/tex/songs.sty b/songbook_core/data/latex/songs.sty
similarity index 96%
rename from tex/songs.sty
rename to songbook_core/data/latex/songs.sty
index 1a338089..3202134c 100644
--- a/tex/songs.sty
+++ b/songbook_core/data/latex/songs.sty
@@ -3076,9 +3076,9 @@
\newcommand\authignoreword[1]{}
\newcommand\titleprefixword[1]{}
{\catcode`\%=12
- \gdef\authsepword#1{\SB@idxcmd{}{%sep #1}{}}
- \gdef\authbyword#1{\SB@idxcmd{}{%after #1}{}}
- \gdef\authignoreword#1{\SB@idxcmd{}{%ignore #1}{}}
+ \gdef\authsepword#1{\SB@idxcmd{}{}{%sep #1}}
+ \gdef\authbyword#1{\SB@idxcmd{}{}{%after #1}}
+ \gdef\authignoreword#1{\SB@idxcmd{}{}{%ignore #1}}
\gdef\titleprefixword#1{\SB@idxcmd{%prefix #1}{}{}}}
\@onlypreamble\authsepword
\@onlypreamble\authbyword
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
new file mode 100644
index 00000000..491fb828
--- /dev/null
+++ b/songbook_core/data/templates/default.tex
@@ -0,0 +1,121 @@
+%! Copyright (C) 2014 The Songbook team (www.patacrep.com)
+%!
+%! This program is free software; you can redistribute it and/or
+%! modify it under the terms of the GNU General Public License
+%! as published by the Free Software Foundation; either version 2
+%! of the License, or (at your option) any later version.
+%!
+%! This program is distributed in the hope that it will be useful,
+%! but WITHOUT ANY WARRANTY; without even the implied warranty of
+%! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+%! GNU General Public License for more details.
+%!
+%! You should have received a copy of the GNU General Public License
+%! along with this program; if not, write to the Free Software
+%! Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+%! MA 02110-1301, USA.
+%!
+%! The latest version of this program can be obtained from
+%! https://github.com/patacrep/
+
+
+(* variables *)
+{
+"title": {"description": {"english": "Title", "french": "Titre"},
+ "default": {"english": "Guitar songbook", "french": "Recueil de chansons pour guitare"},
+ "mandatory":true
+ },
+"author": {"description": {"english": "Author", "french": "Auteur"},
+ "default": {"english": "The Songbook Team", "french": "L'équipe Songbook"},
+ "mandatory":true
+ },
+"subtitle": {"description": {"english": "Subtitle", "french": "Sous-titre"},
+ "default": {"default": ""}
+ },
+"version":{ "description": {"english": "Version", "french": "Version"},
+ "default": {"default": "undefined"}
+ },
+"web": {"description": {"english": "Website", "french": "Site web"},
+ "default": {"default": "http://www.patacrep.com"}
+ },
+"mail": {"description": {"english": "Email", "french": "Adresse électronique"},
+ "default": {"default": "crep@team-on-fire.com"}
+ },
+"picture": {"description": {"english": "Cover picture", "french": "Image de couverture"},
+ "type": "file",
+ "default": {"default": "treble_a"}
+ },
+"picturecopyright": {"description": {"english": "Copyright for the cover picture", "french": "Copyright pour l'image de couverture"},
+ "default": {"default": "Dbolton \\url{http://commons.wikimedia.org/wiki/User:Dbolton}"}
+ },
+"footer": {"description": {"english": "Footer", "french": "Pied de page"},
+ "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"},
+ "default": {"default": []}
+ },
+"authwords": {"description": {"english": "Set of options to process author string (LaTeX commands authsepword, authignoreword, authbyword)",
+ "french": "Options pour traiter les noms d'auteurs (commandes LaTeX authsepword, authignoreword, authbyword)"},
+ "default": {"default": {}}
+ },
+"notenamesout": {"description": {"english": "Note names. Can be 'solfedge' (Do, Re, Mi...) or 'alphascale' (A, B, C...).",
+ "french": "Nom des notes : 'solfedge' (Do, Ré, Mi...) ou 'alphascale' (A, B, C...)."},
+ "default": {"default": "alphascale", "french": "solfedge"}
+ }
+}
+(* endvariables *)
+
+(* extends "songs.tex" *)
+(* set indexes = "titleidx,authidx" *)
+
+
+(* block songbookpreambule *)
+ (( super() ))
+
+ \usepackage{chords}
+
+ \title{((title))}
+ \author{((author))}
+
+ \newindex{titleidx}{((filename))_title}
+ \newauthorindex{authidx}{((filename))_auth}
+
+ (* for prefix in titleprefixwords *)
+ \titleprefixword{((prefix))}
+ (* endfor*)
+ (* for key in titleprefixkeys *)
+ (* for word in authwords.key *)
+ (* if key=="after" *)
+ \authbyword{((word))}
+ (* else *)
+ \auth((key))word{((word))}
+ (* endif *)
+ (* endfor *)
+ (* endfor*)
+
+ (* if notenamesout=="alphascale" *)
+ \notenamesout{A}{B}{C}{D}{E}{F}{G}
+ (* else *)
+ \notenamesout{La}{Si}{Do}{R\'e}{Mi}{Fa}{Sol}
+ (* endif *)
+(* endblock *)
+
+(* block title *)
+\maketitle
+(* endblock *)
+
+(* block index *)
+ \showindex{\songindexname}{titleidx}
+ \showindex{\authorindexname}{authidx}
+(* endblock *)
+
+(* block chords *)
+ % list of chords
+ \ifchorded
+ \phantomsection
+ \addcontentsline{toc}{section}{\chordlistname}
+ \chords
+ \fi
+(* endblock *)
+
diff --git a/songbook_core/data/templates/layout.tex b/songbook_core/data/templates/layout.tex
new file mode 100644
index 00000000..9a17feab
--- /dev/null
+++ b/songbook_core/data/templates/layout.tex
@@ -0,0 +1,76 @@
+%! Copyright (C) 2014 The Songbook team (www.patacrep.com)
+%!
+%! This program is free software; you can redistribute it and/or
+%! modify it under the terms of the GNU General Public License
+%! as published by the Free Software Foundation; either version 2
+%! of the License, or (at your option) any later version.
+%!
+%! This program is distributed in the hope that it will be useful,
+%! but WITHOUT ANY WARRANTY; without even the implied warranty of
+%! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+%! GNU General Public License for more details.
+%!
+%! You should have received a copy of the GNU General Public License
+%! along with this program; if not, write to the Free Software
+%! Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+%! MA 02110-1301, USA.
+%!
+%! The latest version of this program can be obtained from
+%! https://github.com/patacrep/
+
+
+%% Automatically generated document.
+%% You may edit this file but all changes will be overwritten.
+%% If you want to change this document, have a look at
+%% the templating system.
+%%
+%% Generated using Songbook
+
+(* variables *)
+{
+"mainfontsize": {"description": {"english": "Font Size", "french": "Taille de police"},
+ "type":"font",
+ "default":{"default": "10"}
+ }
+}
+(* endvariables *)
+
+(* block documentclass *)
+\documentclass[((mainfontsize))pt]{article}
+(* endblock *)
+
+(* block songbookpackages *)
+(* endblock *)
+
+(* block songbookpreambule *)
+ \usepackage[utf8]{inputenc}
+ \usepackage[T1]{fontenc}
+ \usepackage{lmodern}
+(* endblock songbookpreambule *)
+
+(* block preambule *)
+(* endblock preambule *)
+
+\begin{document}
+
+(* block title *)
+(* endblock *)
+
+(* block preface *)
+(* endblock *)
+
+(* block index *)
+(* endblock *)
+
+(* block chords *)
+(* endblock *)
+
+(* block songs *)
+(* endblock *)
+
+(* block postface *)
+(* endblock *)
+
+\end{document}
+
+%! End of file
diff --git a/songbook_core/data/templates/patacrep.tex b/songbook_core/data/templates/patacrep.tex
new file mode 100644
index 00000000..2569865f
--- /dev/null
+++ b/songbook_core/data/templates/patacrep.tex
@@ -0,0 +1,96 @@
+%! Copyright (C) 2014 The Songbook team (www.patacrep.com)
+%!
+%! This program is free software; you can redistribute it and/or
+%! modify it under the terms of the GNU General Public License
+%! as published by the Free Software Foundation; either version 2
+%! of the License, or (at your option) any later version.
+%!
+%! This program is distributed in the hope that it will be useful,
+%! but WITHOUT ANY WARRANTY; without even the implied warranty of
+%! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+%! GNU General Public License for more details.
+%!
+%! You should have received a copy of the GNU General Public License
+%! along with this program; if not, write to the Free Software
+%! Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+%! MA 02110-1301, USA.
+%!
+%! The latest version of this program can be obtained from
+%! https://github.com/patacrep/
+
+
+(* variables *)
+{
+"songnumberbgcolor": {"description": {"english": "Number Shade", "french": "Couleur des numéros"},
+ "type": "color",
+ "default": {"default": "D1E4AE"}
+ },
+"notebgcolor": {"description": {"english": "Note Shade", "french": "Couleur des notes"},
+ "type": "color",
+ "default": {"default": "D1E4AE"}
+ },
+"indexbgcolor": {"description": {"english": "Index Shade", "french": "Couleur d'index"},
+ "type": "color",
+ "default": {"default": "D1E4AE"}
+ },
+"titleprefixwords": {"description": {"english": "Ignore some words in the beginning of song titles",
+ "french": "Ignore des mots dans le classement des chansons"},
+ "default": {"default": ["The", "Le", "La", "L'", "A", "Au", "Ces", "De",
+ "Des", "El", "Les", "Ma", "Mon", "Un"]}
+ }
+}
+(* endvariables *)
+
+(* extends "default.tex" *)
+
+(* block songbookpackages *)
+%! booktype, bookoptions and instruments are defined in "songs.tex"
+\usepackage[((booktype)),
+ (* for option in bookoptions *)((option)),
+ (* endfor *)
+ (* for instrument in instruments *)((instrument)),
+ (* endfor *)]{crepbook}
+(* endblock *)
+
+(* 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}
+
+ \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
new file mode 100644
index 00000000..968d3600
--- /dev/null
+++ b/songbook_core/data/templates/songs.tex
@@ -0,0 +1,103 @@
+%! Copyright (C) 2014 The Songbook team (www.patacrep.com)
+%!
+%! This program is free software; you can redistribute it and/or
+%! modify it under the terms of the GNU General Public License
+%! as published by the Free Software Foundation; either version 2
+%! of the License, or (at your option) any later version.
+%!
+%! This program is distributed in the hope that it will be useful,
+%! but WITHOUT ANY WARRANTY; without even the implied warranty of
+%! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+%! GNU General Public License for more details.
+%!
+%! You should have received a copy of the GNU General Public License
+%! along with this program; if not, write to the Free Software
+%! Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+%! MA 02110-1301, USA.
+%!
+%! The latest version of this program can be obtained from
+%! https://github.com/patacrep/
+
+(* variables *)
+{
+"instruments": {"description": {"english": "Instruments", "french": "Instruments"},
+ "type": "flag",
+ "values": {"guitar": {"english": "Guitare", "french": "Guitare"},
+ "ukulele": {"english": "Ukulele", "french": "Ukulele"}
+ },
+ "join": ",",
+ "mandatory": true,
+ "default": {"default":["guitar"]}
+ },
+"bookoptions": {"description": {"english": "Options", "french": "Options"},
+ "type": "flag",
+ "values": {"diagram": {"english": "Chords diagrams", "french": "Diagrammes d'accords"},
+ "importantdiagramonly": {"english": "Only importants diagrames", "french": "Diagrammes importants uniquement"},
+ "lilypond": {"english": "Lilypond music sheets", "french": "Partitions lilypond"},
+ "pictures": {"english": "Cover pictures", "french": "Couvertures d'albums"},
+ "tabs": {"english": "Tablatures", "french": "Tablatures"},
+ "repeatchords": {"english": "Repeat chords", "french": "Répéter les accords"},
+ "onesongperpage": {"english": "One song per page", "french": "Une chanson par page"}
+ },
+ "join": ",",
+ "mandatory": true,
+ "default": {"default":["diagram","pictures"]}
+ },
+"booktype": {"description": {"english": "Type", "french": "Type"},
+ "type": "enum",
+ "values": {"chorded": {"english": "With guitar chords", "french": "Avec accords de guitare" },
+ "lyric": {"english": "Lyrics only", "french": "Paroles uniquement"}
+ },
+ "default": {"default":"chorded"},
+ "mandatory": true
+ },
+"lang": {"description": {"english": "Language", "french": "Langue"},
+ "default": {"english": "english", "french": "french"}
+ }
+}
+(* endvariables *)
+
+(* 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 content.languages() *)
+ \PassOptionsToPackage{((lang))}{babel}
+ (* endfor *)
+ \usepackage[((lang))]{babel}
+ \lang{((lang))}
+
+ \usepackage{graphicx}
+ \graphicspath{{((datadir))/img/}}
+
+ \makeatletter
+ \@ifpackageloaded{hyperref}{}{\newcommand{\phantomsection}{}}
+ \@ifpackageloaded{hyperref}{}{\newcommand{\hyperlink}[2]{#2}}
+ \makeatother
+(* endblock *)
+
+(* block songs *)
+ \phantomsection
+ \addcontentsline{toc}{section}{\songlistname}
+
+ \begin{songs}{((indexes|default('')))}
+ (* 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/errors.py b/songbook_core/errors.py
new file mode 100644
index 00000000..d724ae14
--- /dev/null
+++ b/songbook_core/errors.py
@@ -0,0 +1,87 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""Songbook exceptions and errors."""
+
+class SongbookError(Exception):
+ """Generic songbook error.
+
+ Songbook errors should inherit from this one.
+ """
+ pass
+
+class SBFileError(SongbookError):
+ """Error during songbook file decoding"""
+
+ def __init__(self, message=None):
+ super(SBFileError, self).__init__()
+ self.message = message
+
+ def __str__(self):
+ if self.message is None:
+ return str(self.original)
+ else:
+ return self.message
+
+class TemplateError(SongbookError):
+ """Error during template generation"""
+
+ def __init__(self, original, message=None):
+ super(TemplateError, self).__init__()
+ self.original = original
+ self.message = message
+
+ def __str__(self):
+ if self.message is None:
+ return str(self.original)
+ else:
+ return self.message
+
+class LatexCompilationError(SongbookError):
+ """Error during LaTeX compilation."""
+
+ def __init__(self, basename):
+ super(LatexCompilationError, self).__init__()
+ self.basename = basename
+
+ def __str__(self):
+ return ("""Error while pdfLaTeX compilation of "{basename}.tex" """
+ """(see {basename}.log for more information)."""
+ ).format(basename=self.basename)
+
+class StepCommandError(SongbookError):
+ """Error during LaTeX compilation."""
+
+ def __init__(self, command, code):
+ super(StepCommandError, self).__init__()
+ self.command = command
+ self.code = code
+
+ def __str__(self):
+ return ("""Error while running custom command "{command}": got return"""
+ " code {code}.").format(command=self.command, code=self.code)
+
+class CleaningError(SongbookError):
+ """Error during cleaning of LaTeX auxiliary files."""
+
+ def __init__(self, filename, exception):
+ super(CleaningError, self).__init__()
+ self.filename = filename
+ self.exception = exception
+
+ def __str__(self):
+ return """Error while removing "{filename}": {exception}.""".format(
+ filename=self.filename,
+ exception=str(self.exception)
+ )
+
+class UnknownStep(SongbookError):
+ """Unknown compilation step."""
+
+ def __init__(self, step):
+ super(UnknownStep, self).__init__()
+ self.step = step
+
+ def __str__(self):
+ return """Compilation step "{step}" unknown.""".format(step=self.step)
+
diff --git a/songbook_core/files.py b/songbook_core/files.py
new file mode 100644
index 00000000..65acc153
--- /dev/null
+++ b/songbook_core/files.py
@@ -0,0 +1,19 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+
+"""File system utilities."""
+
+import fnmatch
+import os
+
+def recursive_find(root_directory, pattern):
+ """Recursively find files matching a pattern, from a root_directory.
+
+ Return a list of files matching the pattern.
+ """
+ matches = []
+ for root, _, filenames in os.walk(root_directory):
+ for filename in fnmatch.filter(filenames, pattern):
+ matches.append(os.path.join(root, filename))
+ return matches
diff --git a/songbook_core/index.py b/songbook_core/index.py
new file mode 100755
index 00000000..78b64165
--- /dev/null
+++ b/songbook_core/index.py
@@ -0,0 +1,196 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+"""Manage indexes.
+
+Generate indexes files for the songbook compilation. This is a replacement for
+the original makeindex program written in C that produces an index file (.sbx)
+from a file generated by the latex compilation of the songbook (.sxd).
+"""
+
+from unidecode import unidecode
+import locale
+import re
+import codecs
+
+from songbook_core.authors import processauthors
+from songbook_core.plastex import simpleparse
+
+EOL = u"\n"
+
+# Pattern set to ignore latex command in title prefix
+KEYWORD_PATTERN = re.compile(r"^%(\w+)\s?(.*)$")
+FIRST_LETTER_PATTERN = re.compile(r"^(?:\{?\\\w+\}?)*[^\w]*(\w)")
+
+
+def sortkey(value):
+ """From a title, return something usable for sorting.
+
+ It handles locale (but
+ don't forget to call locale.setlocale(locale.LC_ALL, '')). It also handles
+ the sort with latex escape sequences.
+ """
+ return locale.strxfrm(unidecode(simpleparse(value).replace(' ', 'A')))
+
+
+def process_sxd(filename):
+ """Parse sxd file.
+
+ Return an Index object.
+ """
+ data = []
+ with codecs.open(filename, 'r', 'utf-8') as index_file:
+ for line in index_file:
+ data.append(line.strip())
+
+ i = 1
+ idx = Index(data[0])
+
+ while len(data) > i and data[i].startswith('%'):
+ keywords = KEYWORD_PATTERN.match(data[i]).groups()
+ idx.add_keyword(keywords[0], keywords[1])
+ i += 1
+
+ idx.compile_keywords()
+ for i in range(i, len(data), 3):
+ entry = data[i:i + 3]
+ idx.add(entry[0], entry[1], entry[2])
+
+ return idx
+
+
+class Index(object):
+ """Title, author or scripture Index representation."""
+
+ def __init__(self, indextype):
+ self.data = dict()
+ self.keywords = dict()
+ self.prefix_patterns = []
+ self.authwords = {"after": [], "ignore": [], "sep": []}
+ if indextype == "TITLE INDEX DATA FILE":
+ self.indextype = "TITLE"
+ elif indextype == "SCRIPTURE INDEX DATA FILE":
+ self.indextype = "SCRIPTURE"
+ elif indextype == "AUTHOR INDEX DATA FILE":
+ self.indextype = "AUTHOR"
+ else:
+ self.indextype = ""
+
+ @staticmethod
+ def get_first_letter(key):
+ """Return the uppercase first letter of key."""
+ letter = FIRST_LETTER_PATTERN.match(key).group(1)
+ if re.match(r'\d', letter):
+ letter = '0-9'
+ return letter.upper()
+
+ def add_keyword(self, key, word):
+ """Add 'word' to self.keywords[key]."""
+ if not key in self.keywords.keys():
+ self.keywords[key] = []
+ self.keywords[key].append(word)
+
+ def compile_keywords(self):
+ """Turn keywords (self.keywords) into regular expressions."""
+ if self.indextype == "TITLE":
+ if 'prefix' in self.keywords:
+ for prefix in self.keywords['prefix']:
+ self.prefix_patterns.append(re.compile(
+ r"^({prefix})(\b|\\)(\s*.*)$".format(prefix=prefix)
+ ))
+
+ if self.indextype == "AUTHOR":
+ for key in self.keywords:
+ if key in self.authwords:
+ self.authwords[key] = self.keywords[key]
+ for word in self.authwords.keys():
+ if word in self.keywords:
+ if word == "after":
+ self.authwords[word] = [
+ re.compile(r"^.*{after}\b(.*)".format(after=after))
+ for after in self.keywords[word]
+ ]
+ elif word == "sep":
+ self.authwords[word] = [" {sep}".format(sep=sep)
+ for sep in self.authwords[word]
+ ] + [","]
+ self.authwords[word] = [
+ re.compile(r"^(.*){sep} (.*)$".format(sep=sep))
+ for sep in self.authwords[word]
+ ]
+ else:
+ self.authwords[word] = self.keywords[word]
+
+ def _raw_add(self, key, number, link):
+ """Add a song to the list.
+
+ No processing is done on data. It is added raw. See add() for a
+ similar method with processing.
+ """
+ first = self.get_first_letter(key)
+ if not first in self.data.keys():
+ self.data[first] = dict()
+ if not key in self.data[first].keys():
+ self.data[first][key] = []
+ self.data[first][key].append({'num': number, 'link': link})
+
+ def add(self, key, number, link):
+ """Add a song to the list.
+
+ Process data before adding it.
+ """
+ if self.indextype == "TITLE":
+ # Removing prefixes before titles
+ for pattern in self.prefix_patterns:
+ match = pattern.match(key.encode('utf-8'))
+ if match:
+ self._raw_add(
+ "{} ({})".format(
+ match.group(2) + match.group(3),
+ match.group(1)
+ ),
+ number,
+ link
+ )
+ return
+ self._raw_add(key, number, link)
+
+ if self.indextype == "AUTHOR":
+ # Processing authors
+ for author in processauthors(
+ key,
+ **self.authwords):
+ self._raw_add(author, number, link)
+
+ @staticmethod
+ def ref_to_str(ref):
+ """Return the LaTeX code corresponding to the reference."""
+ return r'\hyperlink{{{0[link]}}}{{{0[num]}}}'.format(ref)
+
+ def entry_to_str(self, key, entry):
+ """Return the LaTeX code corresponding to the entry."""
+ if not isinstance(key, unicode):
+ key = unicode(key, "UTF-8")
+ return unicode(ur'\idxentry{{{0}}}{{{1}}}' + EOL).format(
+ key,
+ ur'\\'.join([self.ref_to_str(ref) for ref in entry]),
+ )
+
+ def idxblock_to_str(self, letter, entries):
+ """Return the LaTeX code corresponding to an index block.
+
+ Here, an index block is a letter, and all data beginning with this
+ letter.
+ """
+ string = r'\begin{idxblock}{' + letter + '}' + EOL
+ for key in sorted(entries.keys(), key=sortkey):
+ string += self.entry_to_str(key, entries[key])
+ string += r'\end{idxblock}' + EOL
+ return string
+
+ def entries_to_str(self):
+ """Return the LaTeX code corresponding to the index."""
+ string = ""
+ for letter in sorted(self.data.keys()):
+ string += self.idxblock_to_str(letter, self.data[letter])
+ return string
diff --git a/songbook_core/plastex.py b/songbook_core/plastex.py
new file mode 100644
index 00000000..7f5980ea
--- /dev/null
+++ b/songbook_core/plastex.py
@@ -0,0 +1,115 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""PlasTeX module to process song files."""
+
+from plasTeX.TeX import TeX
+from plasTeX.Base.LaTeX import Sentences
+
+import codecs
+import locale
+import os
+import sys
+
+
+def process_unbr_spaces(node):
+ r"""Replace '~' and '\ ' in node by nodes that
+ will be rendered as unbreakable space.
+
+ 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
+ (type(node) == Sentences.NoLineBreak and node.source == '~ ')):
+ node.unicode = unichr(160)
+ for child in node.childNodes:
+ process_unbr_spaces(child)
+
+ return node
+
+
+def simpleparse(text):
+ """Parse a simple LaTeX string.
+ """
+ tex = TeX()
+ if not isinstance(text, unicode):
+ text = text.decode("utf-8")
+ tex.input(text)
+ doc = tex.parse()
+ return process_unbr_spaces(doc.textContent)
+
+
+class SongParser(object):
+ """Analyseur syntaxique de fichiers .sg"""
+
+ def __init__(self):
+ pass
+
+ @staticmethod
+ def create_tex():
+ """Create a TeX object, ready to parse a tex file."""
+ tex = TeX()
+ tex.disableLogging()
+ tex.ownerDocument.context.loadBaseMacros()
+ sys.path.append(os.path.dirname(__file__))
+ tex.ownerDocument.context.loadPackage(tex, "plastex_patchedbabel")
+ tex.ownerDocument.context.loadPackage(tex, "plastex_chord")
+ tex.ownerDocument.context.loadPackage(tex, "plastex_songs")
+ sys.path.pop()
+ return tex
+
+ @classmethod
+ def parse(cls, filename):
+ """Parse a TeX file, and return its plasTeX representation."""
+ tex = cls.create_tex()
+ tex.input(codecs.open(filename, 'r', 'utf-8', 'replace'))
+ return tex.parse()
+
+
+def parsetex(filename):
+ r"""Analyse syntaxique d'un fichier .sg
+
+ Renvoie un dictionnaire contenant les métadonnées lues dans le fichier. Les
+ clefs sont :
+ - languages: l'ensemble des langages utilisés (recherche des
+ \selectlanguages{}) ;
+ - titles: la liste des titres ;
+ - args: le dictionnaire des paramètres passés à \beginsong.
+ """
+ # /* BEGIN plasTeX patch
+ # The following lines, and another line a few lines later, are used to
+ # 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,
+ # during a month containing diacritics (e.g. Février), and run songbook. If
+ # no plasTeX bug appears, it is safe to remove those lines.
+ oldlocale = locale.getlocale(locale.LC_TIME)
+ locale.setlocale(locale.LC_TIME, 'C')
+ # plasTeX patch END */
+
+ # Analyse syntaxique
+ doc = SongParser.parse(filename)
+
+ # /* BEGIN plasTeX patch
+ if oldlocale[0] and oldlocale[1]:
+ locale.setlocale(locale.LC_TIME, "%s.%s" % oldlocale)
+ # plasTeX patch END */
+
+ # Extraction des données
+ data = {
+ "languages": set(),
+ }
+ for node in doc.allChildNodes:
+ if node.nodeName == "selectlanguage":
+ data["languages"].add(node.attributes['lang'])
+ if node.nodeName == "beginsong":
+ data["titles"] = node.attributes["titles"]
+ data["args"] = node.attributes["args"]
+
+ return data
diff --git a/songbook_core/plastex_chord.py b/songbook_core/plastex_chord.py
new file mode 100644
index 00000000..b3a71eee
--- /dev/null
+++ b/songbook_core/plastex_chord.py
@@ -0,0 +1,110 @@
+# -*- coding: utf-8 -*-
+
+r"""PlasTeX module to deal with chords commands of the songs LaTeX package
+
+Chords are set using commands like \[C]. This package parses those commands.
+"""
+
+from plasTeX import Command, Environment, Macro
+from plasTeX.Base.LaTeX.Math import BeginDisplayMath
+
+# Count the number of levels of 'verse' environment: IN_VERSE==1 means that we
+# are in a 'verse' environment; IN_VERSE==2 means that we are in two included
+# 'verse' environment, and so on.
+IN_VERSE = 0
+
+def wrap_displaymath(cls):
+ """Decorator to store the depth of 'verse' environment
+
+ In the invoke() method classes, global variable IN_VERSE indicates the
+ number of 'verse' (or 'chorus' or 'verse*') environment we are in.
+ """
+
+ # pylint: disable=no-init,too-few-public-methods
+ class DisplayMath(cls):
+ """Wrapper to LaTeX environment updating IN_VERSE"""
+ blockType = True
+ # pylint: disable=super-on-old-class,global-statement,no-member
+ def invoke(self, tex):
+ """Wrapper to invoke() to update global variable IN_VERSE."""
+ global IN_VERSE
+ if self.macroMode == Macro.MODE_BEGIN:
+ IN_VERSE += 1
+ else:
+ IN_VERSE -= 1
+ super(DisplayMath, self).invoke(tex)
+ return DisplayMath
+
+# pylint: disable=too-many-public-methods
+@wrap_displaymath
+class Verse(Environment):
+ """LaTeX 'verse' environment"""
+ macroName = 'verse'
+
+# pylint: disable=too-many-public-methods
+@wrap_displaymath
+class VerseStar(Environment):
+ """LaTeX 'verse*' environment"""
+ macroName = 'verse*'
+
+# pylint: disable=too-many-public-methods
+@wrap_displaymath
+class Chorus(Environment):
+ """LaTeX 'chorus' environment"""
+ macroName = 'chorus'
+
+
+
+class BeginChord(Command):
+ """Beginning of a chord notation"""
+ macroName = 'chord'
+ macroMode = Command.MODE_BEGIN
+
+ @property
+ def source(self):
+ """Return chord LaTeX code."""
+ return r'\[{}]'.format(''.join([str(item) for item in self.childNodes]))
+
+class EndChord(Command):
+ """End of a chord notation"""
+ macroMode = Command.MODE_END
+
+class BeginChordOrDisplayMath(BeginDisplayMath):
+ r"""Wrapper to BeginDisplayMath
+
+ In a 'verse' (or 'verse*' or 'chorus') environment, the '\[' macro
+ displays a chord. Otherwise, it corresponds to the usual LaTeX math mode.
+ This class calls the right method, depending on the inclusion of this
+ macro in a verse environment.
+ """
+ macroName = '['
+
+ def digest(self, tokens):
+ """Consume the tokens corresponding to the arguments of this macro"""
+ if IN_VERSE:
+ for item in tokens:
+ if item.nodeType == item.TEXT_NODE and item.nodeValue == ']':
+ break
+ self.appendChild(item)
+ else:
+ return super(BeginChordOrDisplayMath, self).digest(tokens)
+
+ def invoke(self, tex):
+ """Process this macro"""
+ if IN_VERSE:
+ begin = BeginChord()
+ self.ownerDocument.context.push(begin) # pylint: disable=no-member
+ self.parse(tex)
+
+ for token in tex:
+ if token.nodeType == token.TEXT_NODE and token.nodeValue == ']':
+ break
+ else:
+ begin.appendChild(token)
+
+ end = EndChord()
+ self.ownerDocument.context.push(end) # pylint: disable=no-member
+
+ return [begin]
+ else:
+ return super(BeginChordOrDisplayMath, self).invoke(tex)
diff --git a/songbook_core/plastex_patchedbabel.py b/songbook_core/plastex_patchedbabel.py
new file mode 100644
index 00000000..39aa2e8f
--- /dev/null
+++ b/songbook_core/plastex_patchedbabel.py
@@ -0,0 +1,59 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+r"""Patch pour le paquet Babel de PlasTeX
+
+Un bug dans PlasTeX intervient lorsqu'on essaye d'analyser une commande LaTeX
+\selectlanguage{}, que nous voulons utiliser ici. Un patch a été proposé aux
+développeurs de plasTeX, et accepté. Mais il faut que cette correction arrive
+en production. En attendant, nous utilisons cette version modifiée.
+
+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
+"plastex.py".
+La correction à suveiller est la révision
+41a48c0c229dd46b69fb0e3720595000a71b17d8 du fichier babel.py :
+https://github.com/tiarno/plastex/commit/41a48c0c229dd46b69fb0e3720595000a71b17d8
+
+# Comment vérifier si on peut supprimer ce fichier ?
+
+1) Remplacer l'occurence à patchedbabel par babel dans le fichier plastex.py.
+
+2) Générer un fichier .tex à partir d'un fichier .sb, ce dernier faisant
+intervenir des chansons dans lesquelles \selectlanguage est utilisé (par
+exemple, "make -B matteo.tex" ou "make -B naheulbeuk.tex" pour des fichiers pas
+trop gros.
+
+3) Si l'erreur suivante apparaît, c'est qu'il faut encore attendre.
+
+> Traceback (most recent call last):
+> [...]
+> File "/usr/lib/pymodules/python2.7/plasTeX/Packages/babel.py", line 18, in
+> invoke context.loadLanguage(self.attributes['lang'], self.ownerDocument)
+> NameError: global name 'context' is not defined
+
+3 bis) Si elle n'apparait pas : youpi ! Supprimez ce fichier !
+
+# Contact et commentaires
+
+Mercredi 27 mars 2013
+Louis
+
+"""
+
+from plasTeX import Command
+
+# pylint: disable=invalid-name,too-many-public-methods
+class selectlanguage(Command):
+ """Patch of vanilla selectlanguage class.
+
+ See module docstring for more information."""
+ args = 'lang:str'
+
+ def invoke(self, tex):
+ res = Command.invoke(self, tex)
+ self.ownerDocument.context.loadLanguage( # pylint: disable=no-member
+ self.attributes['lang'],
+ self.ownerDocument
+ )
+ return res
diff --git a/songbook_core/plastex_songs.py b/songbook_core/plastex_songs.py
new file mode 100644
index 00000000..9e39da1f
--- /dev/null
+++ b/songbook_core/plastex_songs.py
@@ -0,0 +1,65 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""Module to process song LaTeX environment.
+"""
+
+import plasTeX
+
+from songbook_core.plastex import process_unbr_spaces
+
+
+def split_linebreak(texlist):
+ """Return a list of alternative title.
+
+ A title can be defined with alternative names :
+
+ A real name\\
+ Alternative name\\
+ Another alternative name
+
+ This function takes the object representation of a list of titles, and
+ return a list of titles.
+ """
+ return_list = []
+ current = []
+ for token in texlist:
+ if token.nodeName == '\\':
+ return_list.append(current)
+ current = []
+ else:
+ current.append(
+ process_unbr_spaces(token).textContent.encode('utf-8'))
+ if current:
+ return_list.append(current)
+ return return_list
+
+
+class beginsong(plasTeX.Command): # pylint: disable=invalid-name,too-many-public-methods
+ """Class parsing the LaTeX song environment."""
+
+ args = '{titles}[ args:dict ]'
+
+ def invoke(self, tex):
+ """Parse an occurence of song environment."""
+
+ plasTeX.Command.invoke(self, tex)
+
+ # Parsing title
+ titles = []
+ for tokens in split_linebreak(self.attributes['titles'].allChildNodes):
+ titles.append("".join(tokens))
+ self.attributes['titles'] = titles
+
+ # Parsing keyval arguments
+ args = {}
+ for (key, val) in self.attributes['args'].iteritems():
+ if isinstance(val, plasTeX.DOM.Element):
+ args[key] = process_unbr_spaces(val).textContent.encode('utf-8')
+ elif isinstance(val, unicode):
+ args[key] = val.encode('utf-8')
+ elif isinstance(val, str):
+ args[key] = val.encode('utf-8')
+ else:
+ args[key] = unicode(val)
+ self.attributes['args'] = args
diff --git a/songbook_core/songs.py b/songbook_core/songs.py
new file mode 100644
index 00000000..5446903d
--- /dev/null
+++ b/songbook_core/songs.py
@@ -0,0 +1,139 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""Song management."""
+
+from unidecode import unidecode
+import glob
+import locale
+import os.path
+import re
+import logging
+
+from songbook_core.authors import processauthors
+from songbook_core.plastex import parsetex
+
+LOGGER = logging.getLogger(__name__)
+
+# pylint: disable=too-few-public-methods
+class Song(object):
+ """Song management"""
+
+ #: Ordre de tri
+ sort = []
+ #: Préfixes à ignorer pour le tri par titres
+ prefixes = []
+ #: Dictionnaire des options pour le traitement des auteurs
+ authwords = {"after": [], "ignore": [], "sep": []}
+
+ def __init__(self, path, languages, titles, args):
+ self.titles = titles
+ self.normalized_titles = [
+ locale.strxfrm(
+ unprefixed_title(
+ unidecode(unicode(title, "utf-8")),
+ self.prefixes
+ )
+ )
+ for title
+ in titles
+ ]
+ self.args = args
+ self.path = path
+ self.languages = languages
+ if "by" in self.args.keys():
+ self.normalized_authors = [
+ locale.strxfrm(author)
+ for author
+ in processauthors(self.args["by"], **self.authwords)
+ ]
+ else:
+ self.normalized_authors = []
+
+ def __repr__(self):
+ return repr((self.titles, self.args, self.path))
+
+ def __cmp__(self, other):
+ if not isinstance(other, Song):
+ return NotImplemented
+ for key in self.sort:
+ if key == "@title":
+ self_key = self.normalized_titles
+ other_key = other.normalized_titles
+ elif key == "@path":
+ self_key = locale.strxfrm(self.path)
+ other_key = locale.strxfrm(other.path)
+ elif key == "by":
+ self_key = self.normalized_authors
+ other_key = other.normalized_authors
+ else:
+ self_key = locale.strxfrm(self.args.get(key, ""))
+ other_key = locale.strxfrm(other.args.get(key, ""))
+
+ if self_key < other_key:
+ return -1
+ elif self_key > other_key:
+ return 1
+ return 0
+
+
+def unprefixed_title(title, prefixes):
+ """Remove the first prefix of the list in the beginning of title (if any).
+ """
+ for prefix in prefixes:
+ match = re.compile(r"^(%s)\b\s*(.*)$" % prefix).match(title)
+ if match:
+ return match.group(2)
+ return title
+
+
+class SongbookContent(object):
+ """Manipulation et traitement de liste de chansons"""
+
+ def __init__(self, library):
+ self._songdir = os.path.join(library, 'songs')
+
+ # Sorted list of the content
+ self.content = []
+
+ def append_song(self, filename):
+ """Ajout d'une chanson à la liste
+
+ Effets de bord : analyse syntaxique plus ou moins sommaire du fichier
+ pour en extraire et traiter certaines information (titre, langue,
+ album, etc.).
+ """
+ LOGGER.debug('Parsing file "{}"…'.format(filename))
+ # Data extraction from the song with plastex
+ data = parsetex(filename)
+ song = Song(filename, data['languages'], data['titles'], data['args'])
+ 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, 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 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 type, song in self.content if type=="song"])
diff --git a/songbook_core/templates.py b/songbook_core/templates.py
new file mode 100644
index 00000000..f71b2b8a
--- /dev/null
+++ b/songbook_core/templates.py
@@ -0,0 +1,220 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""Template for .tex generation settings and utilities"""
+
+from jinja2 import Environment, FileSystemLoader, ChoiceLoader, PackageLoader, \
+ TemplateNotFound, nodes
+from jinja2.ext import Extension
+from jinja2.meta import find_referenced_templates as find_templates
+import codecs
+import os
+import re
+import json
+
+from songbook_core import errors
+
+_LATEX_SUBS = (
+ (re.compile(r'\\'), r'\\textbackslash'),
+ (re.compile(r'([{}_#%&$])'), r'\\\1'),
+ (re.compile(r'~'), r'\~{}'),
+ (re.compile(r'\^'), r'\^{}'),
+ (re.compile(r'"'), r"''"),
+ (re.compile(r'\.\.\.+'), r'\\ldots'),
+)
+
+_VARIABLE_REGEXP = re.compile(r"""
+ \(\*\ *variables\ *\*\) # Match (* variables *)
+ ( # Match and capture the following:
+ (?: # Start of non-capturing group, used to match a single character
+ (?! # only if it's impossible to match the following:
+ \(\*\ * # - a literal (*
+ (?: # Inner non-capturing group, used for the following alternation:
+ variables # - Either match the word variables
+ | # or
+ endvariables # - the word endvariables
+ ) # End of inner non-capturing group
+ \ *\*\) # - a literal *)
+ ) # End of negative lookahead assertion
+ . # Match any single character
+ )* # Repeat as often as possible
+ ) # End of capturing group 1
+ \(\*\ *endvariables\ *\*\) # until (* endvariables *) is matched.""",
+ re.VERBOSE|re.DOTALL)
+
+
+class VariablesExtension(Extension):
+ """Extension to jinja2 to silently ignore variable block.
+ Instead, they are parsed by this module.
+ """
+ tags = set(['variables'])
+
+ def parse(self, parser):
+ parser.stream.next()
+ parser.parse_statements(
+ end_tokens=['name:endvariables'],
+ drop_needle=True,
+ )
+ return nodes.Const("")
+
+
+def _escape_tex(value):
+ '''Escape TeX special characters'''
+ newval = value
+ for pattern, replacement in _LATEX_SUBS:
+ newval = pattern.sub(replacement, newval)
+ return newval
+
+
+class TexRenderer(object):
+ """Render a template to a LaTeX file."""
+
+ def __init__(self, template, datadir, lang):
+ '''Start a new jinja2 environment for .tex creation.
+
+ Arguments:
+ - template: name of the template to use.
+ - datadir: location of the data directory (which max contain
+ file /templates/).
+ - lang: main language of songbook.
+ '''
+ self.lang = lang
+ self.texenv = Environment(
+ loader=ChoiceLoader([
+ FileSystemLoader(
+ os.path.join(datadir, 'templates')
+ ),
+ PackageLoader(
+ 'songbook_core', os.path.join('data', 'templates')
+ ),
+ ]),
+ extensions=[VariablesExtension],
+ )
+ self.texenv.block_start_string = '(*'
+ self.texenv.block_end_string = '*)'
+ self.texenv.variable_start_string = '(('
+ self.texenv.variable_end_string = '))'
+ self.texenv.comment_start_string = '(% comment %)'
+ self.texenv.comment_end_string = '(% endcomment %)'
+ self.texenv.line_comment_prefix = '%!'
+ self.texenv.filters['escape_tex'] = _escape_tex
+ self.texenv.trim_blocks = True
+ self.texenv.lstrip_blocks = True
+
+ try:
+ self.template = self.texenv.get_template(template)
+ except TemplateNotFound as exception:
+ raise errors.TemplateError(
+ exception,
+ """Template "{template}" not found.""".format(
+ template=exception.name
+ ),
+ )
+
+ def get_variables(self):
+ '''Get and return a dictionary with the default values
+ for all the variables
+ '''
+ data = self.get_template_variables(self.template)
+ variables = dict()
+ for name, param in data.items():
+ variables[name] = self._get_default(param)
+ return variables
+
+ def _get_default(self, parameter):
+ '''Get the default value for the parameter, according to the language.
+ '''
+ default = None
+ try:
+ default = parameter['default']
+ except KeyError:
+ return None
+
+ if self.lang in default:
+ variable = default[self.lang]
+ elif "default" in default:
+ variable = default["default"]
+ elif "en" in default:
+ variable = default["en"]
+ elif len(default > 0):
+ variable = default.popitem()[1]
+ else:
+ variable = None
+
+ return variable
+
+ def get_template_variables(self, template, skip=None):
+ """Parse the template to extract the variables as a dictionary.
+
+ If the template includes or extends other templates, load them as well.
+
+ Arguments:
+ - template: the name of the template, as a string.
+ - skip: a list of templates (as strings) to skip: if they are included
+ in 'template' (or one of its subtemplates), it is not parsed.
+ """
+ if not skip:
+ skip = []
+ variables = {}
+ (current, templates) = self.parse_template(template)
+ for subtemplate in templates:
+ if subtemplate in skip:
+ continue
+ variables.update(
+ self.get_template_variables(
+ subtemplate,
+ skip + templates
+ )
+ )
+ variables.update(current)
+ return variables
+
+ def parse_template(self, template):
+ """Return (variables, templates).
+
+ Argument:
+ - template: name of the template to parse.
+
+ Return values:
+ - variables: a dictionary of variables contained in 'template', NOT
+ recursively (included templates are not parsed).
+ - templates: list of included temlates, NOT recursively.
+ """
+
+ subvariables = {}
+ templatename = self.texenv.get_template(template).filename
+ with codecs.open(
+ templatename,
+ 'r',
+ 'utf-8'
+ ) as template_file:
+ content = template_file.read()
+ subtemplates = list(find_templates(self.texenv.parse(content)))
+ match = re.findall(_VARIABLE_REGEXP, content)
+ if match:
+ for var in match:
+ try:
+ subvariables.update(json.loads(var))
+ except ValueError as exception:
+ raise errors.TemplateError(
+ exception,
+ (
+ "Error while parsing json in file "
+ "{filename}. The json string was:"
+ "\n'''\n{jsonstring}\n'''"
+ ).format(
+ filename=templatename,
+ jsonstring=var,
+ )
+ )
+
+ return (subvariables, subtemplates)
+
+ def render_tex(self, output, context):
+ '''Render a template into a .tex file
+
+ Arguments:
+ - output: a file object to write the result
+ - context: a dict of all the data to populate the template
+ '''
+
+ output.write(self.template.render(context))
diff --git a/sortindex.py b/sortindex.py
deleted file mode 100644
index 4333e5f2..00000000
--- a/sortindex.py
+++ /dev/null
@@ -1,47 +0,0 @@
-#coding:utf8
-
-import re
-import warnings
-import locale
-
-iecPattern = re.compile(r"\IeC {\\(.*?)}")
-replacePattern = {
- '`A': 'À',
- '`a': 'Ã ',
- '^a': 'â',
- "'a": 'á',
- "~a": 'ã',
- 'oe': 'Å“',
- "'e" : 'é',
- "`e" : 'è',
- "^e" : 'ê',
- '"e' : 'ë',
- "'E" : 'É',
- "`E" : 'È',
- "'o" : 'ó',
- "^o" : 'ô',
- r'"\i' : 'i',
- r'^\i' : 'i',
- '"u' : 'ü',
- '`u' : 'ù',
- '`u' : 'ù',
- '~n' : 'ñ',
- "c C" : 'Ç',
- "c c" : 'ç',
- "textquoteright" : "'",
-}
-
-def sortkey(value):
- '''
- From a title, return something usable for sorting. It handles locale (but
- don't forget to call locale.setlocale(locale.LC_ALL, '')). It also try to
- handle the sort with crappy latex escape sequences. Some chars may not be
- handled by this function, so add them to *replacePattern* dictionnary.
- '''
- def repl(match):
- try:
- return replacePattern[match.group(1).strip()]
- except KeyError:
- warnings.warn("Error, no match to replace %s in %s. You should add it in the coresponding table in title_sort.py" % (match.group(0), match.group(1)))
-
- return locale.strxfrm(iecPattern.sub(repl, value).replace(' ', 'A'))
diff --git a/stdeb.cfg b/stdeb.cfg
new file mode 100644
index 00000000..be040279
--- /dev/null
+++ b/stdeb.cfg
@@ -0,0 +1,6 @@
+[DEFAULT]
+Depends: python-jinja2, python-pkg-resources, python-plastex, python-unidecode, texlive-latex-base, texlive-latex-recommended, texlive-latex-extra, lilypond, texlive-fonts-recommended
+Recommends: texlive-lang-english, texlive-lang-french, texlive-lang-portuguese, texlive-lang-spanish, texlive-fonts-extra
+XS-Python-Version: >=2.7
+Section: tex
+
diff --git a/templates/ancient.tmpl b/templates/ancient.tmpl
deleted file mode 100644
index b4075a75..00000000
--- a/templates/ancient.tmpl
+++ /dev/null
@@ -1,124 +0,0 @@
-% Copyright (C) 2009-2010 Romain Goffe, Alexandre Dupas
-% Copyright (C) 2008 Kevin W. Hamlen
-%
-% This program is free software; you can redistribute it and/or
-% modify it under the terms of the GNU General Public License
-% as published by the Free Software Foundation; either version 2
-% of the License, or (at your option) any later version.
-%
-% This program is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this program; if not, write to the Free Software
-% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-% MA 02110-1301, USA.
-%
-% The latest version of this program can be obtained from
-% http://songs.sourceforge.net.
-%
-% Modified to serve personnal purposes. Newer versions can be
-% obtained from http://www.lohrun.net.
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Template parameters
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%:[
-%%: {"name":"title", "description":"Title", "default":"Recueil de chansons pour guitare", "mandatory":true},
-%%: {"name":"author", "description":"Author", "default":"Crep (R. Goffe) \\and Lohrun (A. Dupas)", "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":"3.7.2"},
-%%: {"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":"feel-the-music"},
-%%: {"name":"picturecopyright", "description":"Copyright", "default":"foxygamergirl@deviantart.com"},
-%%: {"name":"footer", "description":"Footer", "default":"\\begin{flushleft}\\includegraphics[width=3cm]{on-fire}\\end{flushleft}"},
-%%: {"name":"license", "description":"License", "type":"file", "default":"license.tex"},
-%%: {"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":"#FFFDB3"},
-%%: {"name":"indexbgcolor", "description":"Index Shade", "type":"color", "default":"#D1E4AE"}
-%%:]
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% begin document
-\makeatletter\def\input@path{{tex/}}
-\documentclass[\getbooktype,\getinstruments,\getbookoptions,\getmainfontsize]{crepbook}
-\usepackage[utf8]{inputenc}
-\usepackage[italian,portuguese,english,spanish,french]{babel}
-\usepackage[T1]{fontenc}
-\usepackage{venturisold}
-
-\title{\gettitle}
-\author{\getauthor}
-\subtitle{\getsubtitle}
-\version{\getversion}
-\mail{\getmail}
-\web{\getweb}
-\picture{\getpicture}
-\picturecopyright{\getpicturecopyright}
-\footer{\getfooter}
-\licence{\getlicense}
-\lang{\getlang}
-
-\newindex{titleidx}{\getname_title}
-\newauthorindex{authidx}{\getname_auth}
-
-\graphicspath{ {img/}, {\getLibraryImgDirectory}, {\getLibraryLilypondDirectory} }
-
-\renewcommand{\lilypond}[1]{%
- \iflilypond%
- \IfFileExists{\getLibraryLilypondDirectory/#1.pdf}{\includegraphics{#1}}{}%
- \fi%
-}
-
-\definecolor{SongNumberBgColor}{HTML}{\getsongnumberbgcolor}
-\definecolor{NoteBgColor}{HTML}{\getnotebgcolor}
-\definecolor{IndexBgColor}{HTML}{\getindexbgcolor}
-
-\renewcommand{\snumbgcolor}{SongNumberBgColor}
-\renewcommand{\notebgcolor}{NoteBgColor}
-\renewcommand{\idxbgcolor}{IndexBgColor}
-
-\renewcommand{\printchord}[1]{\mdseries\ttfamily\upshape#1}
-
-\pagestyle{empty}
-
-% Customization of the page appearance
-\RequirePackage[
- 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
-% ,bindingoffset=1.7cm % space reserved to bound pages together
- ]{geometry}
-
-\begin{document}
-
-\maketitle
-
-% licence
-\newpage
-\input{\getlicense}
-\newpage
-
-\showindex{Index des chansons}{titleidx}
-
-\notenamesin{A}{B}{C}{D}{E}{F}{G}
-\notenamesout{La}{Si}{Do}{Ré}{Mi}{Fa}{Sol}
-
-\phantomsection
-\addcontentsline{toc}{section}{Liste des chansons}
-\begin{songs}{titleidx,authidx}
- \getsongslist
-\end{songs}
-
-\end{document}
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% end document
diff --git a/templates/minimal.tmpl b/templates/minimal.tmpl
deleted file mode 100644
index a159a5b4..00000000
--- a/templates/minimal.tmpl
+++ /dev/null
@@ -1,77 +0,0 @@
-% Copyright (C) 2009-2010 Romain Goffe, Alexandre Dupas
-% Copyright (C) 2008 Kevin W. Hamlen
-%
-% This program is free software; you can redistribute it and/or
-% modify it under the terms of the GNU General Public License
-% as published by the Free Software Foundation; either version 2
-% of the License, or (at your option) any later version.
-%
-% This program is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this program; if not, write to the Free Software
-% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-% MA 02110-1301, USA.
-%
-% The latest version of this program can be obtained from
-% http://songs.sourceforge.net.
-%
-% Modified to serve personnal purposes. Newer versions can be
-% obtained from http://www.lohrun.net.
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Template parameters
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%:[
-%%: {"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":["pictures"]},
-%%: {"name":"mainfontsize", "description":"Font Size", "type":"font", "default":"10"},
-%%: {"name":"titleprefixwords", "description":"Ignore some words in the beginning of song titles"}
-%%:]
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% begin document
-\makeatletter\def\input@path{{tex/}}
-\documentclass[\getbooktype,\getinstruments,\getbookoptions,\getmainfontsize,noshading]{crepbook}
-\usepackage[utf8]{inputenc}
-\usepackage[T1]{fontenc}
-\usepackage{lmodern}
-\usepackage[italian,portuguese,spanish,english,french]{babel}
-
-\lang{\getlang}
-\graphicspath{ {img/}, {\getLibraryImgDirectory}, {\getLibraryLilypondDirectory} }
-
-\renewcommand{\lilypond}[1]{%
- \iflilypond%
- \IfFileExists{\getLibraryLilypondDirectory/#1.pdf}{\includegraphics{#1}}{}%
- \fi%
-}
-
-\gettitleprefixwords
-
-\nosongnumbers
-\pagestyle{empty}
-
-% Customization of the page appearance
-\RequirePackage[
- 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
-% ,bindingoffset=1.7cm % space reserved to bound pages together
- ]{geometry}
-
-\begin{document}
-
-\begin{songs}{}
- \getsongslist
-\end{songs}
-
-\end{document}
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% end document
diff --git a/templates/patacrep.tmpl b/templates/patacrep.tmpl
deleted file mode 100644
index 9a1fa2e6..00000000
--- a/templates/patacrep.tmpl
+++ /dev/null
@@ -1,159 +0,0 @@
-% Copyright (C) 2009-2010 Romain Goffe, Alexandre Dupas
-% Copyright (C) 2008 Kevin W. Hamlen
-%
-% This program is free software; you can redistribute it and/or
-% modify it under the terms of the GNU General Public License
-% as published by the Free Software Foundation; either version 2
-% of the License, or (at your option) any later version.
-%
-% This program is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this program; if not, write to the Free Software
-% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-% MA 02110-1301, USA.
-%
-% The latest version of this program can be obtained from
-% http://songs.sourceforge.net.
-%
-% Modified to serve personnal purposes. Newer versions can be
-% obtained from http://www.lohrun.net.
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Template parameters
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%:[
-%%: {"name":"title", "description":"Title", "default":"Recueil de chansons pour guitare", "mandatory":true},
-%%: {"name":"author", "description":"Author", "default":"Crep (R. Goffe) \\and Lohrun (A. Dupas)", "mandatory":true},
-%%: {"name":"booktype", "description":"Type", "type":"enum", "values":["chorded","lyric"], "default":"chorded", "mandatory":true},
-%%: {"name":"lang", "description":"Language", "default":"french"},
-%%: {"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":"3.7.2"},
-%%: {"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":"feel-the-music"},
-%%: {"name":"picturecopyright", "description":"Copyright", "default":"foxygamergirl@deviantart.com"},
-%%: {"name":"footer", "description":"Footer", "default":"\\begin{flushleft}\\includegraphics[width=3cm]{on-fire}\\end{flushleft}"},
-%%: {"name":"license", "description":"License", "type":"file", "default":"license.tex"},
-%%: {"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"}
-%%:]
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% begin document
-\makeatletter\def\input@path{{tex/}}
-\documentclass[\getbooktype,\getinstruments,\getbookoptions,\getmainfontsize]{crepbook}
-\usepackage[utf8]{inputenc}
-\usepackage[T1]{fontenc}
-\usepackage{lmodern}
-\usepackage[italian,portuguese,spanish,english,french]{babel}
-
-\title{\gettitle}
-\author{\getauthor}
-\subtitle{\getsubtitle}
-\version{\getversion}
-\mail{\getmail}
-\web{\getweb}
-\picture{\getpicture}
-\picturecopyright{\getpicturecopyright}
-\footer{\getfooter}
-\licence{\getlicense}
-\lang{\getlang}
-
-\newindex{titleidx}{\getname_title}
-\newauthorindex{authidx}{\getname_auth}
-
-\graphicspath{ {img/}, {\getLibraryImgDirectory}, {\getLibraryLilypondDirectory} }
-
-\renewcommand{\lilypond}[1]{%
- \iflilypond%
- \IfFileExists{\getLibraryLilypondDirectory/#1.pdf}{\includegraphics{#1}}{}%
- \fi%
-}
-
-\definecolor{SongNumberBgColor}{HTML}{\getsongnumberbgcolor}
-\definecolor{NoteBgColor}{HTML}{\getnotebgcolor}
-\definecolor{IndexBgColor}{HTML}{\getindexbgcolor}
-
-\renewcommand{\snumbgcolor}{SongNumberBgColor}
-\renewcommand{\notebgcolor}{NoteBgColor}
-\renewcommand{\idxbgcolor}{IndexBgColor}
-
-\gettitleprefixwords
-
-\pagestyle{empty}
-
-% Customization of the page appearance
-\RequirePackage[
- 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
-% ,bindingoffset=1.7cm % space reserved to bound pages together
- ]{geometry}
-
-\begin{document}
-
-% translate default title
-\IfStrEq{\gettitle}{Recueil de chansons pour guitare}{
- \IfStrEq{\getlang}{english}{\title{Patacrep songbook}}{}
-}{}
-
-\maketitle
-
-% licence
-\newpage
-\input{\getlicense}
-\newpage
-
-% indexes
-\IfStrEq{\getlang}{english}{
- \showindex{Songs Index}{titleidx}
-}{
- \showindex{Index des chansons}{titleidx}
-}
-\IfStrEq{\getlang}{english}{
- \showindex{Authors Index}{authidx}
-}{
- \showindex{Index des auteurs}{authidx}
-}
-
-% chords notation
-\IfStrEq{\getlang}{french}{
- \notenamesin{A}{B}{C}{D}{E}{F}{G}
- \notenamesout{La}{Si}{Do}{Ré}{Mi}{Fa}{Sol}
-}{}
-
-% list of chords
-\ifchorded
-\phantomsection
-\IfStrEq{\getlang}{english}{
- \addcontentsline{toc}{section}{Chords list}
-}{
- \addcontentsline{toc}{section}{Liste des accords}
-}
-\include{tex/chords}
-\fi
-
-% songs
-\phantomsection
-\IfStrEq{\getlang}{english}{
- \addcontentsline{toc}{section}{Songs list}
-}{
- \addcontentsline{toc}{section}{Liste des chansons}
-}
-\begin{songs}{titleidx,authidx}
- \getsongslist
-\end{songs}
-
-\end{document}
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% end document
diff --git a/tex/chords.tex b/tex/chords.tex
deleted file mode 100644
index 60bbf769..00000000
--- a/tex/chords.tex
+++ /dev/null
@@ -1,321 +0,0 @@
-\newcommand*{\Sharp}{\nolinebreak\hspace{-.05em}\raisebox{.6ex}{\,\small\bf \#}}
-\newcommand*{\Flat}{\nolinebreak\hspace{-.05em}\raisebox{.6ex}{\,\small$\mathbf{\flat}$}}
-\newcommand*{\chordrule}{\mbox{\hspace{1cm}\rule[0.5cm]{15cm}{0.02cm}}\vspace{-.4cm}}
-\newcommand*{\chordname}[2]{\makebox[3cm]{\raisebox{.5cm}{\large \textbf{\IfStrEq{\getlang}{english}{#1}{#2}}}}}
-
-\begin{songs}{}
- %hide song number
- \definecolor{SongNumberBgColor}{HTML}{FFFFFF}
- \renewcommand{\snumbgcolor}{SongNumberBgColor}
- \renewcommand{\printsongnum}[1]{}
- \setlength{\songnumwidth}{0.1cm}
- \songcolumns{1}
-
- \ifguitar
- \IfStrEq{\getlang}{english}{\beginsong{Guitar chords}}{\beginsong{Accords de guitare}}
- \chordname{C}{Do}
- \gtab{C}{~:X32010}
- \gtab{C7}{~:X32310}
- \gtab{Cm}{3:X02210}
- \gtab{Cm7}{3:X02010}
- \hspace{1cm}
- \gtab*{C7M}{~:332000}
- \gtab*{C4}{~:X32011}
- \gtab*{C7}{1:X2120X}
- \gtab*{C6}{~:XX2213}
- \chordrule
-
- \chordname{C\Sharp = D\Flat}{Do\Sharp = Ré\Flat}
- \gtab{C#}{4:X02220}
- \gtab{C#7}{4:X02020}
- \gtab{C#m}{4:X02210}
- \gtab{C#m7}{5:XX2213}
- \hspace{1cm}
- \gtab*{C#7M}{1:X32000}
- \gtab*{C#4}{2:X21000}
- \gtab*{C#7}{2:X2120X}
- \gtab*{C#6}{1:X02010}
- \chordrule
-
- \chordname{D}{Ré}
- \gtab{D}{~:XX0232}
- \gtab{D7}{~:XX0212}
- \gtab{Dm}{~:XX0231}
- \gtab{Dm7}{~:XX0211}
- \hspace{1cm}
- \gtab*{D7M}{~:X00222}
- \gtab*{D4}{~:X00233}
- \gtab*{D7}{3:X2120X}
- \gtab*{D6}{~:X00202}
- \chordrule
-
- \chordname{D\Sharp = E\Flat}{Ré\Sharp = Mi\Flat}
- \gtab{D#}{6:X02220}
- \gtab{D#7}{6:X02020}
- \gtab{D#m}{6:X02210}
- \gtab{D#m7}{~:XX1322}
- \hspace{1cm}
- \gtab*{D#7M}{3:022010}
- \gtab*{D#4}{4:X21000}
- \gtab*{D#7}{4:X2120X}
- \gtab*{D#6}{1:X00202}
- \chordrule
-
- \chordname{E}{Mi}
- \gtab{E}{~:022100}
- \gtab{E7}{~:020100}
- \gtab{Em}{~:022000}
- \gtab{Em7}{~:022030}
- \hspace{1cm}
- \gtab*{E7M}{~:021100}
- \gtab*{E4}{~:02220}
- \gtab*{E7}{5:X2120X}
- \gtab*{E6}{~:022120}
- \chordrule
-
- \chordname{F}{Fa}
- \gtab{F}{1:022100}
- \gtab{F7}{1:020100}
- \gtab{Fm}{1:022000}
- \gtab{Fm7}{1:020000}
- \hspace{1cm}
- \gtab*{F7M}{~:XX3210}
- \gtab*{F4}{1:022200}
- \gtab*{F7}{6:X2120X}
- \gtab*{F6}{~:XX0211}
- \chordrule
-
- \chordname{F\Sharp = G\Flat}{Fa\Sharp = Sol\Flat}
- \gtab{F#}{2:022100}
- \gtab{F#7}{2:020100}
- \gtab{F#m}{2:022000}
- \gtab{F#m7}{2:020000}
- \hspace{1cm}
- \gtab*{F#7M}{~:XX4321}
- \gtab*{F#4}{2:022200}
- \gtab*{F#7}{7:X2120X}
- \gtab*{F#6}{~:XX1322}
- \chordrule
-
- \chordname{G}{Sol}
- \gtab{G}{~:320003}
- \gtab{G7}{~:320001}
- \gtab{Gm}{3:022000}
- \gtab{Gm7}{3:020000}
- \hspace{1cm}
- \gtab*{G7M}{~:XX0002}
- \gtab*{G4}{3:022200}
- \gtab*{G7}{3:020200}
- \gtab*{G6}{~:320000}
- \chordrule
-
- \chordname{G\Sharp = A\Flat}{Sol\Sharp = La\Flat}
- \gtab{G#}{4:022100}
- \gtab{G#7}{4:020100}
- \gtab{G#m}{4:022000}
- \gtab{G#m7}{4:020000}
- \hspace{1cm}
- \gtab*{G#7M}{3:XX4321}
- \gtab*{G#4}{4:022200}
- \gtab*{G#7}{~:XX1122}
- \gtab*{G#6}{~:XX1111}
- \chordrule
-
- \chordname{A}{La}
- \gtab{A}{~:X02220}
- \gtab{A7}{~:X02020}
- \gtab{Am}{~:X02210}
- \gtab{Am7}{~:X02213}
- \hspace{1cm}
- \gtab*{A7M}{~:X02120}
- \gtab*{A4}{~:X02230}
- \gtab*{A7}{~:X02233}
- \gtab*{A6}{~:XX2222}
- \chordrule
-
- \chordname{A\Sharp = B\Flat}{La\Sharp = Si\Flat}
- \gtab{A#}{1:X02220}
- \gtab{A#7}{1:X02020}
- \gtab{A#m}{1:X02210}
- \gtab{A#m7}{1:X02010}
- \hspace{1cm}
- \gtab*{A#7M}{1:X02120}
- \gtab*{A#4}{1:X02230}
- \gtab*{A#7}{~:XX3344}
- \gtab*{A#6}{~:XX3333}
- \chordrule
-
- \chordname{B}{Si}
- \gtab{B}{2:X02220}
- \gtab{B7}{X21202}
- \gtab{Bm}{2:X02210}
- \gtab{Bm7}{~:X00202}
- \hspace{1cm}
- \gtab*{B7M}{2:X02120}
- \gtab*{B4}{2:X02230}
- \gtab*{B7}{~:X22202}
- \gtab*{B6}{~:XX4444}
-
- \begin{verse*}
- \musicnote[french]{Accordage standard : {\nolyrics \[E A D G B E]}}
- \musicnote[english]{Standard tuning: {\nolyrics \[E A D G B E]}}
- \end{verse*}
-
- \endsong
- \fi
-
- \ifukulele
- \IfStrEq{\getlang}{english}{\beginsong{Ukulele chords}}{\beginsong{Accords de ukulélé}}
-
- \chordname{C}{Do}
- \utab{C}{~:0003}
- \utab{C7}{~:0001}
- \utab{Cm}{~:0333}
- \utab{Cm7}{3:0000}
- \hspace{1cm}
- \utab*{C7M}{~:0002}
- \utab*{C6}{~:0000}
- \utab*{Caug}{~:1003}
- \utab*{Cdim}{2:3101}
- \chordrule
-
- \chordname{C\Sharp = D\Flat}{Do\Sharp = Ré\Flat}
- \utab{C#}{1:0003}
- \utab{C#7}{1:0001}
- \utab{C#m}{~:1104}
- \utab{C#m7}{4:0000}
- \hspace{1cm}
- \utab*{C#7M}{1:0002}
- \utab*{C#6}{1:0000}
- \utab*{C#aug}{~:2110}
- \utab*{C#dim}{~:0104}
- \chordrule
-
- \chordname{D}{Ré}
- \utab{D}{~:2220}
- \utab{D7}{2:0001}
- \utab{Dm}{~:2210}
- \utab{Dm7}{1:1102}
- \hspace{1cm}
- \utab*{D7M}{2:0002}
- \utab*{D6}{2:0000}
- \utab*{Daug}{1:2110}
- \utab*{Ddim}{1:0104}
- \chordrule
-
- \chordname{D\Sharp = E\Flat}{Ré\Sharp = Mi\Flat}
- \utab{D#}{1:2220}
- \utab{D#7}{3:0001}
- \utab{D#m}{1:2210}
- \utab{D#m7}{2:1102}
- \hspace{1cm}
- \utab*{D#7M}{3:0002}
- \utab*{D#6}{3:0000}
- \utab*{D#aug}{~:0332}
- \utab*{D#dim}{~:2320}
- \chordrule
-
- \chordname{E}{Mi}
- \utab{E}{2:2220}
- \utab{E7}{~:1202}
- \utab{Em}{~:0432}
- \utab{Em7}{~:0202}
- \hspace{1cm}
- \utab*{E7M}{~:1302}
- \utab*{E6}{~:1102}
- \utab*{Eaug}{1:0000}
- \utab*{Edim}{1:2320}
- \chordrule
-
- \chordname{F}{Fa}
- \utab{F}{~:2010}
- \utab{F7}{~:2310}
- \utab{Fm}{~:1013}
- \utab{Fm7}{1:0202}
- \hspace{1cm}
- \utab*{F7M}{1:1302}
- \utab*{F6}{1:1102}
- \utab*{Faug}{~:2110}
- \utab*{Fdim}{2:2320}
- \chordrule
-
- \chordname{F\Sharp = G\Flat}{Fa\Sharp = Sol\Flat}
- \utab{F#}{1:2010}
- \utab{F#7}{1:2310}
- \utab{F#m}{~:2120}
- \utab{F#m7}{2:0202}
- \hspace{1cm}
- \utab*{F#7M}{2:1302}
- \utab*{F#6}{~:0202}
- \utab*{F#aug}{1:2110}
- \utab*{F#dim}{~:2020}
- \chordrule
-
- \chordname{G}{Sol}
- \utab{G}{~:0232}
- \utab{G7}{~:0212}
- \utab{Gm}{~:0231}
- \utab{Gm7}{~:0211}
- \hspace{1cm}
- \utab*{G7M}{~:0222}
- \utab*{G6}{~:0202}
- \utab*{Gaug}{~:0332}
- \utab*{Gdim}{~:0131}
- \chordrule
-
- \chordname{G\Sharp = A\Flat}{Sol\Sharp = La\Flat}
- \utab{G#}{3:2010}
- \utab{G#7}{1:0212}
- \utab{G#m}{1:0231}
- \utab{G#m7}{1:0211}
- \hspace{1cm}
- \utab*{G#7M}{1:0222}
- \utab*{G#6}{1:0202}
- \utab*{G#aug}{~:1003}
- \utab*{G#dim}{1:0131}
- \chordrule
-
- \chordname{A}{La}
- \utab{A}{~:2100}
- \utab{A7}{~:0100}
- \utab{Am}{~:2000}
- \utab{Am7}{~:0000}
- \hspace{1cm}
- \utab*{A7M}{~:1100}
- \utab*{A6}{2:0202}
- \utab*{Aaug}{~:2110}
- \utab*{Adim}{2:0131}
- \chordrule
-
- \chordname{A\Sharp = B\Flat}{La\Sharp = Si\Flat}
- \utab{A#}{1:2100}
- \utab{A#7}{1:0100}
- \utab{A#m}{1:2000}
- \utab{A#m7}{1:0000}
- \hspace{1cm}
- \utab*{A#7M}{1:1100}
- \utab*{A#6}{~:0211}
- \utab*{A#aug}{1:2110}
- \utab*{A#dim}{~:3101}
- \chordrule
-
- \chordname{B}{Si}
- \utab{B}{2:2100}
- \utab{B7}{2:0100}
- \utab{Bm}{2:2000}
- \utab{Bm7}{2:0000}
- \hspace{1cm}
- \utab*{B7M}{2:1100}
- \utab*{B6}{1:0211}
- \utab*{Baug}{~:0332}
- \utab*{Bdim}{1:3101}
-
- \begin{verse*}
- \musicnote[french]{Accordage standard : {\nolyrics \[G C E A]}}
- \musicnote[english]{Standard tuning: {\nolyrics \[G C E A]}}
- \end{verse*}
-
- \endsong
- \fi
-
-\end{songs}
diff --git a/tex/crepbook.cls b/tex/crepbook.cls
deleted file mode 100644
index c256a7dd..00000000
--- a/tex/crepbook.cls
+++ /dev/null
@@ -1,562 +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{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{licence}
-\RequirePackage{xstring}
-\RequirePackage{ifthen}
-\RequirePackage{framed}
-\RequirePackage{currfile}
-
-\iflyric%
- \tabsfalse%
- \lilypondfalse%
- \nodiagramtrue%
- \picturesfalse%
- \renewcommand{\colbotglue}{0pt plus .5\textheight minus 0pt}%
-\fi
-
-% Start
-\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\licence#1{\gdef\@licence{#1}}
-\def\picture#1{\gdef\@picture{#1}}
-\def\picturecopyright#1{\gdef\@picturecopyright{#1}}
-\def\footer#1{\gdef\@footer{#1}}
-\def\lang#1{\gdef\@lang{#1}}
-\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{
- \@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{\l@belVersion} & \@version \\ \fi
- \if!\@date!\else{\l@belDate} & \@date \\ \fi
- \if!\@author!\else{\l@belAuthor} & \@author \\ \fi
- \if!\@web!\else{\l@belWeb} & \url{\@web} \\ \fi
- \if!\@mail!\else{\l@belMail} & \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}
-}
-
-\makeatletter
-
-\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{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}{}{}{
- \IfStrEq{\@lang}{english}{Original song:}{Chanson originale :}
- \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%
-
-\newcommand{\lilypond}[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}{%
- \IfStrEq{\@lang}{english}{intro}{}%
- \IfStrEq{\@lang}{french}{intro}{}%
-}%
-\newcommand*{\Outro}{%
- \IfStrEq{\@lang}{english}{outro}{}%
- \IfStrEq{\@lang}{french}{outro}{}%
-}%
-\newcommand*{\Bridge}{%
- \IfStrEq{\@lang}{english}{bridge}{}%
- \IfStrEq{\@lang}{french}{pont}{}%
-}%
-\newcommand*{\Chorus}{%
- \IfStrEq{\@lang}{english}{chorus}{}%
- \IfStrEq{\@lang}{french}{refrain}{}%
-}%
-\newcommand*{\Verse}{%
- \IfStrEq{\@lang}{english}{verse}{}%
- \IfStrEq{\@lang}{french}{couplet}{}%
-}%
-\newcommand*{\Solo}{%
- \IfStrEq{\@lang}{english}{solo}{}%
- \IfStrEq{\@lang}{french}{solo}{}%
-}%
-\newcommand*{\Pattern}{%
- \IfStrEq{\@lang}{english}{pattern}{}%
- \IfStrEq{\@lang}{french}{motif}{}%
-}%
-\newcommand*{\Rythm}{%
- \IfStrEq{\@lang}{english}{rythm}{}%
- \IfStrEq{\@lang}{french}{rythme}{}%
-}%
-\newcommand*{\Adlib}{%
- \emph{ad~lib.}%
-}%
-
-\let\musicnoteORIG\musicnote
-\renewcommand{\musicnote}[2][]{%
- \vspace{.1cm}
- \IfStrEq{}{#1}{\musicnoteORIG{#2}}{
- \IfStrEq{\@lang}{#1}{\musicnoteORIG{#2}}{}
- }
-}
-
-\let\textnoteORIG\textnote
-\renewcommand{\textnote}[2][]{%
- \vspace{.1cm}
- \IfStrEq{}{#1}{\textnoteORIG{#2}}{
- \IfStrEq{\@lang}{#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{%
- \IfStrEq{\@lang}{english}{transposition:~}{}%
- \IfStrEq{\@lang}{french}{transposition~:~}{}%
- \ifthenelse{#1>0}{#1$\Uparrow$}{\removefirstch@r#1$\Downarrow$}%
- }%
- \else%
- \transpose{#1}
- \fi%
-}%
-
-\makeatother
diff --git a/tex/licence.sty b/tex/licence.sty
deleted file mode 100644
index fcb67697..00000000
--- a/tex/licence.sty
+++ /dev/null
@@ -1,47 +0,0 @@
-\RequirePackage{graphicx}
-\RequirePackage{calc}
-
-\newlength{\largeurnota}
-\newlength{\largeurlignenota}
-\newlength{\indentationnota}
-\newlength{\paddingnota}
-\setlength{\largeurnota}{0.8cm}
-\setlength{\paddingnota}{5pt}
-
-\newenvironment{pictonote}[1]{%
- \begin{list}{}{%
- \setlength{\labelsep}{5pt}%
- \setlength{\leftmargin}{20pt}%
- \setlength{\rightmargin}{25pt}}
- \item%
- \setlength{\indentationnota}{\@totalleftmargin+\largeurnota+\paddingnota}%
- \setlength{\largeurlignenota}{\linewidth-\largeurnota-\paddingnota}%
- \parshape=3%
- \indentationnota\largeurlignenota%
- \indentationnota\largeurlignenota%
- \@totalleftmargin\linewidth%
- \raisebox{-\largeurnota+2.2ex}[0pt][0pt]{%
- \makebox[0pt][r]{%
- \includegraphics[width=\largeurnota]{#1}%
- \hspace{\paddingnota}}}%
- \ignorespaces}{%
- \end{list}%
- \vspace{0.2cm}%
-}
-
-\newcommand{\@lheader}[1]{%
- \textbf{\large #1}%
- \vspace{0.2cm}%
-}
-
-\newcommand{\lcondition}[1]{%
- \textbf{#1~--~}%
-}
-
-\newenvironment{lblock}[1]{%
- \@lheader{#1}}{%
- \vspace{0.6cm}%
-}
-
-
-\endinput
diff --git a/tex/license-nb.tex b/tex/license-nb.tex
deleted file mode 100644
index 197d5b02..00000000
--- a/tex/license-nb.tex
+++ /dev/null
@@ -1,84 +0,0 @@
-\phantomsection
-\addcontentsline{toc}{section}{Licence}
-%Licence Creative Commons
-\begin{center}
- \textbf{\LARGE{Creative Commons\footnote{ Ce document est mis Ã
- disposition selon le Contrat Attribution-ShareAlike 3.0
- Unported disponible en ligne
- \url{http://creativecommons.org/licenses/by-sa/3.0/} ou par
- courrier postal à Creative Commons, 171 Second Street, Suite
- 300, San Francisco, California 94105, USA.} Legal Code} }
-\end{center}
-\vspace{1cm}
-
-%-------------------------------------------------------------------------------
-\begin{lblock}{Vous êtes libres~:}
-
- \begin{pictonote}{share}
- de reproduire, distribuer et communiquer cette création au
- public~;
- \end{pictonote}
-
- \begin{pictonote}{remix}
- de modifier cette création~;
- \end{pictonote}
-
-\end{lblock}
-%-------------------------------------------------------------------------------
-\begin{lblock}{Selon les conditions suivantes~:}
-
- \begin{pictonote}{by}
- \lcondition{Paternité} Vous devez citer le nom de l'auteur
- original de la manière indiquée par l'auteur de l'œuvre ou le
- titulaire des droits qui vous confère cette autorisation (mais pas
- d'une manière qui suggérerait qu'ils vous soutiennent ou
- approuvent votre utilisation de l'Å“uvre)~;
- \end{pictonote}
-
- \begin{pictonote}{sa}
- \lcondition{Partage des Conditions Initiales à l'Identique} Si
- vous modifiez, transformez ou adaptez cette création, vous n'avez
- le droit de distribuer la création qui en résulte que sous un
- contrat identique a celui-ci~;
- \end{pictonote}
-
-\end{lblock}
-%-------------------------------------------------------------------------------
-\begin{lblock}{Informations complémentaires~:}
-
- \hspace{0.4cm}
- \parbox{15cm}{
- \paragraph{Dérogation --}
- Chacune des conditions optionnelles peut être levée après
- l'autorisation du titulaire des droits.
-
- \paragraph{Utilisation --}
- À chaque réutilisation ou distribution de cette création, vous
- devez faire apparaître clairement au public les conditions
- contractuelles de sa mise à disposition.
-
- \paragraph{Équité --}
- La licence n'interfère avec aucun des droits ci-dessous~:
- \begin{itemize}
- \item votre bon usage de ce document~;
- \item les droits moraux des auteurs~;
- \item les droits des personnes tierces dont le travail est
- présenté ou utilisé.
- \end{itemize}
- }
-
- \begin{center}
- \includegraphics[width=5cm]{license}
- \end{center}
-
-\end{lblock}
-%-------------------------------------------------------------------------------
-\begin{itemize}
-\item Donjon de Naheulbeuk:
- \url{http://www.penofchaos.com/warham/donjon}
-\item Illustrations de Marion Poinsot: \url{http://katurajdr.fr}
-\item Ce document est écrit en \LaTeX, d'après le style du projet
- Songs: \url{http://songs.sourceforge.net/}
-\end{itemize}
-%-------------------------------------------------------------------------------
-% Fin de la Licence
diff --git a/tex/license.tex b/tex/license.tex
deleted file mode 100644
index 3f272e85..00000000
--- a/tex/license.tex
+++ /dev/null
@@ -1,170 +0,0 @@
-%Licence Creative Commons
-\IfStrEq{\getlang}{english}{
- \phantomsection
- \addcontentsline{toc}{section}{License}
- \begin{center}
- \textbf{\LARGE{Creative Commons\footnote{ This work is licensed
- under the Creative Commons Attribution-ShareAlike 3.0 Unported
- License. To view a copy of this license, visit
- \url{http://creativecommons.org/licenses/by-sa/3.0/} or send a
- letter to Creative Commons, 171 Second Street, Suite 300, San
- Francisco, California, 94105, USA.} Legal Code} }
- \end{center}
- \vspace{1cm}
-
- %-------------------------------------------------------------------------------
- \begin{lblock}{You are free to:}
-
- \begin{pictonote}{share}
- \lcondition{Share} copy, distribute and transmit the work;
- \end{pictonote}
-
- \begin{pictonote}{remix}
- \lcondition{Remix} adapt the work;
- \end{pictonote}
-
- \end{lblock}
- %-------------------------------------------------------------------------------
- \begin{lblock}{Under the following conditions:}
-
- \begin{pictonote}{by}
- \lcondition{Attribution} You must attribute the work in the manner
- specified by the author or licensor (but not in any way that
- suggests that they endorse you or your use of the work);
- \end{pictonote}
-
- \begin{pictonote}{sa}
- \lcondition{Share Alike} If you alter, transform, or build upon
- this work, you may distribute the resulting work only under the
- same or similar license to this one.
- \end{pictonote}
-
- \end{lblock}
- %-------------------------------------------------------------------------------
- \begin{lblock}{With the understanding that:}
-
- \hspace{0.4cm}
- \parbox{15cm}{
- \paragraph{Waiver --}
- Any of the above conditions can be waived if you get permission
- from the copyright holder.
-
- \paragraph{Public Domain --}
- Where the work or any of its elements is in the public domain
- under applicable law, that status is in no way affected by the
- license.
-
- \paragraph{Other Rights --}
- In no way are any of the following rights affected by the license:
- \begin{itemize}
- \item your fair dealing or fair use rights, or other applicable
- copyright exceptions and limitations;
- \item apart from the remix rights granted under this license,
- the author's moral rights;
- \item rights other persons may have either in the work itself
- or in how the work is used, such as publicity or privacy rights.
- \end{itemize}
- }
-
- \begin{center}
- \includegraphics[width=4cm]{license}
- \end{center}
-
- \end{lblock}
- %-------------------------------------------------------------------------------
- \paragraph{Songs \LaTeX~Package}
- This document is written in \LaTeX, from the Songs
- Project\footnote{\url{http://songs.sourceforge.net/}}.
-}{
- \phantomsection
- \addcontentsline{toc}{section}{Licence}
- \begin{center}
- \textbf{\LARGE{Creative Commons\footnote{ Cette création est mise Ã
- disposition selon le Contrat Attribution-ShareAlike 3.0
- Unported disponible en ligne
- \url{http://creativecommons.org/licenses/by-sa/3.0/} ou par
- courrier postal à Creative Commons, 171 Second Street, Suite
- 300, San Francisco, California 94105, USA.} Legal Code} }
- \end{center}
- \vspace{1cm}
-
- %-------------------------------------------------------------------------------
- \begin{lblock}{Vous êtes libres~:}
-
- \begin{pictonote}{share}
- de reproduire, distribuer et communiquer cette création au
- public~;
- \end{pictonote}
-
- \begin{pictonote}{remix}
- de modifier cette création~;
- \end{pictonote}
-
- \end{lblock}
- %-------------------------------------------------------------------------------
- \begin{lblock}{Selon les conditions suivantes~:}
-
- \begin{pictonote}{by}
- \lcondition{Paternité} Vous devez citer le nom de l'auteur
- original de la manière indiquée par l'auteur de l'œuvre ou le
- titulaire des droits qui vous confère cette autorisation (mais pas
- d'une manière qui suggérerait qu'ils vous soutiennent ou
- approuvent votre utilisation de l'Å“uvre)~;
- \end{pictonote}
-
- \begin{pictonote}{sa}
- \lcondition{Partage des Conditions Initiales à l'Identique} Si
- vous modifiez, transformez ou adaptez cette création, vous n'avez
- le droit de distribuer la création qui en résulte que sous un
- contrat identique a celui-ci~;
- \end{pictonote}
-
- \end{lblock}
- %-------------------------------------------------------------------------------
- \begin{lblock}{Informations complémentaires~:}
-
- \hspace{0.4cm}
- \parbox{15cm}{
- \paragraph{Dérogation --}
- Chacune des conditions optionnelles peut être levée après
- l'autorisation du titulaire des droits.
-
- \paragraph{Utilisation --}
- À chaque réutilisation ou distribution de cette création, vous
- devez faire apparaître clairement au public les conditions
- contractuelles de sa mise à disposition.
-
- \paragraph{Équité --}
- La licence n'interfère avec aucun des droits ci-dessous~:
- \begin{itemize}
- \item votre bon usage de ce document~;
- \item les droits moraux des auteurs~;
- \item les droits des personnes tierces dont le travail est
- présenté ou utilisé.
- \end{itemize}
- }
-
- \begin{center}
- \includegraphics[width=4cm]{license}
- \end{center}
-
- \end{lblock}
- %-------------------------------------------------------------------------------
- \paragraph{Songs \LaTeX~Package}
- Ce document est écrit en \LaTeX, d'après le style du projet
- Songs\footnote{\url{http://songs.sourceforge.net/}}.
-
- \paragraph{Note des auteurs}
- Ces tablatures sont des représentations d'interprétations personnelles
- et approximatives de chansons potentiellement protégées par droits
- d'auteurs. Ce recueil de chansons n'a absolument aucune vocation
- commerciale et joue sur l'autorisation tacite des auteurs et des
- ayant-droits, pensant que la publication de ces tablatures représente
- une publicité positive à leur égard. Si un auteur ou une société
- accréditée pense que ces tablatures sont utilisées d'une manière
- susceptible de porter atteinte à ses droits et désire s'opposer à leur
- publication, merci de nous contacter à \url{crep@team-on-fire.com}.
- %-------------------------------------------------------------------------------
-}
-%-------------------------------------------------------------------------------
-% End of Licence
diff --git a/tex/venturisold.sty b/tex/venturisold.sty
deleted file mode 100644
index 0fa21368..00000000
--- a/tex/venturisold.sty
+++ /dev/null
@@ -1,30 +0,0 @@
-%% Copyright 2010 Clea F. Rees
-%
-% This work may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3
-% of this license or (at your option) any later version.
-% The latest version of this license is in
-% http://www.latex-project.org/lppl.txt
-% and version 1.3 or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clea F. Rees.
-%
-% This work consists of all files listed in manifest.txt.
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{venturisold}[2010/07/03 v1.005 VenturisOldADF PS]
-\RequirePackage[T1]{fontenc}
-\RequirePackage{textcomp}
-\RequirePackage{nfssext-cfr}
-%:Make Venturis Old default for roman text
-\renewcommand{\rmdefault}{yvo}
-%:introduce special titling commands
-\DeclareRobustCommand{\vtstyle}[1][]{% allow an optional argument for consistency with venturis.sty
- \not@math@alphabet\vtstyle\relax
- \fontfamily{yvod}\selectfont}
-\DeclareTextFontCommand{\textvt}{\vtstyle}
-\DeclareTextFontCommand{\textvtl}{\vtstyle}
-\endinput
-%% end venturisold.sty
diff --git a/tex/xstring.sty b/tex/xstring.sty
deleted file mode 100644
index cb4e7536..00000000
--- a/tex/xstring.sty
+++ /dev/null
@@ -1,3 +0,0 @@
-\input xstring.tex
-\ProvidesPackage{xstring}[\xstringdate\space\space v\xstringversion\space\space String manipulations (C Tellechea)]
-\endinput
diff --git a/tex/xstring.tex b/tex/xstring.tex
deleted file mode 100644
index cbad33e6..00000000
--- a/tex/xstring.tex
+++ /dev/null
@@ -1,1166 +0,0 @@
-% __________________________________________________
-% | |
-% | |
-% | xstring v1.5d |
-% | |
-% | March 28 2010 |
-% | |
-% |__________________________________________________|
-%
-% This is xtring.tex
-%
-% "xstring" package consists of the 7 following files:
-% xstring.tex (this file)
-% xstring.sty
-% README
-% xstring_doc_fr.tex, xstring_doc_fr.pdf (manual in french)
-% xstring_doc_en.tex, xstring_doc_en.pdf (manual in english)
-%
-% Christian Tellechea 2008-2010
-% email : unbonpetit@gmail.com
-% -------------------------------------------------------------------
-% This work may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3
-% of this license or (at your option) any later version.
-% The latest version of this license is in
-%
-% http://www.latex-project.org/lppl.txt
-%
-% and version 1.3 or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
-% -------------------------------------------------------------------
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Christian Tellechea
-% -------------------------------------------------------------------
-\def\xstringversion {1.5d}
-\def\xstringdate {2010/03/28}
-\def\xstringfrenchdate {28 mars 2010}
-\def\xstringenglishdate {March $28^{\mathrm{th}}$ 2010}
-\edef\CurrentAtCatcode {\the\catcode`\@}
-\catcode`\@=11
-\newwrite\@xs@message% canal pour les messages
-\newcount\integerpart\newcount\decimalpart% compteurs utilis\'es par xstring
-\newif\if@xs@empty
-
-\expandafter\ifx\csname @latexerr\endcsname\relax% on n'utilise pas LaTeX ?
- \immediate\write\m@ne{Package: xstring \xstringdate\space\space v\xstringversion\space\space String manipulations (C Tellechea)}%
- \long\def\@firstoftwo#1#2{#1}
- \long\def\@secondoftwo#1#2{#2}
- \long\def\@gobble#1{}
- \long\def\@ifnextchar#1#2#3{%
- \let\reserved@d=#1%
- \def\reserved@a{#2}%
- \def\reserved@b{#3}%
- \futurelet\@let@arg\@ifnch}
- \def\@ifnch{%
- \ifx\@let@arg\@sptoken
- \let\reserved@c\@xifnch
- \else
- \ifx\@let@arg\reserved@d
- \let\reserved@c\reserved@a
- \else
- \let\reserved@c\reserved@b
- \fi
- \fi
- \reserved@c}
- \def\:{\let\@sptoken= } \:
- \def\:{\@xifnch} \expandafter\def\: {\futurelet\@let@arg\@ifnch}
- \def\@ifstar#1{\@ifnextchar *{\@firstoftwo{#1}}}
- \long\def\@testopt#1#2{\@ifnextchar[{#1}{#1[{#2}]}}
- \def\@empty{}
-\fi% fin des d\'efinitions LaTeX
-
-\def\@xs@testempty#1{%
- \expandafter\ifx\expandafter\@empty\detokenize{#1}\@empty\@xs@emptytrue\else\@xs@emptyfalse\fi}
-
-% Ouvre un groupe o\`u les catcodes sont \`a 12 et \`a 10 pour les espaces
-% ensuite, appelle \@xs@ReadVerb qui lit un argument entre d\'elimiteurs verb
-\def\@xs@MakeVerb{% lit 1 argument et le transforme en verb
- \begingroup% groupe o\`u les catcodes sont \`a 12 pour la lecture suivante
- \def\do##1{\catcode`##112\relax}%
- \dospecials% on entre dans le mode verb
- \obeyspaces% et on tient compte des espaces
- \@xs@ReadVerb}% et on va lire l'argument
-
-% D\'efinit \@xs@ReadVerb qui lit un argument entre d\'elimiteurs verb
-\def\setverbdelim#1{% d\'efinit quel est le d\'elimiteur de verb
- \expandafter\@xs@testempty\expandafter{\@gobble#1}%
- \if@xs@empty
- \else
- \begingroup
- \newlinechar`\^^J%
- \immediate\write\@xs@message
- {Package xstring Warning: verb delimiter is not a single token on input line \the\inputlineno^^J}%
- \endgroup
- \fi
- \def\@xs@ReadVerb##1#1##2#1{% lit ##2 qui est entre les d\'elimiteurs de verb
- \endgroup% on ferme le groupe
- \@xs@afterreadverb{##2}}}% on appelle l'ex\'ecution de fin
-
-% Assigne l'argument entre d\'elimiteur verb dans la sc #1' +
-\def\verbtocs#1{%
- \def\@xs@afterreadverb##1{\def#1{##1}}%
- \@xs@MakeVerb}
-
-% Cette macro d\'eveloppe \'eventuellement #2
-% puis le transforme en token et l'assigne \`a #1
-\begingroup% on ouvre un groupe o\`u...
-\catcode\z@12\relax% ...le caract\`ere 0 a 12 pour catcode
-\gdef\tokenize#1#2{%
- \begingroup
- \@xs@def\@xs@reserved@A{#2}% on d\'eveloppe en accord avec \fullexpandarg ou \noexpandarg
- \def\@xs@AssignResult^^00##1^^00\@xs@nil{\gdef#1{##1}}% on assigne en tenant compte du \@xs@nil qui vient de la fin du fichier virtuel
- \everyeof{\@xs@nil}% met un \@xs@nil \`a la fin du fichier virtuel
- \endlinechar\m@ne
- \catcode\z@12\relax
- \expandafter\@xs@AssignResult\scantokens\expandafter{\expandafter^^00\@xs@reserved@A^^00}% on fait l'assignation
- \endgroup}%
-\endgroup
-
-% Macro tr\`es simple qui assigne ou affiche le r\'esultat, selon la pr\'esence
-% ou non de #2 qui est l'argument optionnel venant en derni\`ere position des macros
-\def\@xs@ReturnResult#1#2{%
- \def\@xs@argument@A{#1}%
- \@xs@testempty{#2}%
- \if@xs@empty
- \@xs@argument@A
- \else
- \let#2\@xs@argument@A
- \fi}
-
-% Pas d'expansion des arguments
-\def\normalexpandarg{%
- \let\@xs@def\def% on d\'efinit \@xs@call avec \def
- \def\@xs@expand##1{\unexpanded\expandafter{##1}}}
-\let\noexpandarg\normalexpandarg% synonyme
-
-% 1-d\'eveloppement du premier token des arguments
-\def\expandarg{%
- \let\@xs@def\def% on d\'efinit \@xs@call avec \def
- \def\@xs@expand##1{\unexpanded\expandafter\expandafter\expandafter{##1}}}
-
-% D\'eveloppement maximum des arguments
-\def\fullexpandarg{%
- \let\@xs@def\edef% on d\'efinit\@xs@call avec \edef
- \def\@xs@expand##1{##1}}% et on neutralise \@xs@expand
-
-\def\saveexpandmode{\let\@xs@saved@def\@xs@defarg\let\@xs@saved@expand\@xs@expand}
-\def\restoreexpandmode{\let\@xs@defarg\@xs@saved@def\let\@xs@expand\@xs@saved@expand}
-
-% Macro interne renvoyant #2 si son argument commence par une accolade ouvrante "{"
-% et #3 sinon (Ulrich Diez sur comp.text.tex)
-\def\@xs@ifbeginwithbrace#1{%
- \csname @%
- \expandafter\@gobble\string{% ne sert à rien si ce n'est \'equilibrer les accolades dans la d\'efinition
- \expandafter\@gobble\expandafter{\expandafter{\string#1}%
- \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\@firstoftwo
- \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\@gobble
- \expandafter\expandafter\expandafter\@gobble
- \expandafter\expandafter\expandafter{\expandafter\string\expandafter}\string}%
- \expandafter\@gobble\string}%
- \@secondoftwo{first}{second}oftwo%
- \endcsname}
-
-% Cette macro interne prend la 1ere unit\'e syntaxique de #1 et assigne le r\'esultat \`a #2
-\def\@xs@returnfirstsyntaxunit#1#2{%
- \def\@xs@groupfound{\expandafter\def\expandafter#2\expandafter{\expandafter{#2}}\@xs@gobbleall}% on met #2 dans des accolades et on finit
- \def\@xs@assignfirsttok##1##2\@xs@nil{\let\@xs@toks0\def#2{##1}}%
- \def\@xs@testfirsttok{%
- \let\@xs@next\@xs@assignfirsttok
- \ifx\@xs@toks\bgroup
- \expandafter\@xs@ifbeginwithbrace\expandafter{\@xs@argument}{\def\@xs@next{\afterassignment\@xs@groupfound\def#2}}{}%
- \fi
- \@xs@next}%
- \def\@xs@argument{#1}%
- \edef\@xs@next{\expandafter\@xs@beforespace\detokenize{#1} \@xs@nil}% #1 commence par un espace ?
- %\expandafter\expandafter\expandafter\@xs@testempty\expandafter\expandafter\expandafter{\expandafter\@xs@beforespace\detokenize{#1} \@xs@nil}
- \ifx\@xs@next\@empty
- \def\@xs@next{\expandafter\ifx\expandafter\@empty\detokenize\expandafter{\@xs@argument}\@empty\let#2\@empty\else\def#2{ }\let\@xs@toks0\fi}%
- \else
- \def\@xs@next{\expandafter\futurelet\expandafter\@xs@toks\expandafter\@xs@testfirsttok\@xs@argument\@xs@nil}%
- \fi
- \@xs@next}
-
-% Cette macro interne enl\`eve la 1ere unit\'e syntaxique de #1 et assigne le r\'esultat \`a #2
-\def\@xs@testsecondtoken#1\@xs@nil{\@xs@ifbeginwithbrace{#1}}
-\def\@xs@gobblespacebeforebrace#1#{}% supprime tout ce qui est avant la 1ere accolade ouvrante
-\def\@xs@removefirstsyntaxunit#1#2{%
- \def\@xs@argument{#1}%
- \expandafter\expandafter\expandafter\ifx\expandafter\expandafter\expandafter\@empty\expandafter\@xs@beforespace\detokenize\expandafter{\@xs@argument} \@xs@nil\@empty% #1 commence par un espace ?
- \expandafter\@xs@testempty\expandafter{\@xs@argument}%
- \if@xs@empty
- \let#2\@empty
- \else
- \afterassignment\@xs@testsecondtoken% après avoir mangé le 1er token, on va tester si la suite commence par «{»
- \expandafter\let\expandafter\@xs@secontoken\expandafter=\expandafter\@sptoken\@xs@argument\@xs@@nil\@xs@nil% on mange le 1er token et on rajoute \@xs@@nil à la fin pour éviter de perdre les accolades du groupe
- {\expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter#2%
- \expandafter\expandafter\expandafter{\expandafter\@xs@gobblespacebeforebrace\@xs@argument}}%
- {\expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter#2%
- \expandafter\expandafter\expandafter{\expandafter\@xs@behindspace\@xs@argument\@xs@nil}}%
- \fi
- \else
- \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter#2%
- \expandafter\expandafter\expandafter{\expandafter\@gobble\@xs@argument}%
- \fi}
-
-% Macros \`a arguments d\'elimit\'es pour les macros ci dessus
-\def\@xs@beforespace#1 #2\@xs@nil{#1}
-\def\@xs@behindspace#1 #2\@xs@nil{#2}
-\def\@xs@returnfirstsyntaxunit@ii#1#2\@xs@nil{#1}
-\def\@xs@gobbleall#1\@xs@nil{}
-
-% Cette macro interne est utilis\'ee dans les macros \'etoil\'ees pour :
-% 1) d\'evelopper l'argument selon qu'on a choisit \fullexpandarg
-% ou \normalexpandarg, et ceci \`a l'aide de la macro \@xs@def
-% 2) Ensuite, on d\'etokenize ce d\'eveloppement de façon n'avoir plus que
-% des catcodes de 10 pour les espaces et 12 pour le reste.
-\def\@xs@expand@and@detokenize#1#2{%
- \def#1{#2}%
- \expandafter\edef\expandafter#1\expandafter{\@xs@expand#1}% on d\'eveloppe #2 selon le mode de d\'eveloppement
- \edef#1{\detokenize\expandafter{#1}}}% puis on d\'etokenize et on assigne \`a #1
-
-\def\@xs@expand@and@assign#1#2{\@xs@def#1{#2}}% on d\'eveloppe #2 selon \fullexpandarg ou \normalexpandarg
-
-\def\@xs@edefaddtomacro#1#2{\edef#1{\unexpanded\expandafter{#1}#2}}
-\def\@xs@addtomacro#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}
-
-\def\@xs@argstring{0########1########2########3########4########5########6########7########8########9}
-% \@xs@DefArg{3} met dans la sc \@xs@myarg les tokens "####1####2####3"
-\def\@xs@DefArg#1{\def\@xs@defarg0##1#1##2\@xs@nil{\def\@xs@myarg{##1#1}}\expandafter\@xs@defarg\@xs@argstring\@xs@nil}
-% \@xs@DefArg@{3} met dans la sc \@xs@myarg les tokens "[####1]####2####3####4"
-\def\@xs@DefArg@#1{\expandafter\@xs@defarg@\expandafter{\number\numexpr#1+1}}
-\def\@xs@defarg@#1{\def\@xs@defarg0##11##2#1##3\@xs@nil{\def\@xs@myarg{[##11]##2#1}}\expandafter\@xs@defarg\@xs@argstring\@xs@nil}
-% \@xs@OneArg{3} met dans la sc \@xs@myarg les tokens "####3"
-\def\@xs@OneArg#1{\expandafter\@xs@onearg\expandafter{\number\numexpr#1-1}{#1}}
-\def\@xs@onearg#1#2{\def\@xs@defarg##1#1##2#2##3\@xs@nil{\def\@xs@myarg{##2#2}}\expandafter\@xs@defarg\@xs@argstring\@xs@nil}
-
-% #1 : num\'ero du 1er argument; #2 : nombre de lignes; #3 argument optionnel; #4 : dernier num\'ero de l'argument devant être d\'etokenis\'e si \'etoile
-\def\@xs@BuildLines#1#2#3#4{%
- \let\@xs@newlines\@empty
- \let\@xs@newargs\@empty
- \def\@xs@buildlines##1{%
- \expandafter\@xs@OneArg\expandafter{\number\numexpr##1+#1-1}%
- \edef\@xs@reserved@B{\noexpand\@xs@expand\csname @xs@arg@\romannumeral\numexpr##1\endcsname}%
- \ifnum##1=\@ne% si c'est le premier argument
- \@xs@testempty{#3}%
- \if@xs@empty
- \expandafter\@xs@addtomacro\expandafter\@xs@newargs\expandafter{\expandafter{\@xs@reserved@B}}%
- \edef\@xs@reserved@B{\ifnum##1>#4 @xs@def\else @xs@assign\fi}%
- \else% et s'il y a un argument optionnel alors, on met des crochets
- \expandafter\@xs@addtomacro\expandafter\@xs@newargs\expandafter{\expandafter[\@xs@reserved@B]}%
- \def\@xs@reserved@B{@xs@def}% ne pas d\'etok\'eniser l'argument optionnel grace au \@xs@def
- \fi
- \else
- \expandafter\@xs@addtomacro\expandafter\@xs@newargs\expandafter{\expandafter{\@xs@reserved@B}}%
- \edef\@xs@reserved@B{\ifnum##1>#4 @xs@def\else @xs@assign\fi}%
- \fi
- \edef\@xs@newlines{\unexpanded\expandafter{\@xs@newlines}\expandafter\noexpand\csname\@xs@reserved@B\endcsname\expandafter\noexpand\csname @xs@arg@\romannumeral\numexpr##1\endcsname{\@xs@myarg}}%
- \ifnum##1<#2\relax
- \def\@xs@next{\expandafter\@xs@buildlines\expandafter{\number\numexpr##1+1}}%
- \expandafter\@xs@next
- \fi}%
- \@xs@buildlines\@ne}
-
-\def\@xs@newmacro{\@ifstar{\let\@xs@reserved@D\@empty\@xs@newmacro@}{\let\@xs@reserved@D\relax\@xs@newmacro@0}}
-% #1 : dernier num\'ero de l'argument devant être d\'etokenis\'e
-% #2 : nom de la macro publique
-% #3 : argument optionnel (vide si pas d'arg optionnel)
-% #4 : nombre d'arguments obligatoires
-% #5 : utilisation de testopt (1 si oui, 0 si non)
-% #6 : code de la macro
-\def\@xs@newmacro@#1#2#3#4#5{%
- \edef\@xs@reserved@A{@xs@\expandafter\@gobble\string#2}%
- \edef\@xs@reserved@C{\expandafter\noexpand\csname\@xs@reserved@A @\ifx\@empty#3\@empty @\fi\endcsname}%
- \edef\@xs@reserved@B{%
- \ifx\@empty\@xs@reserved@D
- \def\noexpand#2{\noexpand\@ifstar
- {\let\noexpand\@xs@assign\noexpand\@xs@expand@and@detokenize\expandafter\noexpand\@xs@reserved@C}%
- {\let\noexpand\@xs@assign\noexpand\@xs@expand@and@assign\expandafter\noexpand\@xs@reserved@C}}%
- \else
- \def\noexpand#2{\let\noexpand\@xs@assign\noexpand\@xs@expand@and@assign\expandafter\noexpand\@xs@reserved@C}%
- \fi
- \ifx\@empty#3\@empty
- \else
- \def\expandafter\noexpand\@xs@reserved@C{%
- \noexpand\@testopt{\expandafter\noexpand\csname\@xs@reserved@A @@\endcsname}{\ifx\@xs@def\edef#3\else\unexpanded{#3}\fi}}%
- \fi}%
- % Que fait \@xs@reserved@B ? Il d\'efinit :
- % si #3 est vide : \NOM{\@ifstar{\let\@xs@assign\@xs@expand@and@detokenize\@xs@NOM@@}{\let\@xs@assign\@xs@expand@and@assign\@xs@NOM@@}}
- % si #3 existe : \NOM{\@ifstar{\let\@xs@assign\@xs@expand@and@detokenize\@xs@NOM@}{\let\@xs@assign\@xs@expand@and@assign\@xs@NOM@}}
- % \@xs@NOM@{\@testopt{\@xs@NOM@@}{#3}}}
- \@xs@reserved@B
- \ifx\@empty#3\@empty
- \@xs@BuildLines1{#4}{#3}{#1}%
- \@xs@DefArg{#4}%
- \else
- \expandafter\@xs@BuildLines\expandafter1\expandafter{\number\numexpr#4+1}{#3}{#1}%
- \@xs@DefArg@{#4}%
- \fi
- \edef\@xs@reserved@B{\def\expandafter\noexpand\csname\@xs@reserved@A @@\endcsname\@xs@myarg}%
- \edef\@xs@reserved@C{\unexpanded\expandafter{\@xs@newlines}\edef\noexpand\@xs@call}%
- \edef\@xs@reserved@D{\noexpand\noexpand\expandafter\noexpand\csname\@xs@reserved@A\endcsname\unexpanded\expandafter{\@xs@newargs}}%
- \ifnum#5=\@ne\edef\@xs@reserved@D{\noexpand\noexpand\noexpand\@testopt{\unexpanded\expandafter{\@xs@reserved@D}}{}}\fi
- \@xs@edefaddtomacro\@xs@reserved@C{{\unexpanded\expandafter{\@xs@reserved@D}}\noexpand\@xs@call}%
- \@xs@edefaddtomacro\@xs@reserved@B{{\unexpanded\expandafter{\@xs@reserved@C}}}%
- % Que fait \@xs@reserved@B ? Il d\'efinit par exemple pour 3 arguments obligatoires et 1 facultatif :
- % \def\@xs@NOM@@[##2]##3##4##5{%
- % \@xs@def\@xs@arg@i{##2}\@xs@assign\@xs@arg@ii{##3}\@xs@assign\@xs@arg@iii{##4}\@xs@asign\@xs@arg@iv{##5}%
- % si #5=0: \edef\@xs@call{\noexpand\@xs@NOM[\@xs@expand\@xs@arg@i]{\@xs@expand\@xs@arg@ii}{\@xs@expand\@xs@arg@iii}{\@xs@expand\@xs@arg@iv}}%
- % si #5=1: \edef\@xs@call{\noexpand\@testopt{\noexpand\@xs@NOM[\@xs@expand\@xs@arg@i]{\@xs@expand\@xs@arg@i}{\@xs@expand\@xs@arg@ii}{\@xs@expand\@xs@arg@iii}{\@xs@expand\@xs@arg@iv}}{}}%
- % \@xs@call}
- \@xs@reserved@B
- \edef\@xs@reserved@B{\def\expandafter\noexpand\csname\@xs@reserved@A\endcsname\@xs@myarg\ifnum#5=\@ne[\unexpanded{##}\number\numexpr\ifx\@empty#3\@empty#4+1\else#4+2\fi]\fi}%
- % Que fait \@xs@reserved@B ? Il d\'efinit par exemple pour 3 arguments obligatoires et 1 facultatif :
- % \def \@xs@NOM[##2]##3##4##5[##6]{#6}
- \@xs@reserved@B}
-
-% macro g\'en\'erique qui lit \@xs@reserved@C us par us
-% 3 sous-routines sont appel\'ees \`a des moments cl\'e :
-% \@xs@atendofgroup (un groupe se finit, appel r\'ecursif)
-% \@xs@atbegingroup (un groupe vient d'être ouvert)
-% \@xs@atnextsyntaxunit (la future US n'est pas un groupe)
-\def\@xs@read@reserved@C{%
- \expandafter\@xs@testempty\expandafter{\@xs@reserved@C}%
- \if@xs@empty
- \ifnum\@xs@nestlevel=\z@
- \let\@xs@next\relax
- \else
- \let\@xs@next\@xs@atendofgroup
- \fi
- \else
- \expandafter\@xs@returnfirstsyntaxunit\expandafter{\@xs@reserved@C}\@xs@reserved@A
- \expandafter\@xs@removefirstsyntaxunit\expandafter{\@xs@reserved@C}\@xs@reserved@C
- \let\@xs@next\@xs@read@reserved@C
- \@xs@exploregroups
- \ifx\bgroup\@xs@toks
- \advance\integerpart\@ne
- \begingroup
- \expandafter\def\expandafter\@xs@reserved@C\@xs@reserved@A
- \@xs@manage@groupID
- \let\@xs@nestlevel\@ne
- \integerpart\z@
- \@xs@atbegingroup
- \else
- \global\advance\decimalpart\@ne
- \@xs@atnextsyntaxunit
- \fi
- \fi
- \@xs@next}
-
-% macro g\'en\'erique qui lit \@xs@reserved@D en proc\'edant \`a des tests avec \IfBeginWith
-% 2 sous-routines sont appel\'ees \`a des moments cl\'e :
-% \@xs@atendofgroup (un groupe se finit, appel r\'ecursif)
-% \@xs@atoccurfound (une occurrence a \'et\'e trouv\'ee)
-\def\@xs@read@reserved@D{%
- \expandafter\@xs@testempty\expandafter{\@xs@reserved@D}%
- \if@xs@empty
- \ifnum\@xs@nestlevel=\z@
- \let\@xs@next\relax
- \else
- \let\@xs@next\@xs@atendofgroup
- \fi
- \else
- \expandafter\expandafter\expandafter\@xs@IfBeginWith@i\expandafter\expandafter\expandafter{\expandafter\@xs@reserved@D\expandafter}\expandafter{\@xs@reserved@E}%
- {\global\advance\decimalpart\@ne
- \let\@xs@reserved@D\@xs@reserved@A
- \@xs@atoccurfound}%
- {\expandafter\@xs@returnfirstsyntaxunit\expandafter{\@xs@reserved@D}\@xs@reserved@A
- \expandafter\@xs@removefirstsyntaxunit\expandafter{\@xs@reserved@D}\@xs@reserved@D
- \let\@xs@next\@xs@read@reserved@D
- \@xs@exploregroups
- \ifx\bgroup\@xs@toks
- \advance\integerpart\@ne
- \begingroup
- \expandafter\def\expandafter\@xs@reserved@D\@xs@reserved@A
- \@xs@manage@groupID
- \let\@xs@reserved@C\@empty
- \let\@xs@nestlevel\@ne
- \integerpart\z@
- \else
- \expandafter\@xs@addtomacro\expandafter\@xs@reserved@C\expandafter{\@xs@reserved@A}%
- \fi}%
- \fi
- \@xs@next}
-
-\@xs@newmacro\StrRemoveBraces{}{1}{1}{%
- \def\@xs@reserved@C{#1}%
- \let\@xs@reserved@B\@empty
- \let\@xs@nestlevel\z@
- \@xs@StrRemoveBraces@i
- \expandafter\@xs@ReturnResult\expandafter{\@xs@reserved@B}{#2}}
-
-\def\@xs@StrRemoveBraces@i{%
- \expandafter\@xs@testempty\expandafter{\@xs@reserved@C}%
- \if@xs@empty
- \ifnum\@xs@nestlevel=\z@
- \let\@xs@next\relax
- \else
- \expandafter\endgroup
- \expandafter\@xs@addtomacro\expandafter\@xs@reserved@B\expandafter{\@xs@reserved@B}%
- \let\@xs@next\@xs@StrRemoveBraces@i
- \fi
- \else
- \expandafter\@xs@returnfirstsyntaxunit\expandafter{\@xs@reserved@C}\@xs@reserved@A
- \expandafter\@xs@removefirstsyntaxunit\expandafter{\@xs@reserved@C}\@xs@reserved@C
- \let\@xs@next\@xs@StrRemoveBraces@i
- \ifx\bgroup\@xs@toks
- \ifx\@xs@exploregroups\relax% on explore les groupes ?
- \begingroup
- \expandafter\def\expandafter\@xs@reserved@C\@xs@reserved@A
- \let\@xs@nestlevel\@ne
- \integerpart\z@
- \let\@xs@reserved@B\@empty
- \else
- \expandafter\@xs@addtomacro\expandafter\@xs@reserved@B\@xs@reserved@A
- \fi
- \else
- \expandafter\@xs@addtomacro\expandafter\@xs@reserved@B\expandafter{\@xs@reserved@A}%
- \fi
- \fi
- \@xs@next}
-
-% \@xs@cutafteroccur coupe l'argument #1 apr\`es la #3\`eme occurrence de #2
-% \@xs@reserved@C : contient ce qui se trouve avant cette occurrence
-% \@xs@reserved@D : contient ce qui se trouve avant cette occurrence y compris cette occurrence
-% \@xs@reserved@E : contient ce qui se trouve apr\`es l'occurrence
-% si l'occurrence n'existe pas ou qu'un des arguments est vide, toutes les chaines renvoy\'ees sont vides
-\def\@xs@cutafteroccur#1#2#3{%
- \def\@xs@reserved@D{#1}\let\@xs@reserved@C\@empty\def\@xs@reserved@E{#2}%
- \decimalpart\z@\integerpart\z@\def\groupID{0}\let\@xs@nestlevel\z@
- \def\@xs@atendofgroup{%
- \expandafter\endgroup
- \expandafter\@xs@addtomacro\expandafter\@xs@reserved@C\expandafter{\expandafter{\@xs@reserved@C}}%
- \@xs@read@reserved@D}%
- \def\@xs@atoccurfound{%
- \ifnum\decimalpart=#3
- \global\let\@xs@reserved@D\@xs@reserved@D
- \global\let\@xs@reserved@C\@xs@reserved@C
- \global\let\groupID\groupID
- \@xs@exitallgroups
- \let\@xs@next\relax
- \else
- \expandafter\@xs@addtomacro\expandafter\@xs@reserved@C\expandafter{\@xs@reserved@E}%
- \let\@xs@next\@xs@read@reserved@D
- \fi}%
- \@xs@read@reserved@D
- \def\@xs@argument@A{#2}%
- \ifnum\decimalpart=#3% occurrence trouv\'ee ?
- \let\@xs@reserved@E\@xs@reserved@D
- \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\@xs@reserved@D\expandafter\expandafter\expandafter{\expandafter\@xs@reserved@C\@xs@argument@A}%
- \else
- \let\@xs@reserved@C\@empty\let\@xs@reserved@E\@empty\let\groupID\@empty
- \fi}
-
-\@xs@newmacro*3\IfSubStr{1}{2}{0}{%
- \def\@xs@argument@A{#2}\def\@xs@argument@B{#3}%
- \expandafter\expandafter\expandafter\@xs@cutafteroccur
- \expandafter\expandafter\expandafter{\expandafter\@xs@argument@A\expandafter}\expandafter{\@xs@argument@B}{#1}%
- \expandafter\@xs@testempty\expandafter{\@xs@reserved@D}%
- \if@xs@empty
- \expandafter\@secondoftwo
- \else
- \expandafter\@firstoftwo
- \fi}
-
-\@xs@newmacro*2\IfBeginWith{}{2}{0}{%
- \def\@xs@argument@A{#1}\def\@xs@argument@B{#2}%
- \expandafter\@xs@testempty\expandafter{\@xs@argument@B}%
- \if@xs@empty
- \let\@xs@next\@secondoftwo
- \else
- \def\@xs@next{\expandafter\expandafter\expandafter\@xs@IfBeginWith@i
- \expandafter\expandafter\expandafter{\expandafter\@xs@argument@A\expandafter}\expandafter{\@xs@argument@B}}%
- \fi
- \@xs@next}
-
-\def\@xs@IfBeginWith@i#1#2{%
- \def\@xs@argument@A{#1}\def\@xs@argument@B{#2}%
- \expandafter\@xs@testempty\expandafter{\@xs@argument@B}%
- \if@xs@empty% #2 est vide, tous les tests sont pass\'es avec succ\`es : on renvoie #3
- \let\@xs@next\@firstoftwo
- \else
- \expandafter\@xs@testempty\expandafter{\@xs@argument@A}%\@xs@testempty{#1}%
- \if@xs@empty
- \let\@xs@next\@secondoftwo% #1 est vide, c'est que #2 est + long que #1 : on renvoie #4
- \else
- \expandafter\@xs@returnfirstsyntaxunit\expandafter{\@xs@argument@B}\@xs@reserved@B
- \expandafter\@xs@returnfirstsyntaxunit\expandafter{\@xs@argument@A}\@xs@reserved@A
- \ifx\@xs@reserved@A\@xs@reserved@B% il y a \'egalit\'e...
- \expandafter\@xs@removefirstsyntaxunit\expandafter{\@xs@argument@B}\@xs@reserved@B
- \expandafter\@xs@removefirstsyntaxunit\expandafter{\@xs@argument@A}\@xs@reserved@A% on enl\`eve les 1ere unit\'es syntaxiques
- \def\@xs@next{% et on recommence avec ces arguments racourcis d'1 unit\'e syntaxique
- \expandafter\expandafter\expandafter\@xs@IfBeginWith@i
- \expandafter\expandafter\expandafter{\expandafter\@xs@reserved@A\expandafter}\expandafter{\@xs@reserved@B}}%
- \else
- \let\@xs@next\@secondoftwo
- \fi
- \fi
- \fi
- \@xs@next}
-
-\@xs@newmacro*2\IfEndWith{}{2}{0}{%
- \def\@xs@argument@A{#1}\def\@xs@argument@B{#2}%
- \@xs@testempty{#2}%
- \if@xs@empty
- \let\@xs@reserved@A\@secondoftwo
- \else
- \expandafter\expandafter\expandafter\@xs@StrCount
- \expandafter\expandafter\expandafter{\expandafter\@xs@argument@A\expandafter}\expandafter
- {\@xs@argument@B}[\@xs@reserved@A]%
- \ifnum\@xs@reserved@A=\z@
- \let\@xs@reserved@A\@secondoftwo
- \else
- \expandafter\@xs@testempty\expandafter{\@xs@reserved@C}%
- \if@xs@empty
- \let\@xs@reserved@A\@firstoftwo
- \else
- \let\@xs@reserved@A\@secondoftwo
- \fi
- \fi
- \fi
- \@xs@reserved@A}
-
-\@xs@newmacro*4\IfSubStrBefore{1,1}{3}{0}{\@xs@IfSubStrBefore@i[#1]{#2}{#3}{#4}}
-\def\@xs@IfSubStrBefore@i[#1,#2]#3#4#5{%
- \def\@xs@reserved@C{#3}%
- \ifx\@xs@exploregroups\relax% si on explore les groupes
- \let\@xs@reserved@B\@empty
- \let\@xs@nestlevel\z@
- \@xs@StrRemoveBraces@i% on retire les accolades
- \let\@xs@reserved@C\@xs@reserved@B
- \fi
- \def\@xs@reserved@A{#5}%
- \expandafter\expandafter\expandafter\@xs@cutafteroccur\expandafter\expandafter\expandafter{\expandafter\@xs@reserved@C\expandafter}\expandafter{\@xs@reserved@A}{#2}%
- \def\@xs@reserved@A{#4}%
- \expandafter\expandafter\expandafter\@xs@cutafteroccur\expandafter\expandafter\expandafter{\expandafter\@xs@reserved@C\expandafter}\expandafter{\@xs@reserved@A}{#1}%
- \let\groupID\@empty
- \expandafter\@xs@testempty\expandafter{\@xs@reserved@C}%
- \if@xs@empty
- \expandafter\@secondoftwo
- \else
- \expandafter\@firstoftwo
- \fi}
-
-\@xs@newmacro*4\IfSubStrBehind{1,1}{3}{0}{\@xs@IfSubStrBehind@i[#1]{#2}{#3}{#4}}
-\def\@xs@IfSubStrBehind@i[#1,#2]#3#4#5{\@xs@IfSubStrBefore@i[#2,#1]{#3}{#5}{#4}}
-
-\def\@xs@formatnumber#1#2{%
- \def\@xs@argument@A{#1}%
- \@xs@testempty{#1}%
- \if@xs@empty
- \def#2{0X}% si vide, renvoie 0X
- \else
- \@xs@returnfirstsyntaxunit{#1}\@xs@reserved@A
- \def\@xs@reserved@B{+}%
- \ifx\@xs@reserved@A\@xs@reserved@B
- \expandafter\@xs@removefirstsyntaxunit\expandafter{\@xs@argument@A}\@xs@reserved@C
- \expandafter\@xs@testempty\expandafter{\@xs@reserved@C}%
- \if@xs@empty
- \def#2{+0X}%
- \else
- \expandafter\def\expandafter#2\expandafter{\expandafter+\expandafter0\@xs@reserved@C}%
- \fi
- \else
- \def\@xs@reserved@B{-}%
- \ifx\@xs@reserved@A\@xs@reserved@B
- \expandafter\@xs@removefirstsyntaxunit\expandafter{\@xs@argument@A}\@xs@reserved@A
- \expandafter\@xs@testempty\expandafter{\@xs@reserved@A}%
- \if@xs@empty
- \def#2{-0X}%
- \else
- \expandafter\def\expandafter#2\expandafter{\expandafter-\expandafter0\@xs@reserved@A}%
- \fi
- \else
- \expandafter\def\expandafter#2\expandafter{\expandafter0\@xs@argument@A}%
- \fi
- \fi
- \fi}
-
-\@xs@newmacro\IfInteger{}{1}{0}{%
- \@xs@formatnumber{#1}\@xs@reserved@A
- \decimalpart\z@
- \afterassignment\@xs@defafterinteger\integerpart\@xs@reserved@A\relax\@xs@nil
- \let\@xs@after@intpart\@xs@afterinteger
- \expandafter\@xs@testdot\@xs@afterinteger\@xs@nil
- \ifx\@empty\@xs@afterdecimal
- \ifnum\decimalpart=\z@
- \let\@xs@next\@firstoftwo% partie décimale constituée de 0 --> seul cas où on renvoie vrai
- \else
- \let\@xs@afterinteger\@xs@after@intpart
- \let\@xs@next\@secondoftwo
- \fi
- \else
- \let\@xs@afterinteger\@xs@after@intpart
- \let\@xs@next\@secondoftwo
- \fi
- \@xs@next}
-
-\@xs@newmacro\IfDecimal{}{1}{0}{%
- \expandafter\@xs@formatnumber\expandafter{\detokenize{#1}}\@xs@reserved@A
- \decimalpart\z@
- \afterassignment\@xs@defafterinteger\integerpart\@xs@reserved@A\relax\@xs@nil
- \expandafter\@xs@testdot\@xs@afterinteger\@xs@nil
- \ifx\@empty\@xs@afterdecimal
- \expandafter\@firstoftwo
- \else
- \expandafter\@secondoftwo
- \fi}
-
-\def\@xs@defafterinteger#1\relax\@xs@nil{\def\@xs@afterinteger{#1}}
-\def\@xs@testdot{\let\xs@decsep\@empty\@ifnextchar.{\def\xs@decsep{.}\@xs@readdecimalpart}{\@xs@testcomma}}
-\def\@xs@testcomma{\@ifnextchar,{\def\xs@dessep{,}\@xs@readdecimalpart}{\@xs@endnumber}}
-\def\@xs@readdecimalpart#1#2\@xs@nil{%
- \ifx\@empty#2\@empty\def\@xs@reserved@A{0X}\else\def\@xs@reserved@A{0#2}\fi
- \afterassignment\@xs@defafterinteger\decimalpart\@xs@reserved@A\relax\@xs@nil
- \expandafter\@xs@endnumber\@xs@afterinteger\@xs@nil}
-\def\@xs@endnumber#1\@xs@nil{\def\@xs@afterdecimal{#1}}
-
-% test d'\'egalit\'e sur des chaines (et des chaines contenant des nombres)
-\def\@xs@IfStrEqFalse@i#1#2{\let\@xs@reserved@A\@secondoftwo}
-\def\@xs@IfStrEqFalse@ii#1#2{% renvoie vrai si les 2 arg sont d\'ecimaux et s'ils sont \'egaux, faux sinon
- \@xs@IfDecimal{#1}%
- {\@xs@IfDecimal{#2}%
- {\ifdim#1pt=#2pt\let\@xs@reserved@A\@firstoftwo\else\let\@xs@reserved@A\@secondoftwo\fi}% les 2 sont d\'ecimaux : on fait le test
- {\let\@xs@reserved@A\@secondoftwo}}% un seul est d\'ecimal
- {\let\@xs@reserved@A\@secondoftwo}}% #1 n'est pas d\'ecimal
-
-\def\@xs@TestEqual#1#2{% teste si les 2 arguments sont \'egaux
- \def\@xs@reserved@A{#1}\def\@xs@reserved@B{#2}%
- \ifx\@xs@reserved@A\@xs@reserved@B
- \let\@xs@reserved@A\@firstoftwo% \'egalit\'e parfaite des 2 chaines
- \else
- \expandafter\expandafter\expandafter\@xs@reserved@D\expandafter\expandafter\expandafter{\expandafter\@xs@reserved@A\expandafter}\expandafter{\@xs@reserved@B}%
- \fi
- \@xs@reserved@A}
-
-\@xs@newmacro*2\IfStrEq{}{2}{0}{% teste si les deux chaines sont \'egales
- \let\@xs@reserved@D\@xs@IfStrEqFalse@i
- \@xs@TestEqual{#1}{#2}}
-
-\@xs@newmacro*2\IfEq{}{2}{0}{% teste si les 2 arguments (chaine ou nombre) sont \'egaux
- \let\@xs@reserved@D\@xs@IfStrEqFalse@ii
- \@xs@TestEqual{#1}{#2}}
-
-\def\IfStrEqCase{\@ifstar{\def\@xs@reserved@E{\IfStrEq*}\@xs@IfStrCase}{\def\@xs@reserved@E{\IfStrEq}\@xs@IfStrCase}}
-\def\@xs@IfStrCase#1#2{\@testopt{\@xs@IfStringCase{#1}{#2}}{}}
-
-\def\IfEqCase{\@ifstar{\def\@xs@reserved@E{\IfEq*}\@xs@IfEqCase}{\def\@xs@reserved@E{\IfEq}\@xs@IfEqCase}}
-\def\@xs@IfEqCase#1#2{\@testopt{\@xs@IfStringCase{#1}{#2}}{}}
-
-\def\@xs@IfStringCase#1#2[#3]{%
- \def\@xs@testcase##1##2##3\@xs@nil{% lit les 2 premieres unit\'es syntaxiques dans ##1 et ##2. Les autres dans ##3
- \@xs@reserved@E{#1}{##1}%
- {##2}% le test est positif, on ex\'ecute le code correspondant
- {\@xs@testempty{##3}%
- \if@xs@empty% le test est n\'egatif
- \def\@xs@next{#3}% s'il n'y a plus de cas, on ex\'ecute le code
- \else
- \def\@xs@next{\@xs@testcase##3\@xs@nil}% sinon, on recommence avec ce qui reste
- \fi
- \@xs@next}}%
- \@xs@testcase#2\@xs@nil}
-
-% Renvoie ce qui est \`a gauche de l'occurence n°#1 de la sous chaine #3 dans la chaine
-\@xs@newmacro*3\StrBefore{1}{2}{1}{%
- \@xs@cutafteroccur{#2}{#3}{#1}%
- \expandafter\@xs@ReturnResult\expandafter{\@xs@reserved@C}{#4}}
-
-% Renvoie ce qui est \`a droite de l'occurence n°#1 de la sous chaine #3 dans la chaine #2
-\@xs@newmacro*3\StrBehind{1}{2}{1}{%
- \@xs@cutafteroccur{#2}{#3}{#1}%
- \expandafter\@xs@ReturnResult\expandafter{\@xs@reserved@E}{#4}}
-
-% Renvoie ce qui est strictement compris entre les occurrences n°#1 et n°#2
-% des chaines #4 et #5 dans la chaine #3
-\@xs@newmacro*4\StrBetween{1,1}{3}{1}{\@xs@StrBetween@i[#1]{#2}{#3}{#4}[#5]}
-\def\@xs@StrBetween@i[#1,#2]#3#4#5[#6]{%
- \begingroup
- \noexploregroups
- \@xs@cutafteroccur{#3}{#5}{#2}%
- \expandafter\@xs@cutafteroccur\expandafter{\@xs@reserved@C}{#4}{#1}%
- \expandafter
- \endgroup
- \expandafter\@xs@ReturnResult\expandafter{\@xs@reserved@E}{#6}%
- \let\groupID\@empty}
-
-\def\exploregroups{\let\@xs@exploregroups\relax}
-\def\noexploregroups{\def\@xs@exploregroups{\let\@xs@toks0\relax}}
-\def\saveexploremode{\let\@xs@saveexploremode\@xs@exploregroups}
-\def\restoreexploremode{\let\@xs@exploregroups\@xs@saveexploremode}
-
-% Remplace les #1 premi\`eres occurences de la chaine #3
-% par la chaine #4 dans la chaine #2
-\@xs@newmacro\StrSubstitute{0}{3}{1}{%
- \def\@xs@reserved@D{#2}\let\@xs@reserved@C\@empty\def\@xs@reserved@E{#3}%
- \def\@xs@argument@C{#3}\def\@xs@argument@D{#4}%
- \decimalpart\z@\integerpart\z@\def\groupID{0}\let\@xs@nestlevel\z@
- \def\@xs@atendofgroup{%
- \expandafter\endgroup
- \expandafter\@xs@addtomacro\expandafter\@xs@reserved@C\expandafter{\expandafter{\@xs@reserved@C}}%
- \@xs@read@reserved@D}%
- \def\@xs@atoccurfound{%
- \ifnum#1<\@ne
- \let\@xs@reserved@A\@xs@argument@D
- \else
- \ifnum\decimalpart>#1
- \let\@xs@reserved@A\@xs@argument@C
- \else
- \let\@xs@reserved@A\@xs@argument@D
- \fi
- \fi
- \expandafter\@xs@addtomacro\expandafter\@xs@reserved@C\expandafter{\@xs@reserved@A}%
- \@xs@read@reserved@D}%
- \@xs@testempty{#3}%
- \if@xs@empty
- \expandafter\@xs@ReturnResult\expandafter{\@xs@reserved@D}{#5}%
- \else
- \@xs@read@reserved@D
- \expandafter\@xs@ReturnResult\expandafter{\@xs@reserved@C}{#5}%
- \fi}
-
-% Supprime les #1 premi\`eres occurrences de #3 dans #2
-\@xs@newmacro\StrDel{0}{2}{1}{\@xs@StrSubstitute[#1]{#2}{#3}{}[#4]}
-
-\def\@xs@exitallgroups{\ifnum\@xs@nestlevel>\z@\endgroup\expandafter\@xs@exitallgroups\fi}
-
-% Compte combien d'unit\'es syntaxiques contient la chaine #1 ?
-\@xs@newmacro\StrLen{}{1}{1}{%
- \def\@xs@reserved@C{#1}%
- \decimalpart\z@
- \let\@xs@nestlevel\z@
- \def\groupID{0}%
- \let\@xs@atbegingroup\relax
- \def\@xs@atendofgroup{\endgroup\@xs@read@reserved@C}%
- \let\@xs@atnextsyntaxunit\relax
- \@xs@read@reserved@C
- \expandafter\@xs@ReturnResult\expandafter{\number\decimalpart}{#2}}
-
-% Macro interne fermant autant de groupes que n\'ecessaire pour trouver une unit\'e syntaxique derri\`ere
-\def\@xs@continuetonext{%
- \expandafter\@xs@testempty\expandafter{\@xs@reserved@C}%
- \if@xs@empty
- \ifnum\@xs@nestlevel>\z@
- \expandafter\endgroup\expandafter\@xs@addtomacro\expandafter\@xs@reserved@B\expandafter{\expandafter{\@xs@reserved@B}}% on concat\`ene
- \expandafter\expandafter\expandafter\@xs@continuetonext% on recommence
- \fi
- \fi}%
-
-\def\@xs@manage@groupID{%
- \begingroup\def\@xs@reserved@A{0}%
- \ifx\@xs@reserved@A\groupID% si on arrive du groupe de niveau 0
- \endgroup\edef\groupID{\number\integerpart}% on met simplement le niveau
- \else
- \endgroup\expandafter\@xs@addtomacro\expandafter\groupID\expandafter{\expandafter,\number\integerpart}%
- \fi}
-
-% Cette macro coupe la chaine #1 apr\`es l'unit\'e syntaxique n°#2
-\def\StrSplit{\@ifstar{\let\@xs@reserved@E\@xs@continuetonext\StrSpl@t}{\let\@xs@reserved@E\relax\StrSpl@t}}
-\@xs@newmacro\StrSpl@t{}{2}{0}{\@xs@StrSplit@i{#2}{#1}\@xs@StrSplit@ii}
-% Cette macro interne coupe la chaine #2 apr\`es l'unit\'e syntaxique n°#1
-% Le d\'ebut est assign\'e dans \@xs@reserved@B et la fin dans \@xs@reserved@C
-\def\@xs@StrSplit@i#1#2{%
- \def\@xs@reserved@D{#1}\def\@xs@reserved@C{#2}\let\@xs@reserved@B\@empty\let\groupID\@empty
- \ifnum#1>\z@
- \decimalpart\z@\integerpart\z@\def\groupID{0}\let\@xs@nestlevel\z@
- \def\@xs@atendofgroup{%
- \expandafter\endgroup
- \expandafter\@xs@addtomacro\expandafter\@xs@reserved@B\expandafter{\expandafter{\@xs@reserved@B}}%
- \@xs@read@reserved@C}%
- \def\@xs@atbegingroup{\let\@xs@reserved@B\@empty}%
- \def\@xs@atnextsyntaxunit{%
- \expandafter\@xs@addtomacro\expandafter\@xs@reserved@B\expandafter{\@xs@reserved@A}%
- \ifnum\decimalpart=\@xs@reserved@D\relax
- \ifx\@xs@reserved@C\@empty\@xs@reserved@E\fi
- \global\let\@xs@reserved@B\@xs@reserved@B
- \global\let\@xs@reserved@C\@xs@reserved@C
- \global\let\groupID\groupID
- \@xs@exitallgroups
- \let\@xs@next\relax
- \fi}%
- \@xs@read@reserved@C
- \fi}
-\def\@xs@StrSplit@ii#1#2{\let#1\@xs@reserved@B\let#2\@xs@reserved@C}
-
-% De la chaine #1, renvoie ce qui se trouve entre les positions
-% #2 et #3, unit\'es syntaxiques aux positions compris !
-\@xs@newmacro\StrMid{}{3}{1}{%
- \begingroup
- \noexploregroups
- \let\@xs@reserved@E\relax
- \@xs@StrSplit@i{#3}{#1}%
- \edef\@xs@reserved@C{\number\numexpr#2-1}%
- \let\@xs@reserved@E\relax
- \expandafter\expandafter\expandafter\@xs@StrSplit@i\expandafter\expandafter\expandafter{\expandafter\@xs@reserved@C\expandafter}\expandafter{\@xs@reserved@B}%
- \expandafter\endgroup
- \expandafter\@xs@ReturnResult\expandafter{\@xs@reserved@C}{#4}%
- \let\groupID\@empty}
-
-% supprime #2 unit\'es syntaxiques \`a gauche dans la chaine #1
-\@xs@newmacro\StrGobbleLeft{}{2}{1}{%
- \let\@xs@reserved@E\relax
- \@xs@StrSplit@i{#2}{#1}%
- \expandafter\@xs@ReturnResult\expandafter{\@xs@reserved@C}{#3}}
-
-% extrait de #1 la chaine \`a gauche de longueur #2
-\@xs@newmacro\StrLeft{}{2}{1}{%
- \let\@xs@reserved@E\relax
- \@xs@StrSplit@i{#2}{#1}%
- \expandafter\@xs@ReturnResult\expandafter{\@xs@reserved@B}{#3}}
-
-% supprime #2 unit\'es syntaxiques \`a droite dans la chaine #1
-\@xs@newmacro\StrGobbleRight{}{2}{1}{%
- \@xs@StrLen{#1}[\@xs@reserved@D]%
- \let\@xs@reserved@E\relax
- \expandafter\@xs@StrSplit@i\expandafter{\number\numexpr\@xs@reserved@D-#2}{#1}%
- \expandafter\@xs@ReturnResult\expandafter{\@xs@reserved@B}{#3}}
-
-% renvoie #2 unit\'es syntaxiques \`a la droite de la chaine #1
-\@xs@newmacro\StrRight{}{2}{1}{%
- \@xs@StrLen{#1}[\@xs@reserved@D]%
- \let\@xs@reserved@E\relax
- \expandafter\@xs@StrSplit@i\expandafter{\number\numexpr\@xs@reserved@D-#2}{#1}%
- \expandafter\@xs@ReturnResult\expandafter{\@xs@reserved@C}{#3}}
-
-\@xs@newmacro\StrChar{}{2}{1}{%
- \let\@xs@reserved@B\@empty
- \def\@xs@reserved@C{#1}\def\@xs@reserved@D{#2}%
- \ifnum#2>\z@
- \def\groupID{0}\let\@xs@nestlevel\z@\integerpart\z@\decimalpart\z@
- \let\@xs@atbegingroup\relax
- \def\@xs@atendofgroup{\endgroup\@xs@read@reserved@C}%
- \def\@xs@atnextsyntaxunit{%
- \ifnum\decimalpart=\@xs@reserved@D% la n i\`eme US est atteinte ?
- \global\let\@xs@reserved@B\@xs@reserved@A% on capture l'US en cours qui est celle cherch\'ee
- \global\let\groupID\groupID
- \@xs@exitallgroups
- \let\@xs@next\relax
- \fi}%
- \@xs@read@reserved@C
- \fi
- \expandafter\@xs@testempty\expandafter{\@xs@reserved@B}%
- \if@xs@empty\let\groupID\@empty\fi
- \expandafter\@xs@ReturnResult\expandafter{\@xs@reserved@B}{#3}}
-
-% Combien de fois compte t-on #2 dans #1 ?
-\@xs@newmacro\StrCount{}{2}{1}{%
- \@xs@testempty{#2}%
- \def\@xs@reserved@D{#1}\def\@xs@reserved@E{#2}\let\@xs@reserved@C\@empty
- \if@xs@empty
- \@xs@ReturnResult{0}{#3}%
- \else
- \decimalpart\z@\integerpart\z@\def\groupID{0}\let\@xs@nestlevel\z@
- \def\@xs@atendofgroup{%
- \expandafter\endgroup
- \expandafter\@xs@addtomacro\expandafter\@xs@reserved@C\expandafter{\expandafter{\@xs@reserved@C}}%
- \@xs@read@reserved@D}%
- \def\@xs@atoccurfound{\let\@xs@reserved@C\@empty\@xs@read@reserved@D}%
- \@xs@read@reserved@D
- \expandafter\@xs@ReturnResult\expandafter{\number\decimalpart}{#3}%
- \fi}
-
-% renvoie la position de l'occurrence #1 de la sous chaine #3 dans la chaine #2
-\@xs@newmacro\StrPosition{1}{2}{1}{%
- \@xs@cutafteroccur{#2}{#3}{#1}%
- \let\@xs@reserved@E\groupID
- \ifx\@xs@reserved@C\@xs@reserved@D
- \@xs@ReturnResult{0}{#4}%
- \let\@xs@reserved@E\@empty
- \else
- \expandafter\@xs@StrLen\expandafter{\@xs@reserved@C}[\@xs@reserved@C]%
- \expandafter\@xs@ReturnResult\expandafter{\number\numexpr\@xs@reserved@C+1}{#4}%
- \fi
- \let\groupID\@xs@reserved@E}
-
-\def\comparestrict{\let\@xs@comparecoeff\@ne}
-\def\comparenormal{\let\@xs@comparecoeff\z@}
-\def\savecomparemode{\let\@xs@saved@comparecoeff\@xs@comparecoeff}
-\def\restorecomparemode{\let\@xs@comparecoeff\@xs@saved@comparecoeff}
-% Compare les deux arguments #1 et #2
-% Renvoie 0 s'ils sont \'egaux et renvoie la
-% position de la premiere unit\'e syntaxiques diff\'erente sinon
-\@xs@newmacro*2\StrCompare{}{2}{1}{%
- \def\@xs@reserved@A{#1}%
- \def\@xs@reserved@B{#2}%
- \ifx\@xs@reserved@B\@xs@reserved@A
- \@xs@ReturnResult{0}{#3}%
- \else
- \def\@xs@next{\@xs@StrCompare@i{#1}{#2}{#3}}%
- \expandafter\@xs@next
- \fi}
-
-\def\@xs@StrCompare@i#1#2#3{%
- \def\@xs@StrCompare@iii##1{%
- \let\@xs@reserved@A\@empty
- \expandafter\@xs@testempty\expandafter{\@xs@reserved@C}%
- \if@xs@empty
- \def\@xs@reserved@A{*\@xs@comparecoeff}%
- \else
- \expandafter\@xs@testempty\expandafter{\@xs@reserved@D}%
- \if@xs@empty
- \def\@xs@reserved@A{*\@xs@comparecoeff}%
- \fi
- \fi
- \def\@xs@next{%
- \expandafter\@xs@ReturnResult\expandafter
- {\number\numexpr##1\@xs@reserved@A\relax}{#3}}}%
- \def\@xs@StrCompare@ii##1{% ##1 est la position
- \expandafter\@xs@returnfirstsyntaxunit\expandafter{\@xs@reserved@C}\@xs@reserved@A
- \expandafter\@xs@returnfirstsyntaxunit\expandafter{\@xs@reserved@D}\@xs@reserved@B
- \ifx\@xs@reserved@B\@xs@reserved@A
- \expandafter\@xs@testempty\expandafter{\@xs@reserved@A}%
- \if@xs@empty
- \@xs@StrCompare@iii{##1}% les 2 unit\'es syntaxiques sont \'egales, on renvoie la position
- \else
- \def\@xs@next{\expandafter\@xs@StrCompare@ii\expandafter{\number\numexpr##1+1}}% les 2 unit\'es syntaxiques sont \'egales et non vides, on recommence
- \expandafter\@xs@removefirstsyntaxunit\expandafter{\@xs@reserved@C}\@xs@reserved@C
- \expandafter\@xs@removefirstsyntaxunit\expandafter{\@xs@reserved@D}\@xs@reserved@D
- \fi
- \else% les 2 unit\'es syntaxiques sont diff\'erentes : on renvoie la position
- \@xs@StrCompare@iii{##1}%
- \fi
- \@xs@next}%
- \def\@xs@reserved@C{#1}\def\@xs@reserved@D{#2}%
- \@xs@StrCompare@ii1}
-
-\@xs@newmacro\StrFindGroup{}{2}{1}{%
- \def\@xs@reserved@A{#2}\def\@xs@reserved@B{0}%
- \ifx\@xs@reserved@A\@xs@reserved@B
- \def\@xs@next{\@xs@ReturnResult{{#1}}{#3}}%
- \else
- \def\@xs@next{\@xs@StrFindGroup@i{#1}{#2}[#3]}%
- \fi
- \@xs@next}
-\def\@xs@StrFindGroup@i#1#2[#3]{%
- \def\@xs@StrFindGroup@ii{%
- \expandafter\@xs@testempty\expandafter{\@xs@reserved@C}%
- \if@xs@empty
- \def\@xs@next{\@xs@ReturnResult{}{#3}}% s'il ne reste plus rien, on renvoie vide
- \else
- \expandafter\@xs@returnfirstsyntaxunit\expandafter{\@xs@reserved@C}\@xs@reserved@D
- \ifx\bgroup\@xs@toks% si la 1\`ere unit\'e syntaxique est un groupe explicite
- \advance\decimalpart\@ne% on augmente le compteur
- \ifnum\decimalpart=\@xs@reserved@A% on est au groupe cherch\'e lors de la profondeur courante ?
- \ifx\@empty\@xs@reserved@B% on est \`a la profondeur maximale ?
- \def\@xs@next{\expandafter\@xs@ReturnResult\expandafter{\@xs@reserved@D}{#3}}% on renvoie ce groupe
- \else% sinon
- \expandafter\def\expandafter\@xs@next\expandafter{\expandafter\@xs@StrFindGroup@i\@xs@reserved@D}% on recommence avec ce groupe
- \expandafter\@xs@addtomacro\expandafter\@xs@next\expandafter{\expandafter{\@xs@reserved@B}[#3]}% et les profondeurs de recherche restantes
- \fi
- \else
- \expandafter\@xs@removefirstsyntaxunit\expandafter{\@xs@reserved@C}\@xs@reserved@C
- \let\@xs@next\@xs@StrFindGroup@ii
- \fi
- \else
- \expandafter\@xs@removefirstsyntaxunit\expandafter{\@xs@reserved@C}\@xs@reserved@C
- \let\@xs@next\@xs@StrFindGroup@ii
- \fi
- \fi
- \@xs@next}%
- \@xs@extractgroupnumber{#2}\@xs@reserved@A\@xs@reserved@B
- \decimalpart\z@
- \ifnum\@xs@reserved@A>\z@\def\@xs@reserved@C{#1}\else\let\@xs@reserved@C\@empty\fi
- \@xs@StrFindGroup@ii}
-
-\def\@xs@extractgroupnumber#1#2#3{%
- \def\@xs@extractgroupnumber@i##1,##2\@xs@nil{\def#2{##1}\def#3{##2}}%
- \@xs@extractgroupnumber@i#1,\@xs@nil
- \ifx\@empty#3\else\@xs@extractgroupnumber@i#1\@xs@nil\fi}
-
-\def\expandingroups{\let\@xs@expandingroups\exploregroups}
-\def\noexpandingroups{\let\@xs@expandingroups\noexploregroups}
-\def\StrExpand{\@testopt{\@xs@StrExpand}{1}}
-\def\@xs@StrExpand[#1]#2#3{%
- \begingroup
- \@xs@expandingroups
- \ifnum#1>\z@
- \integerpart#1\relax
- \decimalpart\z@\def\groupID{0}\let\@xs@nestlevel\z@
- \def\@xs@atendofgroup{%
- \expandafter\endgroup
- \expandafter\@xs@addtomacro\expandafter\@xs@reserved@B\expandafter{\expandafter{\@xs@reserved@B}}%
- \@xs@read@reserved@C}%
- \def\@xs@atbegingroup{\let\@xs@reserved@B\@empty}%
- \def\@xs@atnextsyntaxunit{%
- \expandafter\expandafter\expandafter\@xs@addtomacro
- \expandafter\expandafter\expandafter\@xs@reserved@B
- \expandafter\expandafter\expandafter{\@xs@reserved@A}}%
- \def\@xs@reserved@C{#2}%
- \@xs@StrExpand@i{#1}% Appel de la macro r\'ecursive
- \else
- \def\@xs@reserved@B{#2}%
- \fi
- \global\let\@xs@reserved@B\@xs@reserved@B
- \endgroup
- \let#3\@xs@reserved@B
- \let\groupID\@empty}
-\def\@xs@StrExpand@i#1{%
- \ifnum#1>\z@
- \let\@xs@reserved@B\@empty
- \@xs@read@reserved@C
- \let\@xs@reserved@C\@xs@reserved@B
- \def\@xs@reserved@A{\expandafter\@xs@StrExpand@i\expandafter{\number\numexpr#1-1}}%
- \else
- \let\@xs@reserved@A\relax
- \fi
- \@xs@reserved@A}
-
-\def\scancs{\@testopt{\@xs@scancs}{1}}
-\def\@xs@scancs[#1]#2#3{%
- \@xs@StrExpand[#1]{#3}{#2}%
- \edef#2{\detokenize\expandafter{#2}}}
-
-% Restaure le code de @
-\catcode`\@=\CurrentAtCatcode\relax
-% D\'efinit le d\'elimiteur verb
-% d\'efinit les diff\'erents modes et les m\'emorise
-\setverbdelim{|}%
-\fullexpandarg\saveexpandmode
-\comparenormal\savecomparemode
-\noexploregroups\saveexploremode
-\expandingroups
-\endinput
-%
-% Historique
-%------------------------------------------------------------------------------
-%% v1.0 4/7/2008 : - Package achev\'e.
-% 7/7/2008 : - Package publi\'e sur CTAN.
-%------------------------------------------------------------------------------
-% v1.1 15/8/2008
-% - Le package ne n\'ecessite plus LaTeX et est d\'esormais utilisable sous
-% Plain eTeX.
-% - Ajout des macros \IfInteger et \IfDecimal.
-% Pour cette derni\`ere, la partie enti\`ere et la partie d\'ecimale sont
-% r\'ecup\'erables dans les compteurs \integerpart et \decimalpart. Ce
-% qu'il reste apr\`es qu'un caract\`ere non attendu soit rencontr\'e est
-% dispo dans \@xs@remainafterdecimal
-% - Correction d'un bug dans \tokenize :
-% suppression de l'expansion avec \normalexpandarg pour \'eviter le bug
-% avec les lettres accentu\'ees dans l'exemple : \tokenize\aa{\'e\`u}
-% - Am\'elioration du code de la plupart des macros.
-% - \'Ecriture d'une routine \@xs@newmacro d\'efinissant les macros.
-% - Suppression de tous les compteurs grace \`a \numexpr.
-% - Nouvelles fonctionnalit\'es internes dans :
-% \IfSubStr
-% ajout des chaines se trouvant avant et apr\`es l'occurrence test\'ee
-% dans les sc \@xs@behind@IfSubStr et \@xs@before@IfSubStr
-% \StrCount
-% a) ajout de ce qui se trouve apr\`es la derni\`ere occurrence dans la
-% sc \@xs@StrCount@afterlastocccur
-% b) la macro ne d\'epend plus d'aucune autre
-%------------------------------------------------------------------------------
-% v1.2 23/8/2008
-% - Am\'elioration du code de \StrMid \StrGobbleLeft, \StrLeft,
-% \StrGobbleRight et \StrRight \`a l'aide de la nouvelle macro
-% \@xs@StrSplit@i
-% - Nouveau test \IfStrEq qui compare 2 chaines
-% - Nouveau test \IfEq qui compare 2 chaines (ou 2 nombres si les 2 chaines
-% contiennent un nombre)
-% - Correction d'un bug dans \@xs@formatnumber. La macro n'envisageait pas le
-% cas o\`u son argument \'etait vide ce qui faiasait planter
-% \IfDecimal{}{V}{F} et \IfInteger{}{V}{F}
-%------------------------------------------------------------------------------
-% v1.3 21/9/2008
-% - Am\'elioration du code, mise en place de r\'ecursivit\'es terminales dans
-% toutes les macros r\'ecursives, simplification de \@xs@TestEqual en
-% utilisant \ifx
-% - Nouvelles macros \IfStrEqCase et \IfEqCase
-% Teste si une chaîne est \'egale \`a plusieurs chaînes donn\'ee et
-% ex\'ecute un code sp\'ecifique
-% - Cr\'eation de la macro publique \StrSplit
-% Coupe la chaine en 2 \`a une position donn\'ee
-% - Nouvelle macro \StrCompare
-% Compare 2 chaînes et renvoie la position du 1er caract\`ere diff\'erent.
-% Renvoie 0 si elles sont \'egales.
-%------------------------------------------------------------------------------
-% v1.3a 29/9/2008
-% - Correction d'un bug : \expandafter#1
-% dans les macros \IfSubStrBefore et \StrBetween qui buggue si #1 est un
-% nombre > 9 !
-% - R\'e \'ecriture de \@xs@returnfirstsyntaxunit et \@gobble qui
-% deviennent purement d\'eveloppables.
-% - R\'e \'ecriture de \StrLen
-% - Nouvelle macro interne \@xs@cutafteroccur
-% Coupe la chaine apr\`es la ni\`eme occurrence d'une sous chaine.
-% - Code am\'elior\'e de \StrMid, \StrLeft, \StrGobbleLeft, \StrRight,
-% \StrGobbleRight grace \`a \@xs@cutafteroccur
-%------------------------------------------------------------------------------
-% v1.4 4/11/2008
-% - xstring traite ses arguments par unit\'e syntaxique, et donc toutes les
-% macros internes ont \'et\'e r\'e-\'ecrites \`a cette fin.
-% - Le manuel a \'et\'e r\'e-\'ecrit, rendu plus clair et mieux structur\'e.
-% - Nouvelle fonctionnalit\'e : \expandarg
-% le 1er lex\`eme de chaque argument est 1-d\'evelopp\'e avant que la
-% macro ne soit appel\'ee. Si un argument comporte plus qu'1 lex\`eme,
-% il faut passer par \scancs*[1] pour 1-d\'evelopper toutes les unit\'es
-% syntaxiques.
-% - Correction de 2 erreurs dans le manuel anglais : 0 est la valeur par
-% d\'efaut dans \StrSubstitute et \StrDel
-% - Coh\'erence dans les nom des s\'equences de contr\^oles temporaires qui
-% sont d\'esormais : \@xs@reserved@A \`a \@xs@reserved@E
-%------------------------------------------------------------------------------
-% v1.4a 12/11/2008
-% - Correction d'un bug dans \@xs@StrSplit dans le cas o\`u l'argument
-% num\'erique est <1 : la 1ere coupure doit être vide et le seconde doit
-% être \'egale \`a l'argument.
-%------------------------------------------------------------------------------
-% v1.4b 16/11/2008
-% - Correction de 2 bugs dans \@xs@returnfirstsyntaxunit
-%------------------------------------------------------------------------------
-% v1.5 31/12/2008
-% - Nouvelles fonctionnalit\'es dans la recherche de groupes par un
-% identificateur caract\'erisant leur imbrication. Impl\'ementation de :
-% 1) \StrFindGroup
-% 2) \groupID
-% - Ajout des nouvelles macros g\'en\'eriques \@xs@read@reserved@C et
-% \@xs@read@reserved@D
-% - Correction d'un bug dans \StrSplit : \StrSplit{{a}bc}{1}[\truc] faisait
-% que \truc contenait «a{a}».
-% - Correction d'un bug dans \@xs@newmacro : l'argument optionnel \'etait
-% d\'etok\'enis\'e \`a tort dans les macros \'etoil\'ees.
-% - Dans \@xs@newmacro, on doit choisir le num\'ero du dernier argument devant
-% être d\'etok\'enis\'e dans le cas d'une macro \'etoil\'ee (sachant que
-% l'argument optionnel ne l'est jamais)
-%------------------------------------------------------------------------------
-% v1.5a 09/2/2009
-% - Nouvelle macro \StrExpand, sensible au mode d'exploration. La macro est
-% indépendante du mode d'exploration et dispose de ses propres commandes
-% d'exploration : \expandingroups et \noexpandingroups
-% - R\'e-\'ecriture de \scancs, qui devient triviale puisque d\'ependant de
-% \StrExpand. Il n'y a plus de version \'étoil\'ee et d\'esormais, \scancs
-% est sensible au mode d'exploration.
-% - Correction d'un bug dans \IfInteger : \IfInteger{2.0}{V}{F} affichait F
-% - Correction de bugs : mettre \let\@xs@reserved@E\relax avant d'appeler
-% \@xs@StrSplit@i
-% - Suppression des messages d'erreur, de warning et d'info. xstring devient
-% donc silencieux ;)
-% - Passage de 3 \'a 2 compteurs
-% - Le manuel est d\'esormais plus color\'e, en esp\'erant qu'il sera un peu
-% plus agr\'eable \`a lire !
-%------------------------------------------------------------------------------
-% v1.5b 13/3/2009
-% - Modification d'un grand nombre de macros de telle sorte que vraiment
-% n'importe quel code peut d\'esormais \^etre plac\'e dans les arguments des
-% macros (comme par exemple des \if, \ifx ou autre, m\^eme sans leur \fi, ce
-% qui n'\'etait pas possible jusqu'alors)
-%------------------------------------------------------------------------------
-% v1.5c 05/6/2009
-% - Correction d'un bug dans \IfBeginWith : il faut appeler
-% \@xs@returnfirstsyntaxunit pour l'argument #2 puis pour l'argument #1 et
-% non pas l'inverse pour que \@xs@toks reflète ce qui se trouve dans #1
-% - Correction d'un bug dans \@xs@returnfirstsyntaxunit au cas où #1 commence
-% par un espace : mettre \@xs@toks à 0
-% - Correction d'un bug dans \@xs@returnfirstsyntaxunit :
-% \@xs@returnfirstsyntaxunit{{}}\truc
-% faisait que \truc se développait en un espace.
-% - Correction d'un bug dans \@xs@removefirstsyntaxunit où le cas
-% \@xs@removefirstsyntaxunit{ {b}}\truc
-% donnait \truc se développant en «b» au lieu de «{b}».
-%------------------------------------------------------------------------------
-% v1.5d 28/3/2010
-% - Correction d'un bug dans \IfInteger : \@xs@afterinteger ne donnait pas le
-% bon r\'esultat. Par exemple avec 1.23 il renvoyait {} au lieu de {.23}
-% - \xs@formatnumber ne detokenize plus ses arguments (que m'est-il pass\'e
-% par la t\^ete pour que je code un truc comme ca ?), et donc
-% \@xs@afterinteger et \@xs@afterdecimal ont des tokens ayant le bon
-% catcode
\ No newline at end of file
diff --git a/utils/__init__.py b/utils/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/utils/cover.sh b/utils/cover.sh
deleted file mode 100755
index bfca9aee..00000000
--- a/utils/cover.sh
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/bin/sh
-for directory in songs/*; do
- images=`ls $directory/*.{jpg,png} 2> /dev/null`
- val=`echo $images | wc -w`
- for song in $directory/*.sg; do
- sg=`basename $song`
- sed -i '0,/\\gtab/s//\\cover\n\\gtab/' $song
- if [ $val -gt 1 ]
- then
- i=1
- for image in $images; do
- img=`basename $image .jpg`
- img=`echo $img | sed 's/.png$//'`
- echo "Apply $img to $song ? ($i/$val)"
- i=$(($i+1))
- read answer
- case "$answer" in
- "y")
- sed -i 's/beginsong{\([^}]*\)}\[\([^]]*\)\]/beginsong{\1}[\2,cov='$img']/' $song
- break;
- ;;
- "n")
- true
- ;;
- esac
- done;
- elif [ $val -eq 1 ]
- then
- img=`basename $images .jpg`
- img=`echo $img | sed 's/.png$//'`
- echo "Applying $img to $sg"
- sed -i 's/beginsong{\([^}]*\)}\[\([^]]*\)\]/beginsong{\1}[\2,cov='$img']/' $song
- fi;
- done;
-done;
diff --git a/utils/emacs-format-file.el b/utils/emacs-format-file.el
deleted file mode 100644
index b5571c46..00000000
--- a/utils/emacs-format-file.el
+++ /dev/null
@@ -1,44 +0,0 @@
-;;; File: emacs-format-file.el
-;;; Description: use this for batch indentation with emacs (see indent.sh)
-;;; Author: Romain Goffe
-;;; Date: 27/10/2010
-;;; Commentary: based on the work of Stan Warford (emacs-format-mode) and Scott Andrew Borton (indent-mode)
-
-(defun songbook-indent-line ()
- "Indent current line as SONGBOOK code."
- (interactive)
- (beginning-of-line)
- (if (bobp)
- (indent-line-to 0) ; First line is always non-indented
- (let ((not-indented t) cur-indent)
- (if (looking-at "^[ \t]*\\(\\\\end\\)") ; If the line we are looking at is the end of a block, then decrease the indentation
- (progn
- (save-excursion
- (forward-line -1)
- (setq cur-indent (- (current-indentation) 2)))
- (if (< cur-indent 0) ; We can't indent past the left margin
- (setq cur-indent 0)))
- (save-excursion
- (while not-indented ; Iterate backwards until we find an indentation hint
- (forward-line -1)
- (if (looking-at "^[ \t]*\\(\\\\end\\)") ; This hint indicates that we need to indent at the level of the END_ token
- (progn
- (setq cur-indent (current-indentation))
- (setq not-indented nil))
- (if (looking-at "^[ \t]*\\(\\\\begin\\)") ; This hint indicates that we need to indent an extra level
- (progn
- (setq cur-indent (+ (current-indentation) 2)) ; Do the actual indenting
- (setq not-indented nil))
- (if (bobp)
- (setq not-indented nil)))))))
- (if cur-indent
- (indent-line-to cur-indent)
- (indent-line-to 0))))) ; If we didn't see an indentation hint, then allow no indentation
-
-(defun emacs-format-function ()
- "Format the whole buffer."
- (set (make-local-variable 'indent-line-function) 'songbook-indent-line)
- (indent-region (point-min) (point-max) nil)
- (untabify (point-min) (point-max))
- (save-buffer)
- )
diff --git a/utils/header-english b/utils/header-english
deleted file mode 100644
index bed49cc7..00000000
--- a/utils/header-english
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-"template" : "patacrep.tmpl",
-"lang" : "english",
-"bookoptions" : [
- "diagram",
- "lilypond",
- "pictures"
- ],
-"booktype" : "chorded",
-"subtitle" : "English songs",
-"picture" : "Music_by_Katie8594",
-"title" : "Guitar Songbook",
-"songs" : [
\ No newline at end of file
diff --git a/utils/header-french b/utils/header-french
deleted file mode 100644
index 68685567..00000000
--- a/utils/header-french
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-"template" : "patacrep.tmpl",
-"lang" : "french",
-"subtitle" : "chanson francaise",
-"bookoptions" : [
- "diagram",
- "lilypond",
- "pictures"
- ],
-"songs" : [
diff --git a/utils/header-last-volume b/utils/header-last-volume
deleted file mode 100644
index 57e21525..00000000
--- a/utils/header-last-volume
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-"template" : "patacrep.tmpl",
-"lang" : "french",
-"bookoptions" : [
- "diagram",
- "lilypond",
- "pictures"
- ],
-"booktype" : "chorded",
-"picture" : "The_Music_Machine_by_hit_squad",
-"picturecopyright" : "hit-squad @ deviantart.com",
-"subtitle" : "Tome 5",
-"songs" : [
diff --git a/utils/indent.sh b/utils/indent.sh
deleted file mode 100755
index 08584721..00000000
--- a/utils/indent.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-
-#Author: Romain Goffe
-#Date: 27/10/2010
-#Descritpion: correctly indent all songs with emacs
-#Commentary: can't manage to use a relative path to emacs-format-file.el
-# so be sure to indicate the right path
-
-for song in songs/*/*.sg ; do
- emacs -batch $song -l ~/songbook/utils/emacs-format-file.el -f emacs-format-function ;
-done;
diff --git a/utils/langbooks.sh b/utils/langbooks.sh
deleted file mode 100755
index 4d90e93c..00000000
--- a/utils/langbooks.sh
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/bin/sh
-
-#Author: Romain Goffe
-#Date: 14/11/2010
-#Description: Generate an sb file containing all the songs in a given language
-
-if [ $# -ne 1 ];
-then
- echo "Usage: $0 LANG"
- exit 1
-fi;
-
-GREP="$GREP_OPTIONS"
-export GREP_OPTIONS=""
-
-LANG=$1
-BOOKS_DIR="books/"
-
-if [ $LANG="english" -o $LANG="french" ];
-then
- cp "./utils/header-$LANG" "$BOOKS_DIR$LANG.sb"
- grep "selectlanguage{$LANG}" songs/*/*.sg | sed 's|songs/\(.*\):.*| \"\1\",|; $ s|,$|\n ]\n}\n|' >> "$BOOKS_DIR$LANG.sb"
-else
- echo "Error: $LANG is not a supported language"
- exit 2
-fi;
-
-export GREP_OPTIONS="$GREP"
diff --git a/utils/language.sh b/utils/language.sh
deleted file mode 100755
index d512fb88..00000000
--- a/utils/language.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/sh
-echo "Choose langage: 1 (english), 2 (french), 3 (spanish)"
-for song in songs/*/*.sg; do
- echo "Apply language to $song ?"
- read answer
- case "$answer" in
- 1)
- sed -i '1i\\\\selectlanguage{english}' $song
- ;;
- 2)
- sed -i '1i\\\\selectlanguage{french}' $song
- ;;
- 3)
- sed -i '1i\\\\selectlanguage{spanish}' $song
- ;;
- esac
-done;
diff --git a/utils/last-volume.sh b/utils/last-volume.sh
deleted file mode 100755
index b123e6e5..00000000
--- a/utils/last-volume.sh
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/bin/sh
-#Author: Romain Goffe
-#Date: 07/05/2011
-#Description: Generate an sb file containing all the songs that are not
-# already in previous volumes
-
-GREP="$GREP_OPTIONS"
-export GREP_OPTIONS=""
-
-BOOKS_DIR="books"
-
-#all songs
-cd songs
-ls -1 */*.sg > ../res1
-cd ..
-
-for i in 1 2 3 4
-do
- #get volume i list
- tail -n +14 "$BOOKS_DIR/volume-$i.sb" > tmp$i
- head -n -2 tmp$i > list$i
- sed -i -e "s/\",//g" -e "s/ \"//g" -e "s/\"//g" list$i
-
- #remove volume i songs
- grep -vf list$i res$i > res$(($i+1))
-done
-
-#format song list
-sed -i -e "s/^/ \"/g" -e "s/$/\",/g" res$(($i+1))
-head -c -2 res$(($i+1)) > res
-
-
-#make volume i+1 sb file
-cat utils/header-last-volume > "$BOOKS_DIR/volume-$(($i+1)).sb"
-cat res >> "$BOOKS_DIR/volume-$(($i+1)).sb"
-echo "]" >> "$BOOKS_DIR/volume-$(($i+1)).sb"
-echo "}" >> "$BOOKS_DIR/volume-$(($i+1)).sb"
-
-#remove tmp files
-for i in 1 2 3 4
-do
- rm -f res$i list$i tmp$i
-done
-rm -f res res$(($i+1))
-
-export GREP_OPTIONS="$GREP"
diff --git a/utils/make-html b/utils/make-html
deleted file mode 100755
index f21775d4..00000000
--- a/utils/make-html
+++ /dev/null
@@ -1,119 +0,0 @@
-#!/usr/bin/perl -w
-#
-# Generate html index for the Crep's chorbook.
-#
-# Usage: make-html [options] source
-# source should be an .sg or .sbd file
-#
-
-use warnings;
-use strict;
-use utf8;
-
-sub uppercase($)
-{
- my $letter = shift;
- $letter =~ tr/a-zà éèëê/A-ZAEEEE/;
- return $letter;
-}
-
-# Create the latex-proof function
-sub latex2utf8($)
-{
- my $result = shift;
-
- $result =~ s/\\'e/é/g;
- $result =~ s/\\¨e/ë/g;
- $result =~ s/\\`e/è/g;
- $result =~ s/\\\^e/ê/g;
- $result =~ s/\\\^o/ô/g;
- $result =~ s/\\\^a/â/g;
- $result =~ s/\\\^i/î/g;
- $result =~ s/\\`a/Ã /g;
- $result =~ s/\\`u/ù/g;
- $result =~ s/\\&/&/g;
- $result =~ s/\\oe\s*{}/oe/g;
-
- return ($result);
-}
-#'
-
-sub usage ()
-{
- die "usage: make-html [options] source", "\n";
-}
-
-sub defaultoptions()
-{
- return (
- titleprefix => "",
- );
-}
-
-my %options;
-sub getoptions ()
-{
- %options = defaultoptions();
- eval q{use Getopt::Long};
- Getopt::Long::Configure('pass_through');
- GetOptions(
-# "verbose|v!" => \$options{verbose},
- "titleprefix|p=s" => \$options{titleprefix},
- ) || usage();
-}
-
-getoptions();
-
-my $prefix = '(('.$options{titleprefix}.')[\s\'])';
-
-# Filter function
-sub process_titleprefix($)
-{
- my $string = shift;
- if( $string =~ /^$prefix\W*(\w)/ )
- {
- my $letter = uppercase $3;
- $string =~ s/^$prefix\W*\w(.*)/$letter$3, $1/;
- }
- return $string;
-}
-
-# Process command line
-usage() unless @ARGV;
-my $file = shift;
-
-# Open file and store date before closing the file
-open( FILE, $file ) or die("unable to open $file");
-
-# Process data
-my %table;
-my $author;
-my $title;
-
-while( )
-{
- if( $_ =~ /\\beginsong{(.*)}\[.*by=(.*),.*\]/ )
- {
- $author = latex2utf8 $2;
- $title = latex2utf8 $1;
- $title = process_titleprefix $title unless $options{titleprefix} eq "";
- # Create empty data index if needed
- $table{$author} = [] unless exists $table{$author};
- push @{$table{$author}}, $title;
- }
-}
-
-close( FILE );
-
-# Format output
-print '';
-foreach my $author ( sort keys %table )
-{
- print '- ', $author, '
';
- foreach my $title ( sort @{$table{$author}} )
- {
- print '- ',$title,'
'
- }
- print '
';
-}
-print '
';
diff --git a/utils/new-songs-list.sh b/utils/new-songs-list.sh
deleted file mode 100755
index 8adb6696..00000000
--- a/utils/new-songs-list.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/sh
-#
-# Helper script to get the list of new songs added since the last version
-# The output is supposed to be copy/pasted into the NEWS item.
-
-GREP="$GREP_OPTIONS"
-export GREP_OPTIONS=""
-
-if [ $# -eq 1 ]
-then
- VERSION=$1
-else
- # Get current version
- VERSION=`git tag | grep patacrep | tail -n1`
-fi
-
-# Make new songs list by authors
-git shortlog $VERSION..master | egrep '^([^ ].*|.*[aA]dd song.*)' | sed 's/[aA]dd song.//' | sed 's/\.$//' | sed 's/ (.*)//' | sed 's/\s\s\s*/ /'
-
-export GREP_OPTIONS="$GREP"
diff --git a/utils/perms.sh b/utils/perms.sh
deleted file mode 100755
index 9d5d6e24..00000000
--- a/utils/perms.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-
-#Author: Romain Goffe
-#Date: 07/03/2012
-#Description: Check directories and files permissions
-
-chmod 755 songs/*
-chmod 644 songs/*/*.*
-chmod 644 lilypond/*.ly
-
-exit 0
\ No newline at end of file
diff --git a/utils/release.sh b/utils/release.sh
deleted file mode 100755
index a7cfe312..00000000
--- a/utils/release.sh
+++ /dev/null
@@ -1,84 +0,0 @@
-#!/bin/sh
-
-#Author: Romain Goffe
-#Date: 13/10/2011
-#Description: Build all the pdf on www.patacrep.com, increase their
-#version and commit/tag the result
-
-GREP="$GREP_OPTIONS"
-export GREP_OPTIONS=""
-
-#last volume
-./utils/last-volume.sh
-#english.sb
-./utils/langbooks.sh english
-#french.sb
-./utils/langbooks.sh french
-
-#increase version
-RELEASE_TYPE=$1
-VERSION=`grep "\"version\"" ./templates/patacrep.tmpl | sed -e 's/.*\"\([0-9]\+\)\.\([0-9]\+\)\.\?\([0-9]\+\)\?.*/export MAIN=\1\nexport MAJOR=\2\nexport MINOR=\3\n/'`
-$VERSION
-
-if [ $# -eq 1 ]
-then
- echo "current version : $MAIN.$MAJOR.$MINOR"
- if [ $RELEASE_TYPE = "major" ];
- then
- MAJOR=$(($MAJOR+1))
- MINOR=0
- elif [ $RELEASE_TYPE = "minor" ];
- then
- MINOR=$(($MINOR+1))
- else
- echo "error: unrecognised release type"
- fi;
- echo "new version : $MAIN.$MAJOR.$MINOR"
- #update version field in tmpl files
- sed -i "s/\"[0-9]\+.[0-9]\+.[0-9]\+\"/\"$MAIN.$MAJOR.$MINOR\"/" templates/patacrep.tmpl
- sed -i "s/\"[0-9]\+.[0-9]\+.[0-9]\+\"/\"$MAIN.$MAJOR.$MINOR\"/" templates/ancient.tmpl
-else
- echo "keeping release version"
-fi;
-
-
-#apply verification tools
-#echo "emacs batch indentation in progress ..."
-#./utils/indent.sh 2> /dev/null
-#echo "emacs batch indentation done !"
-./utils/rules.py
-./utils/resize-cover.py
-./utils/perms.sh
-
-#build all songbooks
-rm -f *.d
-make archive
-make naheulbeuk.pdf
-make volume-1.pdf
-make volume-2.pdf
-make volume-3.pdf
-make volume-4.pdf
-make volume-5.pdf
-make english.pdf
-make french.pdf
-make songbook_fr.pdf
-make songbook_en.pdf
-make lyricbook_fr.pdf
-make lyricbook_en.pdf
-make clean
-
-git status
-
-if [ $# -eq 1 ]
-then
- ./utils/new-songs-list.sh | cat - NEWS > /tmp/out && mv -f /tmp/out NEWS
- echo "\nversion $MAIN.$MAJOR.$MINOR\n" | cat - NEWS > /tmp/out && mv -f /tmp/out NEWS
- git add templates/*.tmpl
- git add books/naheulbeuk.sb books/volume*.sb NEWS
- git commit -m "patacrep release version $MAIN.$MAJOR.$MINOR"
- git tag "patacrep_$MAIN.$MAJOR.$MINOR"
-fi
-
-notify-send "Patacrep!" "Release $MAIN.$MAJOR.$MINOR generated" --icon=songbook-client
-
-export GREP_OPTIONS="$GREP"
diff --git a/utils/resize-cover.py b/utils/resize-cover.py
deleted file mode 100755
index 21964487..00000000
--- a/utils/resize-cover.py
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-#Author: Romain Goffe
-#Date: 28/12/2011
-#Description: Resize all covers to 128,128 thumbnails
-
-import Image
-
-from utils.utils import recursiveFind
-
-# Process song files
-covers = recursiveFind(os.path.join(library, 'songs'), '*.jpg')
-for filename in covers:
-
- source = Image.open(filename)
-
- src_width = source.size[0]
- src_height = source.size[1]
- ratio = float(src_height) / float(src_width)
-
- width = 128
- height = 128
- error = 0.2 #0: always preserve ratio; 1: always square images
-
- #tolerate almost square images
- if ratio < 1 - error or ratio > 1 + error:
- #print "preserve ratio = ", ratio
- #preserve important ratio
- if src_width < src_height:
- height = int(width * ratio)
- elif src_height < src_width:
- width = int(height * ratio)
-
- if src_width > width and src_height > height:
- print "resize: ", filename, " from ", source.size, " to ", (width, height)
- target = source.resize((width, height), Image.ANTIALIAS)
- target.save(filename)
diff --git a/utils/rules.py b/utils/rules.py
deleted file mode 100755
index 52b6e0b3..00000000
--- a/utils/rules.py
+++ /dev/null
@@ -1,274 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-import glob
-import getopt, sys
-import re
-import logging
-import locale
-re.LOCALE
-
-from utils.utils import recursiveFind
-
-# the dictionary has target_word:replacement_word pairs
-word_dic = {
-##: oe inclusion
-"coeur": "cœur",
-"choeur": "chœur",
-"boeuf": "bœuf",
-"oeuvre": "Å“uvre",
-"soeur": "sœur",
-"noeud": "nœud",
-"oeil": "Å“il",
-"voeu": "vœu",
-"oeuf": "Å“uf",
-"oe{}": "Å“",
-"\\Å“": "Å“",
-##: Contractions
-"ptit": "p'tit",
-"Y a": "Y'a",
-"ptê": "p't'ê",
-"p'tê": "p't'ê",
-"p't-ê": "p't'ê",
-##: Punctuation
-"’": "'",
-"‘": "'",
-"´": "'",
-"Ca ": "Ça ",
-"...": "{\\dots}",
-"…": "{\\dots}",
-"say: ``":"say, ``",
-"says: ``":"says, ``",
-"said: ``":"said, ``",
-#replace tabs with two spaces
-" ": " ",
-##: Typo
-"New-York": "New York",
-" i ": " I ",
-"avant hier": "avant-hier",
-##: Conversion to anglo-saxon chords
-"Lam ": "Am ",
-"La7": "A7",
-"Lasus2": "Asus2",
-"Sim ": "Bm ",
-"Sim}": "Bm}",
-"Sim]": "Bm]",
-"Si7": "B7",
-"Dom ": "Cm ",
-"Do7": "C7",
-"Do9": "C9",
-"Ré ": "D ",
-"Rém ": "Dm ",
-"Rém]": "Dm]",
-"Ré7": "D7",
-"Ré#": "D#",
-"Mim ": "Em ",
-"Mim]": "Em]",
-"Mim7": "Em7",
-"Mim}": "Em}",
-"Mi7": "E7",
-"Mi7sus4": "E7sus4",
-"Fa ": "F ",
-"Fa}": "F}",
-"[Fa\\": "[F\\",
-"Fam ": "Fm ",
-"Fa7": "F7",
-"Sol ": "G ",
-"Sol]": "G]",
-"Solm ": "Gm ",
-"Solm]": "Gm]",
-"Sol7": "G7",
-"/La": "/A",
-"/Si": "/B",
-"/Do": "/C",
-"/Ré": "/D",
-"/Mi": "/E",
-"/Fa": "/F",
-"/Sol": "/G",
-"tab{La": "tab{A",
-"tab{Si": "tab{B",
-"tab{Do": "tab{C",
-"tab{Ré": "tab{D",
-"tab{Mi": "tab{E",
-"tab{Fa": "tab{F",
-"tab{Sol": "tab{G",
-"\\[La": "\\[A",
-"\\[Si": "\\[B",
-"\\[Do": "\\[C",
-"\\[Ré": "\\[D",
-"\\[Mi": "\\[E",
-"\\[Fa": "\\[F",
-"\\[Sol": "\\[G",
-"\\[Re": "\\[D",
-"b]": "&]",
-"b7]": "&7]",
-#C
-"032010": "X32010",
-#A
-"002220": "X02220",
-"002020": "X02020",
-"002210": "X02210",
-#D
-"000232": "XX0232",
-"X00232": "XX0232",
-"000212": "XX0212",
-"000231": "XX0231",
-"X00231": "XX0231",
-#B
-"021202": "X21202",
-## LaTeX
-"beginchorus": "begin{chorus}",
-"endchorus": "end{chorus}",
-"beginverse*": "begin{verse*}",
-"beginverse": "begin{verse}",
-"endverse": "end{verse}",
-"}[by=": "}\n [by=",
-### end of rules
-}
-
-
-def usage():
- print '''
-Usage: rules.py [OPTION]
-
-OPTIONS
- -h, --help
- display this help and exit
-
- -f, --files=FILES
- apply the set of rules on FILES
- default is songs/*/*.sg
-
- -l, --log=LEVEL
- set the logging level to LEVEL
- outputs logging information to rules.log
- possible LEVEL values are : debug, info, warning, error and critical
-'''
-
-def replace_words(string):
- '''
- Search the data string for words defined in the dictionary and
- replace them. This method avoids usual spelling and typos mistakes
- when writing a song.
- '''
- logging.info("replace_words: search and replace words from dictionary into song data")
- for search, replace in word_dic.items():
- string = string.replace(search, replace)
- return string
-
-#language based typographical rules
-def language_rules(string):
- '''
- Search the data string for common typographical mistakes.
- Implemented rules depend on the current song language that is
- defined by babel for every .sg file through the macro
- \selectlanguage{}
- '''
- logging.info("language_rules: looking for common typographical mistakes")
- if (re.compile("selectlanguage{french}").search(string)):
- logging.info(" song language is set to : french")
- #ensure non-breaking spaces before symbols ? ! ; :
- string = re.sub("(?P\S)(?P[!?;:])","\g \g", string)
- #... except for gtabs macros with capos
- string = re.sub("(?Ptab.?{.*)\s:","\g:", string)
- #... and for urls
- string = re.sub("http\s:","http:", string)
- #and apply a second time for cases like \gtab{Gm}{10:X02210:}
- string = re.sub("(?Ptab.?{.*)\s:","\g:", string)
- #ensure no spaces after symbols (
- string = re.sub("(?P[\(])\s(?P\S)","\g\g", string)
- #convert inverted commas
- string = re.sub("``","{\\og}", string)
- string = re.sub("''","{\\\\fg}", string)
- elif (re.compile("selectlanguage{english}").search(string)):
- logging.info(" song language is set to : english")
- #ensure no spaces before symbols ? ! ; : )
- string = re.sub("(?P\S)\s(?P[!?;:\)])","\g\g", string)
- #ensure no spaces after symbols (
- string = re.sub("(?P[\(])\s(?P\S)","\g\g", string)
- elif (re.compile("selectlanguage{spanish}").search(string)):
- logging.info(" song language is set to : spanish")
- #ensure no spaces before symbols ? ! ; : )
- string = re.sub("(?P\S)\s(?P[!?;:\)])","\g\g", string)
- #ensure no spaces after symbols ¿ ¡ (
- string = re.sub("(?P[¿¡\(])\s(?P\S)","\g\g", string)
- elif (re.compile("selectlanguage{portuguese}").search(string)):
- logging.info(" song language is set to : portuguese")
- #convert inverted commas
- string = re.sub("``","{\\og}", string)
- string = re.sub("''","{\\\\fg}", string)
- else :
- print "Warning: language is not defined for song : " + filename
- return string
-
-def process_lines(lines):
- '''
- Removes trailing punctuation and multi-spaces from lines. Note
- that it preserves whitespaces at the beginning of lines that
- correspond to indentation.
- '''
- logging.info("process_lines: handling song data line by line")
- star = False
- for index, line in enumerate(lines):
- if re.compile("begin{verse\*}").search(line):
- star = True
-
- if re.compile("end{verse\*}").search(line):
- star = False
-
- if star == True and re.compile("end{verse}").search(line):
- line = line.replace("verse", "verse*")
- star = False
-
- #remove trailing spaces and punctuation
- line = line.rstrip().rstrip(',.;').rstrip()
- #remove multi-spaces within lines
- line = re.sub("(?P\S)\s{2,}","\g ", line)
- lines[index] = line
- return lines
-
-
-def main():
- locale.setlocale(locale.LC_ALL, '')
- try:
- opts, args = getopt.getopt(sys.argv[1:],
- "hf:l:",
- ["help", "files=", "log="])
- except getopt.GetoptError:
- usage()
- sys.exit(2)
-
- songfiles = recursiveFind(os.path.join(library, 'songs'), '*.sg')
- loglevel = "warning"
-
- for option, arg in opts:
- if option in ("-h", "--help"):
- usage()
- sys.exit()
- elif option in ("-f", "--files"):
- songfiles = glob.glob(arg)
- elif option in ("-l", "--log"):
- loglevel = arg
- numeric_level = getattr(logging, loglevel.upper(), None)
- if not isinstance(numeric_level, int):
- raise ValueError('Invalid log level: %s' % loglevel)
- logging.basicConfig(level=numeric_level, filename='rules.log', filemode='w')
- else:
- assert False, "unhandled option"
-
- for filename in songfiles:
- with open(filename, 'r+') as songfile:
- logging.info("checking file: "+filename)
- data = songfile.read()
- #no dots for acronyms
- #data = re.sub("(?P[A-Z])\.","\g", data)
- data = replace_words(data)
- data = language_rules(data)
- lines = process_lines(data.split('\n'))
- data = "\n".join(lines)
- songfile.seek(0)
- songfile.write(data)
- songfile.truncate()
-
-if __name__ == '__main__':
- main()
diff --git a/utils/songbook-gtab.py b/utils/songbook-gtab.py
deleted file mode 100755
index c957a8ca..00000000
--- a/utils/songbook-gtab.py
+++ /dev/null
@@ -1,85 +0,0 @@
-#!/usr/bin/python
-#
-
-import sys
-import re
-from optparse import OptionParser
-from utils.utils import recursiveFind
-
-from utils.utils import recursiveFind
-
-# Pattern set to ignore latex command in title prefix
-gtabPattern = re.compile(r"\\gtab\{(.*)\}\{(.*)\}");
-
-def main():
- usage = "usage: %prog [options]"
- parser = OptionParser(usage)
- parser.add_option("-o", "--output", dest="filename",
- help="write result into FILE", metavar="FILE")
- (options, args) = parser.parse_args()
-
- # Options processing
- if options.filename:
- output = open(options.filename,"w")
- else:
- output = sys.stdout
-
- # Actual processing
- chords = dict()
- positions = dict()
-
- songfiles = recursiveFind(os.path.join(library, 'songs'), '*.sg')
-
- for file in songfiles:
- for line in open(file):
- result = gtabPattern.match(line)
- if result:
- (chord,position) = result.groups()
- if not chords.has_key(chord):
- chords[chord] = set()
- chords[chord].add(position)
- if not positions.has_key(position):
- positions[position] = set()
- positions[position].add(chord)
-
- document = [
- '\\documentclass{article}',
- '\\usepackage[chorded]{songs}',
- '\\usepackage[utf8]{inputenc}',
- '\\title{Accords}',
- '\\author{Romain Goffe \\and Alexandre Dupas}',
- '\\date{}',
- '\\begin{document}',
- '\\maketitle',
- '\\begin{songs}{}',
- ]
-
- document.append('\\section{Chords names}')
-
- chordskeys = chords.keys()
- chordskeys.sort()
-
- for k in chordskeys:
- document.append('\\subsection{'+k.replace('#','\\#').replace('&','\\&')+'}')
- for p in chords[k]:
- document.append('\\gtab{'+k+'}{'+p+'}')
-
- document.append('\\section{Chords names}')
-
- positionskeys = positions.keys()
- positionskeys.sort()
-
- for k in positionskeys:
- document.append('\\subsection{'+k+'}')
- for p in positions[k]:
- document.append('\\gtab{'+p+'}{'+k+'}')
-
- document.extend([
- '\\end{songs}',
- '\\end{document}',
- ])
-
- output.write('\n'.join(document))
-
-if __name__ == '__main__':
- main()
diff --git a/utils/utils.py b/utils/utils.py
deleted file mode 100644
index 576c66b2..00000000
--- a/utils/utils.py
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-#
-
-import fnmatch
-import os
-
-def recursiveFind(root_directory, pattern):
- matches = []
- for root, dirnames, filenames in os.walk(root_directory):
- for filename in fnmatch.filter(filenames, pattern):
- matches.append(os.path.join(root, filename))
- return matches
diff --git a/windows/clean.bat b/windows/clean.bat
deleted file mode 100644
index e39bf996..00000000
--- a/windows/clean.bat
+++ /dev/null
@@ -1,4 +0,0 @@
-Rem manually performs "make clean"
-FOR %%A IN (*.aux *.d *.toc *.out *.log *.nav *.snm *.sbx *.sxd) DO DEL %%A
-Rem remove temporary covers
-FOR %%A IN (cache\songbook\*.jpg) DO DEL %%A
diff --git a/windows/cleanall.bat b/windows/cleanall.bat
deleted file mode 100644
index 02df9ca2..00000000
--- a/windows/cleanall.bat
+++ /dev/null
@@ -1,4 +0,0 @@
-Rem remove pdf files
-FOR %%A IN (*.pdf) DO DEL %%A
-Rem manually performs "make cleanall"
-windows\\clean.bat
diff --git a/windows/make.bat b/windows/make.bat
deleted file mode 100644
index 1f4325a7..00000000
--- a/windows/make.bat
+++ /dev/null
@@ -1,12 +0,0 @@
-Rem build tex file from songbook file
-python songbook.py --songbook=books\%1.sb --output=%1.tex
-
-Rem 1st pdf compilation
-pdflatex %1.tex
-
-Rem build indexes
-python songbook-makeindex.py %1_title.sxd > %1_title.sbx
-python songbook-makeindex.py %1_auth.sxd > %1_auth.sbx
-
-Rem 2nd compilation to include indexes
-pdflatex %1.tex