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
|
def read_content_types_xml_element(element):
extension_defaults = dict(map(
_read_default,
element.find_children("content-types:Default")
))
overrides = dict(map(
_read_override,
element.find_children("content-types:Override")
))
return _ContentTypes(extension_defaults, overrides)
def _read_default(element):
extension = element.attributes["Extension"]
content_type = element.attributes["ContentType"]
return extension, content_type
def _read_override(element):
part_name = element.attributes["PartName"]
content_type = element.attributes["ContentType"]
return part_name.lstrip("/"), content_type
class _ContentTypes(object):
_image_content_types = {
"png": "png",
"gif": "gif",
"jpeg": "jpeg",
"jpg": "jpeg",
"tif": "tiff",
"tiff": "tiff",
"bmp": "bmp",
}
def __init__(self, extension_defaults, overrides):
self._extension_defaults = extension_defaults
self._overrides = overrides
def find_content_type(self, path):
if path in self._overrides:
return self._overrides[path]
extension = _get_extension(path)
default_type = self._extension_defaults.get(extension)
if default_type is not None:
return default_type
image_type = self._image_content_types.get(extension.lower())
if image_type is not None:
return "image/" + image_type
return None
empty_content_types = _ContentTypes({}, {})
def _get_extension(path):
return path.rpartition(".")[2]
|