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 = explode(' ', $value);
$classes = array_merge($tagInfo['classes'], $classes); $classes = array_merge($tagInfo['classes'], $classes);
$classes = array_unique($classes); $classes = array_unique($classes);
// identify remove classes $forceAddClasses = [];
$removeMatchClasses = [];
// identify force add and remove classes
foreach($classes as $key => $class) { foreach($classes as $key => $class) {
if(strpos($class, '-') !== 0) continue; if(strpos($class, '+') === 0){
$removeClass = ltrim($class, '-'); $class = ltrim($class, '+');
unset($classes[$key]); $forceAddClasses[$class] = $class;
while(false !== ($k = array_search($removeClass, $classes))) unset($classes[$k]); 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 { } else {
// replace // replace
$attrs[$name] = $value; $attrs[$name] = $value;