Browse Source

Analyse syntaxique de \beginsong

- Correction de problèmes dans l'analyse du titre
- Analyse des arguments
remotes/origin/next
Louis 12 years ago
parent
commit
c852447716
  1. 25
      songbook.py
  2. 5
      utils/plastex.py
  3. 23
      utils/songs.py

25
songbook.py

@ -14,19 +14,15 @@ import platform
from utils import recursiveFind from utils import recursiveFind
from utils.plastex import parsetex from utils.plastex import parsetex
reArtist = re.compile('(?<=by=)(.(?<![,\\]\\}]))+')
reAlbum = re.compile('(?<=album=)(.(?<![,\\]\\}]))+')
class Song: class Song:
def __init__(self, titles, artist, album, path, languages): def __init__(self, path, languages, titles, args):
self.titles = titles self.titles = titles
self.artist = artist self.args = args
self.album = album
self.path = path self.path = path
self.languages = languages self.languages = languages
def __repr__(self): def __repr__(self):
return repr((self.titles, self.artist, self.album, self.path)) return repr((self.titles, self.args, self.path))
if platform.system() == "Linux": if platform.system() == "Linux":
from xdg.BaseDirectory import * from xdg.BaseDirectory import *
@ -79,19 +75,10 @@ class SongsList:
album, etc.). album, etc.).
""" """
path = os.path.join(self._library, 'songs', filename) path = os.path.join(self._library, 'songs', filename)
with open(path, 'r+') as f:
data = f.read()
artist = reArtist.search(data.replace("{","")).group(0)
match = reAlbum.search(data.replace("{",""))
if match:
album = match.group(0)
else:
album = ''
# Exécution de PlasTeX # Exécution de PlasTeX
data = parsetex(path) data = parsetex(path)
self.songs.append(Song(artist = artist, album = album, path = path, **data)) self.songs.append(Song(path, data['languages'], data['titles'], data['args']))
def append_list(self, filelist): def append_list(self, filelist):
"""Ajoute une liste de chansons à la liste """Ajoute une liste de chansons à la liste
@ -108,8 +95,8 @@ class SongsList:
configurer l'ordre de ce tri. configurer l'ordre de ce tri.
""" """
self.songs = sorted(self.songs, key=lambda x: locale.strxfrm(unprefixed(x.titles[0], self._prefixes))) self.songs = sorted(self.songs, key=lambda x: locale.strxfrm(unprefixed(x.titles[0], self._prefixes)))
self.songs = sorted(self.songs, key=lambda x: locale.strxfrm(x.album)) self.songs = sorted(self.songs, key=lambda x: locale.strxfrm(x.args.get("album", "")))
self.songs = sorted(self.songs, key=lambda x: locale.strxfrm(x.artist)) self.songs = sorted(self.songs, key=lambda x: locale.strxfrm(x.args.get("by", "")))
def latex(self): def latex(self):
"""Renvoie le code LaTeX nécessaire pour intégrer la liste de chansons. """Renvoie le code LaTeX nécessaire pour intégrer la liste de chansons.

5
utils/plastex.py

@ -33,7 +33,9 @@ def parsetex(filename):
Renvoie un dictionnaire contenant les métadonnées lues dans le fichier. Les Renvoie un dictionnaire contenant les métadonnées lues dans le fichier. Les
clefs sont : clefs sont :
- languages: l'ensemble des langages utilisés (recherche des - languages: l'ensemble des langages utilisés (recherche des
\selectlanguages{}). \selectlanguages{}) ;
- titles: la liste des titres ;
- args: le dictionnaire des paramètres passés à \\beginsong.
""" """
# Analyse syntaxique # Analyse syntaxique
doc = SongParser.parse(filename) doc = SongParser.parse(filename)
@ -47,5 +49,6 @@ def parsetex(filename):
data["languages"].add(node.attributes['lang']) data["languages"].add(node.attributes['lang'])
if node.nodeName == "beginsong": if node.nodeName == "beginsong":
data["titles"] = node.attributes["titles"] data["titles"] = node.attributes["titles"]
data["args"] = node.attributes["args"]
return data return data

23
utils/songs.py

@ -3,6 +3,19 @@
import plasTeX import plasTeX
def split_linebreak(texlist):
return_list = []
current = []
for token in texlist:
if token.nodeName == '\\':
return_list.append(current)
current = []
else:
current.append(token.textContent.encode('utf-8'))
if current:
return_list.append(current)
return return_list
class beginsong(plasTeX.Command): class beginsong(plasTeX.Command):
args = '{titles}[ args:dict ]' args = '{titles}[ args:dict ]'
def invoke(self, tex): def invoke(self, tex):
@ -10,10 +23,12 @@ class beginsong(plasTeX.Command):
# Parsing title # Parsing title
titles = [] titles = []
for token in self.attributes['titles'].allChildNodes: for tokens in split_linebreak(self.attributes['titles'].allChildNodes):
if token.nodeName != '\\': titles.append("".join(tokens))
titles.append(token.source.encode('utf-8'))
self.attributes['titles'] = titles self.attributes['titles'] = titles
# Parsing keyval arguments # Parsing keyval arguments
pass args = {}
for (key, val) in self.attributes['args'].iteritems():
args[key] = val.textContent.encode('utf-8')
self.attributes['args'] = args

Loading…
Cancel
Save