Данные хранятся в внутреннем формате (значение, тип) Для цвета значение - массив (R,G,B)
Под конец всё выводится в человеческом виде.
Начало заложено для приведения типов … но не реализовано.
Ухожу я в отпуск. Но тему в избранное добавил.
Всем пока.
Форум → Программирование → PHP для идиотов → Sass для PHP
Страницы: ← Предыдущая страница • Следующая страница →
Окт. 2, 2009, 9:52 п.п., спустя 3 часа 2 минуты 8 секунд
Окт. 5, 2009, 10:30 д.п., спустя 2 дня 12 часов 23 минуты
$vars = array('!alfa' => 6, '!beta' => 2, '!gama' => 5);
echo "\nResult: ".SassExpression::calc('2*!alfa + !beta + !gama', $vars)."\n";
echo "\nResult: ".SassExpression::calc('2*(!alfa + !beta) + !gama', $vars)."\n";
echo "\nResult: ".SassExpression::calc('12 + "3"', $vars)."\n";
2 !alfa * !beta + !gama +
Result: 19
2 !alfa !beta + * !gama +
Result: 21
12 "3" +
Result: "123"
Окт. 6, 2009, 8:04 д.п., спустя 21 час 34 минуты 21 секунду
$vars = array('!alfa' => 6, '!beta' => 2, '!gama' => 5);
echo "\nResult: ".SassExpression::calc('2*!alfa + !beta + !gama', $vars)."\n";
echo "\nResult: ".SassExpression::calc('2*(!alfa + !beta) + !gama', $vars)."\n";
echo "\nResult: ".SassExpression::calc('12 + "3"', $vars)."\n";
echo "\nResult: ".SassExpression::calc('white - 1', $vars)."\n";
echo "\nResult: ".SassExpression::calc('1in + 1pt', $vars)."\n";
echo "\nResult: ".SassExpression::calc('1cm + 1in + 1pt', $vars)."\n";
echo "\nResult: ".SassExpression::calc('1em + 2pt', $vars)."\n";
echo "\nResult: ".SassExpression::calc('12 / "3"', $vars)."\n";
2 !alfa * !beta + !gama +
Result: 19
2 !alfa !beta + * !gama +
Result: 21
12 "3" +
Result: "123"
white 1 -
Result: #fefefe
1in 1pt +
Result: 1.014in
1cm 1in + 1pt +
Result: 3.575cm
1em 2pt +
Result: ERROR: incompatible size dimensions
12 "3" /
Result: ERROR: "/" is wrong operation for these arguments
// Operation ID is a key of this array
private static $_operations = array(NULL, '(', '+', '-', '*', '/', ')');
…
// Size dimensions
private static $_dimensions = array('in', 'cm', 'mm', 'pt', 'em', 'wm');
private static $_dimRatio = array(
array( 1, 2.54, 25.5, 72 ),
array(0.394, 1, 10, 28.346),
array(0.039, 0.1, 1, 2.835),
array(0.014, 0.035, 0.353, 1 ));
// Operaion ID symblic name
const OP_ADD = 2;
const OP_SUB = 3;
const OP_MUL = 4;
const OP_DIV = 5;
// Operand type
const OT_NUMBER = 1;
const OT_SIZE = 2;
const OT_COLOR = 3;
const OT_STRING = 4;
…
private static function _funcNumber($a, $op, $b)
{
switch ($op) {
case self::OP_ADD: return $a + $b;
case self::OP_SUB: return $a - $b;
case self::OP_MUL: return $a * $b;
case self::OP_DIV: return $b == 0 ? 0 : $a / $b;
}
}
private static function _func($a, $op, $b)
{
list($a, $aType, $aDim) = self::_getValue($a);
list($b, $bType, $bDim) = self::_getValue($b);
$resultType = max($aType, $bType);
if (min($aType, $bType) == self::OT_SIZE && $resultType == self::OT_COLOR)
throw new Exception('color and size are not compatible');
switch ($resultType) {
case self::OT_NUMBER:
return self::_funcNumber($a, $op, $b);
case self::OT_SIZE:
if (is_null($aDim)) $aDim = $bDim;
if (is_null($bDim)) $bDim = $aDim;
if ($aDim != $bDim)
{
if (!isset(self::$_dimRatio[$aDim][$bDim]))
throw new Exception('incompatible size dimensions');
$b *= self::$_dimRatio[$bDim][$aDim];
}
return self::_funcNumber($a, $op, $b) . self::$_dimensions[$aDim];
case self::OT_COLOR:
if ($aType == self::OT_NUMBER) $a = array($a, $a, $a);
if ($bType == self::OT_NUMBER) $b = array($b, $b, $b);
foreach ($a as $key => $dummy)
$a[$key] = max(0, min(255, self::_funcNumber($a[$key], $op, $b[$key])));
return sprintf('#%2x%2x%2x', $a[0], $a[1], $a[2]);
case self::OT_STRING:
if ($op == self::OP_ADD)
return '"' . $a . $b . '"';
break;
}
throw new Exception('"'.self::$_operations[$op].'" is wrong operation for these arguments');
}
Окт. 5, 2009, 7:11 д.п., спустя 23 часа 7 минут 13 секунд
class SassFilter
{
public static function pipe($sass, $style= O_NESTED, $commandCallback = NULL) {…}
}
class SassFile
{
public static function open($sassFileName, $style= O_NESTED)
{
$sass = file_get_contents($sassFileName);
return SassFilter::pipe($sass, $style, array('SassFile', '_atCommand'));
}
public static function _atCommand(…) {…}
}
Окт. 5, 2009, 10:34 д.п., спустя 3 часа 22 минуты 52 секунды
@import basic.sass
@import typography.sass
@import color.sass
!inner-width = 60%
!inner-side-width = 15%
!inner-middle-width = !inner-width - (2 * !inner-side-width)
!outer-side-width = (100% - !inner-width) / 2
// these columns will be stretched down
#left, #mid-left, #mid-center, #mid-right, #right
+eq-height
#left
:float left
:width = !outer-side-width
#mid-left
:float left
:width = !inner-side-width
#mid-center
:float left
:width = !inner-middle-width
#mid-right
:float right
:width = !inner-side-width
#right
:float right
:width = !outer-side-width
#topbar
:float left
:width = !inner-width
// hack to compensate for IE and percentage widths rounding errors
.ie
#topbar
:width = !inner-width + 0.6%
#mid-center
:width = !inner-middle-width - 0.2%
#right
:width = !outer-side-width - 0.8%
!basic-color = #f0f0f0
!color-accent = #100000
!header-color = #a31e39
!footer-color = #455c5a
!high-color = #fff
body
:background = !basic-color
#minMax
:background = !basic-color - 0x10
#header
:background = !header-color
#left
:background = !basic-color - 0x30 + !color-accent
#mid-left
:background = !basic-color - 0x30
#mid-right
:background = !basic-color - 0x20
#right
:background = !basic-color - 0x40 + !color-accent
<link rel="stylesheet" media="all" type="text/css" href="sass-on-the-fly.php/eqcolumn.sass" />
Окт. 5, 2009, 2:39 п.п., спустя 2 часа 10 минут 8 секунд
Окт. 5, 2009, 2:46 п.п., спустя 6 минут 58 секунд
Окт. 5, 2009, 2:53 п.п., спустя 7 минут 22 секунды
при правильных заголовках ;)
я не мерял пока. на глаз задержки не заметно :) конечно надо продумать кеширование. хотя браузеры стилевые файлы сами кешируют нефигово на клиентской стороне.
Окт. 5, 2009, 5:52 п.п., спустя 2 часа 58 минут 58 секунд
Окт. 5, 2009, 6 п.п., спустя 7 минут 49 секунд
Окт. 6, 2009, 6:31 д.п., спустя 12 часов 31 минуту 7 секунд
echo '<link rel="stylesheet" media="all" type="text/css" href="sass-on-the-fly.php/'.$updatetime.'/eqcolumn.sass" />';
Окт. 6, 2009, 10:42 д.п., спустя 4 часа 10 минут 52 секунды
Страницы: ← Предыдущая страница • Следующая страница →
Пожалуйста, авторизуйтесь, чтобы написать комментарий!