ยปCore Development>Code coverage>Lib/html/__init__.py

Python code coverage for Lib/html/__init__.py

#countcontent
1n/a"""
2n/aGeneral functions for HTML manipulation.
3n/a"""
4n/a
5n/aimport re as _re
6n/afrom html.entities import html5 as _html5
7n/a
8n/a
9n/a__all__ = ['escape', 'unescape']
10n/a
11n/a
12n/adef escape(s, quote=True):
13n/a """
14n/a Replace special characters "&", "<" and ">" to HTML-safe sequences.
15n/a If the optional flag quote is true (the default), the quotation mark
16n/a characters, both double quote (") and single quote (') characters are also
17n/a translated.
18n/a """
19n/a s = s.replace("&", "&amp;") # Must be done first!
20n/a s = s.replace("<", "&lt;")
21n/a s = s.replace(">", "&gt;")
22n/a if quote:
23n/a s = s.replace('"', "&quot;")
24n/a s = s.replace('\'', "&#x27;")
25n/a return s
26n/a
27n/a
28n/a# see http://www.w3.org/TR/html5/syntax.html#tokenizing-character-references
29n/a
30n/a_invalid_charrefs = {
31n/a 0x00: '\ufffd', # REPLACEMENT CHARACTER
32n/a 0x0d: '\r', # CARRIAGE RETURN
33n/a 0x80: '\u20ac', # EURO SIGN
34n/a 0x81: '\x81', # <control>
35n/a 0x82: '\u201a', # SINGLE LOW-9 QUOTATION MARK
36n/a 0x83: '\u0192', # LATIN SMALL LETTER F WITH HOOK
37n/a 0x84: '\u201e', # DOUBLE LOW-9 QUOTATION MARK
38n/a 0x85: '\u2026', # HORIZONTAL ELLIPSIS
39n/a 0x86: '\u2020', # DAGGER
40n/a 0x87: '\u2021', # DOUBLE DAGGER
41n/a 0x88: '\u02c6', # MODIFIER LETTER CIRCUMFLEX ACCENT
42n/a 0x89: '\u2030', # PER MILLE SIGN
43n/a 0x8a: '\u0160', # LATIN CAPITAL LETTER S WITH CARON
44n/a 0x8b: '\u2039', # SINGLE LEFT-POINTING ANGLE QUOTATION MARK
45n/a 0x8c: '\u0152', # LATIN CAPITAL LIGATURE OE
46n/a 0x8d: '\x8d', # <control>
47n/a 0x8e: '\u017d', # LATIN CAPITAL LETTER Z WITH CARON
48n/a 0x8f: '\x8f', # <control>
49n/a 0x90: '\x90', # <control>
50n/a 0x91: '\u2018', # LEFT SINGLE QUOTATION MARK
51n/a 0x92: '\u2019', # RIGHT SINGLE QUOTATION MARK
52n/a 0x93: '\u201c', # LEFT DOUBLE QUOTATION MARK
53n/a 0x94: '\u201d', # RIGHT DOUBLE QUOTATION MARK
54n/a 0x95: '\u2022', # BULLET
55n/a 0x96: '\u2013', # EN DASH
56n/a 0x97: '\u2014', # EM DASH
57n/a 0x98: '\u02dc', # SMALL TILDE
58n/a 0x99: '\u2122', # TRADE MARK SIGN
59n/a 0x9a: '\u0161', # LATIN SMALL LETTER S WITH CARON
60n/a 0x9b: '\u203a', # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
61n/a 0x9c: '\u0153', # LATIN SMALL LIGATURE OE
62n/a 0x9d: '\x9d', # <control>
63n/a 0x9e: '\u017e', # LATIN SMALL LETTER Z WITH CARON
64n/a 0x9f: '\u0178', # LATIN CAPITAL LETTER Y WITH DIAERESIS
65n/a}
66n/a
67n/a_invalid_codepoints = {
68n/a # 0x0001 to 0x0008
69n/a 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
70n/a # 0x000E to 0x001F
71n/a 0xe, 0xf, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
72n/a 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
73n/a # 0x007F to 0x009F
74n/a 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a,
75n/a 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
76n/a 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
77n/a # 0xFDD0 to 0xFDEF
78n/a 0xfdd0, 0xfdd1, 0xfdd2, 0xfdd3, 0xfdd4, 0xfdd5, 0xfdd6, 0xfdd7, 0xfdd8,
79n/a 0xfdd9, 0xfdda, 0xfddb, 0xfddc, 0xfddd, 0xfdde, 0xfddf, 0xfde0, 0xfde1,
80n/a 0xfde2, 0xfde3, 0xfde4, 0xfde5, 0xfde6, 0xfde7, 0xfde8, 0xfde9, 0xfdea,
81n/a 0xfdeb, 0xfdec, 0xfded, 0xfdee, 0xfdef,
82n/a # others
83n/a 0xb, 0xfffe, 0xffff, 0x1fffe, 0x1ffff, 0x2fffe, 0x2ffff, 0x3fffe, 0x3ffff,
84n/a 0x4fffe, 0x4ffff, 0x5fffe, 0x5ffff, 0x6fffe, 0x6ffff, 0x7fffe, 0x7ffff,
85n/a 0x8fffe, 0x8ffff, 0x9fffe, 0x9ffff, 0xafffe, 0xaffff, 0xbfffe, 0xbffff,
86n/a 0xcfffe, 0xcffff, 0xdfffe, 0xdffff, 0xefffe, 0xeffff, 0xffffe, 0xfffff,
87n/a 0x10fffe, 0x10ffff
88n/a}
89n/a
90n/a
91n/adef _replace_charref(s):
92n/a s = s.group(1)
93n/a if s[0] == '#':
94n/a # numeric charref
95n/a if s[1] in 'xX':
96n/a num = int(s[2:].rstrip(';'), 16)
97n/a else:
98n/a num = int(s[1:].rstrip(';'))
99n/a if num in _invalid_charrefs:
100n/a return _invalid_charrefs[num]
101n/a if 0xD800 <= num <= 0xDFFF or num > 0x10FFFF:
102n/a return '\uFFFD'
103n/a if num in _invalid_codepoints:
104n/a return ''
105n/a return chr(num)
106n/a else:
107n/a # named charref
108n/a if s in _html5:
109n/a return _html5[s]
110n/a # find the longest matching name (as defined by the standard)
111n/a for x in range(len(s)-1, 1, -1):
112n/a if s[:x] in _html5:
113n/a return _html5[s[:x]] + s[x:]
114n/a else:
115n/a return '&' + s
116n/a
117n/a
118n/a_charref = _re.compile(r'&(#[0-9]+;?'
119n/a r'|#[xX][0-9a-fA-F]+;?'
120n/a r'|[^\t\n\f <&#;]{1,32};?)')
121n/a
122n/adef unescape(s):
123n/a """
124n/a Convert all named and numeric character references (e.g. &gt;, &#62;,
125n/a &x3e;) in the string s to the corresponding unicode characters.
126n/a This function uses the rules defined by the HTML 5 standard
127n/a for both valid and invalid character references, and the list of
128n/a HTML 5 named character references defined in html.entities.html5.
129n/a """
130n/a if '&' not in s:
131n/a return s
132n/a return _charref.sub(_replace_charref, s)