64 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import typing as t
 | 
						|
 | 
						|
from . import Markup
 | 
						|
 | 
						|
 | 
						|
def escape(s: t.Any) -> Markup:
 | 
						|
    """Replace the characters ``&``, ``<``, ``>``, ``'``, 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("&", "&")
 | 
						|
        .replace(">", ">")
 | 
						|
        .replace("<", "<")
 | 
						|
        .replace("'", "'")
 | 
						|
        .replace('"', """)
 | 
						|
    )
 | 
						|
 | 
						|
 | 
						|
def escape_silent(s: t.Optional[t.Any]) -> 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``.
 | 
						|
 | 
						|
    >>> escape(None)
 | 
						|
    Markup('None')
 | 
						|
    >>> escape_silent(None)
 | 
						|
    Markup('')
 | 
						|
    """
 | 
						|
    if s is None:
 | 
						|
        return Markup()
 | 
						|
 | 
						|
    return escape(s)
 | 
						|
 | 
						|
 | 
						|
def soft_str(s: t.Any) -> 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.
 | 
						|
 | 
						|
    >>> value = escape("<User 1>")
 | 
						|
    >>> value
 | 
						|
    Markup('<User 1>')
 | 
						|
    >>> escape(str(value))
 | 
						|
    Markup('&lt;User 1&gt;')
 | 
						|
    >>> escape(soft_str(value))
 | 
						|
    Markup('<User 1>')
 | 
						|
    """
 | 
						|
    if not isinstance(s, str):
 | 
						|
        return str(s)
 | 
						|
 | 
						|
    return s
 |