mirror of
https://github.com/ankitects/anki.git
synced 2025-09-18 22:12:21 -04:00

* PEP8 dbproxy.py * PEP8 errors.py * PEP8 httpclient.py * PEP8 lang.py * PEP8 latex.py * Add decorator to deprectate key words * Make replacement for deprecated attribute optional * Use new helper `_print_replacement_warning()` * PEP8 media.py * PEP8 rsbackend.py * PEP8 sound.py * PEP8 stdmodels.py * PEP8 storage.py * PEP8 sync.py * PEP8 tags.py * PEP8 template.py * PEP8 types.py * Fix DeprecatedNamesMixinForModule The class methods need to be overridden with instance methods, so every module has its own dicts. * Use `# pylint: disable=invalid-name` instead of id * PEP8 utils.py * Only decorate `__getattr__` with `@no_type_check` * Fix mypy issue with snakecase Importing it from `anki._vendor` raises attribute errors. * Format * Remove inheritance of DeprecatedNamesMixin There's almost no shared code now and overriding classmethods with instance methods raises mypy issues. * Fix traceback frames of deprecation warnings * remove fn/TimedLog (dae) Neither Anki nor add-ons appear to have been using it * fix some issues with stringcase use (dae) - the wheel was depending on the PyPI version instead of our vendored version - _vendor:stringcase should not have been listed in the anki py_library. We already include the sources in py_srcs, and need to refer to them directly. By listing _vendor:stringcase as well, we were making a top-level stringcase library available, which would have only worked for distributing because the wheel definition was also incorrect. - mypy errors are what caused me to mistakenly add the above - they were because the type: ignore at the top of stringcase.py was causing mypy to completely ignore the file, so it was not aware of any attributes it contained.
51 lines
1 KiB
Python
51 lines
1 KiB
Python
# Copyright: Ankitects Pty Ltd and contributors
|
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
|
|
|
# pylint: enable=invalid-name
|
|
|
|
"""
|
|
Sound/TTS references extracted from card text.
|
|
|
|
These can be accessed via eg card.question_av_tags()
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import re
|
|
from dataclasses import dataclass
|
|
from typing import Union
|
|
|
|
|
|
@dataclass
|
|
class TTSTag:
|
|
"""Records information about a text to speech tag.
|
|
|
|
See tts.py for more information.
|
|
"""
|
|
|
|
field_text: str
|
|
lang: str
|
|
voices: list[str]
|
|
speed: float
|
|
# each arg should be in the form 'foo=bar'
|
|
other_args: list[str]
|
|
|
|
|
|
@dataclass
|
|
class SoundOrVideoTag:
|
|
"""Contains the filename inside a [sound:...] tag.
|
|
|
|
Video files also use [sound:...].
|
|
"""
|
|
|
|
filename: str
|
|
|
|
|
|
# note this does not include image tags, which are handled with HTML.
|
|
AVTag = Union[SoundOrVideoTag, TTSTag]
|
|
|
|
AV_REF_RE = re.compile(r"\[anki:(play:(.):(\d+))\]")
|
|
|
|
|
|
def strip_av_refs(text: str) -> str:
|
|
return AV_REF_RE.sub("", text)
|