16
16
# You should have received a copy of the GNU General Public License
17
17
# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.
23
EXTENDED_STRING = "_extended"
25
26
class Template(object):
27
def __init__(self, filename_field=None, unique_fields=[]):
28
self._filename_field = filename_field
29
self._unique_fields = unique_fields
31
def _reader(self, file, size=4096, delimiter="\n\n"):
28
def _reader(self, file, size=4096, delimiter=r"\n{2,}"):
34
31
buffer_new = file.read(size)
38
lines = (buffer_old + buffer_new).split(delimiter)
35
lines = re.split(delimiter, buffer_old + buffer_new)
39
36
buffer_old = lines.pop(-1)
61
58
% (filename, field, value)
62
59
element[field] = value
64
element["%s_extended" % field] = extended
61
element["%s%s" % (field, EXTENDED_STRING)] = extended
66
63
string = string.strip("\n")
67
64
field = value = extended = ""
93
90
bit = match.groups()[0].rstrip()
94
91
if len(extended) and not re.search(r"[\n ]$", extended):
92
if extended.endswith("\\"):
93
extended = extended[:-1].rstrip() + " "
103
103
_save(field, value, extended)
106
if self._filename_field:
107
if self._filename_field in element:
109
"Template %s already contains filename field: %s" \
110
% (filename, self._filename_field)
111
element[self._filename_field] = posixpath.basename(filename)
113
for unique_field in self._unique_fields:
114
if [e for e in elements \
115
if e[unique_field] == element[unique_field]]:
117
"Template %s contains duplicate fields: %s" \
118
% (filename, unique_field)
120
105
elements.append(element)
127
112
file = open(filename, "r")
128
113
return self.load_file(file, filename)
130
def load_directory(self, directory, blacklist=[], whitelist=[]):
131
logging.info("Loading filenames from directory: %s", directory)
133
whitelist_patterns = [re.compile(r"^%s$" % r) for r in whitelist]
134
blacklist_patterns = [re.compile(r"^%s$" % r) for r in blacklist]
137
for name in os.listdir(directory):
138
if name.startswith(".") or name.endswith("~"):
139
logging.info("Ignored filename: %s", name)
142
if whitelist_patterns:
143
if not [name for p in whitelist_patterns if p.match(name)]:
144
logging.info("Not whitelisted filename: %s", name)
146
elif blacklist_patterns:
147
if [name for p in blacklist_patterns if p.match(name)]:
148
logging.info("Blacklisted filename: %s", name)
151
filename = posixpath.join(directory, name)
152
elements.extend(self.load_filename(filename))
156
def load_directories(self, directories, blacklist=[], whitelist=[]):
158
for directory in directories:
159
elements.extend(self.load_directory(directory, blacklist, whitelist))