summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--_test/tests/lib/exe/css_css_compress.test.php40
-rw-r--r--lib/exe/css.php13
2 files changed, 52 insertions, 1 deletions
diff --git a/_test/tests/lib/exe/css_css_compress.test.php b/_test/tests/lib/exe/css_css_compress.test.php
index a7c87b6a7..a614ea2fd 100644
--- a/_test/tests/lib/exe/css_css_compress.test.php
+++ b/_test/tests/lib/exe/css_css_compress.test.php
@@ -62,6 +62,46 @@ class css_css_compress_test extends DokuWikiTest {
$this->assertEquals(css_compress($text), 'a{left:20px;top:20px}');
}
+ function test_shortening() {
+ $input = array(
+ 'margin:0em 0em 0em 0em ul.test margin:0em :0em div#FFFFFF {',
+ 'margin: 1px 1px 1px 1px;',
+ 'padding: 1px 2px 1px 2px;',
+ 'margin: 1px 2px 3px 1px;',
+ 'padding: 1px 2px 3px 4px;',
+ 'margin: 00.00em 0em 01.00px 0em;',
+ 'padding: 0010em 0010.00em 00.00em 00.00100em;',
+ 'padding: 0010% 0010.00% 00.00% 00.00100xxx;',
+ 'padding: 0.0em .0em 0.em 00.00em;',
+ 'padding: 01.0em;',
+ 'color: #FFFFFF;',
+ 'color: #777777;',
+ 'color: #123456;',
+ 'border: 01.0em solid #ffffff;',
+ );
+
+ $expected = array(
+ 'margin:0em 0em 0em 0em ul.test margin:0em :0em div#FFFFFF{',
+ 'margin:1px;',
+ 'padding:1px 2px;',
+ 'margin:1px 2px 3px 1px;',
+ 'padding:1px 2px 3px 4px;',
+ 'margin:0 0 1px 0;',
+ 'padding:10em 10em 0 .001em;',
+ 'padding:10% 10% 0 00.00100xxx;',
+ 'padding:0;',
+ 'padding:1em;',
+ 'color:#FFF;',
+ 'color:#777;',
+ 'color:#123456;',
+ 'border:1em solid #fff;',
+ );
+
+ $input = array_map('css_compress', $input);
+
+ $this->assertEquals($expected, $input);
+ }
+
}
//Setup VIM: ex: et ts=4 :
diff --git a/lib/exe/css.php b/lib/exe/css.php
index afba5fc02..6dfdf06e8 100644
--- a/lib/exe/css.php
+++ b/lib/exe/css.php
@@ -473,8 +473,19 @@ function css_compress($css){
$css = preg_replace('/ ?([;,{}\/]) ?/','\\1',$css);
$css = preg_replace('/ ?: /',':',$css);
+ // number compression
+ $css = preg_replace('/([: ])0+(\.\d+?)0*((?:pt|pc|in|mm|cm|em|ex|px)\b|%)(?=[^\{]*[;\}])/', '$1$2$3', $css); // "0.1em" to ".1em", "1.10em" to "1.1em"
+ $css = preg_replace('/([: ])\.(0)+((?:pt|pc|in|mm|cm|em|ex|px)\b|%)(?=[^\{]*[;\}])/', '$1$2', $css); // ".0em" to "0"
+ $css = preg_replace('/([: ]0)0*(\.0*)?((?:pt|pc|in|mm|cm|em|ex|px)(?=[^\{]*[;\}])\b|%)/', '$1', $css); // "0.0em" to "0"
+ $css = preg_replace('/([: ]\d+)(\.0*)((?:pt|pc|in|mm|cm|em|ex|px)(?=[^\{]*[;\}])\b|%)/', '$1$3', $css); // "1.0em" to "1em"
+ $css = preg_replace('/([: ])0+(\d+|\d*\.\d+)((?:pt|pc|in|mm|cm|em|ex|px)(?=[^\{]*[;\}])\b|%)/', '$1$2$3', $css); // "001em" to "1em"
+
+ // shorten attributes (1em 1em 1em 1em -> 1em)
+ $css = preg_replace('/(?<![\w\-])((?:margin|padding|border|border-(?:width|radius)):)([\w\.]+)( \2)+(?=[;\}]| !)/', '$1$2', $css); // "1em 1em 1em 1em" to "1em"
+ $css = preg_replace('/(?<![\w\-])((?:margin|padding|border|border-(?:width)):)([\w\.]+) ([\w\.]+) \2 \3(?=[;\}]| !)/', '$1$2 $3', $css); // "1em 2em 1em 2em" to "1em 2em"
+
// shorten colors
- $css = preg_replace("/#([0-9a-fA-F]{1})\\1([0-9a-fA-F]{1})\\2([0-9a-fA-F]{1})\\3/", "#\\1\\2\\3",$css);
+ $css = preg_replace("/#([0-9a-fA-F]{1})\\1([0-9a-fA-F]{1})\\2([0-9a-fA-F]{1})\\3(?=[^\{]*[;\}])/", "#\\1\\2\\3", $css);
return $css;
}