Don't warn if the tag is nested inside a <script> or inside a <style>

This commit is contained in:
Guillaume Gomez 2020-09-27 16:15:26 +02:00
parent b2321bb8da
commit 30cabfd215
2 changed files with 26 additions and 1 deletions

View file

@ -48,8 +48,11 @@ fn drop_tag(
if let Some(pos) = tags.iter().rev().position(|(t, _)| *t == tag_name) {
// Because this is from a `rev` iterator, the position is reversed as well!
let pos = tags.len() - 1 - pos;
// If the tag is nested inside a "<script>", not warning should be emitted.
let should_not_warn =
tags.iter().take(pos + 1).any(|(at, _)| at == "script" || at == "style");
for (last_tag_name, last_tag_span) in tags.drain(pos + 1..) {
if ALLOWED_UNCLOSED.iter().any(|&at| at == &last_tag_name) {
if should_not_warn || ALLOWED_UNCLOSED.iter().any(|&at| at == &last_tag_name) {
continue;
}
// `tags` is used as a queue, meaning that everything after `pos` is included inside it.

View file

@ -39,3 +39,25 @@ pub fn b() {}
/// <h3>
//~^ ERROR unclosed HTML tag `h3`
pub fn c() {}
// Unclosed tags shouldn't warn if they are nested inside a <script> elem.
/// <script>
/// <h3><div>
/// </script>
/// <script>
/// <div>
/// <p>
/// </div>
/// </script>
pub fn d() {}
// Unclosed tags shouldn't warn if they are nested inside a <style> elem.
/// <style>
/// <h3><div>
/// </style>
/// <style>
/// <div>
/// <p>
/// </div>
/// </style>
pub fn e() {}