bazarr/libs/pysubs2/ssastyle.py

87 lines
3.5 KiB
Python

from __future__ import unicode_literals
from .common import Color, PY3
class SSAStyle(object):
"""
A SubStation Style.
In SubStation, each subtitle (:class:`SSAEvent`) is associated with a style which defines its font, color, etc.
Like a subtitle event, a style also consists of "fields"; see :attr:`SSAStyle.FIELDS` for a list
(note the spelling, which is different from SubStation proper).
Subtitles and styles are connected via an :class:`SSAFile` they belong to. :attr:`SSAEvent.style` is a string
which is (or should be) a key in the :attr:`SSAFile.styles` dict. Note that style name is stored separately;
a given :class:`SSAStyle` instance has no particular name itself.
This class defines equality (equality of all fields).
"""
DEFAULT_STYLE = None
#: All fields in SSAStyle.
FIELDS = frozenset([
"fontname", "fontsize", "primarycolor", "secondarycolor",
"tertiarycolor", "outlinecolor", "backcolor",
"bold", "italic", "underline", "strikeout",
"scalex", "scaley", "spacing", "angle", "borderstyle",
"outline", "shadow", "alignment",
"marginl", "marginr", "marginv", "alphalevel", "encoding"
])
def __init__(self, **fields):
self.fontname = "Arial" #: Font name
self.fontsize = 20.0 #: Font size (in pixels)
self.primarycolor = Color(255, 255, 255, 0) #: Primary color (:class:`pysubs2.Color` instance)
self.secondarycolor = Color(255, 0, 0, 0) #: Secondary color (:class:`pysubs2.Color` instance)
self.tertiarycolor = Color(0, 0, 0, 0) #: Tertiary color (:class:`pysubs2.Color` instance)
self.outlinecolor = Color(0, 0, 0, 0) #: Outline color (:class:`pysubs2.Color` instance)
self.backcolor = Color(0, 0, 0, 0) #: Back, ie. shadow color (:class:`pysubs2.Color` instance)
self.bold = False #: Bold
self.italic = False #: Italic
self.underline = False #: Underline (ASS only)
self.strikeout = False #: Strikeout (ASS only)
self.scalex = 100.0 #: Horizontal scaling (ASS only)
self.scaley = 100.0 #: Vertical scaling (ASS only)
self.spacing = 0.0 #: Letter spacing (ASS only)
self.angle = 0.0 #: Rotation (ASS only)
self.borderstyle = 1 #: Border style
self.outline = 2.0 #: Outline width (in pixels)
self.shadow = 2.0 #: Shadow depth (in pixels)
self.alignment = 2 #: Numpad-style alignment, eg. 7 is "top left" (that is, ASS alignment semantics)
self.marginl = 10 #: Left margin (in pixels)
self.marginr = 10 #: Right margin (in pixels)
self.marginv = 10 #: Vertical margin (in pixels)
self.alphalevel = 0 #: Old, unused SSA-only field
self.encoding = 1 #: Charset
for k, v in fields.items():
if k in self.FIELDS:
setattr(self, k, v)
else:
raise ValueError("SSAStyle has no field named %r" % k)
def copy(self):
return SSAStyle(**self.as_dict())
def as_dict(self):
return {field: getattr(self, field) for field in self.FIELDS}
def __eq__(self, other):
return self.as_dict() == other.as_dict()
def __ne__(self, other):
return not self == other
def __repr__(self):
s = "<SSAStyle "
s += "%rpx " % self.fontsize
if self.bold: s += "bold "
if self.italic: s += "italic "
s += "{!r}>".format(self.fontname)
if not PY3: s = s.encode("utf-8")
return s
SSAStyle.DEFAULT_STYLE = SSAStyle()