From e9565bf70b1a917030543a3b62e926375ac4e0bf Mon Sep 17 00:00:00 2001 From: Manuel Cillero Date: Sun, 28 Dec 2025 18:00:26 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20Mejora=20rendimiento=20de?= =?UTF-8?q?=20b=C3=BAsquedas=20de=20clases?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/html/classes.rs | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/src/html/classes.rs b/src/html/classes.rs index 2fd2fbf4..0dec5fd8 100644 --- a/src/html/classes.rs +++ b/src/html/classes.rs @@ -133,9 +133,37 @@ impl Classes { } } - /// Devuelve `true` si la clase está presente. + /// Devuelve `true` si **una única clase** está presente. + /// + /// Si necesitas comprobar varias clases separadas por espacios, usa [`contains_all`] o + /// [`contains_any`]. pub fn contains(&self, class: impl AsRef) -> bool { - let class = class.as_ref().to_ascii_lowercase(); - self.0.iter().any(|c| c == &class) + self.contains_class(class.as_ref()) + } + + /// Devuelve `true` si **todas** las clases indicadas están presentes. + pub fn contains_all(&self, classes: impl AsRef) -> bool { + classes + .as_ref() + .split_ascii_whitespace() + .all(|class| self.contains_class(class)) + } + + /// Devuelve `true` si **alguna** de las clases indicadas está presente. + pub fn contains_any(&self, classes: impl AsRef) -> bool { + classes + .as_ref() + .split_ascii_whitespace() + .any(|class| self.contains_class(class)) + } + + #[inline] + fn contains_class(&self, class: &str) -> bool { + if class.bytes().any(|b| b.is_ascii_uppercase()) { + let class = class.to_ascii_lowercase(); + self.0.iter().any(|c| c == &class) + } else { + self.0.iter().any(|c| c == class) + } } }