123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- <?php
- /**
- * Class Minify_Lines
- * @package Minify
- */
- /**
- * Add line numbers in C-style comments for easier debugging of combined content
- *
- * @package Minify
- * @author Stephen Clay <steve@mrclay.org>
- * @author Adam Pedersen (Issue 55 fix)
- */
- class Minify_Lines {
- /**
- * Add line numbers in C-style comments
- *
- * This uses a very basic parser easily fooled by comment tokens inside
- * strings or regexes, but, otherwise, generally clean code will not be
- * mangled. URI rewriting can also be performed.
- *
- * @param string $content
- *
- * @param array $options available options:
- *
- * 'id': (optional) string to identify file. E.g. file name/path
- *
- * 'currentDir': (default null) if given, this is assumed to be the
- * directory of the current CSS file. Using this, minify will rewrite
- * all relative URIs in import/url declarations to correctly point to
- * the desired files, and prepend a comment with debugging information about
- * this process.
- *
- * @return string
- */
- public static function minify($content, $options = array())
- {
- $id = (isset($options['id']) && $options['id'])
- ? $options['id']
- : '';
- $content = str_replace("\r\n", "\n", $content);
- // Hackily rewrite strings with XPath expressions that are
- // likely to throw off our dumb parser (for Prototype 1.6.1).
- $content = str_replace('"/*"', '"/"+"*"', $content);
- $content = preg_replace('@([\'"])(\\.?//?)\\*@', '$1$2$1+$1*', $content);
- $lines = explode("\n", $content);
- $numLines = count($lines);
- // determine left padding
- $padTo = strlen((string) $numLines); // e.g. 103 lines = 3 digits
- $inComment = false;
- $i = 0;
- $newLines = array();
- while (null !== ($line = array_shift($lines))) {
- if (('' !== $id) && (0 == $i % 50)) {
- if ($inComment) {
- array_push($newLines, '', "/* {$id} *|", '');
- } else {
- array_push($newLines, '', "/* {$id} */", '');
- }
- }
- ++$i;
- $newLines[] = self::_addNote($line, $i, $inComment, $padTo);
- $inComment = self::_eolInComment($line, $inComment);
- }
- $content = implode("\n", $newLines) . "\n";
-
- // check for desired URI rewriting
- if (isset($options['currentDir'])) {
- Minify_CSS_UriRewriter::$debugText = '';
- $content = Minify_CSS_UriRewriter::rewrite(
- $content
- ,$options['currentDir']
- ,isset($options['docRoot']) ? $options['docRoot'] : $_SERVER['DOCUMENT_ROOT']
- ,isset($options['symlinks']) ? $options['symlinks'] : array()
- );
- $content = "/* Minify_CSS_UriRewriter::\$debugText\n\n"
- . Minify_CSS_UriRewriter::$debugText . "*/\n"
- . $content;
- }
-
- return $content;
- }
-
- /**
- * Is the parser within a C-style comment at the end of this line?
- *
- * @param string $line current line of code
- *
- * @param bool $inComment was the parser in a comment at the
- * beginning of the line?
- *
- * @return bool
- */
- private static function _eolInComment($line, $inComment)
- {
- // crude way to avoid things like // */
- $line = preg_replace('~//.*?(\\*/|/\\*).*~', '', $line);
- while (strlen($line)) {
- $search = $inComment
- ? '*/'
- : '/*';
- $pos = strpos($line, $search);
- if (false === $pos) {
- return $inComment;
- } else {
- if ($pos == 0
- || ($inComment
- ? substr($line, $pos, 3)
- : substr($line, $pos-1, 3)) != '*/*')
- {
- $inComment = ! $inComment;
- }
- $line = substr($line, $pos + 2);
- }
- }
- return $inComment;
- }
-
- /**
- * Prepend a comment (or note) to the given line
- *
- * @param string $line current line of code
- *
- * @param string $note content of note/comment
- *
- * @param bool $inComment was the parser in a comment at the
- * beginning of the line?
- *
- * @param int $padTo minimum width of comment
- *
- * @return string
- */
- private static function _addNote($line, $note, $inComment, $padTo)
- {
- return $inComment
- ? '/* ' . str_pad($note, $padTo, ' ', STR_PAD_RIGHT) . ' *| ' . $line
- : '/* ' . str_pad($note, $padTo, ' ', STR_PAD_RIGHT) . ' */ ' . $line;
- }
- }
|