1
0
mirror of https://github.com/processwire/processwire.git synced 2025-08-10 16:54:44 +02:00

Add support in MarkupRegions for removing class names by wildcard. For instance, <div id="content" class="-uk-width-*" pw-append></div> would remove all class names from #content div starting with "uk-width-". Regex patterns are also supported when pattern is identifed by /, i.e. <div id="content" class="-/^uk-(text|width).+$/" pw-append></div> would remove all class names from $content starting with "uk-text" or "uk-width".

This commit is contained in:
Ryan Cramer
2025-04-17 12:03:53 -04:00
parent 570bdb4b81
commit b4ddc89fb9

View File

@@ -956,14 +956,38 @@ class WireMarkupRegions extends Wire {
$classes = explode(' ', $value);
$classes = array_merge($tagInfo['classes'], $classes);
$classes = array_unique($classes);
// identify remove classes
$forceAddClasses = [];
$removeMatchClasses = [];
// identify force add and remove classes
foreach($classes as $key => $class) {
if(strpos($class, '-') !== 0) continue;
$removeClass = ltrim($class, '-');
if(strpos($class, '+') === 0){
$class = ltrim($class, '+');
$forceAddClasses[$class] = $class;
unset($classes[$key]);
} else if(strpos($class, '-') === 0) {
$removeClass = substr($class, 1);
if(strpos($removeClass, '*') !== false) $removeMatchClasses[] = $removeClass;
unset($classes[$key]);
while(false !== ($k = array_search($removeClass, $classes))) unset($classes[$k]);
}
$attrs['class'] = implode(' ', $classes);
}
if(count($classes) && count($removeMatchClasses)) {
foreach($removeMatchClasses as $removeClass) {
if(strpos($removeClass, '/') === 0) {
// already a regex
if(strrpos($removeClass, '/') === 0) $removeClass .= '/';
} else {
// convert wildcard to regex
$removeClass = '/^' . str_replace('\\*', '.+', preg_quote($removeClass, '/')) . '$/';
}
foreach($classes as $key => $class) {
if(preg_match($removeClass, $class)) {
unset($classes[$key]);
}
}
}
}
$attrs['class'] = implode(' ', array_merge($forceAddClasses, $classes));
} else {
// replace
$attrs[$name] = $value;