init
This commit is contained in:
@@ -0,0 +1,820 @@
|
||||
<?php
|
||||
namespace MailPoetVendor;
|
||||
if (!defined('ABSPATH')) exit;
|
||||
\define('AT_START', 1);
|
||||
\define('AT_END', 2);
|
||||
\define('SEL_START', 3);
|
||||
\define('SEL_END', 4);
|
||||
\define('PROPERTY', 5);
|
||||
\define('VALUE', 6);
|
||||
\define('COMMENT', 7);
|
||||
\define('IMPORTANT_COMMENT', 8);
|
||||
\define('DEFAULT_AT', 41);
|
||||
require __DIR__ . \DIRECTORY_SEPARATOR . 'class.csstidy_print.php';
|
||||
require __DIR__ . \DIRECTORY_SEPARATOR . 'class.csstidy_optimise.php';
|
||||
class csstidy
|
||||
{
|
||||
public $css = array();
|
||||
public $tokens = array();
|
||||
public $print;
|
||||
public $optimise;
|
||||
public $charset = '';
|
||||
public $import = array();
|
||||
public $namespace = '';
|
||||
public $version = '2.0.3';
|
||||
public $settings = array();
|
||||
public $status = 'is';
|
||||
public $at = '';
|
||||
public $next_selector_at = '';
|
||||
public $selector = '';
|
||||
public $property = '';
|
||||
public $sel_separate = array();
|
||||
public $value = '';
|
||||
public $sub_value = '';
|
||||
public $sub_value_arr = array();
|
||||
public $str_char = array();
|
||||
public $cur_string = array();
|
||||
public $from = array();
|
||||
public $invalid_at = \false;
|
||||
public $added = \false;
|
||||
public $log = array();
|
||||
public $line = 1;
|
||||
public $quoted_string = array();
|
||||
public $tokens_list = "";
|
||||
public $data = array();
|
||||
public $template;
|
||||
public function __construct()
|
||||
{
|
||||
$data = array();
|
||||
include __DIR__ . \DIRECTORY_SEPARATOR . 'data.inc.php';
|
||||
$this->data = $data;
|
||||
$this->settings['remove_bslash'] = \true;
|
||||
$this->settings['compress_colors'] = \true;
|
||||
$this->settings['compress_font-weight'] = \true;
|
||||
$this->settings['lowercase_s'] = \false;
|
||||
$this->settings['optimise_shorthands'] = 1;
|
||||
$this->settings['remove_last_;'] = \true;
|
||||
$this->settings['space_before_important'] = \false;
|
||||
$this->settings['case_properties'] = 1;
|
||||
$this->settings['sort_properties'] = \false;
|
||||
$this->settings['sort_selectors'] = 0;
|
||||
$this->settings['merge_selectors'] = 0;
|
||||
$this->settings['reverse_left_and_right'] = 0;
|
||||
$this->settings['discard_invalid_selectors'] = \false;
|
||||
$this->settings['discard_invalid_properties'] = \false;
|
||||
$this->settings['css_level'] = 'CSS3.0';
|
||||
$this->settings['preserve_css'] = \false;
|
||||
$this->settings['timestamp'] = \false;
|
||||
$this->settings['template'] = '';
|
||||
// say that propertie exist
|
||||
$this->set_cfg('template', 'default');
|
||||
// call load_template
|
||||
$this->optimise = new csstidy_optimise($this);
|
||||
$this->tokens_list =& $this->data['csstidy']['tokens'];
|
||||
}
|
||||
public function get_cfg($setting)
|
||||
{
|
||||
if (isset($this->settings[$setting])) {
|
||||
return $this->settings[$setting];
|
||||
}
|
||||
return \false;
|
||||
}
|
||||
public function _load_template($template)
|
||||
{
|
||||
switch ($template) {
|
||||
case 'default':
|
||||
$this->load_template('default');
|
||||
break;
|
||||
case 'highest':
|
||||
$this->load_template('highest_compression');
|
||||
break;
|
||||
case 'high':
|
||||
$this->load_template('high_compression');
|
||||
break;
|
||||
case 'low':
|
||||
$this->load_template('low_compression');
|
||||
break;
|
||||
default:
|
||||
$this->load_template($template);
|
||||
break;
|
||||
}
|
||||
}
|
||||
public function set_cfg($setting, $value = null)
|
||||
{
|
||||
if (\is_array($setting) && $value === null) {
|
||||
foreach ($setting as $setprop => $setval) {
|
||||
$this->settings[$setprop] = $setval;
|
||||
}
|
||||
if (\array_key_exists('template', $setting)) {
|
||||
$this->_load_template($this->settings['template']);
|
||||
}
|
||||
return \true;
|
||||
} elseif (isset($this->settings[$setting]) && $value !== '') {
|
||||
$this->settings[$setting] = $value;
|
||||
if ($setting === 'template') {
|
||||
$this->_load_template($this->settings['template']);
|
||||
}
|
||||
return \true;
|
||||
}
|
||||
return \false;
|
||||
}
|
||||
public function _add_token($type, $data, $do = \false)
|
||||
{
|
||||
if ($this->get_cfg('preserve_css') || $do) {
|
||||
// nested @... : if opening a new part we just closed, remove the previous closing instead of adding opening
|
||||
if ($type === \AT_START and \count($this->tokens) and $last = \end($this->tokens) and $last[0] === \AT_END and $last[1] === \trim($data)) {
|
||||
\array_pop($this->tokens);
|
||||
} else {
|
||||
$this->tokens[] = array($type, ($type == \COMMENT or $type == \IMPORTANT_COMMENT) ? $data : \trim($data));
|
||||
}
|
||||
}
|
||||
}
|
||||
public function log($message, $type, $line = -1)
|
||||
{
|
||||
if ($line === -1) {
|
||||
$line = $this->line;
|
||||
}
|
||||
$line = \intval($line);
|
||||
$add = array('m' => $message, 't' => $type);
|
||||
if (!isset($this->log[$line]) || !\in_array($add, $this->log[$line])) {
|
||||
$this->log[$line][] = $add;
|
||||
}
|
||||
}
|
||||
public function _unicode(&$string, &$i)
|
||||
{
|
||||
++$i;
|
||||
$add = '';
|
||||
$replaced = \false;
|
||||
while ($i < \strlen($string) && (\ctype_xdigit($string[$i]) || \ctype_space($string[$i])) && \strlen($add) < 6) {
|
||||
$add .= $string[$i];
|
||||
if (\ctype_space($string[$i])) {
|
||||
break;
|
||||
}
|
||||
$i++;
|
||||
}
|
||||
if (\hexdec($add) > 47 && \hexdec($add) < 58 || \hexdec($add) > 64 && \hexdec($add) < 91 || \hexdec($add) > 96 && \hexdec($add) < 123) {
|
||||
$this->log('Replaced unicode notation: Changed \\' . $add . ' to ' . \chr(\hexdec($add)), 'Information');
|
||||
$add = \chr(\hexdec($add));
|
||||
$replaced = \true;
|
||||
} else {
|
||||
$add = \trim('\\' . $add);
|
||||
}
|
||||
if (@\ctype_xdigit($string[$i + 1]) && \ctype_space($string[$i]) && !$replaced || !\ctype_space($string[$i])) {
|
||||
$i--;
|
||||
}
|
||||
if ($add !== '\\' || !$this->get_cfg('remove_bslash') || \strpos($this->tokens_list, $string[$i + 1]) !== \false) {
|
||||
return $add;
|
||||
}
|
||||
if ($add === '\\') {
|
||||
$this->log('Removed unnecessary backslash', 'Information');
|
||||
}
|
||||
return '';
|
||||
}
|
||||
public function write_page($filename, $doctype = 'xhtml1.1', $externalcss = \true, $title = '', $lang = 'en')
|
||||
{
|
||||
$this->write($filename, \true);
|
||||
}
|
||||
public function write($filename, $formatted = \false, $doctype = 'xhtml1.1', $externalcss = \true, $title = '', $lang = 'en', $pre_code = \true)
|
||||
{
|
||||
$filename .= $formatted ? '.xhtml' : '.css';
|
||||
if (!\is_dir('temp')) {
|
||||
$madedir = \mkdir('temp');
|
||||
if (!$madedir) {
|
||||
print 'Could not make directory "temp" in ' . \dirname(__FILE__);
|
||||
exit;
|
||||
}
|
||||
}
|
||||
$handle = \fopen('temp/' . $filename, 'w');
|
||||
if ($handle) {
|
||||
if (!$formatted) {
|
||||
\fwrite($handle, $this->print->plain());
|
||||
} else {
|
||||
\fwrite($handle, $this->print->formatted_page($doctype, $externalcss, $title, $lang, $pre_code));
|
||||
}
|
||||
}
|
||||
\fclose($handle);
|
||||
}
|
||||
public function load_template($content, $from_file = \true)
|
||||
{
|
||||
$predefined_templates =& $this->data['csstidy']['predefined_templates'];
|
||||
if ($content === 'high_compression' || $content === 'default' || $content === 'highest_compression' || $content === 'low_compression') {
|
||||
$this->template = $predefined_templates[$content];
|
||||
return;
|
||||
}
|
||||
if ($from_file) {
|
||||
$content = \strip_tags(\file_get_contents($content), '<span>');
|
||||
}
|
||||
$content = \str_replace("\r\n", "\n", $content);
|
||||
// Unify newlines (because the output also only uses \n)
|
||||
$template = \explode('|', $content);
|
||||
for ($i = 0; $i < \count($template); $i++) {
|
||||
$this->template[$i] = $template[$i];
|
||||
}
|
||||
}
|
||||
public function parse_from_url($url)
|
||||
{
|
||||
return $this->parse(@\file_get_contents($url));
|
||||
}
|
||||
public function is_token(&$string, $i)
|
||||
{
|
||||
return \strpos($this->tokens_list, $string[$i]) !== \false && !$this->escaped($string, $i);
|
||||
}
|
||||
public function parse($string)
|
||||
{
|
||||
// Temporarily set locale to en_US in order to handle floats properly
|
||||
$old = @\setlocale(\LC_ALL, 0);
|
||||
@\setlocale(\LC_ALL, 'C');
|
||||
// PHP bug? Settings need to be refreshed in PHP4
|
||||
$this->print = new csstidy_print($this);
|
||||
$this->optimise = new csstidy_optimise($this);
|
||||
$all_properties =& $this->data['csstidy']['all_properties'];
|
||||
$at_rules =& $this->data['csstidy']['at_rules'];
|
||||
$quoted_string_properties =& $this->data['csstidy']['quoted_string_properties'];
|
||||
$this->css = array();
|
||||
$this->print->input_css = $string;
|
||||
$string = \str_replace("\r\n", "\n", $string) . ' ';
|
||||
$cur_comment = '';
|
||||
$cur_at = '';
|
||||
for ($i = 0, $size = \strlen($string); $i < $size; $i++) {
|
||||
if ($string[$i] === "\n" || $string[$i] === "\r") {
|
||||
++$this->line;
|
||||
}
|
||||
switch ($this->status) {
|
||||
case 'at':
|
||||
if ($this->is_token($string, $i)) {
|
||||
if ($string[$i] === '/' && @$string[$i + 1] === '*') {
|
||||
$this->status = 'ic';
|
||||
++$i;
|
||||
$this->from[] = 'at';
|
||||
} elseif ($string[$i] === '{') {
|
||||
$this->status = 'is';
|
||||
$this->at = $this->css_new_media_section($this->at, $cur_at);
|
||||
$this->_add_token(\AT_START, $this->at);
|
||||
} elseif ($string[$i] === ',') {
|
||||
$cur_at = \trim($cur_at) . ',';
|
||||
} elseif ($string[$i] === '\\') {
|
||||
$cur_at .= $this->_unicode($string, $i);
|
||||
} elseif (\in_array($string[$i], array('(', ')', ':', '.', '/'))) {
|
||||
$cur_at .= $string[$i];
|
||||
}
|
||||
} else {
|
||||
$lastpos = \strlen($cur_at) - 1;
|
||||
if (!((\ctype_space($cur_at[$lastpos]) || $this->is_token($cur_at, $lastpos) && $cur_at[$lastpos] === ',') && \ctype_space($string[$i]))) {
|
||||
$cur_at .= $string[$i];
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'is':
|
||||
if ($this->is_token($string, $i)) {
|
||||
if ($string[$i] === '/' && @$string[$i + 1] === '*' && \trim($this->selector) == '') {
|
||||
$this->status = 'ic';
|
||||
++$i;
|
||||
$this->from[] = 'is';
|
||||
} elseif ($string[$i] === '@' && \trim($this->selector) == '') {
|
||||
// Check for at-rule
|
||||
$this->invalid_at = \true;
|
||||
foreach ($at_rules as $name => $type) {
|
||||
if (!\strcasecmp(\substr($string, $i + 1, \strlen($name)), $name)) {
|
||||
$type === 'at' ? $cur_at = '@' . $name : ($this->selector = '@' . $name);
|
||||
if ($type === 'atis') {
|
||||
$this->next_selector_at = $this->next_selector_at ? $this->next_selector_at : ($this->at ? $this->at : \DEFAULT_AT);
|
||||
$this->at = $this->css_new_media_section($this->at, ' ', \true);
|
||||
$type = 'is';
|
||||
}
|
||||
$this->status = $type;
|
||||
$i += \strlen($name);
|
||||
$this->invalid_at = \false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ($this->invalid_at) {
|
||||
$this->selector = '@';
|
||||
$invalid_at_name = '';
|
||||
for ($j = $i + 1; $j < $size; ++$j) {
|
||||
if (!\ctype_alpha($string[$j])) {
|
||||
break;
|
||||
}
|
||||
$invalid_at_name .= $string[$j];
|
||||
}
|
||||
$this->log('Invalid @-rule: ' . $invalid_at_name . ' (removed)', 'Warning');
|
||||
}
|
||||
} elseif ($string[$i] === '"' || $string[$i] === "'") {
|
||||
$this->cur_string[] = $string[$i];
|
||||
$this->status = 'instr';
|
||||
$this->str_char[] = $string[$i];
|
||||
$this->from[] = 'is';
|
||||
$this->quoted_string[] = $string[$i - 1] === '=';
|
||||
} elseif ($this->invalid_at && $string[$i] === ';') {
|
||||
$this->invalid_at = \false;
|
||||
$this->status = 'is';
|
||||
if ($this->next_selector_at) {
|
||||
$this->at = $this->css_close_media_section($this->at);
|
||||
$this->at = $this->css_new_media_section($this->at, $this->next_selector_at);
|
||||
$this->next_selector_at = '';
|
||||
}
|
||||
} elseif ($string[$i] === '{') {
|
||||
$this->status = 'ip';
|
||||
if ($this->at == '') {
|
||||
$this->at = $this->css_new_media_section($this->at, \DEFAULT_AT);
|
||||
}
|
||||
$this->selector = $this->css_new_selector($this->at, $this->selector);
|
||||
$this->_add_token(\SEL_START, $this->selector);
|
||||
$this->added = \false;
|
||||
} elseif ($string[$i] === '}') {
|
||||
$this->_add_token(\AT_END, $this->at);
|
||||
$this->at = $this->css_close_media_section($this->at);
|
||||
$this->selector = '';
|
||||
$this->sel_separate = array();
|
||||
} elseif ($string[$i] === ',') {
|
||||
$this->selector = \trim($this->selector) . ',';
|
||||
$this->sel_separate[] = \strlen($this->selector);
|
||||
} elseif ($string[$i] === '\\') {
|
||||
$this->selector .= $this->_unicode($string, $i);
|
||||
} elseif ($string[$i] === '*' && @\in_array($string[$i + 1], array('.', '#', '[', ':')) && ($i == 0 or $string[$i - 1] !== '/')) {
|
||||
// remove unnecessary universal selector, FS#147, but not comment in selector
|
||||
} else {
|
||||
$this->selector .= $string[$i];
|
||||
}
|
||||
} else {
|
||||
$lastpos = \strlen($this->selector) - 1;
|
||||
if ($lastpos == -1 || !((\ctype_space($this->selector[$lastpos]) || $this->is_token($this->selector, $lastpos) && $this->selector[$lastpos] === ',') && \ctype_space($string[$i]))) {
|
||||
$this->selector .= $string[$i];
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'ip':
|
||||
if ($this->is_token($string, $i)) {
|
||||
if (($string[$i] === ':' || $string[$i] === '=') && $this->property != '') {
|
||||
$this->status = 'iv';
|
||||
if (!$this->get_cfg('discard_invalid_properties') || $this->property_is_valid($this->property)) {
|
||||
$this->property = $this->css_new_property($this->at, $this->selector, $this->property);
|
||||
$this->_add_token(\PROPERTY, $this->property);
|
||||
}
|
||||
} elseif ($string[$i] === '/' && @$string[$i + 1] === '*' && $this->property == '') {
|
||||
$this->status = 'ic';
|
||||
++$i;
|
||||
$this->from[] = 'ip';
|
||||
} elseif ($string[$i] === '}') {
|
||||
$this->explode_selectors();
|
||||
$this->status = 'is';
|
||||
$this->invalid_at = \false;
|
||||
$this->_add_token(\SEL_END, $this->selector);
|
||||
$this->selector = '';
|
||||
$this->property = '';
|
||||
if ($this->next_selector_at) {
|
||||
$this->at = $this->css_close_media_section($this->at);
|
||||
$this->at = $this->css_new_media_section($this->at, $this->next_selector_at);
|
||||
$this->next_selector_at = '';
|
||||
}
|
||||
} elseif ($string[$i] === ';') {
|
||||
$this->property = '';
|
||||
} elseif ($string[$i] === '\\') {
|
||||
$this->property .= $this->_unicode($string, $i);
|
||||
} elseif ($this->property === '' && !\ctype_space($string[$i]) || ($this->property === '/' || $string[$i] === '/')) {
|
||||
$this->property .= $string[$i];
|
||||
}
|
||||
} elseif (!\ctype_space($string[$i])) {
|
||||
$this->property .= $string[$i];
|
||||
}
|
||||
break;
|
||||
case 'iv':
|
||||
$pn = ($string[$i] === "\n" || $string[$i] === "\r") && $this->property_is_next($string, $i + 1) || $i == \strlen($string) - 1;
|
||||
if ($this->is_token($string, $i) || $pn) {
|
||||
if ($string[$i] === '/' && @$string[$i + 1] === '*') {
|
||||
$this->status = 'ic';
|
||||
++$i;
|
||||
$this->from[] = 'iv';
|
||||
} elseif ($string[$i] === '"' || $string[$i] === "'" || $string[$i] === '(') {
|
||||
$this->cur_string[] = $string[$i];
|
||||
$this->str_char[] = $string[$i] === '(' ? ')' : $string[$i];
|
||||
$this->status = 'instr';
|
||||
$this->from[] = 'iv';
|
||||
$this->quoted_string[] = \in_array(\strtolower($this->property), $quoted_string_properties);
|
||||
} elseif ($string[$i] === ',') {
|
||||
$this->sub_value = \trim($this->sub_value) . ',';
|
||||
} elseif ($string[$i] === '\\') {
|
||||
$this->sub_value .= $this->_unicode($string, $i);
|
||||
} elseif ($string[$i] === ';' || $pn) {
|
||||
if ($this->selector[0] === '@' && isset($at_rules[\substr($this->selector, 1)]) && $at_rules[\substr($this->selector, 1)] === 'iv') {
|
||||
$this->sub_value_arr[] = \trim($this->sub_value);
|
||||
$this->status = 'is';
|
||||
switch ($this->selector) {
|
||||
case '@charset':
|
||||
$this->charset = '"' . $this->sub_value_arr[0] . '"';
|
||||
break;
|
||||
case '@namespace':
|
||||
$this->namespace = \implode(' ', $this->sub_value_arr);
|
||||
break;
|
||||
case '@import':
|
||||
$this->import[] = \implode(' ', $this->sub_value_arr);
|
||||
break;
|
||||
}
|
||||
$this->sub_value_arr = array();
|
||||
$this->sub_value = '';
|
||||
$this->selector = '';
|
||||
$this->sel_separate = array();
|
||||
} else {
|
||||
$this->status = 'ip';
|
||||
}
|
||||
} elseif ($string[$i] !== '}') {
|
||||
$this->sub_value .= $string[$i];
|
||||
}
|
||||
if (($string[$i] === '}' || $string[$i] === ';' || $pn) && !empty($this->selector)) {
|
||||
if ($this->at == '') {
|
||||
$this->at = $this->css_new_media_section($this->at, \DEFAULT_AT);
|
||||
}
|
||||
// case settings
|
||||
if ($this->get_cfg('lowercase_s')) {
|
||||
$this->selector = \strtolower($this->selector);
|
||||
}
|
||||
$this->property = \strtolower($this->property);
|
||||
$this->optimise->subvalue();
|
||||
if ($this->sub_value != '') {
|
||||
$this->sub_value_arr[] = $this->sub_value;
|
||||
$this->sub_value = '';
|
||||
}
|
||||
$this->value = '';
|
||||
while (\count($this->sub_value_arr)) {
|
||||
$sub = \array_shift($this->sub_value_arr);
|
||||
if (\strstr($this->selector, 'font-face')) {
|
||||
$sub = $this->quote_font_format($sub);
|
||||
}
|
||||
if ($sub != '') {
|
||||
$this->value .= (!\strlen($this->value) || \substr($this->value, -1, 1) === ',' ? '' : ' ') . $sub;
|
||||
}
|
||||
}
|
||||
$this->optimise->value();
|
||||
$valid = $this->property_is_valid($this->property);
|
||||
if ((!$this->invalid_at || $this->get_cfg('preserve_css')) && (!$this->get_cfg('discard_invalid_properties') || $valid)) {
|
||||
$this->css_add_property($this->at, $this->selector, $this->property, $this->value);
|
||||
$this->_add_token(\VALUE, $this->value);
|
||||
$this->optimise->shorthands();
|
||||
}
|
||||
if (!$valid) {
|
||||
if ($this->get_cfg('discard_invalid_properties')) {
|
||||
$this->log('Removed invalid property: ' . $this->property, 'Warning');
|
||||
} else {
|
||||
$this->log('Invalid property in ' . \strtoupper($this->get_cfg('css_level')) . ': ' . $this->property, 'Warning');
|
||||
}
|
||||
}
|
||||
$this->property = '';
|
||||
$this->sub_value_arr = array();
|
||||
$this->value = '';
|
||||
}
|
||||
if ($string[$i] === '}') {
|
||||
$this->explode_selectors();
|
||||
$this->_add_token(\SEL_END, $this->selector);
|
||||
$this->status = 'is';
|
||||
$this->invalid_at = \false;
|
||||
$this->selector = '';
|
||||
if ($this->next_selector_at) {
|
||||
$this->at = $this->css_close_media_section($this->at);
|
||||
$this->at = $this->css_new_media_section($this->at, $this->next_selector_at);
|
||||
$this->next_selector_at = '';
|
||||
}
|
||||
}
|
||||
} elseif (!$pn) {
|
||||
$this->sub_value .= $string[$i];
|
||||
if (\ctype_space($string[$i])) {
|
||||
$this->optimise->subvalue();
|
||||
if ($this->sub_value != '') {
|
||||
$this->sub_value_arr[] = $this->sub_value;
|
||||
$this->sub_value = '';
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'instr':
|
||||
$_str_char = $this->str_char[\count($this->str_char) - 1];
|
||||
$_cur_string = $this->cur_string[\count($this->cur_string) - 1];
|
||||
$_quoted_string = $this->quoted_string[\count($this->quoted_string) - 1];
|
||||
$temp_add = $string[$i];
|
||||
// Add another string to the stack. Strings can't be nested inside of quotes, only parentheses, but
|
||||
// parentheticals can be nested more than once.
|
||||
if ($_str_char === ")" && ($string[$i] === "(" || $string[$i] === '"' || $string[$i] === '\'') && !$this->escaped($string, $i)) {
|
||||
$this->cur_string[] = $string[$i];
|
||||
$this->str_char[] = $string[$i] === '(' ? ')' : $string[$i];
|
||||
$this->from[] = 'instr';
|
||||
$this->quoted_string[] = $_str_char === ')' && $string[$i] !== '(' && \trim($_cur_string) === '(' ? $_quoted_string : !($string[$i] === '(');
|
||||
continue 2;
|
||||
}
|
||||
if ($_str_char !== ")" && ($string[$i] === "\n" || $string[$i] === "\r") && !($string[$i - 1] === '\\' && !$this->escaped($string, $i - 1))) {
|
||||
$temp_add = "\\A";
|
||||
$this->log('Fixed incorrect newline in string', 'Warning');
|
||||
}
|
||||
$_cur_string .= $temp_add;
|
||||
if ($string[$i] === $_str_char && !$this->escaped($string, $i)) {
|
||||
$this->status = \array_pop($this->from);
|
||||
if (!\preg_match('|[' . \implode('', $this->data['csstidy']['whitespace']) . ']|uis', $_cur_string) && $this->property !== 'content') {
|
||||
if (!$_quoted_string) {
|
||||
if ($_str_char !== ')') {
|
||||
// Convert properties like
|
||||
// font-family: 'Arial';
|
||||
// to
|
||||
// font-family: Arial;
|
||||
// or
|
||||
// url("abc")
|
||||
// to
|
||||
// url(abc)
|
||||
$_cur_string = \substr($_cur_string, 1, -1);
|
||||
}
|
||||
} else {
|
||||
$_quoted_string = \false;
|
||||
}
|
||||
}
|
||||
\array_pop($this->cur_string);
|
||||
\array_pop($this->quoted_string);
|
||||
\array_pop($this->str_char);
|
||||
if ($_str_char === ')') {
|
||||
$_cur_string = '(' . \trim(\substr($_cur_string, 1, -1)) . ')';
|
||||
}
|
||||
if ($this->status === 'iv') {
|
||||
if (!$_quoted_string) {
|
||||
if (\strpos($_cur_string, ',') !== \false) {
|
||||
// we can on only remove space next to ','
|
||||
$_cur_string = \implode(',', \array_map('trim', \explode(',', $_cur_string)));
|
||||
}
|
||||
// and multiple spaces (too expensive)
|
||||
if (\strpos($_cur_string, ' ') !== \false) {
|
||||
$_cur_string = \preg_replace(",\\s+,", ' ', $_cur_string);
|
||||
}
|
||||
}
|
||||
$this->sub_value .= $_cur_string;
|
||||
} elseif ($this->status === 'is') {
|
||||
$this->selector .= $_cur_string;
|
||||
} elseif ($this->status === 'instr') {
|
||||
$this->cur_string[\count($this->cur_string) - 1] .= $_cur_string;
|
||||
}
|
||||
} else {
|
||||
$this->cur_string[\count($this->cur_string) - 1] = $_cur_string;
|
||||
}
|
||||
break;
|
||||
case 'ic':
|
||||
if ($string[$i] === '*' && $string[$i + 1] === '/') {
|
||||
$this->status = \array_pop($this->from);
|
||||
$i++;
|
||||
if (\strlen($cur_comment) > 1 and \strncmp($cur_comment, '!', 1) === 0) {
|
||||
$this->_add_token(\IMPORTANT_COMMENT, $cur_comment);
|
||||
$this->css_add_important_comment($cur_comment);
|
||||
} else {
|
||||
$this->_add_token(\COMMENT, $cur_comment);
|
||||
}
|
||||
$cur_comment = '';
|
||||
} else {
|
||||
$cur_comment .= $string[$i];
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
$this->optimise->postparse();
|
||||
$this->print->_reset();
|
||||
@\setlocale(\LC_ALL, $old);
|
||||
// Set locale back to original setting
|
||||
return !(empty($this->css) && empty($this->import) && empty($this->charset) && empty($this->tokens) && empty($this->namespace));
|
||||
}
|
||||
public function quote_font_format($value)
|
||||
{
|
||||
if (\strncmp($value, 'format', 6) == 0) {
|
||||
$p = \strpos($value, ')', 7);
|
||||
$end = \substr($value, $p);
|
||||
$format_strings = $this->parse_string_list(\substr($value, 7, $p - 7));
|
||||
if (!$format_strings) {
|
||||
$value = '';
|
||||
} else {
|
||||
$value = 'format(';
|
||||
foreach ($format_strings as $format_string) {
|
||||
$value .= '"' . \str_replace('"', '\\"', $format_string) . '",';
|
||||
}
|
||||
$value = \substr($value, 0, -1) . $end;
|
||||
}
|
||||
}
|
||||
return $value;
|
||||
}
|
||||
public function explode_selectors()
|
||||
{
|
||||
// Explode multiple selectors
|
||||
if ($this->get_cfg('merge_selectors') === 1) {
|
||||
$new_sels = array();
|
||||
$lastpos = 0;
|
||||
$this->sel_separate[] = \strlen($this->selector);
|
||||
foreach ($this->sel_separate as $num => $pos) {
|
||||
if ($num == \count($this->sel_separate) - 1) {
|
||||
$pos += 1;
|
||||
}
|
||||
$new_sels[] = \substr($this->selector, $lastpos, $pos - $lastpos - 1);
|
||||
$lastpos = $pos;
|
||||
}
|
||||
if (\count($new_sels) > 1) {
|
||||
foreach ($new_sels as $selector) {
|
||||
if (isset($this->css[$this->at][$this->selector])) {
|
||||
$this->merge_css_blocks($this->at, $selector, $this->css[$this->at][$this->selector]);
|
||||
}
|
||||
}
|
||||
unset($this->css[$this->at][$this->selector]);
|
||||
}
|
||||
}
|
||||
$this->sel_separate = array();
|
||||
}
|
||||
static function escaped(&$string, $pos)
|
||||
{
|
||||
return !(@($string[$pos - 1] !== '\\') || csstidy::escaped($string, $pos - 1));
|
||||
}
|
||||
public function css_add_important_comment($comment)
|
||||
{
|
||||
if ($this->get_cfg('preserve_css') || \trim($comment) == '') {
|
||||
return;
|
||||
}
|
||||
if (!isset($this->css['!'])) {
|
||||
$this->css['!'] = '';
|
||||
} else {
|
||||
$this->css['!'] .= "\n";
|
||||
}
|
||||
$this->css['!'] .= $comment;
|
||||
}
|
||||
public function css_add_property($media, $selector, $property, $new_val)
|
||||
{
|
||||
if ($this->get_cfg('preserve_css') || \trim($new_val) == '') {
|
||||
return;
|
||||
}
|
||||
$this->added = \true;
|
||||
if (isset($this->css[$media][$selector][$property])) {
|
||||
if ($this->is_important($this->css[$media][$selector][$property]) && $this->is_important($new_val) || !$this->is_important($this->css[$media][$selector][$property])) {
|
||||
$this->css[$media][$selector][$property] = \trim($new_val);
|
||||
}
|
||||
} else {
|
||||
$this->css[$media][$selector][$property] = \trim($new_val);
|
||||
}
|
||||
}
|
||||
public function css_check_last_media_section_or_inc($media)
|
||||
{
|
||||
// are we starting?
|
||||
if (!$this->css || !\is_array($this->css) || empty($this->css)) {
|
||||
return $media;
|
||||
}
|
||||
// if the last @media is the same as this
|
||||
// keep it
|
||||
\end($this->css);
|
||||
$at = \key($this->css);
|
||||
if ($at == $media) {
|
||||
return $media;
|
||||
}
|
||||
// else inc the section in the array
|
||||
while (isset($this->css[$media])) {
|
||||
if (\is_numeric($media)) {
|
||||
$media++;
|
||||
} else {
|
||||
$media .= ' ';
|
||||
}
|
||||
}
|
||||
return $media;
|
||||
}
|
||||
public function css_new_media_section($current_media, $new_media, $at_root = \false)
|
||||
{
|
||||
if ($this->get_cfg('preserve_css')) {
|
||||
return $new_media;
|
||||
}
|
||||
// if we already are in a media and CSS level is 3, manage nested medias
|
||||
if ($current_media && !$at_root && !\is_numeric($current_media) && \strncmp($this->get_cfg('css_level'), 'CSS3', 4) == 0) {
|
||||
$new_media = \rtrim($current_media) . "{" . \rtrim($new_media);
|
||||
}
|
||||
return $this->css_check_last_media_section_or_inc($new_media);
|
||||
}
|
||||
public function css_close_media_section($current_media)
|
||||
{
|
||||
if ($this->get_cfg('preserve_css')) {
|
||||
return '';
|
||||
}
|
||||
if (\strpos($current_media, '{') !== \false) {
|
||||
$current_media = \explode('{', $current_media);
|
||||
\array_pop($current_media);
|
||||
$current_media = \implode('{', $current_media);
|
||||
return $current_media;
|
||||
}
|
||||
return '';
|
||||
}
|
||||
public function css_new_selector($media, $selector)
|
||||
{
|
||||
if ($this->get_cfg('preserve_css')) {
|
||||
return $selector;
|
||||
}
|
||||
$selector = \trim($selector);
|
||||
if (\strncmp($selector, '@font-face', 10) != 0) {
|
||||
if ($this->settings['merge_selectors'] != \false) {
|
||||
return $selector;
|
||||
}
|
||||
if (!$this->css || !isset($this->css[$media]) || !$this->css[$media]) {
|
||||
return $selector;
|
||||
}
|
||||
// if last is the same, keep it
|
||||
\end($this->css[$media]);
|
||||
$sel = \key($this->css[$media]);
|
||||
if ($sel == $selector) {
|
||||
return $selector;
|
||||
}
|
||||
}
|
||||
while (isset($this->css[$media][$selector])) {
|
||||
$selector .= ' ';
|
||||
}
|
||||
return $selector;
|
||||
}
|
||||
public function css_new_property($media, $selector, $property)
|
||||
{
|
||||
if ($this->get_cfg('preserve_css')) {
|
||||
return $property;
|
||||
}
|
||||
if (!$this->css || !isset($this->css[$media][$selector]) || !$this->css[$media][$selector]) {
|
||||
return $property;
|
||||
}
|
||||
while (isset($this->css[$media][$selector][$property])) {
|
||||
$property .= ' ';
|
||||
}
|
||||
return $property;
|
||||
}
|
||||
public function merge_css_blocks($media, $selector, $css_add)
|
||||
{
|
||||
foreach ($css_add as $property => $value) {
|
||||
$this->css_add_property($media, $selector, $property, $value, \false);
|
||||
}
|
||||
}
|
||||
public function is_important(&$value)
|
||||
{
|
||||
return \strpos($value, '!') !== \false and !\strcasecmp(\substr(\str_replace($this->data['csstidy']['whitespace'], '', $value), -10, 10), '!important');
|
||||
}
|
||||
public function gvw_important($value)
|
||||
{
|
||||
if ($this->is_important($value)) {
|
||||
$value = \trim($value);
|
||||
$value = \substr($value, 0, -9);
|
||||
$value = \trim($value);
|
||||
$value = \substr($value, 0, -1);
|
||||
$value = \trim($value);
|
||||
return $value;
|
||||
}
|
||||
return $value;
|
||||
}
|
||||
public function property_is_next($istring, $pos)
|
||||
{
|
||||
$all_properties =& $this->data['csstidy']['all_properties'];
|
||||
$istring = \substr($istring, $pos, \strlen($istring) - $pos);
|
||||
$pos = \strpos($istring, ':');
|
||||
if ($pos === \false) {
|
||||
return \false;
|
||||
}
|
||||
$istring = \strtolower(\trim(\substr($istring, 0, $pos)));
|
||||
if (isset($all_properties[$istring])) {
|
||||
$this->log('Added semicolon to the end of declaration', 'Warning');
|
||||
return \true;
|
||||
}
|
||||
return \false;
|
||||
}
|
||||
public function property_is_valid($property)
|
||||
{
|
||||
if (\strpos($property, '--') === 0) {
|
||||
$property = "--custom";
|
||||
} elseif (\in_array(\trim($property), $this->data['csstidy']['multiple_properties'])) {
|
||||
$property = \trim($property);
|
||||
}
|
||||
$all_properties =& $this->data['csstidy']['all_properties'];
|
||||
return isset($all_properties[$property]) && \strpos($all_properties[$property], \strtoupper($this->get_cfg('css_level'))) !== \false;
|
||||
}
|
||||
public function parse_string_list($value)
|
||||
{
|
||||
$value = \trim($value);
|
||||
// Case: empty
|
||||
if (!$value) {
|
||||
return array();
|
||||
}
|
||||
$strings = array();
|
||||
$in_str = \false;
|
||||
$current_string = '';
|
||||
for ($i = 0, $_len = \strlen($value); $i < $_len; $i++) {
|
||||
if (($value[$i] === ',' || $value[$i] === ' ') && $in_str === \true) {
|
||||
$in_str = \false;
|
||||
$strings[] = $current_string;
|
||||
$current_string = '';
|
||||
} elseif ($value[$i] === '"' || $value[$i] === "'") {
|
||||
if ($in_str === $value[$i]) {
|
||||
$strings[] = $current_string;
|
||||
$in_str = \false;
|
||||
$current_string = '';
|
||||
continue;
|
||||
} elseif (!$in_str) {
|
||||
$in_str = $value[$i];
|
||||
}
|
||||
} else {
|
||||
if ($in_str) {
|
||||
$current_string .= $value[$i];
|
||||
} else {
|
||||
if (!\preg_match("/[\\s,]/", $value[$i])) {
|
||||
$in_str = \true;
|
||||
$current_string = $value[$i];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($current_string) {
|
||||
$strings[] = $current_string;
|
||||
}
|
||||
return $strings;
|
||||
}
|
||||
}
|
||||
+991
@@ -0,0 +1,991 @@
|
||||
<?php
|
||||
namespace MailPoetVendor;
|
||||
if (!defined('ABSPATH')) exit;
|
||||
class csstidy_optimise
|
||||
{
|
||||
public $parser;
|
||||
public $css;
|
||||
public $sub_value;
|
||||
public $at;
|
||||
public $selector;
|
||||
public $property;
|
||||
public $value;
|
||||
public function __construct($css)
|
||||
{
|
||||
$this->parser = $css;
|
||||
$this->css =& $css->css;
|
||||
$this->sub_value =& $css->sub_value;
|
||||
$this->at =& $css->at;
|
||||
$this->selector =& $css->selector;
|
||||
$this->property =& $css->property;
|
||||
$this->value =& $css->value;
|
||||
}
|
||||
public function postparse()
|
||||
{
|
||||
if ($this->parser->get_cfg('reverse_left_and_right') > 0) {
|
||||
foreach ($this->css as $medium => $selectors) {
|
||||
if (\is_array($selectors)) {
|
||||
foreach ($selectors as $selector => $properties) {
|
||||
$this->css[$medium][$selector] = $this->reverse_left_and_right($this->css[$medium][$selector]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($this->parser->get_cfg('preserve_css')) {
|
||||
return;
|
||||
}
|
||||
if ((int) $this->parser->get_cfg('merge_selectors') === 2) {
|
||||
foreach ($this->css as $medium => $value) {
|
||||
if (\is_array($value)) {
|
||||
$this->merge_selectors($this->css[$medium]);
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($this->parser->get_cfg('discard_invalid_selectors')) {
|
||||
foreach ($this->css as $medium => $value) {
|
||||
if (\is_array($value)) {
|
||||
$this->discard_invalid_selectors($this->css[$medium]);
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($this->parser->get_cfg('optimise_shorthands') > 0) {
|
||||
foreach ($this->css as $medium => $value) {
|
||||
if (\is_array($value)) {
|
||||
foreach ($value as $selector => $value1) {
|
||||
$this->css[$medium][$selector] = $this->merge_4value_shorthands($this->css[$medium][$selector]);
|
||||
$this->css[$medium][$selector] = $this->merge_4value_radius_shorthands($this->css[$medium][$selector]);
|
||||
if ($this->parser->get_cfg('optimise_shorthands') < 2) {
|
||||
continue;
|
||||
}
|
||||
$this->css[$medium][$selector] = $this->merge_font($this->css[$medium][$selector]);
|
||||
if ($this->parser->get_cfg('optimise_shorthands') < 3) {
|
||||
continue;
|
||||
}
|
||||
$this->css[$medium][$selector] = $this->merge_bg($this->css[$medium][$selector]);
|
||||
if (empty($this->css[$medium][$selector])) {
|
||||
unset($this->css[$medium][$selector]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
public function value()
|
||||
{
|
||||
$shorthands =& $this->parser->data['csstidy']['shorthands'];
|
||||
// optimise shorthand properties
|
||||
if (isset($shorthands[$this->property])) {
|
||||
$temp = $this->shorthand($this->value);
|
||||
// FIXME - move
|
||||
if ($temp != $this->value) {
|
||||
$this->parser->log('Optimised shorthand notation (' . $this->property . '): Changed "' . $this->value . '" to "' . $temp . '"', 'Information');
|
||||
}
|
||||
$this->value = $temp;
|
||||
}
|
||||
// Remove whitespace at ! important
|
||||
if ($this->value != $this->compress_important($this->value)) {
|
||||
$this->parser->log('Optimised !important', 'Information');
|
||||
}
|
||||
}
|
||||
public function shorthands()
|
||||
{
|
||||
$shorthands =& $this->parser->data['csstidy']['shorthands'];
|
||||
if (!$this->parser->get_cfg('optimise_shorthands') || $this->parser->get_cfg('preserve_css')) {
|
||||
return;
|
||||
}
|
||||
if ($this->property === 'font' && $this->parser->get_cfg('optimise_shorthands') > 1) {
|
||||
$this->css[$this->at][$this->selector]['font'] = '';
|
||||
$this->parser->merge_css_blocks($this->at, $this->selector, $this->dissolve_short_font($this->value));
|
||||
}
|
||||
if ($this->property === 'background' && $this->parser->get_cfg('optimise_shorthands') > 2) {
|
||||
$this->css[$this->at][$this->selector]['background'] = '';
|
||||
$this->parser->merge_css_blocks($this->at, $this->selector, $this->dissolve_short_bg($this->value));
|
||||
}
|
||||
if (isset($shorthands[$this->property])) {
|
||||
$this->parser->merge_css_blocks($this->at, $this->selector, $this->dissolve_4value_shorthands($this->property, $this->value));
|
||||
if (\is_array($shorthands[$this->property])) {
|
||||
$this->css[$this->at][$this->selector][$this->property] = '';
|
||||
}
|
||||
}
|
||||
}
|
||||
public function subvalue()
|
||||
{
|
||||
$replace_colors =& $this->parser->data['csstidy']['replace_colors'];
|
||||
$this->sub_value = \trim($this->sub_value);
|
||||
if ($this->sub_value == '') {
|
||||
// caution : '0'
|
||||
return;
|
||||
}
|
||||
$important = '';
|
||||
if ($this->parser->is_important($this->sub_value)) {
|
||||
$important = '!important';
|
||||
}
|
||||
$this->sub_value = $this->parser->gvw_important($this->sub_value);
|
||||
// Compress font-weight
|
||||
if ($this->property === 'font-weight' && $this->parser->get_cfg('compress_font-weight')) {
|
||||
if ($this->sub_value === 'bold') {
|
||||
$this->sub_value = '700';
|
||||
$this->parser->log('Optimised font-weight: Changed "bold" to "700"', 'Information');
|
||||
} elseif ($this->sub_value === 'normal') {
|
||||
$this->sub_value = '400';
|
||||
$this->parser->log('Optimised font-weight: Changed "normal" to "400"', 'Information');
|
||||
}
|
||||
}
|
||||
$temp = $this->compress_numbers($this->sub_value);
|
||||
if (\strcasecmp($temp, $this->sub_value) !== 0) {
|
||||
if (\strlen($temp) > \strlen($this->sub_value)) {
|
||||
$this->parser->log('Fixed invalid number: Changed "' . $this->sub_value . '" to "' . $temp . '"', 'Warning');
|
||||
} else {
|
||||
$this->parser->log('Optimised number: Changed "' . $this->sub_value . '" to "' . $temp . '"', 'Information');
|
||||
}
|
||||
$this->sub_value = $temp;
|
||||
}
|
||||
if ($this->parser->get_cfg('compress_colors')) {
|
||||
$temp = $this->cut_color($this->sub_value);
|
||||
if ($temp !== $this->sub_value) {
|
||||
if (isset($replace_colors[$this->sub_value])) {
|
||||
$this->parser->log('Fixed invalid color name: Changed "' . $this->sub_value . '" to "' . $temp . '"', 'Warning');
|
||||
} else {
|
||||
$this->parser->log('Optimised color: Changed "' . $this->sub_value . '" to "' . $temp . '"', 'Information');
|
||||
}
|
||||
$this->sub_value = $temp;
|
||||
}
|
||||
}
|
||||
$this->sub_value .= $important;
|
||||
}
|
||||
public function shorthand($value)
|
||||
{
|
||||
$important = '';
|
||||
if ($this->parser->is_important($value)) {
|
||||
$values = $this->parser->gvw_important($value);
|
||||
$important = '!important';
|
||||
} else {
|
||||
$values = $value;
|
||||
}
|
||||
$values = \explode(' ', $values);
|
||||
switch (\count($values)) {
|
||||
case 4:
|
||||
if ($values[0] == $values[1] && $values[0] == $values[2] && $values[0] == $values[3]) {
|
||||
return $values[0] . $important;
|
||||
} elseif ($values[1] == $values[3] && $values[0] == $values[2]) {
|
||||
return $values[0] . ' ' . $values[1] . $important;
|
||||
} elseif ($values[1] == $values[3]) {
|
||||
return $values[0] . ' ' . $values[1] . ' ' . $values[2] . $important;
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if ($values[0] == $values[1] && $values[0] == $values[2]) {
|
||||
return $values[0] . $important;
|
||||
} elseif ($values[0] == $values[2]) {
|
||||
return $values[0] . ' ' . $values[1] . $important;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if ($values[0] == $values[1]) {
|
||||
return $values[0] . $important;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return $value;
|
||||
}
|
||||
public function compress_important(&$string)
|
||||
{
|
||||
if ($this->parser->is_important($string)) {
|
||||
$important = $this->parser->get_cfg('space_before_important') ? ' !important' : '!important';
|
||||
$string = $this->parser->gvw_important($string) . $important;
|
||||
}
|
||||
return $string;
|
||||
}
|
||||
public function cut_color($color)
|
||||
{
|
||||
$replace_colors =& $this->parser->data['csstidy']['replace_colors'];
|
||||
// if it's a string, don't touch !
|
||||
if (\strncmp($color, "'", 1) == 0 || \strncmp($color, '"', 1) == 0) {
|
||||
return $color;
|
||||
}
|
||||
if (\strpos($color, '(') !== \false && (\strncasecmp($color, 'rgb(', 4) !== 0 and \strncasecmp($color, 'rgba(', 5) !== 0)) {
|
||||
// on ne touche pas aux couleurs dans les expression ms, c'est trop sensible
|
||||
if (\stripos($color, 'progid:') !== \false) {
|
||||
return $color;
|
||||
}
|
||||
\preg_match_all(",rgba?\\([^)]+\\),i", $color, $matches, \PREG_SET_ORDER);
|
||||
if (\count($matches)) {
|
||||
foreach ($matches as $m) {
|
||||
$color = \str_replace($m[0], $this->cut_color($m[0]), $color);
|
||||
}
|
||||
}
|
||||
\preg_match_all(",#[0-9a-f]{6}(?=[^0-9a-f]),i", $color, $matches, \PREG_SET_ORDER);
|
||||
if (\count($matches)) {
|
||||
foreach ($matches as $m) {
|
||||
$color = \str_replace($m[0], $this->cut_color($m[0]), $color);
|
||||
}
|
||||
}
|
||||
return $color;
|
||||
}
|
||||
// rgb(0,0,0) -> #000000 (or #000 in this case later)
|
||||
if (\strncasecmp($color, 'rgb(', 4) == 0 and \strpos($color, '(', 4) === \false or \strncasecmp($color, 'rgba(', 5) == 0 and \strpos($color, '(', 5) === \false) {
|
||||
$color_tmp = \explode('(', $color, 2);
|
||||
$color_tmp = \rtrim(\end($color_tmp), ')');
|
||||
if (\strpos($color_tmp, '/') !== \false) {
|
||||
$color_tmp = \explode('/', $color_tmp, 2);
|
||||
$color_parts = \explode(' ', \trim(\reset($color_tmp)), 3);
|
||||
while (\count($color_parts) < 3) {
|
||||
$color_parts[] = 0;
|
||||
}
|
||||
$color_parts[] = \end($color_tmp);
|
||||
} else {
|
||||
$color_parts = \explode(',', $color_tmp, 4);
|
||||
}
|
||||
for ($i = 0; $i < \count($color_parts); $i++) {
|
||||
$color_parts[$i] = \trim($color_parts[$i]);
|
||||
if (\substr($color_parts[$i], -1) === '%') {
|
||||
$color_parts[$i] = \round(255 * \intval($color_parts[$i]) / 100);
|
||||
} elseif ($i > 2) {
|
||||
// 4th argument is alpga layer between 0 and 1 (if not %)
|
||||
$color_parts[$i] = \round(255 * \floatval($color_parts[$i]));
|
||||
}
|
||||
$color_parts[$i] = \intval($color_parts[$i]);
|
||||
if ($color_parts[$i] > 255) {
|
||||
$color_parts[$i] = 255;
|
||||
}
|
||||
}
|
||||
$color = '#';
|
||||
// 3 or 4 parts depending on alpha layer
|
||||
$nb = \min(\max(\count($color_parts), 3), 4);
|
||||
for ($i = 0; $i < $nb; $i++) {
|
||||
if (!isset($color_parts[$i])) {
|
||||
$color_parts[$i] = 0;
|
||||
}
|
||||
if ($color_parts[$i] < 16) {
|
||||
$color .= '0' . \dechex($color_parts[$i]);
|
||||
} else {
|
||||
$color .= \dechex($color_parts[$i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Fix bad color names
|
||||
if (isset($replace_colors[\strtolower($color)])) {
|
||||
$color = $replace_colors[\strtolower($color)];
|
||||
}
|
||||
// #aabbcc -> #abc
|
||||
if (\strlen($color) == 7) {
|
||||
$color_temp = \strtolower($color);
|
||||
if ($color_temp[0] === '#' && $color_temp[1] == $color_temp[2] && $color_temp[3] == $color_temp[4] && $color_temp[5] == $color_temp[6]) {
|
||||
$color = '#' . $color[1] . $color[3] . $color[5];
|
||||
}
|
||||
} elseif (\strlen($color) == 9) {
|
||||
$color_temp = \strtolower($color);
|
||||
if ($color_temp[0] === '#' && $color_temp[1] == $color_temp[2] && $color_temp[3] == $color_temp[4] && $color_temp[5] == $color_temp[6] && $color_temp[7] == $color_temp[8]) {
|
||||
$color = '#' . $color[1] . $color[3] . $color[5] . $color[7];
|
||||
}
|
||||
}
|
||||
switch (\strtolower($color)) {
|
||||
case 'black':
|
||||
return '#000';
|
||||
case 'fuchsia':
|
||||
return '#f0f';
|
||||
case 'white':
|
||||
return '#fff';
|
||||
case 'yellow':
|
||||
return '#ff0';
|
||||
case '#800000':
|
||||
return 'maroon';
|
||||
case '#ffa500':
|
||||
return 'orange';
|
||||
case '#808000':
|
||||
return 'olive';
|
||||
case '#800080':
|
||||
return 'purple';
|
||||
case '#008000':
|
||||
return 'green';
|
||||
case '#000080':
|
||||
return 'navy';
|
||||
case '#008080':
|
||||
return 'teal';
|
||||
case '#c0c0c0':
|
||||
return 'silver';
|
||||
case '#808080':
|
||||
return 'gray';
|
||||
case '#f00':
|
||||
return 'red';
|
||||
}
|
||||
return $color;
|
||||
}
|
||||
public function compress_numbers($subvalue)
|
||||
{
|
||||
$unit_values =& $this->parser->data['csstidy']['unit_values'];
|
||||
$color_values =& $this->parser->data['csstidy']['color_values'];
|
||||
// for font:1em/1em sans-serif...;
|
||||
if ($this->property === 'font') {
|
||||
$temp = \explode('/', $subvalue);
|
||||
} else {
|
||||
$temp = array($subvalue);
|
||||
}
|
||||
for ($l = 0; $l < \count($temp); $l++) {
|
||||
// if we are not dealing with a number at this point, do not optimise anything
|
||||
$number = $this->AnalyseCssNumber($temp[$l]);
|
||||
if ($number === \false) {
|
||||
return $subvalue;
|
||||
}
|
||||
// Fix bad colors
|
||||
if (\in_array($this->property, $color_values)) {
|
||||
$temp[$l] = '#' . $temp[$l];
|
||||
continue;
|
||||
}
|
||||
if (\abs($number[0]) > 0) {
|
||||
if ($number[1] == '' && \in_array($this->property, $unit_values, \true)) {
|
||||
$number[1] = 'px';
|
||||
}
|
||||
} elseif ($number[1] != 's' && $number[1] != 'ms') {
|
||||
$number[1] = '';
|
||||
}
|
||||
$temp[$l] = $number[0] . $number[1];
|
||||
}
|
||||
return \count($temp) > 1 ? $temp[0] . '/' . $temp[1] : $temp[0];
|
||||
}
|
||||
public function AnalyseCssNumber($string)
|
||||
{
|
||||
// most simple checks first
|
||||
if (\strlen($string) == 0 || \ctype_alpha($string[0])) {
|
||||
return \false;
|
||||
}
|
||||
$units =& $this->parser->data['csstidy']['units'];
|
||||
$return = array(0, '');
|
||||
$return[0] = \floatval($string);
|
||||
if (\abs($return[0]) > 0 && \abs($return[0]) < 1) {
|
||||
if ($return[0] < 0) {
|
||||
$return[0] = '-' . \ltrim(\substr($return[0], 1), '0');
|
||||
} else {
|
||||
$return[0] = \ltrim($return[0], '0');
|
||||
}
|
||||
}
|
||||
// Look for unit and split from value if exists
|
||||
foreach ($units as $unit) {
|
||||
$expectUnitAt = \strlen($string) - \strlen($unit);
|
||||
if (!($unitInString = \stristr($string, $unit))) {
|
||||
// mb_strpos() fails with "false"
|
||||
continue;
|
||||
}
|
||||
$actualPosition = \strpos($string, $unitInString);
|
||||
if ($expectUnitAt === $actualPosition) {
|
||||
$return[1] = $unit;
|
||||
$string = \substr($string, 0, -\strlen($unit));
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!\is_numeric($string)) {
|
||||
return \false;
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
public function merge_selectors(&$array)
|
||||
{
|
||||
$css = $array;
|
||||
foreach ($css as $key => $value) {
|
||||
if (!isset($css[$key])) {
|
||||
continue;
|
||||
}
|
||||
$newsel = '';
|
||||
// Check if properties also exist in another selector
|
||||
$keys = array();
|
||||
// PHP bug (?) without $css = $array; here
|
||||
foreach ($css as $selector => $vali) {
|
||||
if ($selector == $key) {
|
||||
continue;
|
||||
}
|
||||
if ($css[$key] === $vali) {
|
||||
$keys[] = $selector;
|
||||
}
|
||||
}
|
||||
if (!empty($keys)) {
|
||||
$newsel = $key;
|
||||
unset($css[$key]);
|
||||
foreach ($keys as $selector) {
|
||||
unset($css[$selector]);
|
||||
$newsel .= ',' . $selector;
|
||||
}
|
||||
$css[$newsel] = $value;
|
||||
}
|
||||
}
|
||||
$array = $css;
|
||||
}
|
||||
public function discard_invalid_selectors(&$array)
|
||||
{
|
||||
$invalid = array('+' => \true, '~' => \true, ',' => \true, '>' => \true);
|
||||
foreach ($array as $selector => $decls) {
|
||||
$ok = \true;
|
||||
$selectors = \array_map('trim', \explode(',', $selector));
|
||||
foreach ($selectors as $s) {
|
||||
$simple_selectors = \preg_split('/\\s*[+>~\\s]\\s*/', $s);
|
||||
foreach ($simple_selectors as $ss) {
|
||||
if ($ss === '') {
|
||||
$ok = \false;
|
||||
}
|
||||
// could also check $ss for internal structure,
|
||||
// but that probably would be too slow
|
||||
}
|
||||
}
|
||||
if (!$ok) {
|
||||
unset($array[$selector]);
|
||||
}
|
||||
}
|
||||
}
|
||||
public function dissolve_4value_shorthands($property, $value, $shorthands = null)
|
||||
{
|
||||
if (\is_null($shorthands)) {
|
||||
$shorthands =& $this->parser->data['csstidy']['shorthands'];
|
||||
}
|
||||
if (!\is_array($shorthands[$property])) {
|
||||
$return[$property] = $value;
|
||||
return $return;
|
||||
}
|
||||
$important = '';
|
||||
if ($this->parser->is_important($value)) {
|
||||
$value = $this->parser->gvw_important($value);
|
||||
$important = '!important';
|
||||
}
|
||||
$values = \explode(' ', $value);
|
||||
$return = array();
|
||||
if (\count($values) == 4) {
|
||||
for ($i = 0; $i < 4; $i++) {
|
||||
$return[$shorthands[$property][$i]] = $values[$i] . $important;
|
||||
}
|
||||
} elseif (\count($values) == 3) {
|
||||
$return[$shorthands[$property][0]] = $values[0] . $important;
|
||||
$return[$shorthands[$property][1]] = $values[1] . $important;
|
||||
$return[$shorthands[$property][3]] = $values[1] . $important;
|
||||
$return[$shorthands[$property][2]] = $values[2] . $important;
|
||||
} elseif (\count($values) == 2) {
|
||||
for ($i = 0; $i < 4; $i++) {
|
||||
$return[$shorthands[$property][$i]] = $i % 2 != 0 ? $values[1] . $important : $values[0] . $important;
|
||||
}
|
||||
} else {
|
||||
for ($i = 0; $i < 4; $i++) {
|
||||
$return[$shorthands[$property][$i]] = $values[0] . $important;
|
||||
}
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
public function dissolve_4value_radius_shorthands($property, $value)
|
||||
{
|
||||
$shorthands =& $this->parser->data['csstidy']['radius_shorthands'];
|
||||
if (!\is_array($shorthands[$property])) {
|
||||
$return[$property] = $value;
|
||||
return $return;
|
||||
}
|
||||
if (\strpos($value, '/') !== \false) {
|
||||
$values = $this->explode_ws('/', $value);
|
||||
if (\count($values) == 2) {
|
||||
$r[0] = $this->dissolve_4value_shorthands($property, \trim($values[0]), $shorthands);
|
||||
$r[1] = $this->dissolve_4value_shorthands($property, \trim($values[1]), $shorthands);
|
||||
$return = array();
|
||||
foreach ($r[0] as $p => $v) {
|
||||
$return[$p] = $v;
|
||||
if ($r[1][$p] !== $v) {
|
||||
$return[$p] .= ' ' . $r[1][$p];
|
||||
}
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
}
|
||||
$return = $this->dissolve_4value_shorthands($property, $value, $shorthands);
|
||||
return $return;
|
||||
}
|
||||
public function explode_ws($sep, $string, $explode_in_parenthesis = \false)
|
||||
{
|
||||
$status = 'st';
|
||||
$to = '';
|
||||
$output = array(0 => '');
|
||||
$num = 0;
|
||||
for ($i = 0, $len = \strlen($string); $i < $len; $i++) {
|
||||
switch ($status) {
|
||||
case 'st':
|
||||
if ($string[$i] == $sep && !$this->parser->escaped($string, $i)) {
|
||||
++$num;
|
||||
} elseif ($string[$i] === '"' || $string[$i] === '\'' || !$explode_in_parenthesis && $string[$i] === '(' && !$this->parser->escaped($string, $i)) {
|
||||
$status = 'str';
|
||||
$to = $string[$i] === '(' ? ')' : $string[$i];
|
||||
isset($output[$num]) ? $output[$num] .= $string[$i] : ($output[$num] = $string[$i]);
|
||||
} else {
|
||||
isset($output[$num]) ? $output[$num] .= $string[$i] : ($output[$num] = $string[$i]);
|
||||
}
|
||||
break;
|
||||
case 'str':
|
||||
if ($string[$i] == $to && !$this->parser->escaped($string, $i)) {
|
||||
$status = 'st';
|
||||
}
|
||||
isset($output[$num]) ? $output[$num] .= $string[$i] : ($output[$num] = $string[$i]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return $output;
|
||||
}
|
||||
public function merge_4value_shorthands($array, $shorthands = null)
|
||||
{
|
||||
$return = $array;
|
||||
if (\is_null($shorthands)) {
|
||||
$shorthands =& $this->parser->data['csstidy']['shorthands'];
|
||||
}
|
||||
foreach ($shorthands as $key => $value) {
|
||||
if ($value !== 0 && isset($array[$value[0]]) && isset($array[$value[1]]) && isset($array[$value[2]]) && isset($array[$value[3]])) {
|
||||
$return[$key] = '';
|
||||
$important = '';
|
||||
for ($i = 0; $i < 4; $i++) {
|
||||
$val = $array[$value[$i]];
|
||||
if ($this->parser->is_important($val)) {
|
||||
$important = '!important';
|
||||
$return[$key] .= $this->parser->gvw_important($val) . ' ';
|
||||
} else {
|
||||
$return[$key] .= $val . ' ';
|
||||
}
|
||||
unset($return[$value[$i]]);
|
||||
}
|
||||
$return[$key] = $this->shorthand(\trim($return[$key] . $important));
|
||||
}
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
public function merge_4value_radius_shorthands($array)
|
||||
{
|
||||
$return = $array;
|
||||
$shorthands =& $this->parser->data['csstidy']['radius_shorthands'];
|
||||
foreach ($shorthands as $key => $value) {
|
||||
if (isset($array[$value[0]]) && isset($array[$value[1]]) && isset($array[$value[2]]) && isset($array[$value[3]]) && $value !== 0) {
|
||||
$return[$key] = '';
|
||||
$a = array();
|
||||
for ($i = 0; $i < 4; $i++) {
|
||||
$v = $this->explode_ws(' ', \trim($array[$value[$i]]));
|
||||
$a[0][$value[$i]] = \reset($v);
|
||||
$a[1][$value[$i]] = \end($v);
|
||||
}
|
||||
$r = array();
|
||||
$r[0] = $this->merge_4value_shorthands($a[0], $shorthands);
|
||||
$r[1] = $this->merge_4value_shorthands($a[1], $shorthands);
|
||||
if (isset($r[0][$key]) and isset($r[1][$key])) {
|
||||
$return[$key] = $r[0][$key];
|
||||
if ($r[1][$key] !== $r[0][$key]) {
|
||||
$return[$key] .= ' / ' . $r[1][$key];
|
||||
}
|
||||
for ($i = 0; $i < 4; $i++) {
|
||||
unset($return[$value[$i]]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
public function dissolve_short_bg($str_value)
|
||||
{
|
||||
// don't try to explose background gradient !
|
||||
if (\stripos($str_value, 'gradient(') !== \false) {
|
||||
return array('background' => $str_value);
|
||||
}
|
||||
$background_prop_default =& $this->parser->data['csstidy']['background_prop_default'];
|
||||
$repeat = array('repeat', 'repeat-x', 'repeat-y', 'no-repeat', 'space');
|
||||
$attachment = array('scroll', 'fixed', 'local');
|
||||
$clip = array('border', 'padding');
|
||||
$origin = array('border', 'padding', 'content');
|
||||
$pos = array('top', 'center', 'bottom', 'left', 'right');
|
||||
$important = '';
|
||||
$return = array('background-image' => null, 'background-size' => null, 'background-repeat' => null, 'background-position' => null, 'background-attachment' => null, 'background-clip' => null, 'background-origin' => null, 'background-color' => null);
|
||||
if ($this->parser->is_important($str_value)) {
|
||||
$important = ' !important';
|
||||
$str_value = $this->parser->gvw_important($str_value);
|
||||
}
|
||||
$str_value = $this->explode_ws(',', $str_value);
|
||||
for ($i = 0; $i < \count($str_value); $i++) {
|
||||
$have['clip'] = \false;
|
||||
$have['pos'] = \false;
|
||||
$have['color'] = \false;
|
||||
$have['bg'] = \false;
|
||||
if (\is_array($str_value[$i])) {
|
||||
$str_value[$i] = $str_value[$i][0];
|
||||
}
|
||||
$str_value[$i] = $this->explode_ws(' ', \trim($str_value[$i]));
|
||||
for ($j = 0; $j < \count($str_value[$i]); $j++) {
|
||||
if ($have['bg'] === \false && (\substr($str_value[$i][$j], 0, 4) === 'url(' || $str_value[$i][$j] === 'none')) {
|
||||
$return['background-image'] .= $str_value[$i][$j] . ',';
|
||||
$have['bg'] = \true;
|
||||
} elseif (\in_array($str_value[$i][$j], $repeat, \true)) {
|
||||
$return['background-repeat'] .= $str_value[$i][$j] . ',';
|
||||
} elseif (\in_array($str_value[$i][$j], $attachment, \true)) {
|
||||
$return['background-attachment'] .= $str_value[$i][$j] . ',';
|
||||
} elseif (\in_array($str_value[$i][$j], $clip, \true) && !$have['clip']) {
|
||||
$return['background-clip'] .= $str_value[$i][$j] . ',';
|
||||
$have['clip'] = \true;
|
||||
} elseif (\in_array($str_value[$i][$j], $origin, \true)) {
|
||||
$return['background-origin'] .= $str_value[$i][$j] . ',';
|
||||
} elseif ($str_value[$i][$j][0] === '(') {
|
||||
$return['background-size'] .= \substr($str_value[$i][$j], 1, -1) . ',';
|
||||
} elseif (\in_array($str_value[$i][$j], $pos, \true) || \is_numeric($str_value[$i][$j][0]) || $str_value[$i][$j][0] === null || $str_value[$i][$j][0] === '-' || $str_value[$i][$j][0] === '.') {
|
||||
$return['background-position'] .= $str_value[$i][$j];
|
||||
if (!$have['pos']) {
|
||||
$return['background-position'] .= ' ';
|
||||
} else {
|
||||
$return['background-position'] .= ',';
|
||||
}
|
||||
$have['pos'] = \true;
|
||||
} elseif (!$have['color']) {
|
||||
$return['background-color'] .= $str_value[$i][$j] . ',';
|
||||
$have['color'] = \true;
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach ($background_prop_default as $bg_prop => $default_value) {
|
||||
if ($return[$bg_prop] !== null) {
|
||||
$return[$bg_prop] = \substr($return[$bg_prop], 0, -1) . $important;
|
||||
} else {
|
||||
$return[$bg_prop] = $default_value . $important;
|
||||
}
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
public function merge_bg($input_css)
|
||||
{
|
||||
$background_prop_default =& $this->parser->data['csstidy']['background_prop_default'];
|
||||
// Max number of background images. CSS3 not yet fully implemented
|
||||
$number_of_values = @\max(\count($this->explode_ws(',', $input_css['background-image'])), \count($this->explode_ws(',', $input_css['background-color'])), 1);
|
||||
// Array with background images to check if BG image exists
|
||||
$bg_img_array = @$this->explode_ws(',', $this->parser->gvw_important($input_css['background-image']));
|
||||
$new_bg_value = '';
|
||||
$important = '';
|
||||
// if background properties is here and not empty, don't try anything
|
||||
if (isset($input_css['background']) && $input_css['background']) {
|
||||
return $input_css;
|
||||
}
|
||||
for ($i = 0; $i < $number_of_values; $i++) {
|
||||
foreach ($background_prop_default as $bg_property => $default_value) {
|
||||
// Skip if property does not exist
|
||||
if (!isset($input_css[$bg_property])) {
|
||||
continue;
|
||||
}
|
||||
$cur_value = $input_css[$bg_property];
|
||||
// skip all optimisation if gradient() somewhere
|
||||
if (\stripos($cur_value, 'gradient(') !== \false) {
|
||||
return $input_css;
|
||||
}
|
||||
// Skip some properties if there is no background image
|
||||
if ((!isset($bg_img_array[$i]) || $bg_img_array[$i] === 'none') && ($bg_property === 'background-size' || $bg_property === 'background-position' || $bg_property === 'background-attachment' || $bg_property === 'background-repeat')) {
|
||||
continue;
|
||||
}
|
||||
// Remove !important
|
||||
if ($this->parser->is_important($cur_value)) {
|
||||
$important = ' !important';
|
||||
$cur_value = $this->parser->gvw_important($cur_value);
|
||||
}
|
||||
// Do not add default values
|
||||
if ($cur_value === $default_value) {
|
||||
continue;
|
||||
}
|
||||
$temp = $this->explode_ws(',', $cur_value);
|
||||
if (isset($temp[$i])) {
|
||||
if ($bg_property === 'background-size') {
|
||||
$new_bg_value .= '(' . $temp[$i] . ') ';
|
||||
} else {
|
||||
$new_bg_value .= $temp[$i] . ' ';
|
||||
}
|
||||
}
|
||||
}
|
||||
$new_bg_value = \trim($new_bg_value);
|
||||
if ($i != $number_of_values - 1) {
|
||||
$new_bg_value .= ',';
|
||||
}
|
||||
}
|
||||
// Delete all background-properties
|
||||
foreach ($background_prop_default as $bg_property => $default_value) {
|
||||
unset($input_css[$bg_property]);
|
||||
}
|
||||
// Add new background property
|
||||
if ($new_bg_value !== '') {
|
||||
$input_css['background'] = $new_bg_value . $important;
|
||||
} elseif (isset($input_css['background'])) {
|
||||
$input_css['background'] = 'none';
|
||||
}
|
||||
return $input_css;
|
||||
}
|
||||
public function dissolve_short_font($str_value)
|
||||
{
|
||||
$font_prop_default =& $this->parser->data['csstidy']['font_prop_default'];
|
||||
$font_weight = array('normal', 'bold', 'bolder', 'lighter', 100, 200, 300, 400, 500, 600, 700, 800, 900);
|
||||
$font_variant = array('normal', 'small-caps');
|
||||
$font_style = array('normal', 'italic', 'oblique');
|
||||
$important = '';
|
||||
$return = array('font-style' => null, 'font-variant' => null, 'font-weight' => null, 'font-size' => null, 'line-height' => null, 'font-family' => null);
|
||||
if ($this->parser->is_important($str_value)) {
|
||||
$important = '!important';
|
||||
$str_value = $this->parser->gvw_important($str_value);
|
||||
}
|
||||
$have['style'] = \false;
|
||||
$have['variant'] = \false;
|
||||
$have['weight'] = \false;
|
||||
$have['size'] = \false;
|
||||
// Detects if font-family consists of several words w/o quotes
|
||||
$multiwords = \false;
|
||||
// Workaround with multiple font-family
|
||||
$str_value = $this->explode_ws(',', \trim($str_value));
|
||||
$str_value[0] = $this->explode_ws(' ', \trim($str_value[0]));
|
||||
for ($j = 0; $j < \count($str_value[0]); $j++) {
|
||||
if ($have['weight'] === \false && \in_array($str_value[0][$j], $font_weight)) {
|
||||
$return['font-weight'] = $str_value[0][$j];
|
||||
$have['weight'] = \true;
|
||||
} elseif ($have['variant'] === \false && \in_array($str_value[0][$j], $font_variant)) {
|
||||
$return['font-variant'] = $str_value[0][$j];
|
||||
$have['variant'] = \true;
|
||||
} elseif ($have['style'] === \false && \in_array($str_value[0][$j], $font_style)) {
|
||||
$return['font-style'] = $str_value[0][$j];
|
||||
$have['style'] = \true;
|
||||
} elseif ($have['size'] === \false && (\is_numeric($str_value[0][$j][0]) || $str_value[0][$j][0] === null || $str_value[0][$j][0] === '.')) {
|
||||
$size = $this->explode_ws('/', \trim($str_value[0][$j]));
|
||||
$return['font-size'] = $size[0];
|
||||
if (isset($size[1])) {
|
||||
$return['line-height'] = $size[1];
|
||||
} else {
|
||||
$return['line-height'] = '';
|
||||
// don't add 'normal' !
|
||||
}
|
||||
$have['size'] = \true;
|
||||
} else {
|
||||
if (isset($return['font-family'])) {
|
||||
$return['font-family'] .= ' ' . $str_value[0][$j];
|
||||
$multiwords = \true;
|
||||
} else {
|
||||
$return['font-family'] = $str_value[0][$j];
|
||||
}
|
||||
}
|
||||
}
|
||||
// add quotes if we have several qords in font-family
|
||||
if ($multiwords !== \false) {
|
||||
$return['font-family'] = '"' . $return['font-family'] . '"';
|
||||
}
|
||||
$i = 1;
|
||||
while (isset($str_value[$i])) {
|
||||
$return['font-family'] .= ',' . \trim($str_value[$i]);
|
||||
$i++;
|
||||
}
|
||||
// Fix for 100 and more font-size
|
||||
if ($have['size'] === \false && isset($return['font-weight']) && \is_numeric($return['font-weight'][0])) {
|
||||
$return['font-size'] = $return['font-weight'];
|
||||
unset($return['font-weight']);
|
||||
}
|
||||
foreach ($font_prop_default as $font_prop => $default_value) {
|
||||
if ($return[$font_prop] !== null) {
|
||||
$return[$font_prop] = $return[$font_prop] . $important;
|
||||
} else {
|
||||
$return[$font_prop] = $default_value . $important;
|
||||
}
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
public function merge_font($input_css)
|
||||
{
|
||||
$font_prop_default =& $this->parser->data['csstidy']['font_prop_default'];
|
||||
$new_font_value = '';
|
||||
$important = '';
|
||||
// Skip if not font-family and font-size set
|
||||
if (isset($input_css['font-family']) && isset($input_css['font-size']) && $input_css['font-family'] != 'inherit') {
|
||||
// fix several words in font-family - add quotes
|
||||
if (isset($input_css['font-family'])) {
|
||||
$families = \explode(',', $input_css['font-family']);
|
||||
$result_families = array();
|
||||
foreach ($families as $family) {
|
||||
$family = \trim($family);
|
||||
$len = \strlen($family);
|
||||
if (\strpos($family, ' ') && !($family[0] === '"' && $family[$len - 1] === '"' || $family[0] === "'" && $family[$len - 1] === "'")) {
|
||||
$family = '"' . $family . '"';
|
||||
}
|
||||
$result_families[] = $family;
|
||||
}
|
||||
$input_css['font-family'] = \implode(',', $result_families);
|
||||
}
|
||||
foreach ($font_prop_default as $font_property => $default_value) {
|
||||
// Skip if property does not exist
|
||||
if (!isset($input_css[$font_property])) {
|
||||
continue;
|
||||
}
|
||||
$cur_value = $input_css[$font_property];
|
||||
// Skip if default value is used
|
||||
if ($cur_value === $default_value) {
|
||||
continue;
|
||||
}
|
||||
// Remove !important
|
||||
if ($this->parser->is_important($cur_value)) {
|
||||
$important = '!important';
|
||||
$cur_value = $this->parser->gvw_important($cur_value);
|
||||
}
|
||||
$new_font_value .= $cur_value;
|
||||
// Add delimiter
|
||||
$new_font_value .= $font_property === 'font-size' && isset($input_css['line-height']) ? '/' : ' ';
|
||||
}
|
||||
$new_font_value = \trim($new_font_value);
|
||||
// Delete all font-properties
|
||||
foreach ($font_prop_default as $font_property => $default_value) {
|
||||
if ($font_property !== 'font' || !$new_font_value) {
|
||||
unset($input_css[$font_property]);
|
||||
}
|
||||
}
|
||||
// Add new font property
|
||||
if ($new_font_value !== '') {
|
||||
$input_css['font'] = $new_font_value . $important;
|
||||
}
|
||||
}
|
||||
return $input_css;
|
||||
}
|
||||
public function reverse_left_and_right($array)
|
||||
{
|
||||
$return = array();
|
||||
// change left <-> right in properties name and values
|
||||
foreach ($array as $propertie => $value) {
|
||||
if (\method_exists($this, $m = 'reverse_left_and_right_' . \str_replace('-', '_', \trim($propertie)))) {
|
||||
$value = $this->{$m}($value);
|
||||
}
|
||||
// simple replacement for properties
|
||||
$propertie = \str_ireplace(array('left', 'right', "\x01"), array("\x01", 'left', 'right'), $propertie);
|
||||
// be careful for values, not modifying protected or quoted valued
|
||||
foreach (array('left' => "\x01", 'right' => 'left', "\x01" => 'right') as $v => $r) {
|
||||
if (\strpos($value, $v) !== \false) {
|
||||
// attraper les left et right separes du reste (pas au milieu d'un mot)
|
||||
if (\in_array($v, array('left', 'right'))) {
|
||||
$value = \preg_replace(",\\b{$v}\\b,", "\x00", $value);
|
||||
} else {
|
||||
$value = \str_replace($v, "\x00", $value);
|
||||
}
|
||||
$value = $this->explode_ws("\x00", $value . ' ', \true);
|
||||
$value = \rtrim(\implode($r, $value));
|
||||
$value = \str_replace("\x00", $v, $value);
|
||||
}
|
||||
}
|
||||
$return[$propertie] = $value;
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
public function reverse_left_and_right_4value_shorthands($property, $value)
|
||||
{
|
||||
$shorthands =& $this->parser->data['csstidy']['shorthands'];
|
||||
if (isset($shorthands[$property])) {
|
||||
$property_right = $shorthands[$property][1];
|
||||
$property_left = $shorthands[$property][3];
|
||||
$v = $this->dissolve_4value_shorthands($property, $value);
|
||||
if ($v[$property_left] !== $v[$property_right]) {
|
||||
$r = $v[$property_right];
|
||||
$v[$property_right] = $v[$property_left];
|
||||
$v[$property_left] = $r;
|
||||
$v = $this->merge_4value_shorthands($v);
|
||||
if (isset($v[$property])) {
|
||||
return $v[$property];
|
||||
}
|
||||
}
|
||||
}
|
||||
return $value;
|
||||
}
|
||||
public function reverse_left_and_right_4value_radius_shorthands($property, $value)
|
||||
{
|
||||
$shorthands =& $this->parser->data['csstidy']['radius_shorthands'];
|
||||
if (isset($shorthands[$property])) {
|
||||
$v = $this->dissolve_4value_radius_shorthands($property, $value);
|
||||
if ($v[$shorthands[$property][0]] !== $v[$shorthands[$property][1]] or $v[$shorthands[$property][2]] !== $v[$shorthands[$property][3]]) {
|
||||
$r = array($shorthands[$property][0] => $v[$shorthands[$property][1]], $shorthands[$property][1] => $v[$shorthands[$property][0]], $shorthands[$property][2] => $v[$shorthands[$property][3]], $shorthands[$property][3] => $v[$shorthands[$property][2]]);
|
||||
$v = $this->merge_4value_radius_shorthands($r);
|
||||
if (isset($v[$property])) {
|
||||
return $v[$property];
|
||||
}
|
||||
}
|
||||
}
|
||||
return $value;
|
||||
}
|
||||
public function reverse_left_and_right_margin($value)
|
||||
{
|
||||
return $this->reverse_left_and_right_4value_shorthands('margin', $value);
|
||||
}
|
||||
public function reverse_left_and_right_padding($value)
|
||||
{
|
||||
return $this->reverse_left_and_right_4value_shorthands('padding', $value);
|
||||
}
|
||||
public function reverse_left_and_right_border_color($value)
|
||||
{
|
||||
return $this->reverse_left_and_right_4value_shorthands('border-color', $value);
|
||||
}
|
||||
public function reverse_left_and_right_border_style($value)
|
||||
{
|
||||
return $this->reverse_left_and_right_4value_shorthands('border-style', $value);
|
||||
}
|
||||
public function reverse_left_and_right_border_width($value)
|
||||
{
|
||||
return $this->reverse_left_and_right_4value_shorthands('border-width', $value);
|
||||
}
|
||||
public function reverse_left_and_right_border_radius($value)
|
||||
{
|
||||
return $this->reverse_left_and_right_4value_radius_shorthands('border-radius', $value);
|
||||
}
|
||||
public function reverse_left_and_right__moz_border_radius($value)
|
||||
{
|
||||
return $this->reverse_left_and_right_4value_radius_shorthands('border-radius', $value);
|
||||
}
|
||||
public function reverse_left_and_right__webkit_border_radius($value)
|
||||
{
|
||||
return $this->reverse_left_and_right_4value_radius_shorthands('border-radius', $value);
|
||||
}
|
||||
public function reverse_left_and_right_background($value)
|
||||
{
|
||||
$values = $this->dissolve_short_bg($value);
|
||||
if (isset($values['background-position']) and $values['background-position']) {
|
||||
$v = $this->reverse_left_and_right_background_position($values['background-position']);
|
||||
if ($v !== $values['background-position']) {
|
||||
if ($value == $values['background-position']) {
|
||||
return $v;
|
||||
} else {
|
||||
$values['background-position'] = $v;
|
||||
$x = $this->merge_bg($values);
|
||||
if (isset($x['background'])) {
|
||||
return $x['background'];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return $value;
|
||||
}
|
||||
public function reverse_left_and_right_background_position_x($value)
|
||||
{
|
||||
return $this->reverse_left_and_right_background_position($value);
|
||||
}
|
||||
public function reverse_left_and_right_background_position($value)
|
||||
{
|
||||
// multiple background case
|
||||
if (\strpos($value, ',') !== \false) {
|
||||
$values = $this->explode_ws(',', $value);
|
||||
if (\count($values) > 1) {
|
||||
foreach ($values as $k => $v) {
|
||||
$values[$k] = $this->reverse_left_and_right_background_position($v);
|
||||
}
|
||||
return \implode(',', $values);
|
||||
}
|
||||
}
|
||||
// if no explicit left or right value
|
||||
if (\stripos($value, 'left') === \false and \stripos($value, 'right') === \false) {
|
||||
$values = $this->explode_ws(' ', \trim($value));
|
||||
$values = \array_map('trim', $values);
|
||||
$values = \array_filter($values, function ($v) {
|
||||
return \strlen($v);
|
||||
});
|
||||
$values = \array_values($values);
|
||||
if (\count($values) == 1) {
|
||||
if (\in_array($value, array('center', 'top', 'bottom', 'inherit', 'initial', 'unset'))) {
|
||||
return $value;
|
||||
}
|
||||
return "left {$value}";
|
||||
}
|
||||
if ($values[1] == 'top' or $values[1] == 'bottom') {
|
||||
if ($values[0] === 'center') {
|
||||
return $value;
|
||||
}
|
||||
return 'left ' . \implode(' ', $values);
|
||||
} else {
|
||||
$last = \array_pop($values);
|
||||
if ($last === 'center') {
|
||||
return $value;
|
||||
}
|
||||
return \implode(' ', $values) . ' left ' . $last;
|
||||
}
|
||||
}
|
||||
return $value;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,320 @@
|
||||
<?php
|
||||
namespace MailPoetVendor;
|
||||
if (!defined('ABSPATH')) exit;
|
||||
class csstidy_print
|
||||
{
|
||||
public $parser;
|
||||
public $input_css = '';
|
||||
public $output_css = '';
|
||||
public $output_css_plain = '';
|
||||
public $css;
|
||||
public $template;
|
||||
public $tokens;
|
||||
public $charset;
|
||||
public $import;
|
||||
public $namespace;
|
||||
public function __construct($css)
|
||||
{
|
||||
$this->parser = $css;
|
||||
$this->css =& $css->css;
|
||||
$this->template =& $css->template;
|
||||
$this->tokens =& $css->tokens;
|
||||
$this->charset =& $css->charset;
|
||||
$this->import =& $css->import;
|
||||
$this->namespace =& $css->namespace;
|
||||
}
|
||||
public function _reset()
|
||||
{
|
||||
$this->output_css = '';
|
||||
$this->output_css_plain = '';
|
||||
}
|
||||
public function plain($default_media = '')
|
||||
{
|
||||
$this->_print(\true, $default_media);
|
||||
return $this->output_css_plain;
|
||||
}
|
||||
public function formatted($default_media = '')
|
||||
{
|
||||
$this->_print(\false, $default_media);
|
||||
return $this->output_css;
|
||||
}
|
||||
public function formatted_page($doctype = 'html5', $externalcss = \true, $title = '', $lang = 'en')
|
||||
{
|
||||
switch ($doctype) {
|
||||
case 'html5':
|
||||
$doctype_output = '<!DOCTYPE html>';
|
||||
break;
|
||||
case 'xhtml1.0strict':
|
||||
$doctype_output = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">';
|
||||
break;
|
||||
case 'xhtml1.1':
|
||||
default:
|
||||
$doctype_output = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
|
||||
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">';
|
||||
break;
|
||||
}
|
||||
$output = $cssparsed = '';
|
||||
$this->output_css_plain =& $output;
|
||||
$output .= $doctype_output . "\n" . '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="' . $lang . '"';
|
||||
$output .= $doctype === 'xhtml1.1' ? '>' : ' lang="' . $lang . '">';
|
||||
$output .= "\n<head>\n <title>{$title}</title>";
|
||||
if ($externalcss) {
|
||||
$output .= "\n <style type=\"text/css\">\n";
|
||||
$cssparsed = \file_get_contents('cssparsed.css');
|
||||
$output .= $cssparsed;
|
||||
// Adds an invisible BOM or something, but not in css_optimised.php
|
||||
$output .= "\n</style>";
|
||||
} else {
|
||||
$output .= "\n" . ' <link rel="stylesheet" type="text/css" href="cssparsed.css" />';
|
||||
}
|
||||
$output .= "\n</head>\n<body><code id=\"copytext\">";
|
||||
$output .= $this->formatted();
|
||||
$output .= '</code>' . "\n" . '</body></html>';
|
||||
return $this->output_css_plain;
|
||||
}
|
||||
public function _print($plain = \false, $default_media = '')
|
||||
{
|
||||
if ($this->output_css && $this->output_css_plain) {
|
||||
return;
|
||||
}
|
||||
$output = '';
|
||||
if (!$this->parser->get_cfg('preserve_css')) {
|
||||
$this->_convert_raw_css($default_media);
|
||||
}
|
||||
$template =& $this->template;
|
||||
if ($plain) {
|
||||
$template = \array_map('strip_tags', $template);
|
||||
}
|
||||
if ($this->parser->get_cfg('timestamp')) {
|
||||
\array_unshift($this->tokens, array(\COMMENT, ' CSSTidy ' . $this->parser->version . ': ' . \date('r') . ' '));
|
||||
}
|
||||
if (!empty($this->charset)) {
|
||||
$output .= $template[0] . '@charset ' . $template[5] . $this->charset . $template[6] . $template[13];
|
||||
}
|
||||
if (!empty($this->import)) {
|
||||
for ($i = 0, $size = \count($this->import); $i < $size; $i++) {
|
||||
if (\substr($this->import[$i], 0, 4) === 'url(' && \substr($this->import[$i], -1, 1) === ')') {
|
||||
$this->import[$i] = '"' . \substr($this->import[$i], 4, -1) . '"';
|
||||
$this->parser->log('Optimised @import : Removed "url("', 'Information');
|
||||
} else {
|
||||
if (!\preg_match('/^".+"$/', $this->import[$i])) {
|
||||
// fixes a bug for @import ".." instead of the expected @import url("..")
|
||||
// If it comes in due to @import ".." the "" will be missing and the output will become @import .. (which is an error)
|
||||
$this->import[$i] = '"' . $this->import[$i] . '"';
|
||||
}
|
||||
}
|
||||
$output .= $template[0] . '@import ' . $template[5] . $this->import[$i] . $template[6] . $template[13];
|
||||
}
|
||||
}
|
||||
if (!empty($this->namespace)) {
|
||||
if (($p = \strpos($this->namespace, "url(")) !== \false && \substr($this->namespace, -1, 1) === ')') {
|
||||
$this->namespace = \substr_replace($this->namespace, '"', $p, 4);
|
||||
$this->namespace = \substr($this->namespace, 0, -1) . '"';
|
||||
$this->parser->log('Optimised @namespace : Removed "url("', 'Information');
|
||||
}
|
||||
$output .= $template[0] . '@namespace ' . $template[5] . $this->namespace . $template[6] . $template[13];
|
||||
}
|
||||
$in_at_out = [];
|
||||
$out =& $output;
|
||||
$indent_level = 0;
|
||||
foreach ($this->tokens as $key => $token) {
|
||||
switch ($token[0]) {
|
||||
case \AT_START:
|
||||
$out .= $template[0] . $this->_htmlsp($token[1], $plain) . $template[1];
|
||||
$indent_level++;
|
||||
if (!isset($in_at_out[$indent_level])) {
|
||||
$in_at_out[$indent_level] = '';
|
||||
}
|
||||
$out =& $in_at_out[$indent_level];
|
||||
break;
|
||||
case \SEL_START:
|
||||
if ($this->parser->get_cfg('lowercase_s')) {
|
||||
$token[1] = \strtolower($token[1]);
|
||||
}
|
||||
$out .= $token[1][0] !== '@' ? $template[2] . $this->_htmlsp($token[1], $plain) : $template[0] . $this->_htmlsp($token[1], $plain);
|
||||
$out .= $template[3];
|
||||
break;
|
||||
case \PROPERTY:
|
||||
if ($this->parser->get_cfg('case_properties') === 2) {
|
||||
$token[1] = \strtoupper($token[1]);
|
||||
} elseif ($this->parser->get_cfg('case_properties') === 1) {
|
||||
$token[1] = \strtolower($token[1]);
|
||||
}
|
||||
$out .= $template[4] . $this->_htmlsp($token[1], $plain) . ':' . $template[5];
|
||||
break;
|
||||
case \VALUE:
|
||||
$out .= $this->_htmlsp($token[1], $plain);
|
||||
if ($this->_seeknocomment($key, 1) == \SEL_END && $this->parser->get_cfg('remove_last_;')) {
|
||||
$out .= \str_replace(';', '', $template[6]);
|
||||
} else {
|
||||
$out .= $template[6];
|
||||
}
|
||||
break;
|
||||
case \SEL_END:
|
||||
$out .= $template[7];
|
||||
if ($this->_seeknocomment($key, 1) != \AT_END) {
|
||||
$out .= $template[8];
|
||||
}
|
||||
break;
|
||||
case \AT_END:
|
||||
if (\strlen($template[10])) {
|
||||
// indent the bloc we are closing
|
||||
$out = \str_replace("\n\n", "\r\n", $out);
|
||||
// don't fill empty lines
|
||||
$out = \str_replace("\n", "\n" . $template[10], $out);
|
||||
$out = \str_replace("\r\n", "\n\n", $out);
|
||||
}
|
||||
if ($indent_level > 1) {
|
||||
$out =& $in_at_out[$indent_level - 1];
|
||||
} else {
|
||||
$out =& $output;
|
||||
}
|
||||
$out .= $template[10] . $in_at_out[$indent_level];
|
||||
if ($this->_seeknocomment($key, 1) != \AT_END) {
|
||||
$out .= $template[9];
|
||||
} else {
|
||||
$out .= \rtrim($template[9]);
|
||||
}
|
||||
unset($in_at_out[$indent_level]);
|
||||
$indent_level--;
|
||||
break;
|
||||
case \IMPORTANT_COMMENT:
|
||||
case \COMMENT:
|
||||
$out .= $template[11] . '/*' . $this->_htmlsp($token[1], $plain) . '*/' . $template[12];
|
||||
break;
|
||||
}
|
||||
}
|
||||
$output = \trim($output);
|
||||
if (!$plain) {
|
||||
$this->output_css = $output;
|
||||
$this->_print(\true);
|
||||
} else {
|
||||
// If using spaces in the template, don't want these to appear in the plain output
|
||||
$this->output_css_plain = \str_replace(' ', '', $output);
|
||||
}
|
||||
}
|
||||
public function _seeknocomment($key, $move)
|
||||
{
|
||||
$go = $move > 0 ? 1 : -1;
|
||||
for ($i = $key + 1; \abs($key - $i) - 1 < \abs($move); $i += $go) {
|
||||
if (!isset($this->tokens[$i])) {
|
||||
return;
|
||||
}
|
||||
if ($this->tokens[$i][0] == \COMMENT) {
|
||||
$move += 1;
|
||||
continue;
|
||||
}
|
||||
return $this->tokens[$i][0];
|
||||
}
|
||||
}
|
||||
public function _convert_raw_css($default_media = '')
|
||||
{
|
||||
$this->tokens = array();
|
||||
$sort_selectors = $this->parser->get_cfg('sort_selectors');
|
||||
$sort_properties = $this->parser->get_cfg('sort_properties');
|
||||
// important comment section ?
|
||||
if (isset($this->css['!'])) {
|
||||
$this->parser->_add_token(\IMPORTANT_COMMENT, \rtrim($this->css['!']), \true);
|
||||
unset($this->css['!']);
|
||||
}
|
||||
foreach ($this->css as $medium => $val) {
|
||||
if ($sort_selectors) {
|
||||
\ksort($val);
|
||||
}
|
||||
if (\intval($medium) < \DEFAULT_AT) {
|
||||
// un medium vide (contenant @font-face ou autre @) ne produit aucun conteneur
|
||||
if (\strlen(\trim($medium))) {
|
||||
$parts_to_open = \explode('{', $medium);
|
||||
foreach ($parts_to_open as $part) {
|
||||
$this->parser->_add_token(\AT_START, $part, \true);
|
||||
}
|
||||
}
|
||||
} elseif ($default_media) {
|
||||
$this->parser->_add_token(\AT_START, $default_media, \true);
|
||||
}
|
||||
foreach ($val as $selector => $vali) {
|
||||
if ($sort_properties) {
|
||||
\ksort($vali);
|
||||
}
|
||||
$this->parser->_add_token(\SEL_START, $selector, \true);
|
||||
$invalid = array(
|
||||
'*' => array(),
|
||||
// IE7 hacks first
|
||||
'_' => array(),
|
||||
// IE6 hacks
|
||||
'/' => array(),
|
||||
// IE6 hacks
|
||||
'-' => array(),
|
||||
);
|
||||
foreach ($vali as $property => $valj) {
|
||||
if (\strncmp($property, "//", 2) !== 0) {
|
||||
$matches = array();
|
||||
if ($sort_properties && \preg_match('/^(\\*|_|\\/|-)(?!(ms|moz|o\\b|xv|atsc|wap|khtml|webkit|ah|hp|ro|rim|tc)-)/', $property, $matches)) {
|
||||
$invalid[$matches[1]][$property] = $valj;
|
||||
} else {
|
||||
$this->parser->_add_token(\PROPERTY, $property, \true);
|
||||
$this->parser->_add_token(\VALUE, $valj, \true);
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach ($invalid as $prefix => $props) {
|
||||
foreach ($props as $property => $valj) {
|
||||
$this->parser->_add_token(\PROPERTY, $property, \true);
|
||||
$this->parser->_add_token(\VALUE, $valj, \true);
|
||||
}
|
||||
}
|
||||
$this->parser->_add_token(\SEL_END, $selector, \true);
|
||||
}
|
||||
if (\intval($medium) < \DEFAULT_AT) {
|
||||
// un medium vide (contenant @font-face ou autre @) ne produit aucun conteneur
|
||||
if (\strlen(\trim($medium))) {
|
||||
$parts_to_close = \explode('{', $medium);
|
||||
foreach (\array_reverse($parts_to_close) as $part) {
|
||||
$this->parser->_add_token(\AT_END, $part, \true);
|
||||
}
|
||||
}
|
||||
} elseif ($default_media) {
|
||||
$this->parser->_add_token(\AT_END, $default_media, \true);
|
||||
}
|
||||
}
|
||||
}
|
||||
public function _htmlsp($string, $plain)
|
||||
{
|
||||
if (!$plain) {
|
||||
return \htmlspecialchars($string, \ENT_QUOTES, 'utf-8');
|
||||
}
|
||||
return $string;
|
||||
}
|
||||
public function get_ratio()
|
||||
{
|
||||
if (!$this->output_css_plain) {
|
||||
$this->formatted();
|
||||
}
|
||||
return \round((\strlen($this->input_css) - \strlen($this->output_css_plain)) / \strlen($this->input_css), 3) * 100;
|
||||
}
|
||||
public function get_diff()
|
||||
{
|
||||
if (!$this->output_css_plain) {
|
||||
$this->formatted();
|
||||
}
|
||||
$diff = \strlen($this->output_css_plain) - \strlen($this->input_css);
|
||||
if ($diff > 0) {
|
||||
return '+' . $diff;
|
||||
} elseif ($diff == 0) {
|
||||
return '+-' . $diff;
|
||||
}
|
||||
return $diff;
|
||||
}
|
||||
public function size($loc = 'output')
|
||||
{
|
||||
if ($loc === 'output' && !$this->output_css) {
|
||||
$this->formatted();
|
||||
}
|
||||
if ($loc === 'input') {
|
||||
return \strlen($this->input_css) / 1000;
|
||||
} else {
|
||||
return \strlen($this->output_css_plain) / 1000;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,119 @@
|
||||
@import "cssparsed.css";
|
||||
|
||||
html,body {
|
||||
font:.8em Verdana,Helvetica,sans-serif;
|
||||
background:#f8f8f6
|
||||
}
|
||||
|
||||
code {
|
||||
font-size:1.2em
|
||||
}
|
||||
|
||||
div#rightcol {
|
||||
padding-left:32em
|
||||
}
|
||||
|
||||
fieldset {
|
||||
display:block;
|
||||
margin:.5em 0;
|
||||
padding:1em;
|
||||
border:solid #7284ab 2px
|
||||
}
|
||||
|
||||
fieldset.code_output {
|
||||
display:inline
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size:2em
|
||||
}
|
||||
|
||||
small {
|
||||
font-size:.7em
|
||||
}
|
||||
|
||||
fieldset#field_input {
|
||||
float:left;
|
||||
margin:0 .5em 1em 0
|
||||
}
|
||||
|
||||
fieldset#options,fieldset#code_layout {
|
||||
width:31em
|
||||
}
|
||||
|
||||
input#submit {
|
||||
clear:both;
|
||||
display:block;
|
||||
margin:1em
|
||||
}
|
||||
|
||||
select {
|
||||
margin:2px 0 0
|
||||
}
|
||||
|
||||
label.block {
|
||||
display:block
|
||||
}
|
||||
|
||||
legend {
|
||||
background:#c4e1c3;
|
||||
padding:2px 4px;
|
||||
border:dashed 1px
|
||||
}
|
||||
|
||||
textarea#css_text {
|
||||
width:27em;
|
||||
height:370px;
|
||||
display:block;
|
||||
margin-right:1em
|
||||
}
|
||||
|
||||
.help {
|
||||
cursor:help
|
||||
}
|
||||
|
||||
p.important {
|
||||
border:solid 1px red;
|
||||
font-weight:700;
|
||||
padding:1em;
|
||||
background:#fff
|
||||
}
|
||||
|
||||
p {
|
||||
margin:1em 0
|
||||
}
|
||||
|
||||
dl {
|
||||
padding-left:.5em
|
||||
}
|
||||
|
||||
dt {
|
||||
font-weight:700;
|
||||
margin:0;
|
||||
float:left;
|
||||
clear:both;
|
||||
height:1.5em
|
||||
}
|
||||
|
||||
dd {
|
||||
margin:0 0 0 4em;
|
||||
height:1.5em
|
||||
}
|
||||
|
||||
fieldset#messages {
|
||||
background:#fff;
|
||||
padding:0 0 0 1em
|
||||
}
|
||||
|
||||
fieldset#messages div {
|
||||
height:10em;
|
||||
overflow:auto
|
||||
}
|
||||
|
||||
dd.Warning {
|
||||
color:orange
|
||||
}
|
||||
|
||||
dd.Information {
|
||||
color:green
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
code#copytext {
|
||||
white-space:pre;
|
||||
font-family:Verdana
|
||||
}
|
||||
|
||||
.at {
|
||||
color:#00008b
|
||||
}
|
||||
|
||||
.format {
|
||||
color:gray
|
||||
}
|
||||
|
||||
.property {
|
||||
color:green
|
||||
}
|
||||
|
||||
.selector {
|
||||
color:blue
|
||||
}
|
||||
|
||||
.value {
|
||||
color:red;
|
||||
left:500px
|
||||
}
|
||||
|
||||
.comment {
|
||||
color:orange
|
||||
}
|
||||
@@ -0,0 +1,529 @@
|
||||
<?php
|
||||
namespace MailPoetVendor;
|
||||
if (!defined('ABSPATH')) exit;
|
||||
$data['csstidy']['whitespace'] = array(' ', "\n", "\t", "\r", "\v");
|
||||
$data['csstidy']['tokens'] = '/@}{;:=\'"(,\\!$%&)*+.<>?[]^`|~';
|
||||
$data['csstidy']['units'] = array('in', 'cm', 'mm', 'pt', 'pc', 'px', 'rem', 'em', '%', 'ex', 'gd', 'vw', 'vh', 'vm', 'deg', 'grad', 'rad', 'turn', 'ms', 's', 'khz', 'hz', 'ch', 'vmin', 'vmax', 'dpi', 'dpcm', 'dppx');
|
||||
$data['csstidy']['at_rules'] = array('page' => 'is', 'font-face' => 'atis', 'charset' => 'iv', 'import' => 'iv', 'namespace' => 'iv', 'media' => 'at', 'supports' => 'at', 'keyframes' => 'at', '-moz-keyframes' => 'at', '-o-keyframes' => 'at', '-webkit-keyframes' => 'at', '-ms-keyframes' => 'at');
|
||||
$data['csstidy']['unit_values'] = array('background', 'background-position', 'background-size', 'border', 'border-top', 'border-right', 'border-bottom', 'border-left', 'border-width', 'border-top-width', 'border-right-width', 'border-left-width', 'border-bottom-width', 'bottom', 'border-spacing', 'column-gap', 'column-width', 'font-size', 'height', 'left', 'margin', 'margin-top', 'margin-right', 'margin-bottom', 'margin-left', 'max-height', 'max-width', 'min-height', 'min-width', 'outline', 'outline-width', 'padding', 'padding-top', 'padding-right', 'padding-bottom', 'padding-left', 'perspective', 'right', 'top', 'text-indent', 'letter-spacing', 'word-spacing', 'width');
|
||||
$data['csstidy']['color_values'] = array();
|
||||
$data['csstidy']['color_values'][] = 'background-color';
|
||||
$data['csstidy']['color_values'][] = 'border-color';
|
||||
$data['csstidy']['color_values'][] = 'border-top-color';
|
||||
$data['csstidy']['color_values'][] = 'border-right-color';
|
||||
$data['csstidy']['color_values'][] = 'border-bottom-color';
|
||||
$data['csstidy']['color_values'][] = 'border-left-color';
|
||||
$data['csstidy']['color_values'][] = 'color';
|
||||
$data['csstidy']['color_values'][] = 'outline-color';
|
||||
$data['csstidy']['color_values'][] = 'column-rule-color';
|
||||
$data['csstidy']['background_prop_default'] = array();
|
||||
$data['csstidy']['background_prop_default']['background-image'] = 'none';
|
||||
$data['csstidy']['background_prop_default']['background-size'] = 'auto';
|
||||
$data['csstidy']['background_prop_default']['background-repeat'] = 'repeat';
|
||||
$data['csstidy']['background_prop_default']['background-position'] = '0 0';
|
||||
$data['csstidy']['background_prop_default']['background-attachment'] = 'scroll';
|
||||
$data['csstidy']['background_prop_default']['background-clip'] = 'border';
|
||||
$data['csstidy']['background_prop_default']['background-origin'] = 'padding';
|
||||
$data['csstidy']['background_prop_default']['background-color'] = 'transparent';
|
||||
$data['csstidy']['font_prop_default'] = array();
|
||||
$data['csstidy']['font_prop_default']['font-style'] = 'normal';
|
||||
$data['csstidy']['font_prop_default']['font-variant'] = 'normal';
|
||||
$data['csstidy']['font_prop_default']['font-weight'] = 'normal';
|
||||
$data['csstidy']['font_prop_default']['font-size'] = '';
|
||||
$data['csstidy']['font_prop_default']['line-height'] = '';
|
||||
$data['csstidy']['font_prop_default']['font-family'] = '';
|
||||
$data['csstidy']['replace_colors'] = array();
|
||||
$data['csstidy']['replace_colors']['aliceblue'] = '#f0f8ff';
|
||||
$data['csstidy']['replace_colors']['antiquewhite'] = '#faebd7';
|
||||
$data['csstidy']['replace_colors']['aquamarine'] = '#7fffd4';
|
||||
$data['csstidy']['replace_colors']['azure'] = '#f0ffff';
|
||||
$data['csstidy']['replace_colors']['beige'] = '#f5f5dc';
|
||||
$data['csstidy']['replace_colors']['bisque'] = '#ffe4c4';
|
||||
$data['csstidy']['replace_colors']['blanchedalmond'] = '#ffebcd';
|
||||
$data['csstidy']['replace_colors']['blueviolet'] = '#8a2be2';
|
||||
$data['csstidy']['replace_colors']['brown'] = '#a52a2a';
|
||||
$data['csstidy']['replace_colors']['burlywood'] = '#deb887';
|
||||
$data['csstidy']['replace_colors']['cadetblue'] = '#5f9ea0';
|
||||
$data['csstidy']['replace_colors']['chartreuse'] = '#7fff00';
|
||||
$data['csstidy']['replace_colors']['chocolate'] = '#d2691e';
|
||||
$data['csstidy']['replace_colors']['coral'] = '#ff7f50';
|
||||
$data['csstidy']['replace_colors']['cornflowerblue'] = '#6495ed';
|
||||
$data['csstidy']['replace_colors']['cornsilk'] = '#fff8dc';
|
||||
$data['csstidy']['replace_colors']['crimson'] = '#dc143c';
|
||||
$data['csstidy']['replace_colors']['cyan'] = '#00ffff';
|
||||
$data['csstidy']['replace_colors']['darkblue'] = '#00008b';
|
||||
$data['csstidy']['replace_colors']['darkcyan'] = '#008b8b';
|
||||
$data['csstidy']['replace_colors']['darkgoldenrod'] = '#b8860b';
|
||||
$data['csstidy']['replace_colors']['darkgray'] = '#a9a9a9';
|
||||
$data['csstidy']['replace_colors']['darkgreen'] = '#006400';
|
||||
$data['csstidy']['replace_colors']['darkkhaki'] = '#bdb76b';
|
||||
$data['csstidy']['replace_colors']['darkmagenta'] = '#8b008b';
|
||||
$data['csstidy']['replace_colors']['darkolivegreen'] = '#556b2f';
|
||||
$data['csstidy']['replace_colors']['darkorange'] = '#ff8c00';
|
||||
$data['csstidy']['replace_colors']['darkorchid'] = '#9932cc';
|
||||
$data['csstidy']['replace_colors']['darkred'] = '#8b0000';
|
||||
$data['csstidy']['replace_colors']['darksalmon'] = '#e9967a';
|
||||
$data['csstidy']['replace_colors']['darkseagreen'] = '#8fbc8f';
|
||||
$data['csstidy']['replace_colors']['darkslateblue'] = '#483d8b';
|
||||
$data['csstidy']['replace_colors']['darkslategray'] = '#2f4f4f';
|
||||
$data['csstidy']['replace_colors']['darkturquoise'] = '#00ced1';
|
||||
$data['csstidy']['replace_colors']['darkviolet'] = '#9400d3';
|
||||
$data['csstidy']['replace_colors']['deeppink'] = '#ff1493';
|
||||
$data['csstidy']['replace_colors']['deepskyblue'] = '#00bfff';
|
||||
$data['csstidy']['replace_colors']['dimgray'] = '#696969';
|
||||
$data['csstidy']['replace_colors']['dodgerblue'] = '#1e90ff';
|
||||
$data['csstidy']['replace_colors']['feldspar'] = '#d19275';
|
||||
$data['csstidy']['replace_colors']['firebrick'] = '#b22222';
|
||||
$data['csstidy']['replace_colors']['floralwhite'] = '#fffaf0';
|
||||
$data['csstidy']['replace_colors']['forestgreen'] = '#228b22';
|
||||
$data['csstidy']['replace_colors']['gainsboro'] = '#dcdcdc';
|
||||
$data['csstidy']['replace_colors']['ghostwhite'] = '#f8f8ff';
|
||||
$data['csstidy']['replace_colors']['gold'] = '#ffd700';
|
||||
$data['csstidy']['replace_colors']['goldenrod'] = '#daa520';
|
||||
$data['csstidy']['replace_colors']['greenyellow'] = '#adff2f';
|
||||
$data['csstidy']['replace_colors']['honeydew'] = '#f0fff0';
|
||||
$data['csstidy']['replace_colors']['hotpink'] = '#ff69b4';
|
||||
$data['csstidy']['replace_colors']['indianred'] = '#cd5c5c';
|
||||
$data['csstidy']['replace_colors']['indigo'] = '#4b0082';
|
||||
$data['csstidy']['replace_colors']['ivory'] = '#fffff0';
|
||||
$data['csstidy']['replace_colors']['khaki'] = '#f0e68c';
|
||||
$data['csstidy']['replace_colors']['lavender'] = '#e6e6fa';
|
||||
$data['csstidy']['replace_colors']['lavenderblush'] = '#fff0f5';
|
||||
$data['csstidy']['replace_colors']['lawngreen'] = '#7cfc00';
|
||||
$data['csstidy']['replace_colors']['lemonchiffon'] = '#fffacd';
|
||||
$data['csstidy']['replace_colors']['lightblue'] = '#add8e6';
|
||||
$data['csstidy']['replace_colors']['lightcoral'] = '#f08080';
|
||||
$data['csstidy']['replace_colors']['lightcyan'] = '#e0ffff';
|
||||
$data['csstidy']['replace_colors']['lightgoldenrodyellow'] = '#fafad2';
|
||||
$data['csstidy']['replace_colors']['lightgrey'] = '#d3d3d3';
|
||||
$data['csstidy']['replace_colors']['lightgreen'] = '#90ee90';
|
||||
$data['csstidy']['replace_colors']['lightpink'] = '#ffb6c1';
|
||||
$data['csstidy']['replace_colors']['lightsalmon'] = '#ffa07a';
|
||||
$data['csstidy']['replace_colors']['lightseagreen'] = '#20b2aa';
|
||||
$data['csstidy']['replace_colors']['lightskyblue'] = '#87cefa';
|
||||
$data['csstidy']['replace_colors']['lightslateblue'] = '#8470ff';
|
||||
$data['csstidy']['replace_colors']['lightslategray'] = '#778899';
|
||||
$data['csstidy']['replace_colors']['lightsteelblue'] = '#b0c4de';
|
||||
$data['csstidy']['replace_colors']['lightyellow'] = '#ffffe0';
|
||||
$data['csstidy']['replace_colors']['limegreen'] = '#32cd32';
|
||||
$data['csstidy']['replace_colors']['linen'] = '#faf0e6';
|
||||
$data['csstidy']['replace_colors']['magenta'] = '#ff00ff';
|
||||
$data['csstidy']['replace_colors']['mediumaquamarine'] = '#66cdaa';
|
||||
$data['csstidy']['replace_colors']['mediumblue'] = '#0000cd';
|
||||
$data['csstidy']['replace_colors']['mediumorchid'] = '#ba55d3';
|
||||
$data['csstidy']['replace_colors']['mediumpurple'] = '#9370d8';
|
||||
$data['csstidy']['replace_colors']['mediumseagreen'] = '#3cb371';
|
||||
$data['csstidy']['replace_colors']['mediumslateblue'] = '#7b68ee';
|
||||
$data['csstidy']['replace_colors']['mediumspringgreen'] = '#00fa9a';
|
||||
$data['csstidy']['replace_colors']['mediumturquoise'] = '#48d1cc';
|
||||
$data['csstidy']['replace_colors']['mediumvioletred'] = '#c71585';
|
||||
$data['csstidy']['replace_colors']['midnightblue'] = '#191970';
|
||||
$data['csstidy']['replace_colors']['mintcream'] = '#f5fffa';
|
||||
$data['csstidy']['replace_colors']['mistyrose'] = '#ffe4e1';
|
||||
$data['csstidy']['replace_colors']['moccasin'] = '#ffe4b5';
|
||||
$data['csstidy']['replace_colors']['navajowhite'] = '#ffdead';
|
||||
$data['csstidy']['replace_colors']['oldlace'] = '#fdf5e6';
|
||||
$data['csstidy']['replace_colors']['olivedrab'] = '#6b8e23';
|
||||
$data['csstidy']['replace_colors']['orangered'] = '#ff4500';
|
||||
$data['csstidy']['replace_colors']['orchid'] = '#da70d6';
|
||||
$data['csstidy']['replace_colors']['palegoldenrod'] = '#eee8aa';
|
||||
$data['csstidy']['replace_colors']['palegreen'] = '#98fb98';
|
||||
$data['csstidy']['replace_colors']['paleturquoise'] = '#afeeee';
|
||||
$data['csstidy']['replace_colors']['palevioletred'] = '#d87093';
|
||||
$data['csstidy']['replace_colors']['papayawhip'] = '#ffefd5';
|
||||
$data['csstidy']['replace_colors']['peachpuff'] = '#ffdab9';
|
||||
$data['csstidy']['replace_colors']['peru'] = '#cd853f';
|
||||
$data['csstidy']['replace_colors']['pink'] = '#ffc0cb';
|
||||
$data['csstidy']['replace_colors']['plum'] = '#dda0dd';
|
||||
$data['csstidy']['replace_colors']['powderblue'] = '#b0e0e6';
|
||||
$data['csstidy']['replace_colors']['rosybrown'] = '#bc8f8f';
|
||||
$data['csstidy']['replace_colors']['royalblue'] = '#4169e1';
|
||||
$data['csstidy']['replace_colors']['saddlebrown'] = '#8b4513';
|
||||
$data['csstidy']['replace_colors']['salmon'] = '#fa8072';
|
||||
$data['csstidy']['replace_colors']['sandybrown'] = '#f4a460';
|
||||
$data['csstidy']['replace_colors']['seagreen'] = '#2e8b57';
|
||||
$data['csstidy']['replace_colors']['seashell'] = '#fff5ee';
|
||||
$data['csstidy']['replace_colors']['sienna'] = '#a0522d';
|
||||
$data['csstidy']['replace_colors']['skyblue'] = '#87ceeb';
|
||||
$data['csstidy']['replace_colors']['slateblue'] = '#6a5acd';
|
||||
$data['csstidy']['replace_colors']['slategray'] = '#708090';
|
||||
$data['csstidy']['replace_colors']['snow'] = '#fffafa';
|
||||
$data['csstidy']['replace_colors']['springgreen'] = '#00ff7f';
|
||||
$data['csstidy']['replace_colors']['steelblue'] = '#4682b4';
|
||||
$data['csstidy']['replace_colors']['tan'] = '#d2b48c';
|
||||
$data['csstidy']['replace_colors']['thistle'] = '#d8bfd8';
|
||||
$data['csstidy']['replace_colors']['tomato'] = '#ff6347';
|
||||
$data['csstidy']['replace_colors']['turquoise'] = '#40e0d0';
|
||||
$data['csstidy']['replace_colors']['violet'] = '#ee82ee';
|
||||
$data['csstidy']['replace_colors']['violetred'] = '#d02090';
|
||||
$data['csstidy']['replace_colors']['wheat'] = '#f5deb3';
|
||||
$data['csstidy']['replace_colors']['whitesmoke'] = '#f5f5f5';
|
||||
$data['csstidy']['replace_colors']['yellowgreen'] = '#9acd32';
|
||||
$data['csstidy']['shorthands'] = array();
|
||||
$data['csstidy']['shorthands']['border-color'] = array('border-top-color', 'border-right-color', 'border-bottom-color', 'border-left-color');
|
||||
$data['csstidy']['shorthands']['border-style'] = array('border-top-style', 'border-right-style', 'border-bottom-style', 'border-left-style');
|
||||
$data['csstidy']['shorthands']['border-width'] = array('border-top-width', 'border-right-width', 'border-bottom-width', 'border-left-width');
|
||||
$data['csstidy']['shorthands']['margin'] = array('margin-top', 'margin-right', 'margin-bottom', 'margin-left');
|
||||
$data['csstidy']['shorthands']['padding'] = array('padding-top', 'padding-right', 'padding-bottom', 'padding-left');
|
||||
$data['csstidy']['radius_shorthands']['border-radius'] = array('border-top-left-radius', 'border-top-right-radius', 'border-bottom-right-radius', 'border-bottom-left-radius');
|
||||
$data['csstidy']['radius_shorthands']['-webkit-border-radius'] = array('-webkit-border-top-left-radius', '-webkit-border-top-right-radius', '-webkit-border-bottom-right-radius', '-webkit-border-bottom-left-radius');
|
||||
$data['csstidy']['radius_shorthands']['-moz-border-radius'] = array('-moz-border-radius-topleft', '-moz-border-radius-topright', '-moz-border-radius-bottomright', '-moz-border-radius-bottomleft');
|
||||
$data['csstidy']['all_properties']['alignment-adjust'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['alignment-baseline'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['animation'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['animation-delay'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['animation-direction'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['animation-duration'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['animation-iteration-count'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['animation-name'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['animation-play-state'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['animation-timing-function'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['appearance'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['azimuth'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['backface-visibility'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['background'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['background-attachment'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['background-clip'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['background-color'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['background-image'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['background-origin'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['background-position'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['background-repeat'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['background-size'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['baseline-shift'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['binding'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['bleed'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['bookmark-label'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['bookmark-level'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['bookmark-state'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['bookmark-target'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['border'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['border-bottom'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['border-bottom-color'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['border-bottom-left-radius'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['border-bottom-right-radius'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['border-bottom-style'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['border-bottom-width'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['border-collapse'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['border-color'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['border-image'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['border-image-outset'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['border-image-repeat'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['border-image-slice'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['border-image-source'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['border-image-width'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['border-left'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['border-left-color'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['border-left-style'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['border-left-width'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['border-radius'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['border-right'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['border-right-color'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['border-right-style'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['border-right-width'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['border-spacing'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['border-style'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['border-top'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['border-top-color'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['border-top-left-radius'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['border-top-right-radius'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['border-top-style'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['border-top-width'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['border-width'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['bottom'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['box-decoration-break'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['box-shadow'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['box-sizing'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['break-after'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['break-before'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['break-inside'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['caption-side'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['clear'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['clip'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['color'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['color-profile'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['column-count'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['column-fill'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['column-gap'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['column-rule'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['column-rule-color'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['column-rule-style'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['column-rule-width'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['column-span'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['column-width'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['columns'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['content'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['counter-increment'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['counter-reset'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['crop'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['cue'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['cue-after'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['cue-before'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['cursor'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['direction'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['display'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['dominant-baseline'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['drop-initial-after-adjust'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['drop-initial-after-align'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['drop-initial-before-adjust'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['drop-initial-before-align'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['drop-initial-size'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['drop-initial-value'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['elevation'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['empty-cells'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['fit'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['fit-position'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['flex-align'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['flex-flow'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['flex-line-pack'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['flex-order'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['flex-pack'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['float'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['float-offset'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['font'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['font-family'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['font-size'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['font-size-adjust'] = 'CSS2.0,CSS3.0';
|
||||
$data['csstidy']['all_properties']['font-stretch'] = 'CSS2.0,CSS3.0';
|
||||
$data['csstidy']['all_properties']['font-style'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['font-variant'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['font-weight'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['grid-columns'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['grid-rows'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['hanging-punctuation'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['height'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['hyphenate-after'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['hyphenate-before'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['hyphenate-character'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['hyphenate-lines'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['hyphenate-resource'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['hyphens'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['icon'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['image-orientation'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['image-rendering'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['image-resolution'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['inline-box-align'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['left'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['letter-spacing'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['line-break'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['line-height'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['line-stacking'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['line-stacking-ruby'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['line-stacking-shift'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['line-stacking-strategy'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['list-style'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['list-style-image'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['list-style-position'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['list-style-type'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['margin'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['margin-bottom'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['margin-left'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['margin-right'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['margin-top'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['marker-offset'] = 'CSS2.0,CSS3.0';
|
||||
$data['csstidy']['all_properties']['marks'] = 'CSS2.0,CSS3.0';
|
||||
$data['csstidy']['all_properties']['marquee-direction'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['marquee-loop'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['marquee-play-count'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['marquee-speed'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['marquee-style'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['max-height'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['max-width'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['min-height'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['min-width'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['move-to'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['nav-down'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['nav-index'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['nav-left'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['nav-right'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['nav-up'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['opacity'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['orphans'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['outline'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['outline-color'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['outline-offset'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['outline-style'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['outline-width'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['overflow'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['overflow-style'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['overflow-wrap'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['overflow-x'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['overflow-y'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['padding'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['padding-bottom'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['padding-left'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['padding-right'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['padding-top'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['page'] = 'CSS2.0,CSS3.0';
|
||||
$data['csstidy']['all_properties']['page-break-after'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['page-break-before'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['page-break-inside'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['page-policy'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['pause'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['pause-after'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['pause-before'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['perspective'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['perspective-origin'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['phonemes'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['pitch'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['pitch-range'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['play-during'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['position'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['presentation-level'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['punctuation-trim'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['quotes'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['rendering-intent'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['resize'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['rest'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['rest-after'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['rest-before'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['richness'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['right'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['rotation'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['rotation-point'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['ruby-align'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['ruby-overhang'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['ruby-position'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['ruby-span'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['size'] = 'CSS2.0,CSS3.0';
|
||||
$data['csstidy']['all_properties']['speak'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['speak-header'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['speak-numeral'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['speak-punctuation'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['speech-rate'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['src'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['stress'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['string-set'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['tab-size'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['table-layout'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['target'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['target-name'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['target-new'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['target-position'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['text-align'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['text-align-last'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['text-decoration'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['text-decoration-color'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['text-decoration-line'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['text-decoration-skip'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['text-decoration-style'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['text-emphasis'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['text-emphasis-color'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['text-emphasis-position'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['text-emphasis-style'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['text-height'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['text-indent'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['text-justify'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['text-outline'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['text-shadow'] = 'CSS2.0,CSS3.0';
|
||||
$data['csstidy']['all_properties']['text-space-collapse'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['text-transform'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['text-underline-position'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['text-wrap'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['top'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['transform'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['transform-origin'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['transform-style'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['transition'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['transition-delay'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['transition-duration'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['transition-property'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['transition-timing-function'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['unicode-bidi'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['vertical-align'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['visibility'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['voice-balance'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['voice-duration'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['voice-family'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['voice-pitch'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['voice-pitch-range'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['voice-rate'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['voice-stress'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['voice-volume'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['volume'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['white-space'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['widows'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['width'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['word-break'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['word-spacing'] = 'CSS1.0,CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['word-wrap'] = 'CSS3.0';
|
||||
$data['csstidy']['all_properties']['z-index'] = 'CSS2.0,CSS2.1,CSS3.0';
|
||||
$data['csstidy']['all_properties']['--custom'] = 'CSS3.0';
|
||||
$data['csstidy']['quoted_string_properties'] = array('content', 'font-family', 'quotes');
|
||||
$data['csstidy']['multiple_properties'] = array('background', 'background-image');
|
||||
$data['csstidy']['predefined_templates']['default'][0] = '<span class="at">';
|
||||
//string before @rule
|
||||
$data['csstidy']['predefined_templates']['default'][1] = '</span> <span class="format">{</span>' . "\n";
|
||||
//bracket after @-rule
|
||||
$data['csstidy']['predefined_templates']['default'][2] = '<span class="selector">';
|
||||
//string before selector
|
||||
$data['csstidy']['predefined_templates']['default'][3] = '</span> <span class="format">{</span>' . "\n";
|
||||
//bracket after selector
|
||||
$data['csstidy']['predefined_templates']['default'][4] = '<span class="property">';
|
||||
//string before property
|
||||
$data['csstidy']['predefined_templates']['default'][5] = '</span><span class="value">';
|
||||
//string after property+before value
|
||||
$data['csstidy']['predefined_templates']['default'][6] = '</span><span class="format">;</span>' . "\n";
|
||||
//string after value
|
||||
$data['csstidy']['predefined_templates']['default'][7] = '<span class="format">}</span>';
|
||||
//closing bracket - selector
|
||||
$data['csstidy']['predefined_templates']['default'][8] = "\n\n";
|
||||
//space between blocks {...}
|
||||
$data['csstidy']['predefined_templates']['default'][9] = "\n" . '<span class="format">}</span>' . "\n\n";
|
||||
//closing bracket @-rule
|
||||
$data['csstidy']['predefined_templates']['default'][10] = '';
|
||||
//indent in @-rule
|
||||
$data['csstidy']['predefined_templates']['default'][11] = '<span class="comment">';
|
||||
// before comment
|
||||
$data['csstidy']['predefined_templates']['default'][12] = '</span>' . "\n";
|
||||
// after comment
|
||||
$data['csstidy']['predefined_templates']['default'][13] = "\n";
|
||||
// after each line @-rule
|
||||
$data['csstidy']['predefined_templates']['high_compression'][] = '<span class="at">';
|
||||
$data['csstidy']['predefined_templates']['high_compression'][] = '</span> <span class="format">{</span>' . "\n";
|
||||
$data['csstidy']['predefined_templates']['high_compression'][] = '<span class="selector">';
|
||||
$data['csstidy']['predefined_templates']['high_compression'][] = '</span><span class="format">{</span>';
|
||||
$data['csstidy']['predefined_templates']['high_compression'][] = '<span class="property">';
|
||||
$data['csstidy']['predefined_templates']['high_compression'][] = '</span><span class="value">';
|
||||
$data['csstidy']['predefined_templates']['high_compression'][] = '</span><span class="format">;</span>';
|
||||
$data['csstidy']['predefined_templates']['high_compression'][] = '<span class="format">}</span>';
|
||||
$data['csstidy']['predefined_templates']['high_compression'][] = "\n";
|
||||
$data['csstidy']['predefined_templates']['high_compression'][] = "\n" . '<span class="format">}' . "\n" . '</span>';
|
||||
$data['csstidy']['predefined_templates']['high_compression'][] = '';
|
||||
$data['csstidy']['predefined_templates']['high_compression'][] = '<span class="comment">';
|
||||
// before comment
|
||||
$data['csstidy']['predefined_templates']['high_compression'][] = '</span>' . "\n";
|
||||
// after comment
|
||||
$data['csstidy']['predefined_templates']['high_compression'][] = "\n";
|
||||
$data['csstidy']['predefined_templates']['highest_compression'][] = '<span class="at">';
|
||||
$data['csstidy']['predefined_templates']['highest_compression'][] = '</span><span class="format">{</span>';
|
||||
$data['csstidy']['predefined_templates']['highest_compression'][] = '<span class="selector">';
|
||||
$data['csstidy']['predefined_templates']['highest_compression'][] = '</span><span class="format">{</span>';
|
||||
$data['csstidy']['predefined_templates']['highest_compression'][] = '<span class="property">';
|
||||
$data['csstidy']['predefined_templates']['highest_compression'][] = '</span><span class="value">';
|
||||
$data['csstidy']['predefined_templates']['highest_compression'][] = '</span><span class="format">;</span>';
|
||||
$data['csstidy']['predefined_templates']['highest_compression'][] = '<span class="format">}</span>';
|
||||
$data['csstidy']['predefined_templates']['highest_compression'][] = '';
|
||||
$data['csstidy']['predefined_templates']['highest_compression'][] = '<span class="format">}</span>';
|
||||
$data['csstidy']['predefined_templates']['highest_compression'][] = '';
|
||||
$data['csstidy']['predefined_templates']['highest_compression'][] = '<span class="comment">';
|
||||
// before comment
|
||||
$data['csstidy']['predefined_templates']['highest_compression'][] = '</span>';
|
||||
// after comment
|
||||
$data['csstidy']['predefined_templates']['highest_compression'][] = '';
|
||||
$data['csstidy']['predefined_templates']['low_compression'][] = '<span class="at">';
|
||||
$data['csstidy']['predefined_templates']['low_compression'][] = '</span> <span class="format">{</span>' . "\n";
|
||||
$data['csstidy']['predefined_templates']['low_compression'][] = '<span class="selector">';
|
||||
$data['csstidy']['predefined_templates']['low_compression'][] = '</span>' . "\n" . '<span class="format">{</span>' . "\n";
|
||||
$data['csstidy']['predefined_templates']['low_compression'][] = ' <span class="property">';
|
||||
$data['csstidy']['predefined_templates']['low_compression'][] = '</span><span class="value">';
|
||||
$data['csstidy']['predefined_templates']['low_compression'][] = '</span><span class="format">;</span>' . "\n";
|
||||
$data['csstidy']['predefined_templates']['low_compression'][] = '<span class="format">}</span>';
|
||||
$data['csstidy']['predefined_templates']['low_compression'][] = "\n\n";
|
||||
$data['csstidy']['predefined_templates']['low_compression'][] = "\n" . '<span class="format">}</span>' . "\n\n";
|
||||
$data['csstidy']['predefined_templates']['low_compression'][] = ' ';
|
||||
$data['csstidy']['predefined_templates']['low_compression'][] = '<span class="comment">';
|
||||
// before comment
|
||||
$data['csstidy']['predefined_templates']['low_compression'][] = '</span>' . "\n";
|
||||
// after comment
|
||||
$data['csstidy']['predefined_templates']['low_compression'][] = "\n";
|
||||
@@ -0,0 +1 @@
|
||||
<?php
|
||||
@@ -0,0 +1,276 @@
|
||||
<?php
|
||||
namespace MailPoetVendor;
|
||||
if (!defined('ABSPATH')) exit;
|
||||
if (isset($_GET['lang'])) {
|
||||
$l = $_GET['lang'];
|
||||
} elseif (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
|
||||
$l = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
|
||||
$l = \strtolower(\substr($l, 0, 2));
|
||||
} else {
|
||||
$l = '';
|
||||
}
|
||||
$l = \in_array($l, array('de', 'fr', 'zh')) ? $l : 'en';
|
||||
// note 67 in all but English&French, and 5 and 40 in all are orphaned
|
||||
$lang = array();
|
||||
$lang['en'][0] = 'CSS Formatter and Optimiser/Optimizer (based on CSSTidy ';
|
||||
$lang['en'][1] = 'CSS Formatter and Optimiser';
|
||||
$lang['en'][2] = '(based on';
|
||||
$lang['en'][3] = '(plaintext)';
|
||||
$lang['en'][4] = 'Important Note:';
|
||||
$lang['en'][6] = 'Your code should be well-formed. This is <strong>not a validator</strong> which points out errors in your CSS code. To make sure that your code is valid, use the <a href="http://jigsaw.w3.org/css-validator/">W3C Validator</a>.';
|
||||
$lang['en'][7] = 'all comments are removed';
|
||||
$lang['en'][8] = 'CSS Input:';
|
||||
$lang['en'][9] = 'CSS-Code:';
|
||||
$lang['en'][10] = 'CSS from URL:';
|
||||
$lang['en'][11] = 'Code Layout:';
|
||||
$lang['en'][12] = 'Compression (code layout):';
|
||||
$lang['en'][13] = 'Highest (no readability, smallest size)';
|
||||
$lang['en'][14] = 'High (moderate readability, smaller size)';
|
||||
$lang['en'][15] = 'Standard (balance between readability and size)';
|
||||
$lang['en'][16] = 'Low (higher readability)';
|
||||
$lang['en'][17] = 'Custom (enter below)';
|
||||
$lang['en'][18] = 'Custom <a href="http://csstidy.sourceforge.net/templates.php">template</a>';
|
||||
$lang['en'][19] = 'Options';
|
||||
$lang['en'][20] = 'Sort Selectors (caution)';
|
||||
$lang['en'][21] = 'Sort Properties';
|
||||
$lang['en'][22] = 'Regroup selectors';
|
||||
$lang['en'][23] = 'Optimise shorthands';
|
||||
$lang['en'][24] = 'Compress colors';
|
||||
$lang['en'][25] = 'Lowercase selectors';
|
||||
$lang['en'][26] = 'Case for properties:';
|
||||
$lang['en'][27] = 'Lowercase';
|
||||
$lang['en'][28] = 'No or invalid CSS input or wrong URL!';
|
||||
$lang['en'][29] = 'Uppercase';
|
||||
$lang['en'][30] = 'lowercase elementnames needed for XHTML';
|
||||
$lang['en'][31] = 'Remove unnecessary backslashes';
|
||||
$lang['en'][32] = 'convert !important-hack';
|
||||
$lang['en'][33] = 'Output as file';
|
||||
$lang['en'][34] = 'Bigger compression because of smaller newlines (copy & paste doesn\'t work)';
|
||||
$lang['en'][35] = 'Process CSS';
|
||||
$lang['en'][36] = 'Compression Ratio';
|
||||
$lang['en'][37] = 'Input';
|
||||
$lang['en'][38] = 'Output';
|
||||
$lang['en'][39] = 'Language';
|
||||
$lang['en'][41] = 'Attention: This may change the behaviour of your CSS Code!';
|
||||
$lang['en'][42] = 'Remove last ;';
|
||||
$lang['en'][43] = 'Discard invalid properties';
|
||||
$lang['en'][44] = 'Only safe optimisations';
|
||||
$lang['en'][45] = 'Compress font-weight';
|
||||
$lang['en'][46] = 'Save comments';
|
||||
$lang['en'][47] = 'Do not change anything';
|
||||
$lang['en'][48] = 'Only seperate selectors (split at ,)';
|
||||
$lang['en'][49] = 'Merge selectors with the same properties (fast)';
|
||||
$lang['en'][50] = 'Merge selectors intelligently (slow)';
|
||||
$lang['en'][51] = 'Preserve CSS';
|
||||
$lang['en'][52] = 'Save comments, hacks, etc. Most optimisations can *not* be applied if this is enabled.';
|
||||
$lang['en'][53] = 'None';
|
||||
$lang['en'][54] = 'Don\'t optimise';
|
||||
$lang['en'][55] = 'Safe optimisations';
|
||||
$lang['en'][56] = 'All optimisations';
|
||||
$lang['en'][57] = 'Add timestamp';
|
||||
$lang['en'][58] = 'Copy to clipboard';
|
||||
$lang['en'][59] = 'Back to top';
|
||||
$lang['en'][60] = 'Your browser doesn\'t support copy to clipboard.';
|
||||
$lang['en'][61] = 'For bugs and suggestions feel free to';
|
||||
$lang['en'][62] = 'contact me';
|
||||
$lang['en'][63] = 'Output CSS code as complete HTML document';
|
||||
$lang['en'][64] = 'Code';
|
||||
$lang['en'][65] = 'CSS to style CSS output';
|
||||
$lang['en'][66] = 'You need to go to about:config in your URL bar, select \'signed.applets.codebase_principal_support\' in the filter field, and set its value to true in order to use this feature; however, be aware that doing so increases security risks.';
|
||||
$lang['en'][67] = 'Reverse left and right directions';
|
||||
$lang['de'][0] = 'CSS Formatierer und Optimierer (basierend auf CSSTidy ';
|
||||
$lang['de'][1] = 'CSS Formatierer und Optimierer';
|
||||
$lang['de'][2] = '(basierend auf';
|
||||
$lang['de'][3] = '(Textversion)';
|
||||
$lang['de'][4] = 'Wichtiger Hinweis:';
|
||||
$lang['de'][6] = 'Der CSS Code sollte wohlgeformt sein. Der CSS Code wird <strong>nicht auf Gültigkeit überprüft</strong>. Um sicherzugehen dass dein Code valide ist, benutze den <a href="http://jigsaw.w3.org/css-validator/">W3C Validierungsservice</a>.';
|
||||
$lang['de'][7] = 'alle Kommentare werden entfernt';
|
||||
$lang['de'][8] = 'CSS Eingabe:';
|
||||
$lang['de'][9] = 'CSS-Code:';
|
||||
$lang['de'][10] = 'CSS von URL:';
|
||||
$lang['de'][11] = 'Code Layout:';
|
||||
$lang['de'][12] = 'Komprimierung (Code Layout):';
|
||||
$lang['de'][13] = 'Höchste (keine Lesbarkeit, niedrigste Größe)';
|
||||
$lang['de'][14] = 'Hoch (mittelmäßige Lesbarkeit, geringe Größe)';
|
||||
$lang['de'][15] = 'Standard (Kompromiss zwischen Lesbarkeit und Größe)';
|
||||
$lang['de'][16] = 'Niedrig (höhere Lesbarkeit)';
|
||||
$lang['de'][17] = 'Benutzerdefiniert (unten eingeben)';
|
||||
$lang['de'][18] = 'Benutzerdefinierte <a href="http://csstidy.sourceforge.net/templates.php">Vorlage</a>';
|
||||
$lang['de'][19] = 'Optionen';
|
||||
$lang['de'][20] = 'Selektoren sortieren (Vorsicht)';
|
||||
$lang['de'][21] = 'Eigenschaften sortieren';
|
||||
$lang['de'][22] = 'Selektoren umgruppieren';
|
||||
$lang['de'][23] = 'Shorthands optimieren';
|
||||
$lang['de'][24] = 'Farben komprimieren';
|
||||
$lang['de'][25] = 'Selektoren in Kleinbuchstaben';
|
||||
$lang['de'][26] = 'Groß-/Kleinschreibung für Eigenschaften';
|
||||
$lang['de'][27] = 'Kleinbuchstaben';
|
||||
$lang['de'][28] = 'Keine oder ungültige CSS Eingabe oder falsche URL!';
|
||||
$lang['de'][29] = 'Großbuchstaben';
|
||||
$lang['de'][30] = 'kleingeschriebene Elementnamen benötigt für XHTML';
|
||||
$lang['de'][31] = 'Unnötige Backslashes entfernen';
|
||||
$lang['de'][32] = '!important-Hack konvertieren';
|
||||
$lang['de'][33] = 'Als Datei ausgeben';
|
||||
$lang['de'][34] = 'Größere Komprimierung augrund von kleineren Neuezeile-Zeichen';
|
||||
$lang['de'][35] = 'CSS verarbeiten';
|
||||
$lang['de'][36] = 'Komprimierungsrate';
|
||||
$lang['de'][37] = 'Eingabe';
|
||||
$lang['de'][38] = 'Ausgabe';
|
||||
$lang['de'][39] = 'Sprache';
|
||||
$lang['de'][41] = 'Achtung: Dies könnte das Verhalten ihres CSS-Codes verändern!';
|
||||
$lang['de'][42] = 'Letztes ; entfernen';
|
||||
$lang['de'][43] = 'Ungültige Eigenschaften entfernen';
|
||||
$lang['de'][44] = 'Nur sichere Optimierungen';
|
||||
$lang['de'][45] = 'font-weight komprimieren';
|
||||
$lang['de'][46] = 'Kommentare beibehalten';
|
||||
$lang['de'][47] = 'Nichts ändern';
|
||||
$lang['de'][48] = 'Selektoren nur trennen (am Komma)';
|
||||
$lang['de'][49] = 'Selektoren mit gleichen Eigenschaften zusammenfassen (schnell)';
|
||||
$lang['de'][50] = 'Selektoren intelligent zusammenfassen (langsam!)';
|
||||
$lang['de'][51] = 'CSS erhalten';
|
||||
$lang['de'][52] = 'Kommentare, Hacks, etc. speichern. Viele Optimierungen sind dann aber nicht mehr möglich.';
|
||||
$lang['de'][53] = 'Keine';
|
||||
$lang['de'][54] = 'Nicht optimieren';
|
||||
$lang['de'][55] = 'Sichere Optimierungen';
|
||||
$lang['de'][56] = 'Alle Optimierungen';
|
||||
$lang['de'][57] = 'Zeitstempel hinzufügen';
|
||||
$lang['de'][58] = 'Copy to clipboard';
|
||||
$lang['de'][59] = 'Back to top';
|
||||
$lang['de'][60] = 'Your browser doesn\'t support copy to clipboard.';
|
||||
$lang['de'][61] = 'For bugs and suggestions feel free to';
|
||||
$lang['de'][62] = 'contact me';
|
||||
$lang['de'][63] = 'Output CSS code as complete HTML document';
|
||||
$lang['de'][64] = 'Code';
|
||||
$lang['de'][65] = 'CSS to style CSS output';
|
||||
$lang['de'][66] = 'You need to go to about:config in your URL bar, select \'signed.applets.codebase_principal_support\' in the filter field, and set its value to true in order to use this feature; however, be aware that doing so increases security risks.';
|
||||
$lang['fr'][0] = 'CSS Formateur et Optimiseur (basé sur CSSTidy ';
|
||||
$lang['fr'][1] = 'CSS Formateur et Optimiseur';
|
||||
$lang['fr'][2] = '(basé sur ';
|
||||
$lang['fr'][3] = '(Version texte)';
|
||||
$lang['fr'][4] = 'Note Importante :';
|
||||
$lang['fr'][6] = 'Votre code doit être valide. Ce n’est <strong>pas un validateur</strong> qui signale les erreurs dans votre code CSS. Pour être sûr que votre code est correct, utilisez le validateur : <a href="http://jigsaw.w3.org/css-validator/">W3C Validator</a>.';
|
||||
$lang['fr'][7] = 'tous les commentaires sont enlevés';
|
||||
$lang['fr'][8] = 'Champ CSS :';
|
||||
$lang['fr'][9] = 'Code CSS :';
|
||||
$lang['fr'][10] = 'CSS en provenance d’une URL :<br />';
|
||||
$lang['fr'][11] = 'Mise en page du code :';
|
||||
$lang['fr'][12] = 'Compression (mise en page du code) :';
|
||||
$lang['fr'][13] = 'La plus élevée (aucune lisibilité, taille minimale)';
|
||||
$lang['fr'][14] = 'Élevée (lisibilité modérée, petite taille)';
|
||||
$lang['fr'][15] = 'Normale (équilibre entre lisibilité et taille)';
|
||||
$lang['fr'][16] = 'Faible (lisibilité élevée)';
|
||||
$lang['fr'][17] = 'Sur mesure (entrer ci-dessous)';
|
||||
$lang['fr'][18] = '<a href="http://csstidy.sourceforge.net/templates.php">Gabarit</a> sur mesure';
|
||||
$lang['fr'][19] = 'Options';
|
||||
$lang['fr'][20] = 'Trier les sélecteurs (attention)';
|
||||
$lang['fr'][21] = 'Trier les propriétés';
|
||||
$lang['fr'][22] = 'Regrouper les sélecteurs';
|
||||
$lang['fr'][23] = 'Propriétés raccourcies';
|
||||
$lang['fr'][24] = 'Compresser les couleurs';
|
||||
$lang['fr'][25] = 'Sélecteurs en minuscules';
|
||||
$lang['fr'][26] = 'Case pour les propriétés :';
|
||||
$lang['fr'][27] = 'Minuscule';
|
||||
$lang['fr'][28] = 'CSS non valide ou URL incorrecte !';
|
||||
$lang['fr'][29] = 'Majuscule';
|
||||
$lang['fr'][30] = 'les noms des éléments en minuscules (indispensables pour XHTML)';
|
||||
$lang['fr'][31] = 'enlever les antislashs inutiles';
|
||||
$lang['fr'][32] = 'convertir !important-hack';
|
||||
$lang['fr'][33] = 'Sauver en tant que fichier';
|
||||
$lang['fr'][34] = 'Meilleure compression grâce aux caractères de saut de ligne plus petits (copier & coller ne marche pas)';
|
||||
$lang['fr'][35] = 'Compresser la CSS';
|
||||
$lang['fr'][36] = 'Facteur de Compression';
|
||||
$lang['fr'][37] = 'Entrée';
|
||||
$lang['fr'][38] = 'Sortie';
|
||||
$lang['fr'][39] = 'Langue';
|
||||
$lang['fr'][41] = 'Attention : ceci peut changer le comportement de votre code CSS !';
|
||||
$lang['fr'][42] = 'Enlever le dernier ;';
|
||||
$lang['fr'][43] = 'Supprimer les propriétés non valide';
|
||||
$lang['fr'][44] = 'Seulement les optimisations sûres';
|
||||
$lang['fr'][45] = 'Compresser font-weight';
|
||||
$lang['fr'][46] = 'Sauvegarder les commentaires ';
|
||||
$lang['fr'][47] = 'Ne rien changer';
|
||||
$lang['fr'][48] = 'Sépare les sélecteurs (sépare au niveau de ,)';
|
||||
$lang['fr'][49] = 'Fusionne les sélecteurs avec les mêmes propriétés (rapide)';
|
||||
$lang['fr'][50] = 'Fusionne les sélecteurs intelligemment (lent)';
|
||||
$lang['fr'][51] = 'Préserver la CSS';
|
||||
$lang['fr'][52] = 'Sauvegarder les commentaires, hacks, etc. La plupart des optimisations ne peuvent *pas* être appliquées si cela est activé.';
|
||||
$lang['fr'][53] = 'Aucun';
|
||||
$lang['fr'][54] = 'Ne pas optimiser';
|
||||
$lang['fr'][55] = 'Optimisations sûres';
|
||||
$lang['fr'][56] = 'Toutes les optimisations';
|
||||
$lang['fr'][57] = 'Ajouter un timestamp';
|
||||
$lang['fr'][58] = 'Copier dans le presse-papiers';
|
||||
$lang['fr'][59] = 'Retour en haut';
|
||||
$lang['fr'][60] = 'Votre navigateur ne supporte pas la copie vers le presse-papiers.';
|
||||
$lang['fr'][61] = 'Pour signaler des bugs ou pour des suggestions,';
|
||||
$lang['fr'][62] = 'contactez-moi';
|
||||
$lang['fr'][63] = 'Sauver le code CSS comme document complet HTML';
|
||||
$lang['fr'][64] = 'Code';
|
||||
$lang['fr'][65] = 'CSS pour colorier la sortie CSS';
|
||||
$lang['fr'][66] = 'Vous devez aller dans about:config dans votre barre d’adresse, sélectionner \'signed.applets.codebase_principal_support\' dans le champ Filtre et attribuez-lui la valeur \'true\' pour utiliser cette fonctionnalité; toutefois, soyez conscient que cela augmente les risques de sécurité.';
|
||||
$lang['fr'][67] = 'Inverser gauche et droite';
|
||||
$lang['zh'][0] = 'CSS整形與最佳化工具(使用 CSSTidy ';
|
||||
$lang['zh'][1] = 'CSS整形與最佳化工具';
|
||||
$lang['zh'][2] = '(使用';
|
||||
$lang['zh'][3] = '(純文字)';
|
||||
$lang['zh'][4] = '重要事項:';
|
||||
$lang['zh'][6] = '你的原始碼必須是良構的(well-formed). 這個工具<strong>沒有內建驗證器(validator)</strong>. 驗證器能夠指出你CSS原始碼裡的錯誤. 請使用 <a href="http://jigsaw.w3.org/css-validator/">W3C 驗證器</a>, 確保你的原始碼合乎規範.';
|
||||
$lang['zh'][7] = '所有註解都移除了';
|
||||
$lang['zh'][8] = 'CSS 輸入:';
|
||||
$lang['zh'][9] = 'CSS 原始碼:';
|
||||
$lang['zh'][10] = 'CSS 檔案網址(URL):';
|
||||
$lang['zh'][11] = '原始碼規劃:';
|
||||
$lang['zh'][12] = '壓縮程度(原始碼規劃):';
|
||||
$lang['zh'][13] = '最高 (沒有辦法讀, 檔案最小)';
|
||||
$lang['zh'][14] = '高 (適度的可讀性, 檔案小)';
|
||||
$lang['zh'][15] = '標準 (兼顧可讀性與檔案大小)';
|
||||
$lang['zh'][16] = '低 (注重可讀性)';
|
||||
$lang['zh'][17] = '自訂 (在下方設定)';
|
||||
$lang['zh'][18] = '自訂<a href="http://csstidy.sourceforge.net/templates.php">樣板</a>';
|
||||
$lang['zh'][19] = '選項';
|
||||
$lang['zh'][20] = '整理選擇符(請謹慎使用)';
|
||||
$lang['zh'][21] = '整理屬性';
|
||||
$lang['zh'][22] = '重組選擇符';
|
||||
$lang['zh'][23] = '速記法(shorthand)最佳化';
|
||||
$lang['zh'][24] = '壓縮色彩語法';
|
||||
$lang['zh'][25] = '改用小寫選擇符';
|
||||
$lang['zh'][26] = '屬性的字形:';
|
||||
$lang['zh'][27] = '小寫';
|
||||
$lang['zh'][28] = '沒有輸入CSS, 語法不符合規定, 或是網址錯誤!';
|
||||
$lang['zh'][29] = '大寫';
|
||||
$lang['zh'][30] = 'XHTML必須使用小寫的元素名稱';
|
||||
$lang['zh'][31] = '移除不必要的反斜線';
|
||||
$lang['zh'][32] = '轉換 !important-hack';
|
||||
$lang['zh'][33] = '輸出成檔案形式';
|
||||
$lang['zh'][34] = '由於比較少換行字元, 會有更大的壓縮比率(複製&貼上沒有用)';
|
||||
$lang['zh'][35] = '執行';
|
||||
$lang['zh'][36] = '壓縮比率';
|
||||
$lang['zh'][37] = '輸入';
|
||||
$lang['zh'][38] = '輸出';
|
||||
$lang['zh'][39] = '語言';
|
||||
$lang['zh'][41] = '注意: 這或許會變更你CSS原始碼的行為!';
|
||||
$lang['zh'][42] = '除去最後一個分號';
|
||||
$lang['zh'][43] = '拋棄不符合規定的屬性';
|
||||
$lang['zh'][44] = '只安全地最佳化';
|
||||
$lang['zh'][45] = '壓縮 font-weight';
|
||||
$lang['zh'][46] = '保留註解';
|
||||
$lang['zh'][47] = '什麼都不要改';
|
||||
$lang['zh'][48] = '只分開原本用逗號分隔的選擇符';
|
||||
$lang['zh'][49] = '合併有相同屬性的選擇符(快速)';
|
||||
$lang['zh'][50] = '聰明地合併選擇符(慢速)';
|
||||
$lang['zh'][51] = '保護CSS';
|
||||
$lang['zh'][52] = '保留註解與 hack 等等. 如果啟用這個選項, 大多數的最佳化程序都不會執行.';
|
||||
$lang['zh'][53] = '不改變';
|
||||
$lang['zh'][54] = '不做最佳化';
|
||||
$lang['zh'][55] = '安全地最佳化';
|
||||
$lang['zh'][56] = '全部最佳化';
|
||||
$lang['zh'][57] = '加上時間戳記';
|
||||
$lang['zh'][58] = '复制到剪贴板';
|
||||
$lang['zh'][59] = '回到页面上方';
|
||||
$lang['zh'][60] = '你的浏览器不支持复制到剪贴板。';
|
||||
$lang['zh'][61] = '如果程序有错误或你有建议,欢迎';
|
||||
$lang['zh'][62] = '和我联系';
|
||||
$lang['zh'][63] = 'Output CSS code as complete HTML document';
|
||||
$lang['zh'][64] = '代码';
|
||||
$lang['zh'][65] = 'CSS to style CSS output';
|
||||
$lang['zh'][66] = 'You need to go to about:config in your URL bar, select \'signed.applets.codebase_principal_support\' in the filter field, and set its value to true in order to use this feature; however, be aware that doing so increases security risks.';
|
||||
@@ -0,0 +1,10 @@
|
||||
<span class="at">|</span> <span class="format">{</span>
|
||||
|<span class="selector">|</span> <span class="format">{</span>
|
||||
|<span class="property">|</span><span class="value">|</span><span class="format">;</span>
|
||||
|<span class="format">}</span>|
|
||||
|
||||
|
|
||||
<span class="format">}</span>
|
||||
|
||||
||<span class="comment">|</span>
|
||||
|
|
||||
@@ -0,0 +1,12 @@
|
||||
<span class="at">|</span> <span class="format">{</span>
|
||||
|<span class="selector">|</span>
|
||||
<span class="format">{</span>
|
||||
| <span class="property">|</span><span class="value">|</span><span class="format">;</span>
|
||||
|<span class="format">}</span>|
|
||||
|
||||
|
|
||||
|
||||
<span class="format">}</span>
|
||||
|
||||
| |<span class="comment">|</span>
|
||||
|
|
||||
@@ -0,0 +1,5 @@
|
||||
<span class="at">|</span> <span class="format">{</span>
|
||||
|<span class="selector">|</span><span class="format">{</span>|<span class="property">|</span><span class="value">|</span><span class="format">;</span>|<span class="format">}</span>|
|
||||
|
|
||||
<span class="format">}
|
||||
</span>||<span class="comment">|</span>|
|
||||
@@ -0,0 +1 @@
|
||||
<span class="at">|</span><span class="format">{</span>|<span class="selector">|</span><span class="format">{</span>|<span class="property">|</span><span class="value">|</span><span class="format">;</span>|<span class="format">}</span>||<span class="format">}</span>||<span class="comment">|</span>|
|
||||
Reference in New Issue
Block a user