166 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			166 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | #!/usr/bin/python3 | ||
|  | # -*- coding: utf-8 -*- | ||
|  | """
 | ||
|  | Inky-Calendar custom-functions for ease-of-use | ||
|  | 
 | ||
|  | Copyright by aceisace | ||
|  | """
 | ||
|  | from PIL import Image, ImageDraw, ImageFont, ImageColor | ||
|  | from urllib.request import urlopen | ||
|  | import os | ||
|  | import time | ||
|  | 
 | ||
|  | 
 | ||
|  | ##from glob import glob | ||
|  | ##import importlib | ||
|  | ##import subprocess as subp | ||
|  | ##import numpy | ||
|  | ##import arrow | ||
|  | ##from pytz import timezone | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | ##"""Set some display parameters""" | ||
|  | ##driver = importlib.import_module('drivers.'+model) | ||
|  | 
 | ||
|  | # Get the path to the Inky-Calendar folder | ||
|  | top_level = os.path.dirname( | ||
|  |   os.path.abspath(os.path.dirname(__file__))).split('/inkycal')[0] | ||
|  | 
 | ||
|  | # Get path of 'fonts' and 'images' folders within Inky-Calendar folder | ||
|  | fonts_location = top_level + '/fonts/' | ||
|  | images = top_level + '/images/' | ||
|  | 
 | ||
|  | # Get available fonts within fonts folder | ||
|  | fonts = {} | ||
|  | 
 | ||
|  | for path,dirs,files in os.walk(fonts_location): | ||
|  |   for filename in files: | ||
|  |     if filename.endswith('.otf'): | ||
|  |       name = filename.split('.otf')[0] | ||
|  |       fonts[name] = os.path.join(path, filename) | ||
|  | 
 | ||
|  |     if filename.endswith('.ttf'): | ||
|  |       name = filename.split('.ttf')[0] | ||
|  |       fonts[name] = os.path.join(path, filename) | ||
|  | 
 | ||
|  | del name, filename, files | ||
|  | 
 | ||
|  | available_fonts = [key for key,values in fonts.items()] | ||
|  | 
 | ||
|  | def get_fonts(): | ||
|  |   """Print all available fonts by name""" | ||
|  |   for fonts in available_fonts: | ||
|  |     print(fonts) | ||
|  | 
 | ||
|  | def write(image, xy, box_size, text, font=None, **kwargs): | ||
|  |   """Write text on specified image
 | ||
|  |   image = on which image should the text be added? | ||
|  |   xy = xy-coordinates as tuple -> (x,y) | ||
|  |   box_size = size of text-box -> (width,height) | ||
|  |   text = string (what to write) | ||
|  |   font = which font to use | ||
|  |   """
 | ||
|  | 
 | ||
|  |   allowed_kwargs = ['alignment', 'autofit', 'colour', 'rotation' | ||
|  |                     'fill_width', 'fill_height'] | ||
|  |   alignment='center' | ||
|  |   autofit = False | ||
|  |   fill_width = 1.0 | ||
|  |   fill_height = 0.8 | ||
|  |   colour = 'black' | ||
|  |   rotation = None | ||
|  | 
 | ||
|  |   for key, value in kwargs.items(): | ||
|  |     if key in allowed_kwargs: | ||
|  |       setattr(write, key, value) | ||
|  |     else: | ||
|  |       print('{0} does not exist'.format(key)) | ||
|  |       pass | ||
|  | 
 | ||
|  |   x,y = xy | ||
|  |   box_width, box_height = box_size | ||
|  | 
 | ||
|  |   # Increase fontsize to fit specified height and width of text box | ||
|  |   if autofit == True or fill_width != 1.0 or fill_height != 0.8: | ||
|  |     size = 8 | ||
|  |     font = ImageFont.truetype(font, size) | ||
|  |     text_width, text_height = font.getsize(text)[0], font.getsize('hg')[1] | ||
|  |     while ( | ||
|  |       text_width < int(box_width * fill_width) | ||
|  |       ) and ( | ||
|  |       text_height < int(box_height * fill_height) | ||
|  |       ): | ||
|  |         size += 1 | ||
|  |         font = ImageFont.truetype(font, size) | ||
|  |         text_width, text_height = font.getsize(text)[0], font.getsize('hg')[1] | ||
|  | 
 | ||
|  |   text_width, text_height = font.getsize(text)[0], font.getsize('hg')[1] | ||
|  | 
 | ||
|  |   # Truncate text if text is too long so it can fit inside the box | ||
|  |   while (text_width, text_height) > (box_width, box_height): | ||
|  |     text=text[0:-1] | ||
|  |     text_width, text_height = font.getsize(text)[0], font.getsize('hg')[1] | ||
|  | 
 | ||
|  |   # Align text to desired position | ||
|  |   if alignment == "" or "center" or None: | ||
|  |     x = int((box_width / 2) - (text_width / 2)) | ||
|  |   elif alignment == 'left': | ||
|  |     x = 0 | ||
|  |   elif alignment == 'right': | ||
|  |     x = int(box_width - text_width) | ||
|  | 
 | ||
|  |   y = int((box_height / 2) - (text_height / 2)) | ||
|  | 
 | ||
|  |   # Draw the text in the text-box | ||
|  |   draw  = ImageDraw.Draw(image) | ||
|  |   space = Image.new('RGBA', (box_width, box_height)) | ||
|  |   ImageDraw.Draw(space).text((x, y), text, fill=colour, font=font) | ||
|  | 
 | ||
|  |   if rotation != None: | ||
|  |     space.rotate(rotation, expand = True) | ||
|  | 
 | ||
|  |   # Update only region with text (add text with transparent background) | ||
|  |   image.paste(space, xy, space) | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | def text_wrap(text, font=None, max_width = None): | ||
|  |   """Split long text (text-wrapping). Returns a list""" | ||
|  |   lines = [] | ||
|  |   if font.getsize(text)[0] < max_width: | ||
|  |     lines.append(text) | ||
|  |   else: | ||
|  |     words = text.split(' ') | ||
|  |     i = 0 | ||
|  |     while i < len(words): | ||
|  |       line = '' | ||
|  |       while i < len(words) and font.getsize(line + words[i])[0] <= max_width: | ||
|  |         line = line + words[i] + " " | ||
|  |         i += 1 | ||
|  |       if not line: | ||
|  |         line = words[i] | ||
|  |         i += 1 | ||
|  |       lines.append(line) | ||
|  |   return lines | ||
|  | 
 | ||
|  | 
 | ||
|  | def internet_available(): | ||
|  |   """check if the internet is available""" | ||
|  |   try: | ||
|  |     urlopen('https://google.com',timeout=5) | ||
|  |     return True | ||
|  |   except URLError as err: | ||
|  |     return False | ||
|  | 
 | ||
|  | 
 | ||
|  | def get_system_tz(): | ||
|  |   """Get the timezone set by the system""" | ||
|  |   try: | ||
|  |     local_tz = time.tzname[1] | ||
|  |   except: | ||
|  |     print('System timezone could not be parsed!') | ||
|  |     print('Please set timezone manually!. Setting timezone to None...') | ||
|  |     local_tz = None | ||
|  |   return local_tz |