You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
1.9 KiB
61 lines
1.9 KiB
6 months ago
|
import re
|
||
|
from typing import Optional, Any, TextIO
|
||
|
from ..time import times_to_ms
|
||
|
from .base import FormatBase
|
||
|
from ..ssaevent import SSAEvent
|
||
|
from ..ssafile import SSAFile
|
||
|
|
||
|
|
||
|
# thanks to http://otsaloma.io/gaupol/doc/api/aeidon.files.mpl2_source.html
|
||
|
MPL2_FORMAT = re.compile(r"^\[(-?\d+)\]\[(-?\d+)\](.*)", re.MULTILINE)
|
||
|
|
||
|
|
||
|
class MPL2Format(FormatBase):
|
||
|
"""MPL2 subtitle format implementation"""
|
||
|
@classmethod
|
||
|
def guess_format(cls, text: str) -> Optional[str]:
|
||
|
"""See :meth:`pysubs2.formats.FormatBase.guess_format()`"""
|
||
|
if MPL2_FORMAT.search(text):
|
||
|
return "mpl2"
|
||
|
else:
|
||
|
return None
|
||
|
|
||
|
@classmethod
|
||
|
def from_file(cls, subs: "SSAFile", fp: TextIO, format_: str, **kwargs: Any) -> None:
|
||
|
"""See :meth:`pysubs2.formats.FormatBase.from_file()`"""
|
||
|
def prepare_text(lines: str) -> str:
|
||
|
out = []
|
||
|
for s in lines.split("|"):
|
||
|
s = s.strip()
|
||
|
|
||
|
if s.startswith("/"):
|
||
|
# line beginning with '/' is in italics
|
||
|
s = r"{\i1}%s{\i0}" % s[1:].strip()
|
||
|
|
||
|
out.append(s)
|
||
|
return "\\N".join(out)
|
||
|
|
||
|
text = fp.read()
|
||
|
for start, end, text in MPL2_FORMAT.findall(text):
|
||
|
e = SSAEvent(
|
||
|
start=times_to_ms(s=float(start) / 10),
|
||
|
end=times_to_ms(s=float(end) / 10),
|
||
|
text=prepare_text(text)
|
||
|
)
|
||
|
subs.append(e)
|
||
|
|
||
|
@classmethod
|
||
|
def to_file(cls, subs: "SSAFile", fp: TextIO, format_: str, **kwargs: Any) -> None:
|
||
|
"""
|
||
|
See :meth:`pysubs2.formats.FormatBase.to_file()`
|
||
|
|
||
|
No styling is supported at the moment.
|
||
|
|
||
|
"""
|
||
|
# TODO handle italics
|
||
|
for line in subs.get_text_events():
|
||
|
start = int(line.start // 100)
|
||
|
end = int(line.end // 100)
|
||
|
text = line.plaintext.replace("\n", "|")
|
||
|
print(f"[{start}][{end}] {text}", file=fp)
|