mirror of https://github.com/patacrep/patacrep.git
Romain Goffe
12 years ago
8 changed files with 260 additions and 33 deletions
@ -0,0 +1,51 @@ |
|||||
|
#!/usr/bin/env python |
||||
|
# -*- coding: utf-8 -*- |
||||
|
|
||||
|
"""Patch pour le paquet Babel de PlasTeX |
||||
|
|
||||
|
Un bug dans PlasTeX intervient lorsqu'on essaye d'analyser une commande LaTeX |
||||
|
\selectlanguage{}, que nouv 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 1.3 du fichier babel.py : |
||||
|
http://plastex.cvs.sourceforge.net/viewvc/plastex/plastex/plasTeX/Packages/babel.py?view=log |
||||
|
|
||||
|
# 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 <spalax(at)gresille.org> |
||||
|
|
||||
|
""" |
||||
|
|
||||
|
from plasTeX import Command |
||||
|
|
||||
|
class selectlanguage(Command): |
||||
|
args = 'lang:str' |
||||
|
|
||||
|
def invoke(self, tex): |
||||
|
res = Command.invoke(self, tex) |
||||
|
self.ownerDocument.context.loadLanguage(self.attributes['lang'], self.ownerDocument) |
||||
|
return res |
@ -0,0 +1,54 @@ |
|||||
|
#!/usr/bin/env python |
||||
|
# -*- coding: utf-8 -*- |
||||
|
|
||||
|
from plasTeX.TeX import TeX |
||||
|
import codecs |
||||
|
import copy |
||||
|
import os |
||||
|
import sys |
||||
|
|
||||
|
class SongParser: |
||||
|
"""Analyseur syntaxique de fichiers .sg""" |
||||
|
|
||||
|
@staticmethod |
||||
|
def _create_TeX(): |
||||
|
tex = TeX() |
||||
|
tex.disableLogging() |
||||
|
tex.ownerDocument.context.loadBaseMacros() |
||||
|
sys.path.append(os.path.dirname(__file__)) |
||||
|
tex.ownerDocument.context.loadPackage(tex, "patchedbabel") |
||||
|
tex.ownerDocument.context.loadPackage(tex, "songs") |
||||
|
sys.path.pop() |
||||
|
return tex |
||||
|
|
||||
|
@classmethod |
||||
|
def parse(cls, filename): |
||||
|
tex = cls._create_TeX() |
||||
|
tex.input(codecs.open(filename, 'r+', 'utf-8', 'replace')) |
||||
|
return tex.parse() |
||||
|
|
||||
|
def parsetex(filename): |
||||
|
"""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. |
||||
|
""" |
||||
|
# Analyse syntaxique |
||||
|
doc = SongParser.parse(filename) |
||||
|
|
||||
|
# 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 |
@ -0,0 +1,34 @@ |
|||||
|
#!/usr/bin/env python |
||||
|
# -*- coding: utf-8 -*- |
||||
|
|
||||
|
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): |
||||
|
args = '{titles}[ args:dict ]' |
||||
|
def invoke(self, tex): |
||||
|
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(): |
||||
|
args[key] = val.textContent.encode('utf-8') |
||||
|
self.attributes['args'] = args |
Loading…
Reference in new issue