CSS минимизировать с расширением PHP - PullRequest
6 голосов
/ 28 августа 2011

Как я могу минимизировать .php файл с содержимым CSS?
В настоящее время я получаю 400 ошибку.

Обычно я называю minify следующим образом

<link rel="stylesheet" type="text/css" 
       href="{$workspace}/min/f=workspace/css/common.css" />

EDIT

Ответ - изменить исходный код minify, но что я должен изменить?

Другими словами .. этот вызов должен работать и обрабатываться как CSS ..

<link rel="stylesheet" type="text/css" 
      href="{$workspace}/min/f=workspace/css/common.php" />

Может быть, с необязательным объявлением?

<link rel="stylesheet" type="text/css" 
href="{$workspace}/min/f=workspace/css/common.php&type=css" />

EDIT

Я создал проект здесь @ https://github.com/into/less-less

Ответы [ 4 ]

7 голосов
/ 31 августа 2011

Ваш скрипт CSS + PHP выводит CSS только после того, как он был запрошен с сервера и проанализирован PHP. Minify читает файлы прямо с сервера, пропуская HTTP-запрос. Итак, я вижу два пути:

  1. Менее оптимально [?]: Make minify загружает CSS следующим образом:

    <link rel="stylesheet" type="text/css" href="{$workspace}/min/f=http://site.com/workspace/css/common.php" />
    
  2. Включите Minify lib в ваш файл common.php и используйте его классы (например, Minify_CSS ) перед выводом. Что-то вроде echo Minify_CSS::minify($css)

Обновление:

В вашем репозитории в качестве примера содержится странное имя файла, которое не позволило бы мне соответствующим образом тянуть / толкать, так что вот измененный report.php:

<code><pre>
<strong>LESS in</strong>
<?= file_get_contents('workspace/less/common.less') ?>
- - - - -
<strong>CSS out</strong>
<?
require 'workspace/php/lessc.inc.php';
$lc = new lessc();
$contents = file_get_contents( 'workspace/less/common.less' );
$css = $lc->parse( $contents );
echo $css;
?>
<strong>Minified</strong>
<?php
require 'workspace/min/lib/Minify/CSS/Compressor.php';
echo Minify_CSS_Compressor::process($css);
?>
1 голос
/ 30 августа 2011

Нет, вы не можете легко это сделать, так как minify сильно зависит от расширений файлов (css, js ,?).Например, он используется для определения того, какие заголовки HTTP отправляются клиенту (application / x-javascript, text / css ,?), какой класс минификаторов использовать, безопасен ли этот файл для анализа и т. Д.

Но я 'Я почти уверен, что этой ситуации можно избежать.Не могли бы вы описать, почему именно вы хотите это сделать?

Если вы настаиваете на том, чтобы делать это таким образом, я могу предложить несколько грязных хаков, чтобы это работало, но для этого нужно изменить исходный код minify, поэтому я не будудействительно знаю, если это хорошая идея.

Upd:

Нет хорошего способа изменить этот источник: у него действительно плохая структура.В minify v2.1.3 вы можете просто изменить следующее:

Путь: lib / Minify / Controller / Base.php ## Minify_Controller_Base :: _ fileIsSafe ()

return in_array(strrev($revExt), array('js', 'css', 'html', 'txt'));

->

return in_array(strrev($revExt), array('js', 'css', 'html', 'txt', 'php'));

Путь: lib / Minify / Controller / MinApp.php ## Minify_Controller_MinApp :: setupSources ()

preg_match('/^[^,]+\\.(css|js)(?:,[^,]+\\.\\1)*$/', $_GET['f'])

->

preg_match('/^[^,]+\\.(css|js|php)(?:,[^,]+\\.\\1)*$/', $_GET['f'])

Путь:lib / Minify / ## Minify_Source :: __ construct ()

case 'css'  : $this->contentType = 'text/css';

->

case 'php': case 'css': $this->contentType = 'text/css';

