mirror of
https://github.com/django/django.git
synced 2025-06-05 03:29:12 +00:00
Refs #30686 -- Moved Parser.SELF_CLOSING_TAGS to django.utils.html.VOID_ELEMENTS
This commit is contained in:
parent
6f1b8c00d8
commit
1d0dfc0b92
@ -2,6 +2,7 @@
|
|||||||
import html
|
import html
|
||||||
from html.parser import HTMLParser
|
from html.parser import HTMLParser
|
||||||
|
|
||||||
|
from django.utils.html import VOID_ELEMENTS
|
||||||
from django.utils.regex_helper import _lazy_re_compile
|
from django.utils.regex_helper import _lazy_re_compile
|
||||||
|
|
||||||
# ASCII whitespace is U+0009 TAB, U+000A LF, U+000C FF, U+000D CR, or U+0020
|
# ASCII whitespace is U+0009 TAB, U+000A LF, U+000C FF, U+000D CR, or U+0020
|
||||||
@ -200,27 +201,6 @@ class HTMLParseError(Exception):
|
|||||||
|
|
||||||
|
|
||||||
class Parser(HTMLParser):
|
class Parser(HTMLParser):
|
||||||
# https://html.spec.whatwg.org/#void-elements
|
|
||||||
SELF_CLOSING_TAGS = {
|
|
||||||
"area",
|
|
||||||
"base",
|
|
||||||
"br",
|
|
||||||
"col",
|
|
||||||
"embed",
|
|
||||||
"hr",
|
|
||||||
"img",
|
|
||||||
"input",
|
|
||||||
"link",
|
|
||||||
"meta",
|
|
||||||
"param",
|
|
||||||
"source",
|
|
||||||
"track",
|
|
||||||
"wbr",
|
|
||||||
# Deprecated tags
|
|
||||||
"frame",
|
|
||||||
"spacer",
|
|
||||||
}
|
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.root = RootElement()
|
self.root = RootElement()
|
||||||
@ -248,14 +228,14 @@ class Parser(HTMLParser):
|
|||||||
|
|
||||||
def handle_startendtag(self, tag, attrs):
|
def handle_startendtag(self, tag, attrs):
|
||||||
self.handle_starttag(tag, attrs)
|
self.handle_starttag(tag, attrs)
|
||||||
if tag not in self.SELF_CLOSING_TAGS:
|
if tag not in VOID_ELEMENTS:
|
||||||
self.handle_endtag(tag)
|
self.handle_endtag(tag)
|
||||||
|
|
||||||
def handle_starttag(self, tag, attrs):
|
def handle_starttag(self, tag, attrs):
|
||||||
attrs = normalize_attributes(attrs)
|
attrs = normalize_attributes(attrs)
|
||||||
element = Element(tag, attrs)
|
element = Element(tag, attrs)
|
||||||
self.current.append(element)
|
self.current.append(element)
|
||||||
if tag not in self.SELF_CLOSING_TAGS:
|
if tag not in VOID_ELEMENTS:
|
||||||
self.open_tags.append(element)
|
self.open_tags.append(element)
|
||||||
self.element_positions[element] = self.getpos()
|
self.element_positions[element] = self.getpos()
|
||||||
|
|
||||||
|
@ -15,6 +15,27 @@ from django.utils.regex_helper import _lazy_re_compile
|
|||||||
from django.utils.safestring import SafeData, SafeString, mark_safe
|
from django.utils.safestring import SafeData, SafeString, mark_safe
|
||||||
from django.utils.text import normalize_newlines
|
from django.utils.text import normalize_newlines
|
||||||
|
|
||||||
|
# https://html.spec.whatwg.org/#void-elements
|
||||||
|
VOID_ELEMENTS = {
|
||||||
|
"area",
|
||||||
|
"base",
|
||||||
|
"br",
|
||||||
|
"col",
|
||||||
|
"embed",
|
||||||
|
"hr",
|
||||||
|
"img",
|
||||||
|
"input",
|
||||||
|
"link",
|
||||||
|
"meta",
|
||||||
|
"param",
|
||||||
|
"source",
|
||||||
|
"track",
|
||||||
|
"wbr",
|
||||||
|
# Deprecated tags.
|
||||||
|
"frame",
|
||||||
|
"spacer",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@keep_lazy(SafeString)
|
@keep_lazy(SafeString)
|
||||||
def escape(text):
|
def escape(text):
|
||||||
|
@ -46,6 +46,7 @@ from django.test.utils import (
|
|||||||
)
|
)
|
||||||
from django.urls import NoReverseMatch, path, reverse, reverse_lazy
|
from django.urls import NoReverseMatch, path, reverse, reverse_lazy
|
||||||
from django.utils.deprecation import RemovedInDjango51Warning
|
from django.utils.deprecation import RemovedInDjango51Warning
|
||||||
|
from django.utils.html import VOID_ELEMENTS
|
||||||
from django.utils.version import PY311
|
from django.utils.version import PY311
|
||||||
|
|
||||||
from .models import Car, Person, PossessedCar
|
from .models import Car, Person, PossessedCar
|
||||||
@ -657,27 +658,8 @@ class HTMLEqualTests(SimpleTestCase):
|
|||||||
self.assertEqual(len(dom.children), 1)
|
self.assertEqual(len(dom.children), 1)
|
||||||
self.assertEqual(dom.children[0], "<p>foo</p> '</scr'+'ipt>' <span>bar</span>")
|
self.assertEqual(dom.children[0], "<p>foo</p> '</scr'+'ipt>' <span>bar</span>")
|
||||||
|
|
||||||
def test_self_closing_tags(self):
|
def test_void_elements(self):
|
||||||
self_closing_tags = [
|
for tag in VOID_ELEMENTS:
|
||||||
"area",
|
|
||||||
"base",
|
|
||||||
"br",
|
|
||||||
"col",
|
|
||||||
"embed",
|
|
||||||
"hr",
|
|
||||||
"img",
|
|
||||||
"input",
|
|
||||||
"link",
|
|
||||||
"meta",
|
|
||||||
"param",
|
|
||||||
"source",
|
|
||||||
"track",
|
|
||||||
"wbr",
|
|
||||||
# Deprecated tags
|
|
||||||
"frame",
|
|
||||||
"spacer",
|
|
||||||
]
|
|
||||||
for tag in self_closing_tags:
|
|
||||||
with self.subTest(tag):
|
with self.subTest(tag):
|
||||||
dom = parse_html("<p>Hello <%s> world</p>" % tag)
|
dom = parse_html("<p>Hello <%s> world</p>" % tag)
|
||||||
self.assertEqual(len(dom.children), 3)
|
self.assertEqual(len(dom.children), 3)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user