Changeset 111675 in spip-zone


Ignore:
Timestamp:
Sep 25, 2018, 4:23:11 PM (7 months ago)
Author:
cedric@…
Message:

Mise a jour de CSSTidy

Location:
_core_/plugins/compresseur
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • _core_/plugins/compresseur/lib/csstidy/README.md

    r109860 r111675  
    33CSSTidy is a CSS minifier
    44
     5* v1.6.0 :
     6  border-radius shorthands optimisation, reverse_left_and_right option
    57* v1.5.7 :
    68  PHP 7 compatibility, composer update, Travis CI integration
  • _core_/plugins/compresseur/lib/csstidy/class.csstidy.php

    r109860 r111675  
    9595 * @package csstidy
    9696 * @author Florian Schmitz (floele at gmail dot com) 2005-2006
    97  * @version 1.5.7
     97 * @version 1.6.0
    9898 */
    9999class csstidy {
     
    148148         * @access private
    149149         */
    150         public $version = '1.5.7';
     150        public $version = '1.6.0';
    151151        /**
    152152         * Stores the settings
     
    319319                $this->settings['merge_selectors'] = 0;
    320320                /* preserve or not browser hacks */
     321
     322                /* Useful to produce a rtl css from a ltr one (or the opposite) */
     323                $this->settings['reverse_left_and_right'] = 0;
     324
    321325                $this->settings['discard_invalid_selectors'] = false;
    322326                $this->settings['discard_invalid_properties'] = false;
  • _core_/plugins/compresseur/lib/csstidy/class.csstidy_optimise.php

    r106461 r111675  
    7171         */
    7272        public function postparse() {
     73
     74                if ($this->parser->get_cfg('reverse_left_and_right') > 0) {
     75
     76                        foreach ($this->css as $medium => $selectors) {
     77                                foreach ($selectors as $selector => $properties) {
     78                                        $this->css[$medium][$selector] = $this->reverse_left_and_right($this->css[$medium][$selector]);
     79                                }
     80                        }
     81
     82                }
     83
    7384                if ($this->parser->get_cfg('preserve_css')) {
    7485                        return;
     
    91102                                foreach ($value as $selector => $value1) {
    92103                                        $this->css[$medium][$selector] = $this->merge_4value_shorthands($this->css[$medium][$selector]);
     104                                        $this->css[$medium][$selector] = $this->merge_4value_radius_shorthands($this->css[$medium][$selector]);
    93105
    94106                                        if ($this->parser->get_cfg('optimise_shorthands') < 2) {
     
    526538         * @param string $property
    527539         * @param string $value
     540         * @param array|null $shorthands
    528541         * @return array
    529542         * @version 1.0
    530543         * @see merge_4value_shorthands()
    531544         */
    532         public function dissolve_4value_shorthands($property, $value) {
    533                 $shorthands = & $this->parser->data['csstidy']['shorthands'];
     545        public function dissolve_4value_shorthands($property, $value, $shorthands = null) {
     546                if (is_null($shorthands)) {
     547                        $shorthands = & $this->parser->data['csstidy']['shorthands'];
     548                }
    534549                if (!is_array($shorthands[$property])) {
    535550                        $return[$property] = $value;
     
    569584
    570585        /**
     586         * Dissolves radius properties like
     587         * border-radius:10px 10px 10px / 1px 2px
     588         * to border-top-left:10px 1px;border-top-right:10px 2x;...
     589         * @param string $property
     590         * @param string $value
     591         * @return array
     592         * @version 1.0
     593         * @use dissolve_4value_shorthands()
     594         * @see merge_4value_radius_shorthands()
     595         */
     596        public function dissolve_4value_radius_shorthands($property, $value) {
     597                $shorthands = & $this->parser->data['csstidy']['radius_shorthands'];
     598                if (!is_array($shorthands[$property])) {
     599                        $return[$property] = $value;
     600                        return $return;
     601                }
     602
     603                if (strpos($value, '/') !== false) {
     604                        $values = $this->explode_ws('/', $value);
     605                        if (count($values) == 2) {
     606                                $r[0] = $this->dissolve_4value_shorthands($property, trim($values[0]), $shorthands);
     607                                $r[1] = $this->dissolve_4value_shorthands($property, trim($values[1]), $shorthands);
     608                                $return = array();
     609                                foreach ($r[0] as $p=>$v) {
     610                                        $return[$p] = $v;
     611                                        if ($r[1][$p] !== $v) {
     612                                                $return[$p] .= ' ' . $r[1][$p];
     613                                        }
     614                                }
     615                                return $return;
     616                        }
     617                }
     618
     619                $return = $this->dissolve_4value_shorthands($property, $value, $shorthands);
     620                return $return;
     621        }
     622
     623        /**
    571624         * Explodes a string as explode() does, however, not if $sep is escaped or within a string.
    572625         * @param string $sep seperator
    573626         * @param string $string
     627         * @param bool $explode_in_parenthesis
    574628         * @return array
    575629         * @version 1.0
    576630         */
    577         public function explode_ws($sep, $string) {
     631        public function explode_ws($sep, $string, $explode_in_parenthesis = false) {
    578632                $status = 'st';
    579633                $to = '';
    580634
    581                 $output = array();
     635                $output = array(
     636                        0 => '',
     637                );
    582638                $num = 0;
    583639                for ($i = 0, $len = strlen($string); $i < $len; $i++) {
     
    586642                                        if ($string{$i} == $sep && !$this->parser->escaped($string, $i)) {
    587643                                                ++$num;
    588                                         } elseif ($string{$i} === '"' || $string{$i} === '\'' || $string{$i} === '(' && !$this->parser->escaped($string, $i)) {
     644                                        } elseif ($string{$i} === '"' || $string{$i} === '\'' || (!$explode_in_parenthesis && $string{$i} === '(') && !$this->parser->escaped($string, $i)) {
    589645                                                $status = 'str';
    590646                                                $to = ($string{$i} === '(') ? ')' : $string{$i};
     
    604660                }
    605661
    606                 if (isset($output[0])) {
    607                         return $output;
    608                 } else {
    609                         return array($output);
    610                 }
     662                return $output;
    611663        }
    612664
     
    614666         * Merges Shorthand properties again, the opposite of dissolve_4value_shorthands()
    615667         * @param array $array
     668         * @param array|null $shorthands
    616669         * @return array
    617670         * @version 1.2
    618671         * @see dissolve_4value_shorthands()
    619672         */
    620         public function merge_4value_shorthands($array) {
     673        public function merge_4value_shorthands($array, $shorthands = null) {
    621674                $return = $array;
    622                 $shorthands = & $this->parser->data['csstidy']['shorthands'];
     675                if (is_null($shorthands)) {
     676                        $shorthands = & $this->parser->data['csstidy']['shorthands'];
     677                }
    623678
    624679                foreach ($shorthands as $key => $value) {
    625                         if (isset($array[$value[0]]) && isset($array[$value[1]])
    626                                                         && isset($array[$value[2]]) && isset($array[$value[3]]) && $value !== 0) {
     680                        if ($value !== 0 && isset($array[$value[0]]) && isset($array[$value[1]])
     681                                                        && isset($array[$value[2]]) && isset($array[$value[3]])) {
    627682                                $return[$key] = '';
    628683
     
    644699        }
    645700
     701        /**
     702         * Merges Shorthand properties again, the opposite of dissolve_4value_shorthands()
     703         * @param array $array
     704         * @return array
     705         * @version 1.2
     706         * @use merge_4value_shorthands()
     707         * @see dissolve_4value_radius_shorthands()
     708         */
     709        public function merge_4value_radius_shorthands($array) {
     710                $return = $array;
     711                $shorthands = & $this->parser->data['csstidy']['radius_shorthands'];
     712
     713                foreach ($shorthands as $key => $value) {
     714                        if (isset($array[$value[0]]) && isset($array[$value[1]])
     715                                                        && isset($array[$value[2]]) && isset($array[$value[3]]) && $value !== 0) {
     716                                $return[$key] = '';
     717                                $a = array();
     718                                for ($i = 0; $i < 4; $i++) {
     719                                        $v = $this->explode_ws(' ', trim($array[$value[$i]]));
     720                                        $a[0][$value[$i]] = reset($v);
     721                                        $a[1][$value[$i]] = end($v);
     722                                }
     723                                $r = array();
     724                                $r[0] = $this->merge_4value_shorthands($a[0], $shorthands);
     725                                $r[1] = $this->merge_4value_shorthands($a[1], $shorthands);
     726
     727                                if (isset($r[0][$key]) and isset($r[1][$key])) {
     728                                        $return[$key] = $r[0][$key];
     729                                        if ($r[1][$key] !== $r[0][$key]) {
     730                                                $return[$key] .= ' / ' . $r[1][$key];
     731                                        }
     732                                        for ($i = 0; $i < 4; $i++) {
     733                                                unset($return[$value[$i]]);
     734                                        }
     735                                }
     736                        }
     737                }
     738                return $return;
     739        }
    646740        /**
    647741         * Dissolve background property
     
    9611055        }
    9621056
     1057        /**
     1058         * Reverse left vs right in a list of properties/values
     1059         * @param array $array
     1060         * @return array
     1061         */
     1062        public function reverse_left_and_right($array) {
     1063                $return = array();
     1064
     1065                // change left <-> right in properties name and values
     1066                foreach ($array as $propertie => $value) {
     1067
     1068                        if (method_exists($this, $m = 'reverse_left_and_right_' . str_replace('-','_',trim($propertie)))) {
     1069                                $value = $this->$m($value);
     1070                        }
     1071
     1072                        // simple replacement for properties
     1073                        $propertie = str_ireplace(array('left', 'right' ,"\x1"), array("\x1", 'left', 'right') , $propertie);
     1074                        // be careful for values, not modifying protected or quoted valued
     1075                        foreach (array('left' => "\x1", 'right' => 'left', "\x1" => 'right') as $v => $r) {
     1076                                if (strpos($value, $v) !== false) {
     1077                                        $value = str_replace($v, "\x0" , $value);
     1078                                        $value = $this->explode_ws("\x0", $value, true);
     1079                                        $value = implode($r, $value);
     1080                                        $value = str_replace("\x0" , $v, $value);
     1081                                }
     1082                        }
     1083                        $return[$propertie] = $value;
     1084                }
     1085
     1086                return $return;
     1087        }
     1088
     1089        /**
     1090         * Reversing 4 values shorthands properties
     1091         * @param string $value
     1092         * @return string
     1093         */
     1094        public function reverse_left_and_right_4value_shorthands($property, $value) {
     1095                $shorthands = & $this->parser->data['csstidy']['shorthands'];
     1096                if (isset($shorthands[$property])) {
     1097                        $property_right = $shorthands[$property][1];
     1098                        $property_left = $shorthands[$property][3];
     1099                        $v = $this->dissolve_4value_shorthands($property, $value);
     1100                        if ($v[$property_left] !== $v[$property_right]) {
     1101                                $r = $v[$property_right];
     1102                                $v[$property_right] = $v[$property_left];
     1103                                $v[$property_left] = $r;
     1104                                $v = $this->merge_4value_shorthands($v);
     1105                                if (isset($v[$property])) {
     1106                                        return $v[$property];
     1107                                }
     1108                        }
     1109                }
     1110                return $value;
     1111        }
     1112
     1113        /**
     1114         * Reversing 4 values radius shorthands properties
     1115         * @param string $value
     1116         * @return string
     1117         */
     1118        public function reverse_left_and_right_4value_radius_shorthands($property, $value) {
     1119                $shorthands = & $this->parser->data['csstidy']['radius_shorthands'];
     1120                if (isset($shorthands[$property])) {
     1121                        $v = $this->dissolve_4value_radius_shorthands($property, $value);
     1122                        if ($v[$shorthands[$property][0]] !== $v[$shorthands[$property][1]]
     1123                          or $v[$shorthands[$property][2]] !== $v[$shorthands[$property][3]]) {
     1124                                $r = array(
     1125                                        $shorthands[$property][0] => $v[$shorthands[$property][1]],
     1126                                        $shorthands[$property][1] => $v[$shorthands[$property][0]],
     1127                                        $shorthands[$property][2] => $v[$shorthands[$property][3]],
     1128                                        $shorthands[$property][3] => $v[$shorthands[$property][2]],
     1129                                );
     1130                                $v = $this->merge_4value_radius_shorthands($r);
     1131                                if (isset($v[$property])) {
     1132                                        return $v[$property];
     1133                                }
     1134                        }
     1135                }
     1136                return $value;
     1137        }
     1138
     1139        /**
     1140         * Reversing margin shorthands
     1141         * @param string $value
     1142         * @return string
     1143         */
     1144        public function reverse_left_and_right_margin($value) {
     1145                return $this->reverse_left_and_right_4value_shorthands('margin', $value);
     1146        }
     1147
     1148        /**
     1149         * Reversing padding shorthands
     1150         * @param string $value
     1151         * @return string
     1152         */
     1153        public function reverse_left_and_right_padding($value) {
     1154                return $this->reverse_left_and_right_4value_shorthands('padding', $value);
     1155        }
     1156
     1157        /**
     1158         * Reversing border-color shorthands
     1159         * @param string $value
     1160         * @return string
     1161         */
     1162        public function reverse_left_and_right_border_color($value) {
     1163                return $this->reverse_left_and_right_4value_shorthands('border-color', $value);
     1164        }
     1165
     1166        /**
     1167         * Reversing border-style shorthands
     1168         * @param string $value
     1169         * @return string
     1170         */
     1171        public function reverse_left_and_right_border_style($value) {
     1172                return $this->reverse_left_and_right_4value_shorthands('border-style', $value);
     1173        }
     1174
     1175        /**
     1176         * Reversing border-width shorthands
     1177         * @param string $value
     1178         * @return string
     1179         */
     1180        public function reverse_left_and_right_border_width($value) {
     1181                return $this->reverse_left_and_right_4value_shorthands('border-width', $value);
     1182        }
     1183
     1184        /**
     1185         * Reversing border-radius shorthands
     1186         * @param string $value
     1187         * @return string
     1188         */
     1189        public function reverse_left_and_right_border_radius($value) {
     1190                return $this->reverse_left_and_right_4value_radius_shorthands('border-radius', $value);
     1191        }
     1192
     1193
     1194        /**
     1195         * Reversing background shorthands
     1196         * @param string $value
     1197         * @return string
     1198         */
     1199        public function reverse_left_and_right_background($value) {
     1200                $values = $this->dissolve_short_bg($value);
     1201                if (isset($values['background-position']) and $values['background-position']) {
     1202                        $v = $this->reverse_left_and_right_background_position($values['background-position']);
     1203                        if ($v !== $values['background-position']) {
     1204                                if ($value == $values['background-position']) {
     1205                                        return $v;
     1206                                }
     1207                                else {
     1208                                        $values['background-position'] = $v;
     1209                                        $x = $this->merge_bg($values);
     1210                                        if (isset($x['background'])) {
     1211                                                return $x['background'];
     1212                                        }
     1213                                }
     1214                        }
     1215                }
     1216                return $value;
     1217        }
     1218
     1219        /**
     1220         * Reversing background position shorthands
     1221         * @param string $value
     1222         * @return string
     1223         */
     1224        public function reverse_left_and_right_background_position_x($value) {
     1225                return $this->reverse_left_and_right_background_position($value);
     1226        }
     1227
     1228        /**
     1229         * Reversing background position shorthands
     1230         * @param string $value
     1231         * @return string
     1232         */
     1233        public function reverse_left_and_right_background_position($value) {
     1234                // multiple background case
     1235                if (strpos($value, ',') !== false) {
     1236                        $values = $this->explode_ws(',', $value);
     1237                        if (count($values) > 1) {
     1238                                foreach ($values as $k=>$v) {
     1239                                        $values[$k] = $this->reverse_left_and_right_background_position($v);
     1240                                }
     1241                                return implode(',', $values);
     1242                        }
     1243                }
     1244
     1245                // if no explicit left or right value
     1246                if (stripos($value, 'left') === false and stripos($value, 'right') === false) {
     1247                        $values = $this->explode_ws(' ', trim($value));
     1248                        $values = array_map('trim', $values);
     1249                        $values = array_filter($values);
     1250                        $values = array_values($values);
     1251                        if (count($values) == 1) {
     1252                                return "left $value";
     1253                        }
     1254                        if ($values[1] == 'top' or $values[1] == 'bottom') {
     1255                                return 'left ' . implode(' ', $values);
     1256                        }
     1257                        else {
     1258                                $last = array_pop($values);
     1259                                return implode(' ', $values) . ' left ' . $last;
     1260                        }
     1261                }
     1262
     1263                return $value;
     1264        }
     1265
    9631266}
  • _core_/plugins/compresseur/lib/csstidy/data.inc.php

    r81333 r111675  
    276276$data['csstidy']['shorthands']['padding'] = array('padding-top','padding-right','padding-bottom','padding-left');
    277277$data['csstidy']['shorthands']['-moz-border-radius'] = 0;
     278
     279$data['csstidy']['radius_shorthands']['border-radius'] = array('border-top-left-radius','border-top-right-radius','border-bottom-right-radius','border-bottom-left-radius');
    278280
    279281/**
  • _core_/plugins/compresseur/paquet.xml

    r110132 r111675  
    22        prefix="compresseur"
    33        categorie="performance"
    4         version="1.13.4"
     4        version="1.13.5"
    55        etat="stable"
    66        compatibilite="[3.3.0-dev;3.3.*]"
Note: See TracChangeset for help on using the changeset viewer.