Ori.livneh has uploaded a new change for review. https://gerrit.wikimedia.org/r/86616
Change subject: lessphp: don't re-order or deduplicate comments ...................................................................... lessphp: don't re-order or deduplicate comments Before I submit this upstream, I'd like to test this a bit more. Once this is merged upstream, I'll update the patch to reference the current commit in the file header, and we'll merge it then. Bug: 54673 Change-Id: Ib6bc76736d460081dc8f48aee09ca32066dae296 --- M includes/libs/lessc.inc.php 1 file changed, 55 insertions(+), 15 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/core refs/changes/16/86616/1 diff --git a/includes/libs/lessc.inc.php b/includes/libs/lessc.inc.php index 7b1c27b..99a1576 100644 --- a/includes/libs/lessc.inc.php +++ b/includes/libs/lessc.inc.php @@ -67,8 +67,9 @@ */ class lessc { static public $VERSION = "v0.4.0"; - static protected $TRUE = array("keyword", "true"); - static protected $FALSE = array("keyword", "false"); + + static public $TRUE = array("keyword", "true"); + static public $FALSE = array("keyword", "false"); protected $libFunctions = array(); protected $registeredVars = array(); @@ -310,33 +311,68 @@ $this->compileProp($prop, $block, $out); } - $out->lines = array_values(array_unique($out->lines)); + $out->lines = array_values($this->deduplicate($out->lines)); + } + + /** + * Deduplicate lines in a block. Comments are not deduplicated. If a + * duplicate rule is detected, the comments immediately preceding each + * occurence are consolidated. + */ + protected function deduplicate($lines) { + $unique = array(); + $comments = array(); + + foreach($lines as $line) { + if (strpos($line, '/*') === 0) { + $comments[] = $line; + continue; + } + if (!in_array($line, $unique)) { + $unique[] = $line; + } + array_splice($unique, array_search($line, $unique), 0, $comments); + $comments = array(); + } + return array_merge($unique, $comments); } protected function sortProps($props, $split = false) { $vars = array(); $imports = array(); $other = array(); + $stack = array(); foreach ($props as $prop) { switch ($prop[0]) { + case "comment": + $stack[] = $prop; + break; case "assign": + $stack[] = $prop; if (isset($prop[1][0]) && $prop[1][0] == $this->vPrefix) { - $vars[] = $prop; + $vars = array_merge($vars, $stack); } else { - $other[] = $prop; + $other = array_merge($other, $stack); } + $stack = array(); break; case "import": $id = self::$nextImportId++; $prop[] = $id; - $imports[] = $prop; + $stack[] = $prop; + $imports = array_merge($imports, $stack); $other[] = array("import_mixin", $id); + $stack = array(); break; default: - $other[] = $prop; + $stack[] = $prop; + $other = array_merge($other, $stack); + $stack = array(); + break; } } + $other = array_merge($other, $stack); if ($split) { return array(array_merge($vars, $imports), $other); @@ -1058,7 +1094,7 @@ * Helper function to get arguments for color manipulation functions. * takes a list that contains a color like thing and a percentage */ - protected function colorArgs($args) { + public function colorArgs($args) { if ($args[0] != 'list' || count($args[2]) < 2) { return array(array('color', 0, 0, 0), 0); } @@ -1217,18 +1253,18 @@ return $lightColor; } - protected function assertColor($value, $error = "expected color value") { + public function assertColor($value, $error = "expected color value") { $color = $this->coerceColor($value); if (is_null($color)) $this->throwError($error); return $color; } - protected function assertNumber($value, $error = "expecting number") { + public function assertNumber($value, $error = "expecting number") { if ($value[0] == "number") return $value[1]; $this->throwError($error); } - protected function assertArgs($value, $expectedArgs, $name="") { + public function assertArgs($value, $expectedArgs, $name="") { if ($expectedArgs == 1) { return $value; } else { @@ -1548,7 +1584,7 @@ return $value; } - protected function toBool($a) { + public function toBool($a) { if ($a) return self::$TRUE; else return self::$FALSE; } @@ -2031,7 +2067,7 @@ /** * Uses the current value of $this->count to show line and line number */ - protected function throwError($msg = null) { + public function throwError($msg = null) { if ($this->sourceLoc >= 0) { $this->sourceParser->throwError($msg, $this->sourceLoc); } @@ -2350,6 +2386,10 @@ if (empty($this->buffer)) return false; $s = $this->seek(); + if ($this->whitespace()) { + return true; + } + // setting a property if ($this->keyword($key) && $this->assign() && $this->propertyValue($value, $key) && $this->end()) @@ -2430,7 +2470,7 @@ } // opening a simple block - if ($this->tags($tags) && $this->literal('{')) { + if ($this->tags($tags) && $this->literal('{', false)) { $tags = $this->fixTags($tags); $this->pushBlock($tags); return true; @@ -3293,7 +3333,7 @@ // consume an end of statement delimiter protected function end() { - if ($this->literal(';')) { + if ($this->literal(';', false)) { return true; } elseif ($this->count == strlen($this->buffer) || $this->buffer[$this->count] == '}') { // if there is end of file or a closing block next then we don't need a ; -- To view, visit https://gerrit.wikimedia.org/r/86616 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ib6bc76736d460081dc8f48aee09ca32066dae296 Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/core Gerrit-Branch: master Gerrit-Owner: Ori.livneh <o...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits