123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- <?php
- /**
- * SCSSPHP
- *
- * @copyright 2012-2015 Leaf Corcoran
- *
- * @license http://opensource.org/licenses/MIT MIT
- *
- * @link http://leafo.github.io/scssphp
- */
- namespace Leafo\ScssPhp;
- use Leafo\ScssPhp\Formatter\OutputBlock;
- /**
- * Base formatter
- *
- * @author Leaf Corcoran <leafot@gmail.com>
- */
- abstract class Formatter
- {
- /**
- * @var integer
- */
- public $indentLevel;
- /**
- * @var string
- */
- public $indentChar;
- /**
- * @var string
- */
- public $break;
- /**
- * @var string
- */
- public $open;
- /**
- * @var string
- */
- public $close;
- /**
- * @var string
- */
- public $tagSeparator;
- /**
- * @var string
- */
- public $assignSeparator;
- /**
- * @var boolea
- */
- public $keepSemicolons;
- /**
- * Initialize formatter
- *
- * @api
- */
- public abstract function __construct();
- /**
- * Return indentation (whitespace)
- *
- * @return string
- */
- protected function indentStr()
- {
- return '';
- }
- /**
- * Return property assignment
- *
- * @api
- *
- * @param string $name
- * @param mixed $value
- *
- * @return string
- */
- public function property($name, $value)
- {
- return rtrim($name) . $this->assignSeparator . $value . ';';
- }
- /**
- * Strip semi-colon appended by property(); it's a separator, not a terminator
- *
- * @api
- *
- * @param array $lines
- */
- public function stripSemicolon(&$lines)
- {
- if ($this->keepSemicolons) {
- return;
- }
- if (($count = count($lines)) && substr($lines[$count - 1], -1) === ';') {
- $lines[$count - 1] = substr($lines[$count - 1], 0, -1);
- }
- }
- /**
- * Output lines inside a block
- *
- * @param \Leafo\ScssPhp\Formatter\OutputBlock $block
- */
- protected function blockLines(OutputBlock $block)
- {
- $inner = $this->indentStr();
- $glue = $this->break . $inner;
- echo $inner . implode($glue, $block->lines);
- if (!empty($block->children)) {
- echo $this->break;
- }
- }
- /**
- * Output block selectors
- *
- * @param \Leafo\ScssPhp\Formatter\OutputBlock $block
- */
- protected function blockSelectors(OutputBlock $block)
- {
- $inner = $this->indentStr();
- echo $inner . implode($this->tagSeparator, $block->selectors) . $this->open . $this->break;
- }
- /**
- * Output block children
- *
- * @param \Leafo\ScssPhp\Formatter\OutputBlock $block
- */
- protected function blockChildren(OutputBlock $block)
- {
- foreach ($block->children as $child) {
- $this->block($child);
- }
- }
- /**
- * Output non-empty block
- *
- * @param \Leafo\ScssPhp\Formatter\OutputBlock $block
- */
- protected function block(OutputBlock $block)
- {
- if (empty($block->lines) && empty($block->children)) {
- return;
- }
- $pre = $this->indentStr();
- if (!empty($block->selectors)) {
- $this->blockSelectors($block);
- $this->indentLevel++;
- }
- if (!empty($block->lines)) {
- $this->blockLines($block);
- }
- if (!empty($block->children)) {
- $this->blockChildren($block);
- }
- if (!empty($block->selectors)) {
- $this->indentLevel--;
- if (empty($block->children)) {
- echo $this->break;
- }
- echo $pre . $this->close . $this->break;
- }
- }
- /**
- * Entry point to formatting a block
- *
- * @api
- *
- * @param \Leafo\ScssPhp\Formatter\OutputBlock $block An abstract syntax tree
- *
- * @return string
- */
- public function format(OutputBlock $block)
- {
- ob_start();
- $this->block($block);
- $out = ob_get_clean();
- return $out;
- }
- }
|