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