Text-Sass-XS

 view release on metacpan or  search on metacpan

libsass/src/inspect.cpp  view on Meta::CPAN

#include "inspect.hpp"
#include "ast.hpp"
#include <cmath>
#include <iostream>
#include <iomanip>

namespace Sass {
  using namespace std;

  Inspect::Inspect() : buffer(""), indentation(0) { }
  Inspect::~Inspect() { }

  // statements
  void Inspect::operator()(Block* block)
  {
    if (!block->is_root()) {
      buffer += " {\n";
      ++indentation;
    }
    for (size_t i = 0, L = block->length(); i < L; ++i) {
      indent();
      (*block)[i]->perform(this);
      // extra newline at the end of top-level statements
      if (block->is_root()) buffer += '\n';
      buffer += '\n';
    }
    if (!block->is_root()) {
      --indentation;
      indent();
      buffer += "}";
    }
    // remove extra newline that gets added after the last top-level block
    if (block->is_root()) {
      size_t l = buffer.length();
      if (l > 2 && buffer[l-1] == '\n' && buffer[l-2] == '\n')
        buffer.erase(l-1);
    }
  }

  void Inspect::operator()(Ruleset* ruleset)
  {
    ruleset->selector()->perform(this);
    ruleset->block()->perform(this);
  }

  void Inspect::operator()(Propset* propset)
  {
    propset->property_fragment()->perform(this);
    buffer += ": ";
    // ++indentation;
    // for (size_t i = 0, S = propset->declarations().size(); i < S; ++i) {
    //   indent();
    //   propset->declarations()[i]->perform(this);
    //   buffer += '\n';
    // }
    // for (size_t i = 0, S = propset->propsets().size(); i < S; ++i) {
    //   indent();
    //   propset->propsets()[i]->perform(this);
    //   buffer += '\n';
    // }
    // --indentation;
    // buffer += "}";
    propset->block()->perform(this);
  }

  void Inspect::operator()(Media_Block* media_block)
  {
    buffer += "@media ";
    media_block->media_queries()->perform(this);
    media_block->block()->perform(this);
  }

  void Inspect::operator()(At_Rule* at_rule)
  {
    buffer += at_rule->keyword();
    if (at_rule->selector()) {
      buffer += ' ';
      at_rule->selector()->perform(this);
    }
    if (at_rule->block()) {
      at_rule->block()->perform(this);
    }
    else {
      buffer += ';';
    }
  }

  void Inspect::operator()(Declaration* dec)
  {
    dec->property()->perform(this);
    buffer += ": ";
    dec->value()->perform(this);
    if (dec->is_important()) buffer += " !important";
    buffer += ';';
  }

  void Inspect::operator()(Assignment* assn)
  {
    buffer += assn->variable();
    buffer += ": ";
    assn->value()->perform(this);
    if (assn->is_guarded()) buffer += " !default";
    buffer += ';';
  }

  void Inspect::operator()(Import* import)
  {
    if (!import->urls().empty()) {
      buffer += "@import ";
      import->urls().front()->perform(this);
      buffer += ';';
      for (size_t i = 1, S = import->urls().size(); i < S; ++i) {
        buffer += "\n@import ";
        import->urls()[i]->perform(this);
        buffer += ';';
      }
    }
  }

  void Inspect::operator()(Import_Stub* import)
  {
    buffer += "@import ";
    buffer += import->file_name();



( run in 0.666 second using v1.01-cache-2.11-cpan-71847e10f99 )