-
Notifications
You must be signed in to change notification settings - Fork 5
/
biblio.py
85 lines (68 loc) · 2.62 KB
/
biblio.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import yaml
import re
class alternate( str ):
'Alterna por los elementos.'
def __init__( self, cadena ):
self.lista = cadena.split( '<!-- alternate -->' )
self.n = 0
def __repr__( self ):
'Override'
value = self.lista[self.n]
self.n = (self.n + 1) % len(self.lista)
return value
def format( self, *params, **keywords ):
'Override'
value = self.lista[self.n]
self.n = (self.n + 1) % len(self.lista)
return value.format( *params, **keywords )
def carga_plantilla( template ):
'Lee y separa el archivo plantilla, regresa tres partes'
nombre_archivo = template
# abrir template correspondiente
template = open("templates/" + template + '.tpl', 'r').read()
# separar en partes
inicio, template, final = re.split( '<!-- -->|\n% section\n', template )
# escapar { y } propios de .tex
if 'tex' in nombre_archivo:
template = template.replace( '{', '{{' )
template = template.replace( '}', '}}' )
template = template.replace( '((', '{' )
template = template.replace( '))', '}' )
# manejar valores cambiantes, si los hay
template = alternate( template )
return inicio, template, final
def traducir_contenido( nombre_archivo, obra ):
'Convierte caracteres si hace falta según el formato.'
# Convertir & para TeX
if '.tex' in nombre_archivo:
for key, item in obra.items():
if type(item) is str:
obra[key] = obra[key].replace( '&', 'and' )
# Convertir & para XML
if '.xml' in nombre_archivo:
for key, item in obra.items():
if type(item) is str:
obra[key] = obra[key].replace( '&', '&' )
# abrir base de datos (yaml)
f = open('biblio.yaml')
# importarla a un objeto
obras = yaml.load(f)
# generar archivos según el tipo de template
def genera(llave, nombre_archivo, template):
# abrir archivo a escribir
salida = open(nombre_archivo, 'w')
# indicar una llave para ordenar
obras.sort(key = lambda elemento: elemento[llave])
# cargar plantilla
inicio, template, final = carga_plantilla( template )
print( inicio, file = salida)
for obra in obras:
traducir_contenido( nombre_archivo, obra )
print(template.format( **obra ), file = salida)
print( final, file = salida)
genera('Autor', 'autor.html', 'tabla-xhtml')
genera('Autor', 'autor.xml', 'archivo-xml')
genera('Autor', 'tabla.html', 'tabla-unica-xhtml')
genera('Autor', 'tabla2.html', 'tabla-unica-tres-xhtml')
genera('Autor', 'tabla.tex', 'archivo-tex')
genera('Autor', 'tablas.tex', 'archivo-tablas-tex')