1# -*- coding: utf-8 -*-
2"""
3    markupsafe._native
4    ~~~~~~~~~~~~~~~~~~
5
6    Native Python implementation the C module is not compiled.
7
8    :copyright: (c) 2010 by Armin Ronacher.
9    :license: BSD, see LICENSE for more details.
10"""
11from markupsafe import Markup
12from markupsafe._compat import text_type
13
14
15def escape(s):
16    """Convert the characters &, <, >, ' and " in string s to HTML-safe
17    sequences.  Use this if you need to display text that might contain
18    such characters in HTML.  Marks return value as markup string.
19    """
20    if hasattr(s, '__html__'):
21        return s.__html__()
22    return Markup(text_type(s)
23        .replace('&', '&amp;')
24        .replace('>', '&gt;')
25        .replace('<', '&lt;')
26        .replace("'", '&#39;')
27        .replace('"', '&#34;')
28    )
29
30
31def escape_silent(s):
32    """Like :func:`escape` but converts `None` into an empty
33    markup string.
34    """
35    if s is None:
36        return Markup()
37    return escape(s)
38
39
40def soft_unicode(s):
41    """Make a string unicode if it isn't already.  That way a markup
42    string is not converted back to unicode.
43    """
44    if not isinstance(s, text_type):
45        s = text_type(s)
46    return s
47