mirror of https://github.com/patacrep/patacrep.git
Louis
12 years ago
1 changed files with 0 additions and 145 deletions
@ -1,145 +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 re |
|||
import locale |
|||
import warnings |
|||
|
|||
# Pattern set to ignore latex command in title prefix |
|||
keywordPattern = re.compile(r"^%(\w+)\s?(.*)$") |
|||
firstLetterPattern = re.compile(r"^(?:\{?\\\w+\}?)*[^\w]*(\w)") |
|||
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')) |
|||
|
|||
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 |
|||
|
|||
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=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 |
Loading…
Reference in new issue