#!/usr/bin/env python # -*- coding: utf-8 -*- from secretary import Renderer from PIL import Image import re RE_UNITS = re.compile("([.0-9]+)([a-z]+)") def parse_value_unit(value): m = RE_UNITS.match(value) if not m: return None, None value, unit = m.groups() value = float(value) return value, unit class IshtarSecretaryRenderer(Renderer): def __init__(self, *args, **kwargs): super(IshtarSecretaryRenderer, self).__init__(*args, **kwargs) self.media_callback = self.ishtar_media_loader # self.environment.filters['pad'] = pad_string def ishtar_media_loader(self, media, *args, **kwargs): image_file, mime = self.fs_loader(media, *args, **kwargs) if "width" in kwargs: kwargs['frame_attrs']['svg:width'] = kwargs["width"] if "height" in kwargs: kwargs['frame_attrs']['svg:height'] = kwargs["height"] if "keep_ratio" in args: image = Image.open(image_file.name) width, width_unit = parse_value_unit( kwargs['frame_attrs']['svg:width']) height, height_unit = parse_value_unit( kwargs['frame_attrs']['svg:height']) if "height" not in kwargs and width: new_height = width * image.height / image.width kwargs['frame_attrs']['svg:height'] = "{}{}".format( new_height, width_unit ) if "width" not in kwargs and height: new_width = height * image.width / image.height kwargs['frame_attrs']['svg:width'] = "{}{}".format( new_width, height_unit ) return image_file, mime