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
|
import codecs
import os
import re
import textwrap
class Templates(object):
def __init__(self, dirs=["debian/templates"]):
self.dirs = dirs
self._cache = {}
def __getitem__(self, key):
ret = self.get(key)
if ret is not None:
return ret
raise KeyError(key)
def _read(self, name):
prefix, id = name.split('.', 1)
for suffix in ['.in', '']:
for dir in self.dirs:
filename = "%s/%s%s" % (dir, name, suffix)
if os.path.exists(filename):
f = codecs.open(filename, 'r', 'utf-8')
if prefix == 'control':
return read_control(f)
return f.read()
def get(self, key, default=None):
if key in self._cache:
return self._cache[key]
value = self._cache.setdefault(key, self._read(key))
if value is None:
return default
return value
def read_control(f):
from .debian import Package
entries = []
eof = False
while not eof:
e = Package()
last = None
lines = []
while True:
line = f.readline()
if not line:
eof = True
break
line = line.strip('\n')
if not line:
break
if line[0] in ' \t':
if not last:
raise ValueError(u'Continuation line seen before first header')
lines.append(line.lstrip())
continue
if last:
e[last] = u'\n'.join(lines)
i = line.find(':')
if i < 0:
raise ValueError(u"Not a header, not a continuation: ``%s''" % line)
last = line[:i]
lines = [line[i + 1:].lstrip()]
if last:
e[last] = '\n'.join(lines)
if e:
entries.append(e)
return entries
class TextWrapper(textwrap.TextWrapper):
wordsep_re = re.compile(
r'(\s+|' # any whitespace
r'(?<=[\w\!\"\'\&\.\,\?])-{2,}(?=\w))') # em-dash
|