From 92e90ca7c97fe75b09046457dda1b9980fd8aed7 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 11 Dec 2017 16:09:46 +0100 Subject: [PATCH] m.images: gracefully handle sparse EXIF info in image grid. And document EXIF modification for future self. --- pelican-plugins/m/images.py | 12 ++++++++++-- pelican-plugins/m/test/images/page.html | 8 ++++++-- pelican-plugins/m/test/images/page.rst | 3 ++- pelican-plugins/m/test/images/sparseexif.jpg | Bin 0 -> 930 bytes pelican-plugins/m/test/test_images.py | 12 +++++++++++- 5 files changed, 29 insertions(+), 6 deletions(-) create mode 100644 pelican-plugins/m/test/images/sparseexif.jpg diff --git a/pelican-plugins/m/images.py b/pelican-plugins/m/images.py index 168bb930..2ebc16db 100644 --- a/pelican-plugins/m/images.py +++ b/pelican-plugins/m/images.py @@ -191,8 +191,16 @@ class ImageGrid(rst.Directive): for k, v in im._getexif().items() if k in PIL.ExifTags.TAGS and len(str(v)) < 256 } - # Can't use just *exif['ExposureTime'] on Py3.4 - caption = "F{}, {}/{} s, ISO {}".format(float(exif['FNumber'][0])/float(exif['FNumber'][1]), exif['ExposureTime'][0], exif['ExposureTime'][1], exif['ISOSpeedRatings']) + + # Not all info might be present + caption = [] + if 'FNumber' in exif: + caption += ["F{}".format(float(float(exif['FNumber'][0])/float(exif['FNumber'][1])))] + if 'ExposureTime' in exif: + caption += ["{}/{} s".format(exif['ExposureTime'][0], exif['ExposureTime'][1])] + if 'ISOSpeedRatings' in exif: + caption += ["ISO {}".format(exif['ISOSpeedRatings'])] + caption = ', '.join(caption) # It's not (e.g. a PNG file), empty caption else: caption = "" diff --git a/pelican-plugins/m/test/images/page.html b/pelican-plugins/m/test/images/page.html index 40fc9b26..abf048f5 100644 --- a/pelican-plugins/m/test/images/page.html +++ b/pelican-plugins/m/test/images/page.html @@ -82,14 +82,18 @@ Yes. -

Image grid with a PNG file:

+

Image grid with a PNG file and a JPEG with sparse EXIF data:

-
+
+
+
F2.8
+
+
diff --git a/pelican-plugins/m/test/images/page.rst b/pelican-plugins/m/test/images/page.rst index 2cc494f1..13fe99aa 100644 --- a/pelican-plugins/m/test/images/page.rst +++ b/pelican-plugins/m/test/images/page.rst @@ -57,8 +57,9 @@ Image grid: {filename}/flowers.jpg {filename}/ship.jpg -Image grid with a PNG file: +Image grid with a PNG file and a JPEG with sparse EXIF data: .. image-grid:: {filename}/tiny.png + {filename}/sparseexif.jpg diff --git a/pelican-plugins/m/test/images/sparseexif.jpg b/pelican-plugins/m/test/images/sparseexif.jpg new file mode 100644 index 0000000000000000000000000000000000000000..19044d3ba406b3f45dc1177afa7ca06d0d7fd552 GIT binary patch literal 930 zcmex=7PJ2Ll5GD}xjxD+42t#Q7f=r~lq~=<2MA<<7$pAxHiI(*2OAqZ z8!HDpJ3A*Q2N#bBFAq02kED<=zlf}qyqv6*jEsVcp1OjPjsT+ED03`~NI%z}*nk1)ss z1B4YA=AdAQ0-%>!SlQS)IJvli3bqO`FflSSGqEtUva$d}hp`qEBrJlgLW+itY{G$w z>`H|qMvW5}awt1(JSZA;@q>zSQc)8pmzcPOq?D?fx`w8fiK&^ng{76Vi>sTvho@I? zNN8AiL}XNQN@`kqMrKxVNoiSmMP*fUOKV$uM`zch$y26In?7UatVN5LEM2yI#mZHi zHgDOwZTpU$yAB;ba`f2o6DLnyx_ss8wd*%--g@}x@sp>|p1*kc>f@)+U%r0({^RE_ zkiQrim?7SR`wY!rf#!{aTy>F&Mv zI1{&TO53h+-Pr9jn=(t?`-$_6XU+V&w=#B`#H5VILtZ*D?6R|$*KNI-X(pw&GxHm_ zF5kJ!Z}g-p^#uDqo;Ydiaju{|d2RgsL-!cxRjU4W`Iw({FQ&L9^yE3FZ_Jms>SgTp IIsgAA0Bn2_kpKVy literal 0 HcmV?d00001 diff --git a/pelican-plugins/m/test/test_images.py b/pelican-plugins/m/test/test_images.py index c3bbc644..699e1f09 100644 --- a/pelican-plugins/m/test/test_images.py +++ b/pelican-plugins/m/test/test_images.py @@ -31,7 +31,17 @@ class Images(PluginTestCase): def test(self): self.run_pelican({ 'PLUGINS': ['m.htmlsanity', 'm.images'], - 'STATIC_PATHS': ['tiny.png', 'ship.jpg', 'flowers.jpg'] + 'STATIC_PATHS': ['tiny.png', 'ship.jpg', 'flowers.jpg', 'sparseexif.jpg'] }) + # + # Modifying EXIF in files for testing: + # + # # Prints out all EXIF info + # identify -format '%[EXIF:*]' file.jpg + # + # # Removes *everything* and adds a new value (order is important) + # exiftool -all= -exif:FNumber=28/10 file.jpg + # + self.assertEqual(*self.actual_expected_contents('page.html')) -- 2.30.2