<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">import typing as t

from . import Markup


def escape(s: t.Any) -&gt; Markup:
    """Replace the characters ``&amp;``, ``&lt;``, ``&gt;``, ``'``, and ``"`` in
    the string with HTML-safe sequences. Use this if you need to display
    text that might contain such characters in HTML.

    If the object has an ``__html__`` method, it is called and the
    return value is assumed to already be safe for HTML.

    :param s: An object to be converted to a string and escaped.
    :return: A :class:`Markup` string with the escaped text.
    """
    if hasattr(s, "__html__"):
        return Markup(s.__html__())

    return Markup(
        str(s)
        .replace("&amp;", "&amp;amp;")
        .replace("&gt;", "&amp;gt;")
        .replace("&lt;", "&amp;lt;")
        .replace("'", "&amp;#39;")
        .replace('"', "&amp;#34;")
    )


def escape_silent(s: t.Optional[t.Any]) -&gt; Markup:
    """Like :func:`escape` but treats ``None`` as the empty string.
    Useful with optional values, as otherwise you get the string
    ``'None'`` when the value is ``None``.

    &gt;&gt;&gt; escape(None)
    Markup('None')
    &gt;&gt;&gt; escape_silent(None)
    Markup('')
    """
    if s is None:
        return Markup()

    return escape(s)


def soft_str(s: t.Any) -&gt; str:
    """Convert an object to a string if it isn't already. This preserves
    a :class:`Markup` string rather than converting it back to a basic
    string, so it will still be marked as safe and won't be escaped
    again.

    &gt;&gt;&gt; value = escape("&lt;User 1&gt;")
    &gt;&gt;&gt; value
    Markup('&amp;lt;User 1&amp;gt;')
    &gt;&gt;&gt; escape(str(value))
    Markup('&amp;amp;lt;User 1&amp;amp;gt;')
    &gt;&gt;&gt; escape(soft_str(value))
    Markup('&amp;lt;User 1&amp;gt;')
    """
    if not isinstance(s, str):
        return str(s)

    return s


def soft_unicode(s: t.Any) -&gt; str:
    import warnings

    warnings.warn(
        "'soft_unicode' has been renamed to 'soft_str'. The old name"
        " will be removed in MarkupSafe 2.1.",
        DeprecationWarning,
        stacklevel=2,
    )
    return soft_str(s)
</pre></body></html>