""" Android text.style 包 — CharacterStyle, AlignmentSpan, BulletSpan, URLSpan 等 方法签名完全对齐 Android SDK """ from __future__ import annotations import sys from typing import Any, Dict, List, Optional, Tuple from .._core import Stub, AndroidOnlyError from ..java.lang import RuntimeException IllegalArgumentException = type("IllegalArgumentException", (RuntimeException,), {}) __all__ = [ "CharacterStyle", "MetricAffectingSpan", "BackgroundColorSpan", "ForegroundColorSpan", "StyleSpan", "TypefaceSpan", "AbsoluteSizeSpan", "RelativeSizeSpan", "ScaleXSpan", "StrikethroughSpan", "UnderlineSpan", "SubscriptSpan", "SuperscriptSpan", "URLSpan", "ClickableSpan", "ImageSpan", "AlignmentSpan", "BulletSpan", "QuoteSpan", "LeadingMarginSpan", "LeadingMarginSpan2", "LineBackgroundSpan", "LineHeightSpan", "TabStopSpan", "WrapTogetherSpan", "ParagraphStyle", "DrawableMarginSpan", "IconMarginSpan", "EasyEditSpan", "SpellCheckSpan", "SuggestionSpan", "TextAppearanceSpan", "LocaleSpan", "ReplacementSpan", "DynamicDrawableSpan", "MaskFilterSpan", "RasterizerSpan", "ShadowStyleSpan", "TtsSpan", ] # ═══════════════════════════════════════════════════════════════ # CharacterStyle # ═══════════════════════════════════════════════════════════════ class CharacterStyle(Stub): """CharacterStyle — 字符样式基类 (桌面存根)""" def __init__(self): super().__init__() def setSpan(self, text: Any, start: int, end: int, flags: int) -> None: """设置 span 范围""" pass def getUnderlying(self) -> "CharacterStyle": """获取底层样式""" return self @staticmethod def wrap(cs: "CharacterStyle") -> "CharacterStyle": """包装样式""" return cs def updateDrawState(self, tp: Any) -> None: """更新绘制状态""" pass def toString(self) -> str: return f"{self.__class__.__name__}@CharacterStyle" class MetricAffectingSpan(CharacterStyle): """MetricAffectingSpan — 影响度量的 Span""" def __init__(self): super().__init__() def updateMeasureState(self, tp: Any) -> None: """更新度量状态""" pass # ═══════════════════════════════════════════════════════════════ # BackgroundColorSpan # ═══════════════════════════════════════════════════════════════ class BackgroundColorSpan(CharacterStyle): """BackgroundColorSpan — 背景颜色 Span""" def __init__(self, color: int = 0): super().__init__() self._color = color def setColor(self, color: int) -> None: """设置背景颜色""" self._color = color def getBackgroundColor(self) -> int: """获取背景颜色""" return self._color def updateDrawState(self, tp: Any) -> None: if hasattr(tp, 'bgColor'): tp.bgColor = self._color # ═══════════════════════════════════════════════════════════════ # ForegroundColorSpan # ═══════════════════════════════════════════════════════════════ class ForegroundColorSpan(CharacterStyle): """ForegroundColorSpan — 前景颜色 Span""" def __init__(self, color: int = 0): super().__init__() self._color = color def setColor(self, color: int) -> None: """设置前景颜色""" self._color = color def getForegroundColor(self) -> int: """获取前景颜色""" return self._color def updateDrawState(self, tp: Any) -> None: if hasattr(tp, 'color'): tp.color = self._color # ═══════════════════════════════════════════════════════════════ # StyleSpan # ═══════════════════════════════════════════════════════════════ class StyleSpan(MetricAffectingSpan): """StyleSpan — 字体样式 Span""" NORMAL = 0 BOLD = 1 ITALIC = 2 BOLD_ITALIC = 3 def __init__(self, style: int = NORMAL): super().__init__() self._style = style def getStyle(self) -> int: """获取字体样式""" return self._style def updateDrawState(self, tp: Any) -> None: if hasattr(tp, 'style'): tp.style = self._style def updateMeasureState(self, tp: Any) -> None: if hasattr(tp, 'style'): tp.style = self._style # ═══════════════════════════════════════════════════════════════ # TypefaceSpan # ═══════════════════════════════════════════════════════════════ class TypefaceSpan(MetricAffectingSpan): """TypefaceSpan — 字体 Span""" def __init__(self, family: str = "sans-serif"): super().__init__() self._family = family def getFamily(self) -> str: """获取字体名称""" return self._family def updateDrawState(self, tp: Any) -> None: if hasattr(tp, 'typeface'): tp.typeface = self._family def updateMeasureState(self, tp: Any) -> None: if hasattr(tp, 'typeface'): tp.typeface = self._family # ═══════════════════════════════════════════════════════════════ # AbsoluteSizeSpan # ═══════════════════════════════════════════════════════════════ class AbsoluteSizeSpan(MetricAffectingSpan): """AbsoluteSizeSpan — 绝对字号 Span""" def __init__(self, size: int = 0, dip: bool = False): super().__init__() self._size = size self._dip = dip def getSize(self) -> int: """获取字号""" return self._size def getDip(self) -> bool: """检查是否使用 dip 单位""" return self._dip def updateDrawState(self, tp: Any) -> None: if hasattr(tp, 'textSize'): tp.textSize = float(self._size) def updateMeasureState(self, tp: Any) -> None: if hasattr(tp, 'textSize'): tp.textSize = float(self._size) # ═══════════════════════════════════════════════════════════════ # RelativeSizeSpan # ═══════════════════════════════════════════════════════════════ class RelativeSizeSpan(MetricAffectingSpan): """RelativeSizeSpan — 相对字号 Span""" def __init__(self, proportion: float = 1.0): super().__init__() self._proportion = proportion def getSizeChange(self) -> float: """获取字号变化比例""" return self._proportion def updateDrawState(self, tp: Any) -> None: if hasattr(tp, 'textSize') and hasattr(tp, '_baseTextSize'): tp.textSize = tp._baseTextSize * self._proportion def updateMeasureState(self, tp: Any) -> None: if hasattr(tp, 'textSize') and hasattr(tp, '_baseTextSize'): tp.textSize = tp._baseTextSize * self._proportion # ═══════════════════════════════════════════════════════════════ # ScaleXSpan # ═══════════════════════════════════════════════════════════════ class ScaleXSpan(MetricAffectingSpan): """ScaleXSpan — X 轴缩放 Span""" def __init__(self, scale_x: float = 1.0): super().__init__() self._scale_x = scale_x def getScaleX(self) -> float: """获取 X 轴缩放比例""" return self._scale_x def updateDrawState(self, tp: Any) -> None: if hasattr(tp, 'textScaleX'): tp.textScaleX = self._scale_x def updateMeasureState(self, tp: Any) -> None: if hasattr(tp, 'textScaleX'): tp.textScaleX = self._scale_x # ═══════════════════════════════════════════════════════════════ # StrikethroughSpan / UnderlineSpan / SubscriptSpan / SuperscriptSpan # ═══════════════════════════════════════════════════════════════ class StrikethroughSpan(CharacterStyle): """StrikethroughSpan — 删除线 Span""" def __init__(self): super().__init__() def updateDrawState(self, tp: Any) -> None: if hasattr(tp, 'strikethru'): tp.strikethru = True class UnderlineSpan(CharacterStyle): """UnderlineSpan — 下划线 Span""" def __init__(self): super().__init__() def updateDrawState(self, tp: Any) -> None: if hasattr(tp, 'underline'): tp.underline = True class SubscriptSpan(MetricAffectingSpan): """SubscriptSpan — 下标 Span""" def __init__(self): super().__init__() def updateDrawState(self, tp: Any) -> None: if hasattr(tp, 'subscript'): tp.subscript = True class SuperscriptSpan(MetricAffectingSpan): """SuperscriptSpan — 上标 Span""" def __init__(self): super().__init__() def updateDrawState(self, tp: Any) -> None: if hasattr(tp, 'superscript'): tp.superscript = True # ═══════════════════════════════════════════════════════════════ # URLSpan / ClickableSpan # ═══════════════════════════════════════════════════════════════ class URLSpan(CharacterStyle): """URLSpan — 超链接 Span""" def __init__(self, url: str = ""): super().__init__() self._url = url def getURL(self) -> str: """获取 URL""" return self._url def updateDrawState(self, tp: Any) -> None: if hasattr(tp, 'color'): tp.color = 0xFF0000FF # blue if hasattr(tp, 'underline'): tp.underline = True def onClick(self, view: Any) -> None: """点击事件""" pass class ClickableSpan(CharacterStyle): """ClickableSpan — 可点击 Span""" def __init__(self): super().__init__() def onClick(self, view: Any) -> None: """点击事件""" pass def updateDrawState(self, tp: Any) -> None: if hasattr(tp, 'color'): tp.color = 0xFF0000FF if hasattr(tp, 'underline'): tp.underline = True # ═══════════════════════════════════════════════════════════════ # ImageSpan # ═══════════════════════════════════════════════════════════════ class ImageSpan(CharacterStyle): """ImageSpan — 图片 Span""" def __init__(self, drawable: Any = None, source: str = "", vertical_alignment: int = 0): super().__init__() self._drawable = drawable self._source = source self._vertical_alignment = vertical_alignment def getDrawable(self) -> Any: """获取 Drawable""" return self._drawable def getSource(self) -> str: """获取资源源""" return self._source def getContentUri(self) -> Optional[str]: """获取内容 URI""" return None def draw(self, canvas: Any, text: str, x: int, y: int, top: int, bottom: int) -> None: """绘制图片""" if self._drawable and hasattr(self._drawable, 'draw'): self._drawable.draw(canvas) def toString(self) -> str: return f"ImageSpan(source={self._source})" # ═══════════════════════════════════════════════════════════════ # AlignmentSpan # ═══════════════════════════════════════════════════════════════ class AlignmentSpan(CharacterStyle): """AlignmentSpan — 对齐 Span""" class Standard(CharacterStyle): """标准对齐实现""" def __init__(self, alignment: int): super().__init__() self._alignment = alignment def getAlignment(self) -> int: return self._alignment def updateDrawState(self, tp: Any) -> None: if hasattr(tp, 'alignment'): tp.alignment = self._alignment def __init__(self, alignment: int = 0): super().__init__() self._alignment = alignment def getAlignment(self) -> int: """获取对齐方式""" return self._alignment def updateDrawState(self, tp: Any) -> None: if hasattr(tp, 'alignment'): tp.alignment = self._alignment # ═══════════════════════════════════════════════════════════════ # BulletSpan # ═══════════════════════════════════════════════════════════════ class BulletSpan(CharacterStyle): """BulletSpan — 项目符号 Span""" STANDARD_GAP_WIDTH = 2 def __init__(self, leading_margin: int = 0, gap_width: int = STANDARD_GAP_WIDTH, bullet_radius: int = 4, color: int = 0xFF000000): super().__init__() self._leading_margin = leading_margin self._gap_width = gap_width self._bullet_radius = bullet_radius self._color = color def getLeadingMargin(self) -> int: """获取前导边距""" return self._leading_margin def getGapWidth(self) -> int: """获取间隙宽度""" return self._gap_width def getBulletRadius(self) -> int: """获取项目符号半径""" return self._bullet_radius def getColor(self) -> int: """获取颜色""" return self._color def updateDrawState(self, tp: Any) -> None: pass def drawLeadingMargin(self, canvas: Any, paint: Any, x: int, dir_: int, top: int, baseline: int, bottom: int, text: str, start: int, end: int, first: bool, margin: int) -> None: """绘制前导边距中的项目符号""" pass # ═══════════════════════════════════════════════════════════════ # QuoteSpan # ═══════════════════════════════════════════════════════════════ class QuoteSpan(CharacterStyle): """QuoteSpan — 引用 Span""" STANDARD_GAP_WIDTH = 2 STANDARD_COLOR = 0xFF0000FF def __init__(self, color: int = STANDARD_COLOR, gap_width: int = STANDARD_GAP_WIDTH, stripe_width: int = 2): super().__init__() self._color = color self._gap_width = gap_width self._stripe_width = stripe_width def getColor(self) -> int: """获取引用颜色""" return self._color def getGapWidth(self) -> int: """获取间隙宽度""" return self._gap_width def getStripeWidth(self) -> int: """获取条纹宽度""" return self._stripe_width def updateDrawState(self, tp: Any) -> None: pass def drawLeadingMargin(self, canvas: Any, paint: Any, x: int, dir_: int, top: int, baseline: int, bottom: int, text: str, start: int, end: int, first: bool, margin: int) -> None: """绘制引用条纹""" pass # ═══════════════════════════════════════════════════════════════ # LeadingMarginSpan / LeadingMarginSpan2 # ═══════════════════════════════════════════════════════════════ class LeadingMarginSpan(CharacterStyle): """LeadingMarginSpan — 前导边距 Span""" def __init__(self): super().__init__() def getLeadingMargin(self, first: bool) -> int: """获取前导边距""" return 0 def drawLeadingMargin(self, canvas: Any, paint: Any, x: int, dir_: int, top: int, baseline: int, bottom: int, text: str, start: int, end: int, first: bool, margin: int) -> None: """绘制前导边距""" pass class LeadingMarginSpan2(LeadingMarginSpan): """LeadingMarginSpan2 — 支持行数限制的前导边距 Span""" def __init__(self): super().__init__() def getLeadingMarginLineCount(self) -> int: """获取前导边距行数""" return 1 # ═══════════════════════════════════════════════════════════════ # LineBackgroundSpan / LineHeightSpan # ═══════════════════════════════════════════════════════════════ class LineBackgroundSpan(CharacterStyle): """LineBackgroundSpan — 行背景 Span""" def __init__(self): super().__init__() def drawBackground(self, canvas: Any, paint: Any, left: int, right: int, top: int, baseline: int, bottom: int, text: str, start: int, end: int, line_num: int) -> None: """绘制行背景""" pass class LineHeightSpan(CharacterStyle): """LineHeightSpan — 行高 Span""" class WithDensity(CharacterStyle): """带密度参数的行高实现""" def __init__(self): super().__init__() def chooseHeight(self, text: str, start: int, end: int, spanstart: int, spanend: int, height: List[int], fontMetrics: Any) -> None: pass def __init__(self): super().__init__() def chooseHeight(self, text: str, start: int, end: int, spanstart: int, spanend: int, height: List[int], fontMetrics: Any) -> None: """选择行高""" pass @staticmethod def increaseHeight(height: List[int], increase: int) -> None: """增加高度""" if height: height[0] = height[0] + increase # ═══════════════════════════════════════════════════════════════ # TabStopSpan / WrapTogetherSpan / ParagraphStyle # ═══════════════════════════════════════════════════════════════ class TabStopSpan(CharacterStyle): """TabStopSpan — 制表符停靠 Span""" class Standard(CharacterStyle): """标准制表符停靠实现""" def __init__(self, tab_stop: int = 40): super().__init__() self._tab_stop = tab_stop def getTabStop(self) -> int: return self._tab_stop def __init__(self, tab_stop: int = 40): super().__init__() self._tab_stop = tab_stop def getTabStop(self) -> int: """获取制表符停靠位置""" return self._tab_stop class WrapTogetherSpan(CharacterStyle): """WrapTogetherSpan — 一起换行 Span""" def __init__(self): super().__init__() class ParagraphStyle(Stub): """ParagraphStyle — 段落样式标记接口""" def __init__(self): super().__init__() # ═══════════════════════════════════════════════════════════════ # DrawableMarginSpan / IconMarginSpan # ═══════════════════════════════════════════════════════════════ class DrawableMarginSpan(CharacterStyle): """DrawableMarginSpan — 可绘制边距 Span""" def __init__(self, drawable: Any = None, pad: int = 0): super().__init__() self._drawable = drawable self._pad = pad class IconMarginSpan(CharacterStyle): """IconMarginSpan — 图标边距 Span""" def __init__(self, bitmap: Any = None, pad: int = 0): super().__init__() self._bitmap = bitmap self._pad = pad # ═══════════════════════════════════════════════════════════════ # EasyEditSpan / SpellCheckSpan # ═══════════════════════════════════════════════════════════════ class EasyEditSpan(CharacterStyle): """EasyEditSpan — 简易编辑 Span""" def __init__(self): super().__init__() class SpellCheckSpan(CharacterStyle): """SpellCheckSpan — 拼写检查 Span""" def __init__(self, spell_checking: bool = True): super().__init__() self._spell_checking = spell_checking def isSpellCheckEnabled(self) -> bool: """检查拼写检查是否启用""" return self._spell_checking def setSpellCheckEnabled(self, enabled: bool) -> None: """设置拼写检查启用""" self._spell_checking = enabled # ═══════════════════════════════════════════════════════════════ # SuggestionSpan # ═══════════════════════════════════════════════════════════════ class SuggestionSpan(CharacterStyle): """SuggestionSpan — 建议 Span""" FLAG_EASY_CORRECT = 0x0001 FLAG_MISSPELLED = 0x0002 FLAG_AUTO_CORRECTION = 0x0004 FLAG_GRAMMAR_ERROR = 0x0008 FLAG_PERSONAL_NAME = 0x0010 FLAG_COMPATIBILITY = 0x0020 SUGGESTIONS_MAX_SIZE = 5 def __init__(self, locale: Optional[Any] = None, suggestions: Optional[List[str]] = None, flags: int = 0, underline_color: int = 0): super().__init__() self._locale = locale self._suggestions = suggestions or [] self._flags = flags self._underline_color = underline_color def getLocale(self) -> Optional[Any]: """获取区域设置""" return self._locale def getSuggestions(self) -> List[str]: """获取建议列表""" return self._suggestions.copy() def getUnderlineColor(self) -> int: """获取下划线颜色""" return self._underline_color def setUnderlineColor(self, color: int) -> None: """设置下划线颜色""" self._underline_color = color def getFlags(self) -> int: """获取标志""" return self._flags def setFlags(self, flags: int) -> None: """设置标志""" self._flags = flags @staticmethod def getSuggestionsFromContext(context: Any, locale: Any, query: str, max_results: int = SUGGESTIONS_MAX_SIZE) -> List[str]: """从上下文中获取建议""" return [] # ═══════════════════════════════════════════════════════════════ # TextAppearanceSpan # ═══════════════════════════════════════════════════════════════ class TextAppearanceSpan(MetricAffectingSpan): """TextAppearanceSpan — 文字外观 Span""" def __init__(self, context: Any = None, appearance_id: int = 0, family: str = "sans-serif", text_size: Optional[int] = None, text_color: Optional[int] = None, link_text_color: Optional[int] = None): super().__init__() self._family = family self._text_size = text_size self._text_color = text_color self._link_text_color = link_text_color def getFamily(self) -> str: """获取字体名称""" return self._family def getTextSize(self) -> Optional[int]: """获取字号""" return self._text_size def getTextColor(self) -> Optional[int]: """获取文字颜色""" return self._text_color def getTextColorLink(self) -> Optional[int]: """获取链接文字颜色""" return self._link_text_color def getLinkTextColor(self) -> Optional[int]: """获取链接文字颜色""" return self._link_text_color def updateDrawState(self, tp: Any) -> None: if self._text_color is not None and hasattr(tp, 'color'): tp.color = self._text_color if self._text_size is not None and hasattr(tp, 'textSize'): tp.textSize = float(self._text_size) if hasattr(tp, 'typeface'): tp.typeface = self._family def updateMeasureState(self, tp: Any) -> None: if self._text_size is not None and hasattr(tp, 'textSize'): tp.textSize = float(self._text_size) # ═══════════════════════════════════════════════════════════════ # LocaleSpan # ═══════════════════════════════════════════════════════════════ class LocaleSpan(MetricAffectingSpan): """LocaleSpan — 区域设置 Span""" def __init__(self, locale: Any = None): super().__init__() self._locale = locale def getLocale(self) -> Any: """获取区域设置""" return self._locale def updateDrawState(self, tp: Any) -> None: pass def updateMeasureState(self, tp: Any) -> None: pass # ═══════════════════════════════════════════════════════════════ # ReplacementSpan # ═══════════════════════════════════════════════════════════════ class ReplacementSpan(CharacterStyle): """ReplacementSpan — 替换 Span""" def __init__(self): super().__init__() def draw(self, canvas: Any, text: str, start: int, end: int, x: float, top: int, y: float, bottom: int, paint: Any) -> None: """绘制替换内容""" pass def getSize(self, paint: Any, text: str, start: int, end: int, fontMetrics: Optional[Any]) -> int: """获取尺寸""" return 0 def updateMeasureState(self, tp: Any) -> None: pass # ═══════════════════════════════════════════════════════════════ # DynamicDrawableSpan # ═══════════════════════════════════════════════════════════════ class DynamicDrawableSpan(ReplacementSpan): """DynamicDrawableSpan — 动态可绘制 Span""" ALIGN_BOTTOM = 0 ALIGN_BASELINE = 1 ALIGN_CENTER = 2 def __init__(self, vertical_alignment: int = ALIGN_BOTTOM): super().__init__() self._vertical_alignment = vertical_alignment def getDrawable(self) -> Any: """获取可绘制对象""" return None def draw(self, canvas: Any, text: str, start: int, end: int, x: float, top: int, y: float, bottom: int, paint: Any) -> None: drawable = self.getDrawable() if drawable: pass def getSize(self, paint: Any, text: str, start: int, end: int, fontMetrics: Optional[Any]) -> int: drawable = self.getDrawable() if drawable and hasattr(drawable, 'getIntrinsicWidth'): return drawable.getIntrinsicWidth() return 0 # ═══════════════════════════════════════════════════════════════ # MaskFilterSpan / RasterizerSpan / ShadowStyleSpan # ═══════════════════════════════════════════════════════════════ class MaskFilterSpan(CharacterStyle): """MaskFilterSpan — 遮罩滤镜 Span""" def __init__(self, filter_: Any = None): super().__init__() self._filter = filter_ def getMaskFilter(self) -> Any: """获取遮罩滤镜""" return self._filter def updateDrawState(self, tp: Any) -> None: if hasattr(tp, 'maskFilter'): tp.maskFilter = self._filter class RasterizerSpan(CharacterStyle): """RasterizerSpan — 光栅化 Span""" def __init__(self, rasterizer: Any = None): super().__init__() self._rasterizer = rasterizer def getRasterizer(self) -> Any: """获取光栅化器""" return self._rasterizer def updateDrawState(self, tp: Any) -> None: if hasattr(tp, 'rasterizer'): tp.rasterizer = self._rasterizer class ShadowStyleSpan(CharacterStyle): """ShadowStyleSpan — 阴影样式 Span""" def __init__(self, radius: float = 1.0, dx: float = 0, dy: float = 0, color: int = 0): super().__init__() self._radius = radius self._dx = dx self._dy = dy self._color = color def updateDrawState(self, tp: Any) -> None: if hasattr(tp, 'setShadowLayer'): tp.setShadowLayer(self._radius, self._dx, self._dy, self._color) # ═══════════════════════════════════════════════════════════════ # TtsSpan # ═══════════════════════════════════════════════════════════════ class TtsSpan(CharacterStyle): """TtsSpan — 文本转语音 Span""" TYPE_DATE = "android.type.date" TYPE_DELIMITER = "android.type.delimiter" TYPE_DIGITS = "android.type.digits" TYPE_ELECTRONIC = "android.type.electronic" TYPE_FRACTION = "android.type.fraction" TYPE_MEASURE = "android.type.measure" TYPE_MONEY = "android.type.money" TYPE_NUMBER = "android.type.number" TYPE_ORDINAL = "android.type.ordinal" TYPE_PERCENTAGE = "android.type.percentage" TYPE_TELEPHONE = "android.type.telephone" TYPE_TEXT = "android.type.text" TYPE_TIME = "android.type.time" TYPE_VERBATIM = "android.type.verbatim" ARG_TEXT = "android.arg.text" ARG_QUANTITY = "android.arg.quantity" ARG_MINUTES = "android.arg.minutes" ARG_HOURS = "android.arg.hours" ARG_DAY = "android.arg.day" ARG_MONTH = "android.arg.month" ARG_YEAR = "android.arg.year" ARG_WEEKDAY = "android.arg.weekday" ARG_COUNTRY_CODE = "android.arg.country_code" ARG_NUMBER_PARTS = "android.arg.number_parts" ARG_NUMBER_TYPE = "android.arg.number_type" ARG_NUMBER_GROUP = "android.arg.number_group" ARG_MONEY = "android.arg.money" ARG_CURRENCY = "android.arg.currency" ARG_AMOUNT = "android.arg.amount" ARG_FRACTION_DENOMINATOR = "android.arg.fraction_denominator" ARG_FRACTION_NUMERATOR = "android.arg.fraction_numerator" ARG_FRACTION_TYPE = "android.arg.fraction_type" ARG_INTEGER_PART = "android.arg.integer_part" def __init__(self, type_: str = TYPE_TEXT, args: Optional[Dict[str, str]] = None): super().__init__() self._type = type_ self._args = args or {} def getType(self) -> str: """获取 TTS 类型""" return self._type def getArgs(self) -> Dict[str, str]: """获取参数""" return self._args.copy() def toString(self) -> str: return f"TtsSpan(type={self._type}, args={self._args})"