Автоматически конвертировать CSS-файл для использования на темном фоне - PullRequest
1 голос
/ 11 января 2010

У меня есть около 200 CSS-файлов, таких как:

/**
 * GeSHi Dynamically Generated Stylesheet
 * --------------------------------------
 * Dynamically generated stylesheet for bnf
 * CSS class: , CSS id: 
 * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
 * (http://qbnz.com/highlighter/ and http://geshi.org/)
 * --------------------------------------
 */
.bnf .de1, .bnf .de2 {font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;}
.bnf  {font-family:monospace;}
.bnf .imp {font-weight: bold; color: red;}
.bnf li, .bnf .li1 {font-weight: normal; vertical-align:top;}
.bnf .ln {width:1px;text-align:right;margin:0;padding:0 2px;vertical-align:top;}
.bnf .li2 {font-weight: bold; vertical-align:top;}
.bnf .sy0 {color: #000066; font-weight: bold;}
.bnf .st0 {color: #a00;}
.bnf .st1 {color: #a00;}
.bnf .re0 {color: #007;}
.bnf .ln-xtra, .bnf li.ln-xtra, .bnf div.ln-xtra {background-color: #ffc;}
.bnf span.xtra { display:block; }

Но цвета в этих CSS-файлах выглядят нормально только на светлом (предпочтительно белом) фоне. Есть ли алгоритм (я могу выразить в PHP-коде), который я могу применить к цветам в этих файлах, чтобы они выглядели хорошо на темном фоне (почти черном)? Может быть, я должен просто инвертировать все цвета? Или есть лучший способ?

Ответы [ 2 ]

1 голос
/ 11 января 2010

Чтобы преобразовать все значения цвета, найденные в файле CSS, в их обратные значения, вы можете использовать эту функцию:

function inverseColors($css) {
    preg_match_all('/#([a-f0-9]{6}|[a-f0-9]{3})/i', $css, $matches);
    $original = $matches[0];
    $inversed = array();
    foreach($matches[1] as $key => $color) {    
        $parts = str_split($color, strlen($color) == 3 ? 1 : 2);
        foreach($parts as &$part) {
            $part = str_pad(dechex(255 - hexdec($part)), 2, 0, STR_PAD_LEFT);
        }
        $inversed[$key] = '#'.implode('', $parts);    
    }

    $css = str_replace($original, $inversed, $css);
    echo $css;
}

Это будет работать как с трех-, так и с шестизначными шестнадцатеричными значениями цвета. Но обратите внимание, что это не приведет к оптимальным цветам, обратный цвет, вероятно, не будет лучшим для вашего макета. Лучших результатов можно достичь, создав таблицу соответствия для всех цветов и подставив эти значения в новый CSS.

Чтобы перебрать все файлы CSS, вы можете использовать классы SPL для рекурсивного поиска, а затем заменить файлы CSS, используя

file_put_contents($file, inverseColors(file_get_contents($file)));

Взгляните на документацию PHP о glob , чтобы узнать, как рекурсивно выполнять итерации каталогов (в разделе комментариев).

1 голос
/ 11 января 2010

Если CSS-файлы содержат некоторый набор цветов, вы можете сначала определить новые цвета для каждого доступного цвета.
Затем вы читаете полный файл CSS в переменную с помощью функции file_get_contents. Примените str_replace, чтобы перераспределить все цвета с их новыми значениями и, наконец, используйте file_put_contents, чтобы записать файл обратно. (используя другое имя?)

Чтобы обработать 200 файлов CSS, используйте opendir, readdir и closedir, чтобы прочитать содержимое каталога, содержащего ваши файлы CSS, чтобы вы могли пакетно обрабатывать код PHP для преобразования значений цвета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...