Skip to content

Commit e949a47

Browse files
committed
deepzoom-tile: Sanitize associated image filenames
1 parent 8f0adee commit e949a47

File tree

1 file changed

+15
-1
lines changed

1 file changed

+15
-1
lines changed

examples/deepzoom/deepzoom-tile.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@
2525
from openslide.deepzoom import DeepZoomGenerator
2626
from optparse import OptionParser
2727
import os
28+
import re
2829
import sys
30+
from unicodedata import normalize
2931

3032
class TileWorker(Process):
3133
def __init__(self, queue, slidepath, tile_size, overlap):
@@ -135,11 +137,23 @@ def _run_image(self, associated=None):
135137
basename = self._basename
136138
else:
137139
image = ImageSlide(self._slide.associated_images[associated])
138-
basename = os.path.join(self._basename, associated)
140+
basename = os.path.join(self._basename, self._slugify(associated))
139141
dz = DeepZoomGenerator(image, self._tile_size, self._overlap)
140142
DeepZoomImageTiler(dz, basename, self._format, associated,
141143
self._queue).run()
142144

145+
_punct_re = re.compile(r'[\t !"#$%&\'()*\-/<=>?@\[\\\]^_`{|},.]+')
146+
@classmethod
147+
def _slugify(cls, text):
148+
"""Generates an ASCII-only slug."""
149+
# Based on Flask snippet 5
150+
result = []
151+
for word in cls._punct_re.split(unicode(text, 'UTF-8').lower()):
152+
word = normalize('NFKD', word).encode('ascii', 'ignore')
153+
if word:
154+
result.append(word)
155+
return unicode(u'_'.join(result))
156+
143157
def _shutdown(self):
144158
for _i in range(self._workers):
145159
self._queue.put(None)

0 commit comments

Comments
 (0)