и все будет работать, но вы должны установить $ min_serveOptions ['minApp'] ['allowDirs'] тщательно сконфигурирован, так как любой пользователь может просматривать любой php-файл из этих каталогов.

0 голосов
/ 23 октября 2014

Да, есть, и он работает довольно хорошо:

https://github.com/c9s/pecl-cssmin

API довольно прост:

<?php
echo cssmin("body { .... } .rule {  } .rule2 { color: #fff; }");
0 голосов
/ 31 августа 2011

Используя CSS Min , вы можете свободно делать что угодно, и вы также можете «обработать» свою таблицу стилей в php-скрипте, а затем минимизировать ее на лету: ее DEAD просто сделать, и угадайте, что,это просто один файл.

Другой способ заключается в том, чтобы не использовать какой-либо сценарий PHP для обработки или выполнения каких-либо логических операций в вашем файле CSS, вместо этого вы могли бы отделить небольшой файл CSS, а затем просто загрузить все, что хотите, создав новый файл кэша или просто объединитьи выведите тег ссылки.

Однако, если у вас сейчас есть что-то подобное в вашем common.php (php файл / скрипт, который выводит css, да?)

<?php 
    $style = '';
    $bodyStyle =  'body {
            background-color: #000;
            margin: 40px;
            font: 13px/20px normal Helvetica, Arial, sans-serif;
            color: #fff;
            }';
    // I assumed you are about proccesing something here..
    // ...
    // Then you merged all style into one string, and output it as css file
    $style = $bodyStyle + $otherStyle + $whateverStyle;
    header('Content-Type: text/css');
    echo $style;
?>

Ивы все еще хотите сделать свое приложение раздутым и сделать ваш код более нечитаемым (подождите, там все еще больше ...), также хотите изменить класс Minify / lib, чтобы минимизировать и кэшировать ваш псевдо-css-php, тогда вам нужно "взломать"«источник следующий:

  • lib / Minify / Controller / Base.php: 135, измените на:

    return in_array(strrev($revExt), array('js', 'css', 'html', 'txt', 'php'));

  • lib / Minify / Controller / MinApp.php: 75, изменить на:

    ! preg_match('/^[^,]+\\.(css|js|php)(?:,[^,]+\\.\\1)*$/', $_GET['f'])

  • lib / Minify / Source.php, изменить несколько вещей:

Добавить одну переменную в качестве флага PHP, в, после строки 41 возможно

/**
 * @var bool
 */
public $isPHP = FALSE;

В том же файле в строке 67 добавьте условие:

case 'php'  : $this->isPHP = TRUE;
              $this->contentType = 'text/css';
              break;

Последнее, замените функцию getContent () на:

public function getContent()
{
    if($this->isPHP)
    {
        include($this->filepath);
    }
    else 
    {
        $content = (null !== $this->filepath)
                ? file_get_contents($this->filepath)
                : ((null !== $this->_content)
                    ? $this->_content
                    : call_user_func($this->_getContentFunc, $this->_id)
                );
    }

    // remove UTF-8 BOM if present
    return (pack("CCC",0xef,0xbb,0xbf) === substr($content, 0, 3))
        ? substr($content, 3)
        : $content;
}
  • Вам также нужно изменить ваш common.php на спецификацию Minify, так что теперь ваш common.php должен выглядеть следующим образом:

Вам нужно поставить все своитаблицу стилей в виде строки и присвойте ее переменной $content

<?php 
    //$style = '';
    $bodyStyle =  'body {
            background-color: #000;
            margin: 40px;
            font: 13px/20px normal Helvetica, Arial, sans-serif;
            color: #fff;
            }';
    // I assumed you are about proccesing something here..
    // ...
    // Then you merged all style into one string, and output it as css file
    // $style = $bodyStyle + $otherStyle + $whateverStyle;
    // header('Content-Type: text/css');
    // echo $style;
    $content = $bodyStyle + $otherStyle + $whateverStyle;
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...