95 lines
2.2 KiB
Python
95 lines
2.2 KiB
Python
from typing import Optional
|
|
from enum import IntEnum
|
|
import copy
|
|
|
|
DEFAULT_FONT = "arial"
|
|
DEFAULT_FONT_SIZE = 0.05
|
|
|
|
|
|
class Pos(IntEnum):
|
|
NW = 0
|
|
N = 1
|
|
NE = 2
|
|
W = 3
|
|
CENTER = 4
|
|
E = 5
|
|
SW = 6
|
|
S = 7
|
|
SE = 8
|
|
|
|
|
|
class Meme:
|
|
def __init__(self, meme_id: str):
|
|
self.id = meme_id
|
|
self.aliases = []
|
|
self.abstract = None
|
|
self.info = None
|
|
self.template = None
|
|
self.text_base = Text()
|
|
self.texts = None
|
|
self.texts_len = 0
|
|
|
|
def clone(self) -> 'Meme':
|
|
return copy.deepcopy(self)
|
|
|
|
|
|
class Text:
|
|
base_properties = ["font", "font_size", "fill", "stroke_width",
|
|
"stroke_fill", "align", "position"]
|
|
|
|
def __init__(self, text: Optional[str] = None):
|
|
self.text = text
|
|
self.text_ref = None
|
|
|
|
self.style_ref = None
|
|
|
|
self.x_range = (0, 1)
|
|
self.y_range = (0, 1)
|
|
self.angle = None
|
|
|
|
self.font = None
|
|
self.font_size = None
|
|
|
|
self.fill = None
|
|
self.stroke_width = None
|
|
self.stroke_fill = None
|
|
|
|
self.align = None
|
|
self.position = None
|
|
|
|
def variant(self, text: str) -> 'Text':
|
|
new_text = copy.deepcopy(self)
|
|
new_text.text = text
|
|
return new_text
|
|
|
|
def update(self, base: 'Text'):
|
|
for prop in Text.base_properties:
|
|
if getattr(self, prop) is None:
|
|
setattr(self, prop, getattr(base, prop))
|
|
|
|
def init(self):
|
|
if self.x_range is None:
|
|
self.x_range = (0, 1)
|
|
if self.y_range is None:
|
|
self.y_range = (0, 1)
|
|
if self.angle is None:
|
|
self.angle = 0
|
|
if self.font is None:
|
|
self.font = DEFAULT_FONT
|
|
if self.font_size is None:
|
|
self.font_size = DEFAULT_FONT_SIZE
|
|
if self.align is None:
|
|
self.align = "center"
|
|
if self.fill is None:
|
|
self.fill = (0, 0, 0)
|
|
else:
|
|
self.fill = tuple(self.fill)
|
|
if self.stroke_fill is None:
|
|
self.stroke_fill = (0, 0, 0)
|
|
else:
|
|
self.stroke_fill = tuple(self.stroke_fill)
|
|
if self.stroke_width is None:
|
|
self.stroke_width = 0
|
|
if self.position is None:
|
|
self.position = Pos.CENTER
|