diff --git a/src/ast.cpp b/src/ast.cpp deleted file mode 100644 index 31dde642a..000000000 --- a/src/ast.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include "ast.hpp" -#include "context.hpp" -#include "to_string.hpp" -#include - -namespace Sass { - using namespace std; - - bool Simple_Selector_Sequence::operator<(const Simple_Selector_Sequence& rhs) const - { - To_String to_string; - // ugly - return const_cast(this)->perform(&to_string) < - const_cast(rhs).perform(&to_string); - } - - Simple_Selector_Sequence* Selector_Combination::base() - { - if (!tail()) return head(); - else return tail()->base(); - } - - Selector_Combination* Selector_Combination::context(Context& ctx) - { - if (!tail()) return 0; - if (!head()) return tail()->context(ctx); - return new (ctx.mem) Selector_Combination(path(), line(), combinator(), head(), tail()->context(ctx)); - } - - Selector_Combination* Selector_Combination::innermost() - { - if (!tail()) return this; - else return tail()->innermost(); - } - -} \ No newline at end of file diff --git a/src/ast.hpp b/src/ast.hpp deleted file mode 100644 index 51297ab84..000000000 --- a/src/ast.hpp +++ /dev/null @@ -1,1192 +0,0 @@ -#define SASS_AST - -#include -#include -#include -#include - -#ifndef SASS_OPERATION -#include "operation.hpp" -#endif - -#ifndef SASS_TOKEN -#include "token.hpp" -#endif - -#ifndef SASS_ENVIRONMENT -#include "environment.hpp" -#endif - -#ifndef SASS -#include "sass.h" -#endif - -#include "units.hpp" -#include "error_handling.hpp" -#include "ast_def_macros.hpp" - -#include -#include -#include - -namespace Sass { - using namespace std; - - ///////////////////////////////////////////////////////////////////////////// - // Mixin class for AST nodes that should behave like vectors. Uses the - // "Template Method" design pattern to allow subclasses to adjust their flags - // when certain objects are pushed. - ///////////////////////////////////////////////////////////////////////////// - template - class Vectorized { - vector elements_; - protected: - virtual void adjust_after_pushing(T element) { } - public: - Vectorized(size_t s = 0) : elements_(vector()) - { elements_.reserve(s); } - virtual ~Vectorized() = 0; - size_t length() const { return elements_.size(); } - bool empty() const { return elements_.empty(); } - T& operator[](size_t i) { return elements_[i]; } - Vectorized& operator<<(T element) - { - elements_.push_back(element); - adjust_after_pushing(element); - return *this; - } - Vectorized& operator+=(Vectorized* v) - { - for (size_t i = 0, L = v->length(); i < L; ++i) *this << (*v)[i]; - return *this; - } - vector& elements() { return elements_; } - }; - template - inline Vectorized::~Vectorized() { } - - ////////////////////////////////////////////////////////// - // Abstract base class for all abstract syntax tree nodes. - ////////////////////////////////////////////////////////// - class Block; - class Statement; - class Expression; - class Selector; - class AST_Node { - ADD_PROPERTY(string, path); - ADD_PROPERTY(size_t, line); - public: - AST_Node(string p, size_t l) : path_(p), line_(l) { } - virtual ~AST_Node() = 0; - // virtual Block* block() { return 0; } - ATTACH_OPERATIONS(); - }; - inline AST_Node::~AST_Node() { } - - ///////////////////////////////////////////////////////////////////////// - // Abstract base class for statements. This side of the AST hierarchy - // represents elements in expansion contexts, which exist primarily to be - // rewritten and macro-expanded. - ///////////////////////////////////////////////////////////////////////// - class Statement : public AST_Node { - public: - Statement(string p, size_t l) : AST_Node(p, l) { } - virtual ~Statement() = 0; - // needed for rearranging nested rulesets during CSS emission - virtual bool is_hoistable() { return false; } - virtual Block* block() { return 0; } - }; - inline Statement::~Statement() { } - - //////////////////////// - // Blocks of statements. - //////////////////////// - class Block : public Statement, public Vectorized { - ADD_PROPERTY(bool, is_root); - // needed for properly formatted CSS emission - ADD_PROPERTY(bool, has_hoistable); - ADD_PROPERTY(bool, has_non_hoistable); - protected: - void adjust_after_pushing(Statement* s) - { - if (s->is_hoistable()) has_hoistable_ = true; - else has_non_hoistable_ = true; - }; - public: - Block(string p, size_t l, size_t s = 0, bool r = false) - : Statement(p, l), - Vectorized(s), - is_root_(r), has_hoistable_(false), has_non_hoistable_(false) - { } - Block* block() { return this; } - ATTACH_OPERATIONS(); - }; - - //////////////////////////////////////////////////////////////////////// - // Abstract base class for statements that contain blocks of statements. - //////////////////////////////////////////////////////////////////////// - class Has_Block : public Statement { - ADD_PROPERTY(Block*, block); - public: - Has_Block(string p, size_t l, Block* b) - : Statement(p, l), block_(b) - { } - virtual ~Has_Block() = 0; - }; - inline Has_Block::~Has_Block() { } - - ///////////////////////////////////////////////////////////////////////////// - // Rulesets (i.e., sets of styles headed by a selector and containing a block - // of style declarations. - ///////////////////////////////////////////////////////////////////////////// - class Selector; - class Ruleset : public Has_Block { - ADD_PROPERTY(Selector*, selector); - public: - Ruleset(string p, size_t l, Selector* s, Block* b) - : Has_Block(p, l, b), selector_(s) - { } - // nested rulesets need to be hoisted out of their enclosing blocks - bool is_hoistable() { return true; } - ATTACH_OPERATIONS(); - }; - - ///////////////////////////////////////////////////////// - // Nested declaration sets (i.e., namespaced properties). - ///////////////////////////////////////////////////////// - class String; - class Propset : public Has_Block { - ADD_PROPERTY(String*, property_fragment); - public: - Propset(string p, size_t l, String* pf) - : Has_Block(p, l, 0), property_fragment_(pf) - { } - ATTACH_OPERATIONS(); - }; - - ///////////////// - // Media queries. - ///////////////// - class List; - class Media_Block : public Has_Block { - ADD_PROPERTY(List*, media_queries); - ADD_PROPERTY(Selector*, enclosing_selector); - public: - Media_Block(string p, size_t l, List* mqs, Block* b) - : Has_Block(p, l, b), media_queries_(mqs), enclosing_selector_(0) - { } - bool is_hoistable() { return true; } - ATTACH_OPERATIONS(); - }; - - /////////////////////////////////////////////////////////////////////// - // At-rules -- arbitrary directives beginning with "@" that may have an - // optional statement block. - /////////////////////////////////////////////////////////////////////// - class At_Rule : public Has_Block { - ADD_PROPERTY(string, keyword); - ADD_PROPERTY(Selector*, selector); - public: - At_Rule(string p, size_t l, string kwd, Selector* sel = 0, Block* b = 0) - : Has_Block(p, l, b), keyword_(kwd), selector_(sel) - { } - ATTACH_OPERATIONS(); - }; - - //////////////////////////////////////////////////////////////////////// - // Declarations -- style rules consisting of a property name and values. - //////////////////////////////////////////////////////////////////////// - class Declaration : public Statement { - ADD_PROPERTY(String*, property); - ADD_PROPERTY(Expression*, value); - ADD_PROPERTY(bool, is_important); - public: - Declaration(string p, size_t l, - String* prop, Expression* val, bool i = false) - : Statement(p, l), property_(prop), value_(val), is_important_(i) - { } - ATTACH_OPERATIONS(); - }; - - ///////////////////////////////////// - // Assignments -- variable and value. - ///////////////////////////////////// - class Variable; - class Expression; - class Assignment : public Statement { - ADD_PROPERTY(string, variable); - ADD_PROPERTY(Expression*, value); - ADD_PROPERTY(bool, is_guarded); - public: - Assignment(string p, size_t l, - string var, Expression* val, bool guarded = false) - : Statement(p, l), variable_(var), value_(val), is_guarded_(guarded) - { } - ATTACH_OPERATIONS(); - }; - - //////////////////////////////////////////////////////////////////////////// - // Import directives. CSS and Sass import lists can be intermingled, so it's - // necessary to store a list of each in an Import node. - //////////////////////////////////////////////////////////////////////////// - class Import : public Statement { - vector files_; - vector urls_; - public: - Import(string p, size_t l) - : Statement(p, l), - files_(vector()), urls_(vector()) - { } - vector& files() { return files_; } - vector& urls() { return urls_; } - ATTACH_OPERATIONS(); - }; - - class Import_Stub : public Statement { - ADD_PROPERTY(string, file_name); - public: - Import_Stub(string p, size_t l, string f) - : Statement(p, l), file_name_(f) - { } - ATTACH_OPERATIONS(); - }; - - ////////////////////////////// - // The Sass `@warn` directive. - ////////////////////////////// - class Warning : public Statement { - ADD_PROPERTY(Expression*, message); - public: - Warning(string p, size_t l, Expression* msg) - : Statement(p, l), message_(msg) - { } - ATTACH_OPERATIONS(); - }; - - /////////////////////////////////////////// - // CSS comments. These may be interpolated. - /////////////////////////////////////////// - class Comment : public Statement { - ADD_PROPERTY(String*, text); - public: - Comment(string p, size_t l, String* txt) - : Statement(p, l), text_(txt) - { } - ATTACH_OPERATIONS(); - }; - - //////////////////////////////////// - // The Sass `@if` control directive. - //////////////////////////////////// - class If : public Statement { - ADD_PROPERTY(Expression*, predicate); - ADD_PROPERTY(Block*, consequent); - ADD_PROPERTY(Block*, alternative); - public: - If(string p, size_t l, Expression* pred, Block* con, Block* alt = 0) - : Statement(p, l), predicate_(pred), consequent_(con), alternative_(alt) - { } - ATTACH_OPERATIONS(); - }; - - ///////////////////////////////////// - // The Sass `@for` control directive. - ///////////////////////////////////// - class For : public Has_Block { - ADD_PROPERTY(string, variable); - ADD_PROPERTY(Expression*, lower_bound); - ADD_PROPERTY(Expression*, upper_bound); - ADD_PROPERTY(bool, is_inclusive); - public: - For(string p, size_t l, - string var, Expression* lo, Expression* hi, Block* b, bool inc) - : Has_Block(p, l, b), - variable_(var), lower_bound_(lo), upper_bound_(hi), is_inclusive_(inc) - { } - ATTACH_OPERATIONS(); - }; - - ////////////////////////////////////// - // The Sass `@each` control directive. - ////////////////////////////////////// - class Each : public Has_Block { - ADD_PROPERTY(string, variable); - ADD_PROPERTY(Expression*, list); - public: - Each(string p, size_t l, string var, Expression* lst, Block* b) - : Has_Block(p, l, b), variable_(var), list_(lst) - { } - ATTACH_OPERATIONS(); - }; - - /////////////////////////////////////// - // The Sass `@while` control directive. - /////////////////////////////////////// - class While : public Has_Block { - ADD_PROPERTY(Expression*, predicate); - public: - While(string p, size_t l, Expression* pred, Block* b) - : Has_Block(p, l, b), predicate_(pred) - { } - ATTACH_OPERATIONS(); - }; - - ///////////////////////////////////////////////////////////// - // The @return directive for use inside SassScript functions. - ///////////////////////////////////////////////////////////// - class Return : public Statement { - ADD_PROPERTY(Expression*, value); - public: - Return(string p, size_t l, Expression* val) - : Statement(p, l), value_(val) - { } - ATTACH_OPERATIONS(); - }; - - //////////////////////////////// - // The Sass `@extend` directive. - //////////////////////////////// - class Extension : public Statement { - ADD_PROPERTY(Selector*, selector); - public: - Extension(string p, size_t l, Selector* s) - : Statement(p, l), selector_(s) - { } - ATTACH_OPERATIONS(); - }; - - ///////////////////////////////////////////////////////////////////////////// - // Definitions for both mixins and functions. The two cases are distinguished - // by a type tag. - ///////////////////////////////////////////////////////////////////////////// - class Context; - struct Backtrace; - class Parameters; - typedef Environment Env; - typedef const char* Signature; - typedef Expression* (*Native_Function)(Env&, Context&, Signature, const string&, size_t, Backtrace*); - typedef const char* Signature; - class Definition : public Has_Block { - public: - enum Type { MIXIN, FUNCTION }; - ADD_PROPERTY(string, name); - ADD_PROPERTY(Parameters*, parameters); - ADD_PROPERTY(Env*, environment); - ADD_PROPERTY(Type, type); - ADD_PROPERTY(Native_Function, native_function); - ADD_PROPERTY(Sass_C_Function, c_function); - ADD_PROPERTY(bool, is_overload_stub); - ADD_PROPERTY(Signature, signature); - public: - Definition(string p, - size_t l, - string n, - Parameters* params, - Block* b, - Type t) - : Has_Block(p, l, b), - name_(n), - parameters_(params), - environment_(0), - type_(t), - native_function_(0), - c_function_(0), - is_overload_stub_(false), - signature_(0) - { } - Definition(string p, - size_t l, - Signature sig, - string n, - Parameters* params, - Native_Function func_ptr, - bool overload_stub = false) - : Has_Block(p, l, 0), - name_(n), - parameters_(params), - environment_(0), - type_(FUNCTION), - native_function_(func_ptr), - c_function_(0), - is_overload_stub_(overload_stub), - signature_(sig) - { } - Definition(string p, - size_t l, - Signature sig, - string n, - Parameters* params, - Sass_C_Function func_ptr, - bool whatever, - bool whatever2) - : Has_Block(p, l, 0), - name_(n), - parameters_(params), - environment_(0), - type_(FUNCTION), - native_function_(0), - c_function_(func_ptr), - is_overload_stub_(false), - signature_(sig) - { } - ATTACH_OPERATIONS(); - }; - - ////////////////////////////////////// - // Mixin calls (i.e., `@include ...`). - ////////////////////////////////////// - class Arguments; - class Mixin_Call : public Has_Block { - ADD_PROPERTY(string, name); - ADD_PROPERTY(Arguments*, arguments); - public: - Mixin_Call(string p, size_t l, string n, Arguments* args, Block* b = 0) - : Has_Block(p, l, b), name_(n), arguments_(args) - { } - ATTACH_OPERATIONS(); - }; - - /////////////////////////////////////////////////// - // The @content directive for mixin content blocks. - /////////////////////////////////////////////////// - class Content : public Statement { - public: - Content(string p, size_t l) : Statement(p, l) { } - ATTACH_OPERATIONS(); - }; - - ////////////////////////////////////////////////////////////////////// - // Abstract base class for expressions. This side of the AST hierarchy - // represents elements in value contexts, which exist primarily to be - // evaluated and returned. - ////////////////////////////////////////////////////////////////////// - class Expression : public AST_Node { - public: - enum Concrete_Type { - NONE, - BOOLEAN, - NUMBER, - COLOR, - STRING, - LIST, - NULL_VAL, - NUM_TYPES - }; - private: - // expressions in some contexts shouldn't be evaluated - ADD_PROPERTY(bool, is_delayed); - ADD_PROPERTY(bool, is_interpolant); - ADD_PROPERTY(Concrete_Type, concrete_type); - public: - Expression(string p, size_t l, - bool d = false, bool i = false, Concrete_Type ct = NONE) - : AST_Node(p, l), - is_delayed_(d), is_interpolant_(i), concrete_type_(ct) - { } - virtual operator bool() { return true; } - virtual ~Expression() = 0; - virtual string type() { return ""; /* TODO: raise an error? */ } - virtual bool is_invisible() { return false; } - static string type_name() { return ""; } - virtual bool is_false() { return false; } - }; - inline Expression::~Expression() { } - - /////////////////////////////////////////////////////////////////////// - // Lists of values, both comma- and space-separated (distinguished by a - // type-tag.) Also used to represent variable-length argument lists. - /////////////////////////////////////////////////////////////////////// - class List : public Expression, public Vectorized { - public: - enum Separator { SPACE, COMMA }; - private: - ADD_PROPERTY(Separator, separator); - ADD_PROPERTY(bool, is_arglist); - public: - List(string p, size_t l, - size_t size = 0, Separator sep = SPACE, bool argl = false) - : Expression(p, l), - Vectorized(size), - separator_(sep), is_arglist_(argl) - { concrete_type(LIST); } - string type() { return is_arglist_ ? "arglist" : "list"; } - static string type_name() { return "list"; } - bool is_invisible() { return !length(); } - ATTACH_OPERATIONS(); - }; - - ////////////////////////////////////////////////////////////////////////// - // Binary expressions. Represents logical, relational, and arithmetic - // operations. Templatized to avoid large switch statements and repetitive - // subclassing. - ////////////////////////////////////////////////////////////////////////// - class Binary_Expression : public Expression { - public: - enum Type { - AND, OR, // logical connectives - EQ, NEQ, GT, GTE, LT, LTE, // arithmetic relations - ADD, SUB, MUL, DIV, MOD, // arithmetic functions - NUM_OPS // so we know how big to make the op table - }; - private: - ADD_PROPERTY(Type, type); - ADD_PROPERTY(Expression*, left); - ADD_PROPERTY(Expression*, right); - public: - Binary_Expression(string p, size_t l, - Type t, Expression* lhs, Expression* rhs) - : Expression(p, l), type_(t), left_(lhs), right_(rhs) - { } - ATTACH_OPERATIONS(); - }; - - //////////////////////////////////////////////////////////////////////////// - // Arithmetic negation (logical negation is just an ordinary function call). - //////////////////////////////////////////////////////////////////////////// - class Unary_Expression : public Expression { - public: - enum Type { PLUS, MINUS }; - private: - ADD_PROPERTY(Type, type); - ADD_PROPERTY(Expression*, operand); - public: - Unary_Expression(string p, size_t l, Type t, Expression* o) - : Expression(p, l), type_(t), operand_(o) - { } - ATTACH_OPERATIONS(); - }; - - ////////////////// - // Function calls. - ////////////////// - class Function_Call : public Expression { - ADD_PROPERTY(string, name); - ADD_PROPERTY(Arguments*, arguments); - public: - Function_Call(string p, size_t l, string n, Arguments* args) - : Expression(p, l), name_(n), arguments_(args) - { concrete_type(STRING); } - ATTACH_OPERATIONS(); - }; - - ///////////////////////// - // Function call schemas. - ///////////////////////// - class Function_Call_Schema : public Expression { - ADD_PROPERTY(String*, name); - ADD_PROPERTY(Arguments*, arguments); - public: - Function_Call_Schema(string p, size_t l, String* n, Arguments* args) - : Expression(p, l), name_(n), arguments_(args) - { concrete_type(STRING); } - ATTACH_OPERATIONS(); - }; - - /////////////////////// - // Variable references. - /////////////////////// - class Variable : public Expression { - ADD_PROPERTY(string, name); - public: - Variable(string p, size_t l, string n) - : Expression(p, l), name_(n) - { } - ATTACH_OPERATIONS(); - }; - - //////////////////////////////////////////////////////////////////////////// - // Textual (i.e., unevaluated) numeric data. Variants are distinguished with - // a type tag. - //////////////////////////////////////////////////////////////////////////// - class Textual : public Expression { - public: - enum Type { NUMBER, PERCENTAGE, DIMENSION, HEX }; - private: - ADD_PROPERTY(Type, type); - ADD_PROPERTY(string, value); - public: - Textual(string p, size_t l, Type t, string val) - : Expression(p, l, true), type_(t), value_(val) - { } - ATTACH_OPERATIONS(); - }; - - //////////////////////////////////////////////// - // Numbers, percentages, dimensions, and colors. - //////////////////////////////////////////////// - class Number : public Expression { - ADD_PROPERTY(double, value); - vector numerator_units_; - vector denominator_units_; - public: - Number(string p, size_t l, double val, string u = "") - : Expression(p, l), - value_(val), - numerator_units_(vector()), - denominator_units_(vector()) - { - if (!u.empty()) numerator_units_.push_back(u); - concrete_type(NUMBER); - } - vector& numerator_units() { return numerator_units_; } - vector& denominator_units() { return denominator_units_; } - string type() { return "number"; } - static string type_name() { return "number"; } - string unit() - { - stringstream u; - for (size_t i = 0, S = numerator_units_.size(); i < S; ++i) { - if (i) u << '*'; - u << numerator_units_[i]; - } - if (!denominator_units_.empty()) u << '/'; - for (size_t i = 0, S = denominator_units_.size(); i < S; ++i) { - if (i) u << '*'; - u << denominator_units_[i]; - } - return u.str(); - } - bool is_unitless() - { return numerator_units_.empty() && denominator_units_.empty(); } - void normalize(string to = "") - { - // (multiple passes because I'm too tired to think up something clever) - // Find a unit to convert everything to, if one isn't provided. - if (to.empty()) { - for (size_t i = 0, S = numerator_units_.size(); i < S; ++i) { - string u(numerator_units_[i]); - if (string_to_unit(u) == INCOMMENSURABLE) { - continue; - } - else { - to = u; - break; - } - } - } - if (to.empty()) { - for (size_t i = 0, S = denominator_units_.size(); i < S; ++i) { - string u(denominator_units_[i]); - if (string_to_unit(u) == INCOMMENSURABLE) { - continue; - } - else { - to = u; - break; - } - } - } - // Now loop through again and do all the conversions. - for (size_t i = 0, S = numerator_units_.size(); i < S; ++i) { - string from(numerator_units_[i]); - if (string_to_unit(from) == INCOMMENSURABLE) continue; - value_ *= conversion_factor(from, to); - numerator_units_[i] = to; - } - for (size_t i = 0, S = denominator_units_.size(); i < S; ++i) { - string from(denominator_units_[i]); - if (string_to_unit(from) == INCOMMENSURABLE) continue; - value_ /= conversion_factor(from, to); - denominator_units_[i] = to; - } - // Now divide out identical units in the numerator and denominator. - vector ncopy; - ncopy.reserve(numerator_units_.size()); - for (vector::iterator n = numerator_units_.begin(); - n != numerator_units_.end(); - ++n) { - vector::iterator d = find(denominator_units_.begin(), - denominator_units_.end(), - *n); - if (d != denominator_units_.end()) { - denominator_units_.erase(d); - } - else { - ncopy.push_back(*n); - } - } - numerator_units_ = ncopy; - // Sort the units to make them pretty and, well, normal. - sort(numerator_units_.begin(), numerator_units_.end()); - sort(denominator_units_.begin(), denominator_units_.end()); - } - // useful for making one number compatible with another - string find_convertible_unit() - { - for (size_t i = 0, S = numerator_units_.size(); i < S; ++i) { - string u(numerator_units_[i]); - if (string_to_unit(u) != INCOMMENSURABLE) return u; - } - for (size_t i = 0, S = denominator_units_.size(); i < S; ++i) { - string u(denominator_units_[i]); - if (string_to_unit(u) != INCOMMENSURABLE) return u; - } - return string(); - } - ATTACH_OPERATIONS(); - }; - - ////////// - // Colors. - ////////// - class Color : public Expression { - ADD_PROPERTY(double, r); - ADD_PROPERTY(double, g); - ADD_PROPERTY(double, b); - ADD_PROPERTY(double, a); - public: - Color(string p, size_t l, double r, double g, double b, double a = 1) - : Expression(p, l), r_(r), g_(g), b_(b), a_(a) - { concrete_type(COLOR); } - string type() { return "color"; } - static string type_name() { return "color"; } - ATTACH_OPERATIONS(); - }; - - //////////// - // Booleans. - //////////// - class Boolean : public Expression { - ADD_PROPERTY(bool, value); - public: - Boolean(string p, size_t l, bool val) : Expression(p, l), value_(val) - { concrete_type(BOOLEAN); } - virtual operator bool() { return value_; } - string type() { return "bool"; } - static string type_name() { return "bool"; } - virtual bool is_false() { return !value_; } - ATTACH_OPERATIONS(); - }; - - //////////////////////////////////////////////////////////////////////// - // Abstract base class for Sass string values. Includes interpolated and - // "flat" strings. - //////////////////////////////////////////////////////////////////////// - class String : public Expression { - ADD_PROPERTY(bool, needs_unquoting); - public: - String(string p, size_t l, bool unq = false, bool delayed = false) - : Expression(p, l, delayed), needs_unquoting_(unq) - { concrete_type(STRING); } - static string type_name() { return "string"; } - virtual ~String() = 0; - ATTACH_OPERATIONS(); - }; - inline String::~String() { }; - - /////////////////////////////////////////////////////////////////////// - // Interpolated strings. Meant to be reduced to flat strings during the - // evaluation phase. - /////////////////////////////////////////////////////////////////////// - class String_Schema : public String, public Vectorized { - ADD_PROPERTY(char, quote_mark); - public: - String_Schema(string p, size_t l, size_t size = 0, bool unq = false, char qm = '\0') - : String(p, l, unq), Vectorized(size), quote_mark_(qm) - { } - string type() { return "string"; } - static string type_name() { return "string"; } - ATTACH_OPERATIONS(); - }; - - //////////////////////////////////////////////////////// - // Flat strings -- the lowest level of raw textual data. - //////////////////////////////////////////////////////// - class String_Constant : public String { - ADD_PROPERTY(string, value); - public: - String_Constant(string p, size_t l, string val, bool unq = false) - : String(p, l, unq, true), value_(val) - { } - String_Constant(string p, size_t l, const char* beg, bool unq = false) - : String(p, l, unq, true), value_(string(beg)) - { } - String_Constant(string p, size_t l, const char* beg, const char* end, bool unq = false) - : String(p, l, unq, true), value_(string(beg, end-beg)) - { } - String_Constant(string p, size_t l, const Token& tok, bool unq = false) - : String(p, l, unq, true), value_(string(tok.begin, tok.end)) - { } - string type() { return "string"; } - static string type_name() { return "string"; } - bool is_quoted() { return value_.length() && (value_[0] == '"' || value_[0] == '\''); } - char quote_mark() { return is_quoted() ? value_[0] : '\0'; } - ATTACH_OPERATIONS(); - }; - - ///////////////// - // Media queries. - ///////////////// - class Media_Query : public Expression, - public Vectorized { - ADD_PROPERTY(String*, media_type); - ADD_PROPERTY(bool, is_negated); - ADD_PROPERTY(bool, is_restricted); - public: - Media_Query(string p, size_t l, - String* t = 0, size_t s = 0, bool n = false, bool r = false) - : Expression(p, l), Vectorized(s), - media_type_(t), is_negated_(n), is_restricted_(r) - { } - ATTACH_OPERATIONS(); - }; - - //////////////////////////////////////////////////// - // Media expressions (for use inside media queries). - //////////////////////////////////////////////////// - class Media_Query_Expression : public Expression { - ADD_PROPERTY(Expression*, feature); - ADD_PROPERTY(Expression*, value); - ADD_PROPERTY(bool, is_interpolated); - public: - Media_Query_Expression(string p, size_t l, - Expression* f, Expression* v, bool i = false) - : Expression(p, l), feature_(f), value_(v), is_interpolated_(i) - { } - ATTACH_OPERATIONS(); - }; - - ////////////////// - // The null value. - ////////////////// - class Null : public Expression { - public: - Null(string p, size_t l) : Expression(p, l) { concrete_type(NULL_VAL); } - string type() { return "null"; } - static string type_name() { return "null"; } - bool is_invisible() { return true; } - ATTACH_OPERATIONS(); - }; - - ///////////////////////////////// - // Thunks for delayed evaluation. - ///////////////////////////////// - class Thunk : public Expression { - ADD_PROPERTY(Expression*, expression); - ADD_PROPERTY(Env*, environment); - public: - Thunk(string p, size_t l, Expression* exp, Env* env = 0) - : Expression(p, l), expression_(exp), environment_(env) - { } - }; - - ///////////////////////////////////////////////////////// - // Individual parameter objects for mixins and functions. - ///////////////////////////////////////////////////////// - class Parameter : public AST_Node { - ADD_PROPERTY(string, name); - ADD_PROPERTY(Expression*, default_value); - ADD_PROPERTY(bool, is_rest_parameter); - public: - Parameter(string p, size_t l, - string n, Expression* def = 0, bool rest = false) - : AST_Node(p, l), name_(n), default_value_(def), is_rest_parameter_(rest) - { - if (default_value_ && is_rest_parameter_) { - error("variable-length parameter may not have a default value", path(), line()); - } - } - ATTACH_OPERATIONS(); - }; - - ///////////////////////////////////////////////////////////////////////// - // Parameter lists -- in their own class to facilitate context-sensitive - // error checking (e.g., ensuring that all optional parameters follow all - // required parameters). - ///////////////////////////////////////////////////////////////////////// - class Parameters : public AST_Node, public Vectorized { - ADD_PROPERTY(bool, has_optional_parameters); - ADD_PROPERTY(bool, has_rest_parameter); - protected: - void adjust_after_pushing(Parameter* p) - { - if (p->default_value()) { - if (has_rest_parameter_) { - error("optional parameters may not be combined with variable-length parameters", p->path(), p->line()); - } - has_optional_parameters_ = true; - } - else if (p->is_rest_parameter()) { - if (has_rest_parameter_) { - error("functions and mixins cannot have more than one variable-length parameter", p->path(), p->line()); - } - if (has_optional_parameters_) { - error("optional parameters may not be combined with variable-length parameters", p->path(), p->line()); - } - has_rest_parameter_ = true; - } - else { - if (has_rest_parameter_) { - error("required parameters must precede variable-length parameters", p->path(), p->line()); - } - if (has_optional_parameters_) { - error("required parameters must precede optional parameters", p->path(), p->line()); - } - } - } - public: - Parameters(string p, size_t l) - : AST_Node(p, l), - Vectorized(), - has_optional_parameters_(false), - has_rest_parameter_(false) - { } - ATTACH_OPERATIONS(); - }; - - //////////////////////////////////////////////////////////// - // Individual argument objects for mixin and function calls. - //////////////////////////////////////////////////////////// - class Argument : public Expression { - ADD_PROPERTY(Expression*, value); - ADD_PROPERTY(string, name); - ADD_PROPERTY(bool, is_rest_argument); - public: - Argument(string p, size_t l, Expression* val, string n = "", bool rest = false) - : Expression(p, l), value_(val), name_(n), is_rest_argument_(rest) - { - if (!name_.empty() && is_rest_argument_) { - error("variable-length argument may not be passed by name", path(), line()); - } - } - ATTACH_OPERATIONS(); - }; - - //////////////////////////////////////////////////////////////////////// - // Argument lists -- in their own class to facilitate context-sensitive - // error checking (e.g., ensuring that all ordinal arguments precede all - // named arguments). - //////////////////////////////////////////////////////////////////////// - class Arguments : public Expression, public Vectorized { - ADD_PROPERTY(bool, has_named_arguments); - ADD_PROPERTY(bool, has_rest_argument); - protected: - void adjust_after_pushing(Argument* a) - { - if (!a->name().empty()) { - if (has_rest_argument_) { - error("named arguments must precede variable-length argument", a->path(), a->line()); - } - has_named_arguments_ = true; - } - else if (a->is_rest_argument()) { - if (has_rest_argument_) { - error("functions and mixins may only be called with one variable-length argument", a->path(), a->line()); - } - if (has_named_arguments_) { - error("functions and mixins may not be called with both named arguments and variable-length arguments", a->path(), a->line()); - } - has_rest_argument_ = true; - } - else { - if (has_rest_argument_) { - error("ordinal arguments must precede variable-length arguments", a->path(), a->line()); - } - if (has_named_arguments_) { - error("ordinal arguments must precede named arguments", a->path(), a->line()); - } - } - } - public: - Arguments(string p, size_t l) - : Expression(p, l), - Vectorized(), - has_named_arguments_(false), - has_rest_argument_(false) - { } - ATTACH_OPERATIONS(); - }; - - ///////////////////////////////////////// - // Abstract base class for CSS selectors. - ///////////////////////////////////////// - class Selector : public AST_Node { - ADD_PROPERTY(bool, has_reference); - ADD_PROPERTY(bool, has_placeholder); - public: - Selector(string p, size_t l, bool r = false, bool h = false) - : AST_Node(p, l), has_reference_(r), has_placeholder_(h) - { } - virtual ~Selector() = 0; - }; - inline Selector::~Selector() { } - - ///////////////////////////////////////////////////////////////////////// - // Interpolated selectors -- the interpolated String will be expanded and - // re-parsed into a normal selector classure. - ///////////////////////////////////////////////////////////////////////// - class Selector_Schema : public Selector { - ADD_PROPERTY(String*, contents); - public: - Selector_Schema(string p, size_t l, String* c) - : Selector(p, l), contents_(c) - { } - ATTACH_OPERATIONS(); - }; - - //////////////////////////////////////////// - // Abstract base class for simple selectors. - //////////////////////////////////////////// - class Simple_Selector : public Selector { - public: - Simple_Selector(string p, size_t l) - : Selector(p, l) - { } - virtual ~Simple_Selector() = 0; - }; - inline Simple_Selector::~Simple_Selector() { } - - ///////////////////////////////////// - // Parent references (i.e., the "&"). - ///////////////////////////////////// - class Selector_Reference : public Simple_Selector { - ADD_PROPERTY(Selector*, selector); - public: - Selector_Reference(string p, size_t l, Selector* r = 0) - : Simple_Selector(p, l), selector_(r) - { has_reference(true); } - ATTACH_OPERATIONS(); - }; - - ///////////////////////////////////////////////////////////////////////// - // Placeholder selectors (e.g., "%foo") for use in extend-only selectors. - ///////////////////////////////////////////////////////////////////////// - class Selector_Placeholder : public Simple_Selector { - ADD_PROPERTY(string, name); - public: - Selector_Placeholder(string p, size_t l, string n) - : Simple_Selector(p, l), name_(n) - { has_placeholder(true); } - ATTACH_OPERATIONS(); - }; - - ///////////////////////////////////////////////////////////////////// - // Type selectors (and the universal selector) -- e.g., div, span, *. - ///////////////////////////////////////////////////////////////////// - class Type_Selector : public Simple_Selector { - ADD_PROPERTY(string, name); - public: - Type_Selector(string p, size_t l, string n) - : Simple_Selector(p, l), name_(n) - { } - ATTACH_OPERATIONS(); - }; - - //////////////////////////////////////////////// - // Selector qualifiers -- i.e., classes and ids. - //////////////////////////////////////////////// - class Selector_Qualifier : public Simple_Selector { - ADD_PROPERTY(string, name); - public: - Selector_Qualifier(string p, size_t l, string n) - : Simple_Selector(p, l), name_(n) - { } - ATTACH_OPERATIONS(); - }; - - /////////////////////////////////////////////////// - // Attribute selectors -- e.g., [src*=".jpg"], etc. - /////////////////////////////////////////////////// - class Attribute_Selector : public Simple_Selector { - ADD_PROPERTY(string, name); - ADD_PROPERTY(string, matcher); - ADD_PROPERTY(string, value); - public: - Attribute_Selector(string p, size_t l, string n, string m, string v) - : Simple_Selector(p, l), name_(n), matcher_(m), value_(v) - { } - ATTACH_OPERATIONS(); - }; - - ////////////////////////////////////////////////////////////////// - // Pseudo selectors -- e.g., :first-child, :nth-of-type(...), etc. - ////////////////////////////////////////////////////////////////// - class Pseudo_Selector : public Simple_Selector { - ADD_PROPERTY(string, name); - ADD_PROPERTY(String*, expression); - public: - Pseudo_Selector(string p, size_t l, string n, String* expr = 0) - : Simple_Selector(p, l), name_(n), expression_(expr) - { } - ATTACH_OPERATIONS(); - }; - - ///////////////////////////////////////////////// - // Negated selector -- e.g., :not(:first-of-type) - ///////////////////////////////////////////////// - class Negated_Selector : public Simple_Selector { - ADD_PROPERTY(Simple_Selector*, selector); - public: - Negated_Selector(string p, size_t l, Simple_Selector* sel) - : Simple_Selector(p, l), selector_(sel) - { } - ATTACH_OPERATIONS(); - }; - - //////////////////////////////////////////////////////////////////////////// - // Simple selector sequences. Maintains flags indicating whether it contains - // any parent references or placeholders, to simplify expansion. - //////////////////////////////////////////////////////////////////////////// - class Simple_Selector_Sequence : public Selector, public Vectorized { - protected: - void adjust_after_pushing(Simple_Selector* s) - { - if (s->has_reference()) has_reference(true); - if (s->has_placeholder()) has_placeholder(true); - } - public: - Simple_Selector_Sequence(string p, size_t l, size_t s = 0) - : Selector(p, l), - Vectorized(s) - { } - bool operator<(const Simple_Selector_Sequence& rhs) const; - ATTACH_OPERATIONS(); - }; - - //////////////////////////////////////////////////////////////////////////// - // General selectors -- i.e., simple sequences combined with one of the four - // CSS selector combinators (">", "+", "~", and whitespace). Essentially a - // linked list. - //////////////////////////////////////////////////////////////////////////// - class Context; - class Selector_Combination : public Selector { - public: - enum Combinator { ANCESTOR_OF, PARENT_OF, PRECEDES, ADJACENT_TO }; - private: - ADD_PROPERTY(Combinator, combinator); - ADD_PROPERTY(Simple_Selector_Sequence*, head); - ADD_PROPERTY(Selector_Combination*, tail); - public: - Selector_Combination(string p, size_t l, - Combinator c, - Simple_Selector_Sequence* h, - Selector_Combination* t) - : Selector(p, l), combinator_(c), head_(h), tail_(t) - { - if ((h && h->has_reference()) || (t && t->has_reference())) has_reference(true); - if ((h && h->has_placeholder()) || (t && t->has_placeholder())) has_placeholder(true); - } - Simple_Selector_Sequence* base(); - Selector_Combination* context(Context&); - Selector_Combination* innermost(); - ATTACH_OPERATIONS(); - }; - - /////////////////////////////////// - // Comma-separated selector groups. - /////////////////////////////////// - class Selector_Group - : public Selector, public Vectorized { - protected: - void adjust_after_pushing(Selector_Combination* c) - { - if (c->has_reference()) has_reference(true); - if (c->has_placeholder()) has_placeholder(true); - } - public: - Selector_Group(string p, size_t l, size_t s = 0) - : Selector(p, l), Vectorized(s) - { } - ATTACH_OPERATIONS(); - }; -} \ No newline at end of file diff --git a/src/ast_def_macros.hpp b/src/ast_def_macros.hpp deleted file mode 100644 index 663e4c40b..000000000 --- a/src/ast_def_macros.hpp +++ /dev/null @@ -1,16 +0,0 @@ -#define ATTACH_OPERATIONS()\ -virtual void perform(Operation* op) { (*op)(this); }\ -virtual AST_Node* perform(Operation* op) { return (*op)(this); }\ -virtual Statement* perform(Operation* op) { return (*op)(this); }\ -virtual Expression* perform(Operation* op) { return (*op)(this); }\ -virtual Selector* perform(Operation* op) { return (*op)(this); }\ -virtual string perform(Operation* op) { return (*op)(this); }\ -virtual Sass_Value perform(Operation* op) { return (*op)(this); } - -#define ADD_PROPERTY(type, name)\ -protected:\ - type name##_;\ -public:\ - type name() const { return name##_; }\ - type name(type name##__) { return name##_ = name##__; }\ -private: diff --git a/src/ast_factory.hpp b/src/ast_factory.hpp deleted file mode 100644 index baebf3241..000000000 --- a/src/ast_factory.hpp +++ /dev/null @@ -1,82 +0,0 @@ -#define SASS_AST_FACTORY - -#include - -#ifndef SASS_AST -#include "ast.hpp" -#endif - -namespace Sass { - using namespace std; - - class AST_Factory { - vector nodes; - public: - // statements - Block* new_Block(string p, size_t l, size_t s = 0, bool r = false); - Ruleset* new_Ruleset(string p, size_t l, Selector* s, Block* b); - Propset* new_Propset(string p, size_t l, String* pf, Block* b); - Media_Query* new_Media_Query(string p, size_t l, List* q, Block* b); - At_Rule* new_At_Rule(string p, size_t l, string kwd, Selector* sel, Block* b); - Declaration* new_Declaration(string p, size_t l, String* prop, List* vals); - Assignment* new_Assignment(string p, size_t l, string var, Expression* val, bool guarded = false); - Import* new_CSS_Import(string p, size_t l, Function_Call* loc); - Import* new_SASS_Import(string p, size_t l, String* loc); - Warning* new_Warning(string p, size_t l, Expression* msg); - Comment* new_Comment(string p, size_t l, String* txt); - If* new_If(string p, size_t l, Expression* pred, Block* con, Block* alt = 0); - For* new_For(string p, size_t l, string var, Expression* lo, Expression* hi, Block* b, bool inc); - Each* new_Each(string p, size_t l, string var, Expression* lst, Block* b); - While* new_While(string p, size_t l, Expression* pred, Block* b); - Extension* new_Extension(string p, size_t l, Selector* s); - Definition* new_Mixin_Definition(string p, size_t l, string n, Parameters* params, Block* b); - Definition* new_Function_Definition(string p, size_t l, string n, Parameters* params, Block* b); - Mixin_Call* new_Mixin_Call(string p, size_t l, string n, Arguments* args, Block* b = 0); - // expressions - List* new_List(string p, size_t l, size_t size = 0, List::Separator sep = List::space, bool argl = false); - Binary_Expression* new_And(string p, size_t l, Expression* lhs, Expression* rhs); - Binary_Expression* new_Or(string p, size_t l, Expression* lhs, Expression* rhs); - Binary_Expression* new_Eq(string p, size_t l, Expression* lhs, Expression* rhs); - Binary_Expression* new_Neq(string p, size_t l, Expression* lhs, Expression* rhs); - Binary_Expression* new_Gt(string p, size_t l, Expression* lhs, Expression* rhs); - Binary_Expression* new_Gte(string p, size_t l, Expression* lhs, Expression* rhs); - Binary_Expression* new_Lt(string p, size_t l, Expression* lhs, Expression* rhs); - Binary_Expression* new_Lte(string p, size_t l, Expression* lhs, Expression* rhs); - Binary_Expression* new_Add(string p, size_t l, Expression* lhs, Expression* rhs); - Binary_Expression* new_Sub(string p, size_t l, Expression* lhs, Expression* rhs); - Binary_Expression* new_Mul(string p, size_t l, Expression* lhs, Expression* rhs); - Binary_Expression
* new_Div(string p, size_t l, Expression* lhs, Expression* rhs); - Negation* new_Negation(string p, size_t l, Expression* o); - Function_Call* new_Function_Call(string p, size_t l, String* n, Arguments* args); - Variable* new_Variable(string p, size_t l, string n); - Textual* new_Textual_Number(string p, size_t l, string val); - Textual* new_Textual_Percentage(string p, size_t l, string val); - Textual* new_Textual_Dimension(string p, size_t l, string val); - Textual* new_Textual_Hex(string p, size_t l, string val); - Number* new_Number(string p, size_t l, double val); - Percentage* new_Percentage(string p, size_t l, double val); - Dimension* new_Dimension(string p, size_t l, double val, string unit); - Color* new_Color(string p, size_t l, double r, double g, double b, double a = 1); - Boolean* new_Boolean(string p, size_t l, bool val); - String_Schema* new_String_Schema(string p, size_t l, size_t size = 0); - String_Constant* new_String_Constant(string p, size_t l, string val); - String_Constant* new_String_Constant(string p, size_t l, const char* beg); - String_Constant* new_String_Constant(string p, size_t l, const char* beg, const char* end); - Media_Expression* new_Media_Expression(string p, size_t l, String* f, Expression* v); - // parameters and arguments - Parameter* new_Parameter(string p, size_t l, string n, Expression* def = 0, bool rest = false); - Parameters* new_Parameters(string p, size_t l); - Argument* new_Argument(string p, size_t l, Expression* val, string n = "", bool rest = false); - Arguments* new_Arguments(string p, size_t l); - // selectors - Selector_Schema* new_Selector_Schema(string p, size_t l, String* c); - Simple_Selector* new_Simple_Selector(string p, size_t l, string c); - Reference_Selector* new_Reference_Selector(string p, size_t l); - Placeholder_Selector* new_Placeholder_Selector(string p, size_t l, string n); - Pseudo_Selector* new_Pseudo_Selector(string p, size_t l, string n, Expression* expr = 0); - Negated_Selector* new_Negated_Selector(string p, size_t l, Simple_Base* sel); - Simple_Selector_Sequence* new_Simple_Selector_Sequence(string p, size_t l, size_t s = 0); - Selector_Combination* new_Selector_Combination(string p, size_t l, Selector_Combination::Combinator c, Selector_Combination* ctx, Simple_Selector_Sequence* sel); - Selector_Group* new_Selector_Group(string p, size_t l, size_t s = 0); - }; -} \ No newline at end of file diff --git a/src/ast_fwd_decl.hpp b/src/ast_fwd_decl.hpp deleted file mode 100644 index 0159dcad4..000000000 --- a/src/ast_fwd_decl.hpp +++ /dev/null @@ -1,66 +0,0 @@ -///////////////////////////////////////////// -// Forward declarations for the AST visitors. -///////////////////////////////////////////// -namespace Sass { - - class AST_Node; - // statements - class Statement; - class Block; - class Ruleset; - class Propset; - class Media_Block; - class At_Rule; - class Declaration; - class Assignment; - class Import; - class Import_Stub; - class Warning; - class Comment; - class If; - class For; - class Each; - class While; - class Return; - class Content; - class Extension; - class Definition; - class Mixin_Call; - // expressions - class Expression; - class List; - class Binary_Expression; - class Unary_Expression; - class Function_Call; - class Function_Call_Schema; - class Variable; - class Textual; - class Number; - class Color; - class Boolean; - class String_Schema; - class String; - class String_Constant; - class Media_Query; - class Media_Query_Expression; - class Null; - // parameters and arguments - class Parameter; - class Parameters; - class Argument; - class Arguments; - // selectors - class Selector; - class Selector_Schema; - class Selector_Reference; - class Selector_Placeholder; - class Type_Selector; - class Selector_Qualifier; - class Attribute_Selector; - class Pseudo_Selector; - class Negated_Selector; - class Simple_Selector_Sequence; - class Selector_Combination; - class Selector_Group; - -} \ No newline at end of file diff --git a/src/backtrace.hpp b/src/backtrace.hpp deleted file mode 100644 index d7a5284a8..000000000 --- a/src/backtrace.hpp +++ /dev/null @@ -1,57 +0,0 @@ -#define SASS_BACKTRACE - -#include - -namespace Sass { - - using namespace std; - - struct Backtrace { - - Backtrace* parent; - string path; - size_t line; - string caller; - - Backtrace(Backtrace* prn, string pth, size_t ln, string c) - : parent(prn), - path(pth), - line(ln), - caller(c) - { } - - string to_string(bool warning = false) - { - stringstream ss; - Backtrace* this_point = this; - - if (!warning) ss << endl << "Backtrace:"; - // the first tracepoint (which is parent-less) is an empty placeholder - while (this_point->parent) { - ss << endl - << "\t" - << (warning ? " " : "") - << this_point->path - << ":" - << this_point->line - << this_point->parent->caller; - this_point = this_point->parent; - } - - return ss.str(); - } - - size_t depth() - { - size_t d = 0; - Backtrace* p = parent; - while (p) { - ++d; - p = p->parent; - } - return d-1; - } - - }; - -} \ No newline at end of file diff --git a/src/bind.cpp b/src/bind.cpp deleted file mode 100644 index 36db6236a..000000000 --- a/src/bind.cpp +++ /dev/null @@ -1,148 +0,0 @@ -#include "bind.hpp" -#include "ast.hpp" -#include "context.hpp" -#include "eval.hpp" -#include -#include -#include - -namespace Sass { - - void bind(string callee, Parameters* ps, Arguments* as, Context& ctx, Env* env, Eval* eval) - { - map param_map; - - // Set up a map to ensure named arguments refer to actual parameters. Also - // eval each default value left-to-right, wrt env, populating env as we go. - for (size_t i = 0, L = ps->length(); i < L; ++i) { - Parameter* p = (*ps)[i]; - param_map[p->name()] = p; - // if (p->default_value()) { - // env->current_frame()[p->name()] = p->default_value()->perform(eval->with(env)); - // } - } - - // plug in all args; if we have leftover params, deal with it later - size_t ip = 0, LP = ps->length(); - size_t ia = 0, LA = as->length(); - while (ia < LA) { - if (ip >= LP) { - stringstream msg; - msg << callee << " only takes " << LP << " arguments; " - << "given " << LA; - error(msg.str(), as->path(), as->line()); - } - Parameter* p = (*ps)[ip]; - Argument* a = (*as)[ia]; - - if (a->is_rest_argument() && p->is_rest_parameter()) { - // rest param and rest arg -- just add one to the other - if (env->current_frame_has(p->name())) { - *static_cast(env->current_frame()[p->name()]) - += static_cast(a->value()); - } - else { - env->current_frame()[p->name()] = a->value(); - } - ++ia; - ++ip; - } - else if (p->is_rest_parameter()) { - List* arglist = 0; - if (!env->current_frame_has(p->name())) { - arglist = new (ctx.mem) List(p->path(), - p->line(), - 0, - List::COMMA, - true); - env->current_frame()[p->name()] = arglist; - } - else { - arglist = static_cast(env->current_frame()[p->name()]); - } - *arglist << a->value(); // TODO: named args going into rest-param? - ++ia; - } - else if (a->is_rest_argument()) { - // normal param and rest arg - if (env->current_frame_has(p->name())) { - stringstream msg; - msg << "parameter " << p->name() - << " provided more than once in call to " << callee; - error(msg.str(), a->path(), a->line()); - } - List* arglist = static_cast(a->value()); - // if it's the last param, move the whole arglist into it - if (ip == LP-1) { - env->current_frame()[p->name()] = arglist; - ++ia; - } - // otherwise move one of the rest args into the param and loop - else { - env->current_frame()[p->name()] = (*arglist)[0]; - arglist->elements().erase(arglist->elements().begin()); - } - ++ip; - } - else if (a->name().empty()) { - // ordinal arg -- bind it to the next param - env->current_frame()[p->name()] = a->value(); - ++ip; - ++ia; - } - else { - // named arg -- bind it to the appropriately named param - if (!param_map.count(a->name())) { - stringstream msg; - msg << callee << " has no parameter named " << a->name(); - error(msg.str(), a->path(), a->line()); - } - if (param_map[a->name()]->is_rest_parameter()) { - stringstream msg; - msg << "argument " << a->name() << " of " << callee - << "cannot be used as named argument"; - error(msg.str(), a->path(), a->line()); - } - if (env->current_frame_has(a->name())) { - stringstream msg; - msg << "parameter " << p->name() - << "provided more than once in call to " << callee; - error(msg.str(), a->path(), a->line()); - } - env->current_frame()[a->name()] = a->value(); - ++ia; - } - } - - // If we make it here, we're out of args but may have leftover params. - // That's only okay if they have default values, or were already bound by - // named arguments, or if it's a single rest-param. - for (size_t i = ip; i < LP; ++i) { - Parameter* leftover = (*ps)[i]; - if (!env->current_frame_has(leftover->name())) { - if (leftover->is_rest_parameter()) { - env->current_frame()[leftover->name()] = new (ctx.mem) List(leftover->path(), - leftover->line(), - 0, - List::COMMA, - true); - } - else if (leftover->default_value()) { - // make sure to eval the default value in the env that we've been populating - env->current_frame()[leftover->name()] = leftover->default_value()->perform(eval->with(env, eval->backtrace)); - } - else { - // param is unbound and has no default value -- error - stringstream msg; - msg << "required parameter " << leftover->name() - << " is missing in call to " << callee; - error(msg.str(), as->path(), as->line()); - } - } - } - - return; - } - - -} \ No newline at end of file diff --git a/src/bind.hpp b/src/bind.hpp deleted file mode 100644 index 84fda6e02..000000000 --- a/src/bind.hpp +++ /dev/null @@ -1,18 +0,0 @@ -#define SASS_BIND - -#ifndef SASS_ENVIRONMENT -#include "environment.hpp" -#endif - -#include - -namespace Sass { - class AST_Node; - class Parameters; - class Arguments; - class Context; - class Eval; - typedef Environment Env; - - void bind(string caller, Parameters*, Arguments*, Context&, Env*, Eval*); -} \ No newline at end of file diff --git a/src/color_names.hpp b/src/color_names.hpp deleted file mode 100644 index 8046f6a11..000000000 --- a/src/color_names.hpp +++ /dev/null @@ -1,311 +0,0 @@ -#define SASS_COLOR_NAMES - -namespace Sass { - - const char* color_names[] = - { - "aliceblue", - "antiquewhite", - "aqua", - "aquamarine", - "azure", - "beige", - "bisque", - "black", - "blanchedalmond", - "blue", - "blueviolet", - "brown", - "burlywood", - "cadetblue", - "chartreuse", - "chocolate", - "coral", - "cornflowerblue", - "cornsilk", - "crimson", - "cyan", - "darkblue", - "darkcyan", - "darkgoldenrod", - "darkgray", - "darkgrey", - "darkgreen", - "darkkhaki", - "darkmagenta", - "darkolivegreen", - "darkorange", - "darkorchid", - "darkred", - "darksalmon", - "darkseagreen", - "darkslateblue", - "darkslategray", - "darkslategrey", - "darkturquoise", - "darkviolet", - "deeppink", - "deepskyblue", - "dimgray", - "dimgrey", - "dodgerblue", - "firebrick", - "floralwhite", - "forestgreen", - "fuchsia", - "gainsboro", - "ghostwhite", - "gold", - "goldenrod", - "gray", - "grey", - "green", - "greenyellow", - "honeydew", - "hotpink", - "indianred", - "indigo", - "ivory", - "khaki", - "lavender", - "lavenderblush", - "lawngreen", - "lemonchiffon", - "lightblue", - "lightcoral", - "lightcyan", - "lightgoldenrodyellow", - "lightgray", - "lightgrey", - "lightgreen", - "lightpink", - "lightsalmon", - "lightseagreen", - "lightskyblue", - "lightslategray", - "lightslategrey", - "lightsteelblue", - "lightyellow", - "lime", - "limegreen", - "linen", - "magenta", - "maroon", - "mediumaquamarine", - "mediumblue", - "mediumorchid", - "mediumpurple", - "mediumseagreen", - "mediumslateblue", - "mediumspringgreen", - "mediumturquoise", - "mediumvioletred", - "midnightblue", - "mintcream", - "mistyrose", - "moccasin", - "navajowhite", - "navy", - "oldlace", - "olive", - "olivedrab", - "orange", - "orangered", - "orchid", - "palegoldenrod", - "palegreen", - "paleturquoise", - "palevioletred", - "papayawhip", - "peachpuff", - "peru", - "pink", - "plum", - "powderblue", - "purple", - "red", - "rosybrown", - "royalblue", - "saddlebrown", - "salmon", - "sandybrown", - "seagreen", - "seashell", - "sienna", - "silver", - "skyblue", - "slateblue", - "slategray", - "slategrey", - "snow", - "springgreen", - "steelblue", - "tan", - "teal", - "thistle", - "tomato", - "turquoise", - "violet", - "wheat", - "white", - "whitesmoke", - "yellow", - "yellowgreen", - // sentinel value - 0 - }; - - const double color_values[] = - { - 0xf0, 0xf8, 0xff, - 0xfa, 0xeb, 0xd7, - 0x00, 0xff, 0xff, - 0x7f, 0xff, 0xd4, - 0xf0, 0xff, 0xff, - 0xf5, 0xf5, 0xdc, - 0xff, 0xe4, 0xc4, - 0x00, 0x00, 0x00, - 0xff, 0xeb, 0xcd, - 0x00, 0x00, 0xff, - 0x8a, 0x2b, 0xe2, - 0xa5, 0x2a, 0x2a, - 0xde, 0xb8, 0x87, - 0x5f, 0x9e, 0xa0, - 0x7f, 0xff, 0x00, - 0xd2, 0x69, 0x1e, - 0xff, 0x7f, 0x50, - 0x64, 0x95, 0xed, - 0xff, 0xf8, 0xdc, - 0xdc, 0x14, 0x3c, - 0x00, 0xff, 0xff, - 0x00, 0x00, 0x8b, - 0x00, 0x8b, 0x8b, - 0xb8, 0x86, 0x0b, - 0xa9, 0xa9, 0xa9, - 0xa9, 0xa9, 0xa9, - 0x00, 0x64, 0x00, - 0xbd, 0xb7, 0x6b, - 0x8b, 0x00, 0x8b, - 0x55, 0x6b, 0x2f, - 0xff, 0x8c, 0x00, - 0x99, 0x32, 0xcc, - 0x8b, 0x00, 0x00, - 0xe9, 0x96, 0x7a, - 0x8f, 0xbc, 0x8f, - 0x48, 0x3d, 0x8b, - 0x2f, 0x4f, 0x4f, - 0x2f, 0x4f, 0x4f, - 0x00, 0xce, 0xd1, - 0x94, 0x00, 0xd3, - 0xff, 0x14, 0x93, - 0x00, 0xbf, 0xff, - 0x69, 0x69, 0x69, - 0x69, 0x69, 0x69, - 0x1e, 0x90, 0xff, - 0xb2, 0x22, 0x22, - 0xff, 0xfa, 0xf0, - 0x22, 0x8b, 0x22, - 0xff, 0x00, 0xff, - 0xdc, 0xdc, 0xdc, - 0xf8, 0xf8, 0xff, - 0xff, 0xd7, 0x00, - 0xda, 0xa5, 0x20, - 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, - 0x00, 0x80, 0x00, - 0xad, 0xff, 0x2f, - 0xf0, 0xff, 0xf0, - 0xff, 0x69, 0xb4, - 0xcd, 0x5c, 0x5c, - 0x4b, 0x00, 0x82, - 0xff, 0xff, 0xf0, - 0xf0, 0xe6, 0x8c, - 0xe6, 0xe6, 0xfa, - 0xff, 0xf0, 0xf5, - 0x7c, 0xfc, 0x00, - 0xff, 0xfa, 0xcd, - 0xad, 0xd8, 0xe6, - 0xf0, 0x80, 0x80, - 0xe0, 0xff, 0xff, - 0xfa, 0xfa, 0xd2, - 0xd3, 0xd3, 0xd3, - 0xd3, 0xd3, 0xd3, - 0x90, 0xee, 0x90, - 0xff, 0xb6, 0xc1, - 0xff, 0xa0, 0x7a, - 0x20, 0xb2, 0xaa, - 0x87, 0xce, 0xfa, - 0x77, 0x88, 0x99, - 0x77, 0x88, 0x99, - 0xb0, 0xc4, 0xde, - 0xff, 0xff, 0xe0, - 0x00, 0xff, 0x00, - 0x32, 0xcd, 0x32, - 0xfa, 0xf0, 0xe6, - 0xff, 0x00, 0xff, - 0x80, 0x00, 0x00, - 0x66, 0xcd, 0xaa, - 0x00, 0x00, 0xcd, - 0xba, 0x55, 0xd3, - 0x93, 0x70, 0xd8, - 0x3c, 0xb3, 0x71, - 0x7b, 0x68, 0xee, - 0x00, 0xfa, 0x9a, - 0x48, 0xd1, 0xcc, - 0xc7, 0x15, 0x85, - 0x19, 0x19, 0x70, - 0xf5, 0xff, 0xfa, - 0xff, 0xe4, 0xe1, - 0xff, 0xe4, 0xb5, - 0xff, 0xde, 0xad, - 0x00, 0x00, 0x80, - 0xfd, 0xf5, 0xe6, - 0x80, 0x80, 0x00, - 0x6b, 0x8e, 0x23, - 0xff, 0xa5, 0x00, - 0xff, 0x45, 0x00, - 0xda, 0x70, 0xd6, - 0xee, 0xe8, 0xaa, - 0x98, 0xfb, 0x98, - 0xaf, 0xee, 0xee, - 0xd8, 0x70, 0x93, - 0xff, 0xef, 0xd5, - 0xff, 0xda, 0xb9, - 0xcd, 0x85, 0x3f, - 0xff, 0xc0, 0xcb, - 0xdd, 0xa0, 0xdd, - 0xb0, 0xe0, 0xe6, - 0x80, 0x00, 0x80, - 0xff, 0x00, 0x00, - 0xbc, 0x8f, 0x8f, - 0x41, 0x69, 0xe1, - 0x8b, 0x45, 0x13, - 0xfa, 0x80, 0x72, - 0xf4, 0xa4, 0x60, - 0x2e, 0x8b, 0x57, - 0xff, 0xf5, 0xee, - 0xa0, 0x52, 0x2d, - 0xc0, 0xc0, 0xc0, - 0x87, 0xce, 0xeb, - 0x6a, 0x5a, 0xcd, - 0x70, 0x80, 0x90, - 0x70, 0x80, 0x90, - 0xff, 0xfa, 0xfa, - 0x00, 0xff, 0x7f, - 0x46, 0x82, 0xb4, - 0xd2, 0xb4, 0x8c, - 0x00, 0x80, 0x80, - 0xd8, 0xbf, 0xd8, - 0xff, 0x63, 0x47, - 0x40, 0xe0, 0xd0, - 0xee, 0x82, 0xee, - 0xf5, 0xde, 0xb3, - 0xff, 0xff, 0xff, - 0xf5, 0xf5, 0xf5, - 0xff, 0xff, 0x00, - 0x9a, 0xcd, 0x32, - // sentinel value - 0xfff - }; - -} \ No newline at end of file diff --git a/src/constants.cpp b/src/constants.cpp deleted file mode 100644 index f1cfc8d79..000000000 --- a/src/constants.cpp +++ /dev/null @@ -1,130 +0,0 @@ -#include "constants.hpp" - -namespace Sass { - namespace Constants { - - // hidden variable name for the image path (for the image-url built-in) - extern const char image_path_var[] = "$[image path]"; - - // sass keywords - extern const char import_kwd[] = "@import"; - extern const char mixin_kwd[] = "@mixin"; - extern const char function_kwd[] = "@function"; - extern const char return_kwd[] = "@return"; - extern const char include_kwd[] = "@include"; - extern const char content_kwd[] = "@content"; - extern const char extend_kwd[] = "@extend"; - extern const char if_kwd[] = "@if"; - extern const char else_kwd[] = "@else"; - extern const char if_after_else_kwd[] = "if"; - extern const char for_kwd[] = "@for"; - extern const char from_kwd[] = "from"; - extern const char to_kwd[] = "to"; - extern const char through_kwd[] = "through"; - extern const char each_kwd[] = "@each"; - extern const char in_kwd[] = "in"; - extern const char while_kwd[] = "@while"; - extern const char warn_kwd[] = "@warn"; - extern const char default_kwd[] = "default"; - extern const char null_kwd[] = "null"; - - // css standard units - extern const char em_kwd[] = "em"; - extern const char ex_kwd[] = "ex"; - extern const char px_kwd[] = "px"; - extern const char cm_kwd[] = "cm"; - extern const char mm_kwd[] = "mm"; - extern const char pt_kwd[] = "pt"; - extern const char pc_kwd[] = "pc"; - extern const char deg_kwd[] = "deg"; - extern const char rad_kwd[] = "rad"; - extern const char grad_kwd[] = "grad"; - extern const char ms_kwd[] = "ms"; - extern const char s_kwd[] = "s"; - extern const char Hz_kwd[] = "Hz"; - extern const char kHz_kwd[] = "kHz"; - - // vendor prefixes - extern const char vendor_opera_kwd[] = "-o-"; - extern const char vendor_webkit_kwd[] = "-webkit-"; - extern const char vendor_mozilla_kwd[] = "-moz-"; - extern const char vendor_ms_kwd[] = "-ms-"; - extern const char vendor_khtml_kwd[] = "-khtml-"; - - // css functions and keywords - extern const char charset_kwd[] = "@charset"; - extern const char media_kwd[] = "@media"; - extern const char keyframes_kwd[] = "keyframes"; - extern const char only_kwd[] = "only"; - extern const char rgb_kwd[] = "rgb("; - extern const char url_kwd[] = "url("; - extern const char image_url_kwd[] = "image-url("; - extern const char important_kwd[] = "important"; - extern const char pseudo_not_kwd[] = ":not("; - extern const char even_kwd[] = "even"; - extern const char odd_kwd[] = "odd"; - - // css attribute-matching operators - extern const char tilde_equal[] = "~="; - extern const char pipe_equal[] = "|="; - extern const char caret_equal[] = "^="; - extern const char dollar_equal[] = "$="; - extern const char star_equal[] = "*="; - - // relational & logical operators and constants - extern const char and_kwd[] = "and"; - extern const char or_kwd[] = "or"; - extern const char not_kwd[] = "not"; - extern const char gt[] = ">"; - extern const char gte[] = ">="; - extern const char lt[] = "<"; - extern const char lte[] = "<="; - extern const char eq[] = "=="; - extern const char neq[] = "!="; - extern const char true_kwd[] = "true"; - extern const char false_kwd[] = "false"; - - // miscellaneous punctuation and delimiters - extern const char percent_str[] = "%"; - extern const char empty_str[] = ""; - extern const char slash_slash[] = "//"; - extern const char slash_star[] = "/*"; - extern const char star_slash[] = "*/"; - extern const char hash_lbrace[] = "#{"; - extern const char rbrace[] = "}"; - extern const char rparen[] = ")"; - extern const char sign_chars[] = "-+"; - extern const char hyphen[] = "-"; - extern const char ellipsis[] = "..."; - - // type names - extern const char numeric_name[] = "numeric value"; - extern const char number_name[] = "number"; - extern const char percentage_name[] = "percentage"; - extern const char dimension_name[] = "numeric dimension"; - extern const char string_name[] = "string"; - extern const char bool_name[] = "bool"; - extern const char color_name[] = "color"; - extern const char list_name[] = "list"; - extern const char arglist_name[] = "arglist"; - - // byte order marks - // (taken from http://en.wikipedia.org/wiki/Byte_order_mark) - extern const unsigned char utf_8_bom[] = { 0xEF, 0xBB, 0xBF }; - extern const unsigned char utf_16_bom_be[] = { 0xFE, 0xFF }; - extern const unsigned char utf_16_bom_le[] = { 0xFF, 0xFE }; - extern const unsigned char utf_32_bom_be[] = { 0x00, 0x00, 0xFE, 0xFF }; - extern const unsigned char utf_32_bom_le[] = { 0xFF, 0xFE, 0x00, 0x00 }; - extern const unsigned char utf_7_bom_1[] = { 0x2B, 0x2F, 0x76, 0x38 }; - extern const unsigned char utf_7_bom_2[] = { 0x2B, 0x2F, 0x76, 0x39 }; - extern const unsigned char utf_7_bom_3[] = { 0x2B, 0x2F, 0x76, 0x2B }; - extern const unsigned char utf_7_bom_4[] = { 0x2B, 0x2F, 0x76, 0x2F }; - extern const unsigned char utf_7_bom_5[] = { 0x2B, 0x2F, 0x76, 0x38, 0x2D }; - extern const unsigned char utf_1_bom[] = { 0xF7, 0x64, 0x4C }; - extern const unsigned char utf_ebcdic_bom[] = { 0xDD, 0x73, 0x66, 0x73 }; - extern const unsigned char scsu_bom[] = { 0x0E, 0xFE, 0xFF }; - extern const unsigned char bocu_1_bom[] = { 0xFB, 0xEE, 0x28 }; - extern const unsigned char gb_18030_bom[] = { 0x84, 0x31, 0x95, 0x33 }; - - } -} diff --git a/src/constants.hpp b/src/constants.hpp deleted file mode 100644 index bd7b152a3..000000000 --- a/src/constants.hpp +++ /dev/null @@ -1,130 +0,0 @@ -#define SASS_CONSTANTS - -namespace Sass { - namespace Constants { - - // hidden variable name for the image path (for the image-url built-in) - extern const char image_path_var[]; - - // sass keywords - extern const char import_kwd[]; - extern const char mixin_kwd[]; - extern const char function_kwd[]; - extern const char return_kwd[]; - extern const char include_kwd[]; - extern const char content_kwd[]; - extern const char extend_kwd[]; - extern const char if_kwd[]; - extern const char else_kwd[]; - extern const char if_after_else_kwd[]; - extern const char for_kwd[]; - extern const char from_kwd[]; - extern const char to_kwd[]; - extern const char through_kwd[]; - extern const char each_kwd[]; - extern const char in_kwd[]; - extern const char while_kwd[]; - extern const char warn_kwd[]; - extern const char default_kwd[]; - extern const char null_kwd[]; - - // css standard units - extern const char em_kwd[]; - extern const char ex_kwd[]; - extern const char px_kwd[]; - extern const char cm_kwd[]; - extern const char mm_kwd[]; - extern const char pt_kwd[]; - extern const char pc_kwd[]; - extern const char deg_kwd[]; - extern const char rad_kwd[]; - extern const char grad_kwd[]; - extern const char ms_kwd[]; - extern const char s_kwd[]; - extern const char Hz_kwd[]; - extern const char kHz_kwd[]; - - // vendor prefixes - extern const char vendor_opera_kwd[]; - extern const char vendor_webkit_kwd[]; - extern const char vendor_mozilla_kwd[]; - extern const char vendor_ms_kwd[]; - extern const char vendor_khtml_kwd[]; - - // css functions and keywords - extern const char charset_kwd[]; - extern const char media_kwd[]; - extern const char keyframes_kwd[]; - extern const char only_kwd[]; - extern const char rgb_kwd[]; - extern const char url_kwd[]; - extern const char image_url_kwd[]; - extern const char important_kwd[]; - extern const char pseudo_not_kwd[]; - extern const char even_kwd[]; - extern const char odd_kwd[]; - - // css attribute-matching operators - extern const char tilde_equal[]; - extern const char pipe_equal[]; - extern const char caret_equal[]; - extern const char dollar_equal[]; - extern const char star_equal[]; - - // relational & logical operators and constants - extern const char and_kwd[]; - extern const char or_kwd[]; - extern const char not_kwd[]; - extern const char gt[]; - extern const char gte[]; - extern const char lt[]; - extern const char lte[]; - extern const char eq[]; - extern const char neq[]; - extern const char true_kwd[]; - extern const char false_kwd[]; - - // miscellaneous punctuation and delimiters - extern const char percent_str[]; - extern const char empty_str[]; - extern const char slash_slash[]; - extern const char slash_star[]; - extern const char star_slash[]; - extern const char hash_lbrace[]; - extern const char rbrace[]; - extern const char rparen[]; - extern const char sign_chars[]; - extern const char hyphen[]; - extern const char ellipsis[]; - - // type names - extern const char numeric_name[]; - extern const char number_name[]; - extern const char percentage_name[]; - extern const char dimension_name[]; - extern const char string_name[]; - extern const char bool_name[]; - extern const char color_name[]; - extern const char list_name[]; - extern const char arglist_name[]; - - // byte order marks - // (taken from http://en.wikipedia.org/wiki/Byte_order_mark) - extern const unsigned char utf_8_bom[]; - extern const unsigned char utf_16_bom_be[]; - extern const unsigned char utf_16_bom_le[]; - extern const unsigned char utf_32_bom_be[]; - extern const unsigned char utf_32_bom_le[]; - extern const unsigned char utf_7_bom_1[]; - extern const unsigned char utf_7_bom_2[]; - extern const unsigned char utf_7_bom_3[]; - extern const unsigned char utf_7_bom_4[]; - extern const unsigned char utf_7_bom_5[]; - extern const unsigned char utf_1_bom[]; - extern const unsigned char utf_ebcdic_bom[]; - extern const unsigned char scsu_bom[]; - extern const unsigned char bocu_1_bom[]; - extern const unsigned char gb_18030_bom[]; - - } -} diff --git a/src/context.cpp b/src/context.cpp deleted file mode 100644 index dc5390e59..000000000 --- a/src/context.cpp +++ /dev/null @@ -1,325 +0,0 @@ -#ifdef _WIN32 -#include -#define getcwd _getcwd -#define PATH_SEP ';' -#else -#include -#define PATH_SEP ':' -#endif - -#include -#include -#include -#include "context.hpp" -#include "constants.hpp" -#include "parser.hpp" -#include "file.hpp" -#include "inspect.hpp" -#include "output_nested.hpp" -#include "output_compressed.hpp" -#include "expand.hpp" -#include "eval.hpp" -#include "contextualize.hpp" -#include "extend.hpp" -#include "copy_c_str.hpp" -#include "color_names.hpp" -#include "functions.hpp" -#include "backtrace.hpp" - -#ifndef SASS_PRELEXER -#include "prelexer.hpp" -#endif - -#include -#include - -namespace Sass { - using namespace Constants; - using std::cerr; - using std::endl; - - Context::Context(Context::Data initializers) - : mem(Memory_Manager()), - source_c_str (initializers.source_c_str()), - sources (vector()), - include_paths (initializers.include_paths()), - queue (vector >()), - style_sheets (map()), - image_path (initializers.image_path()), - source_comments (initializers.source_comments()), - source_maps (initializers.source_maps()), - output_style (initializers.output_style()), - names_to_colors (map()), - colors_to_names (map()) - { - collect_include_paths(initializers.include_paths_c_str()); - collect_include_paths(initializers.include_paths_array()); - - setup_color_map(); - - string entry_point = initializers.entry_point(); - if (!entry_point.empty()) { - string result(add_file(entry_point)); - if (result.empty()) { - throw entry_point; - } - } - } - - Context::~Context() - { for (size_t i = 0; i < sources.size(); ++i) delete[] sources[i]; } - - void Context::setup_color_map() - { - size_t i = 0; - while (color_names[i]) { - string name(color_names[i]); - Color* value = new (mem) Color("[COLOR TABLE]", 0, - color_values[i*3], - color_values[i*3+1], - color_values[i*3+2]); - names_to_colors[name] = value; - int numval = color_values[i*3]*0x10000; - numval += color_values[i*3+1]*0x100; - numval += color_values[i*3+2]; - colors_to_names[numval] = name; - ++i; - } - } - - void Context::collect_include_paths(const char* paths_str) - { - const size_t wd_len = 1024; - char wd[wd_len]; - include_paths.push_back(getcwd(wd, wd_len)); - if (*include_paths.back().rbegin() != '/') include_paths.back() += '/'; - - if (paths_str) { - const char* beg = paths_str; - const char* end = Prelexer::find_first(beg); - - while (end) { - string path(beg, end - beg); - if (!path.empty()) { - if (*path.rbegin() != '/') path += '/'; - include_paths.push_back(path); - } - beg = end + 1; - end = Prelexer::find_first(beg); - } - - string path(beg); - if (!path.empty()) { - if (*path.rbegin() != '/') path += '/'; - include_paths.push_back(path); - } - } - } - - void Context::collect_include_paths(const char* paths_array[]) - { - const size_t wd_len = 1024; - char wd[wd_len]; - include_paths.push_back(getcwd(wd, wd_len)); - if (*include_paths.back().rbegin() != '/') include_paths.back() += '/'; - - // if (paths_array) { - // for (size_t i = 0; paths_array[i]; ++i) { - // string path(paths_array[i]); - // if (!path.empty()) { - // if (*path.rbegin() != '/') path += '/'; - // include_paths.push_back(path); - // } - // } - // } - } - - string Context::add_file(string path) - { - using namespace File; - char* contents = 0; - for (size_t i = 0, S = include_paths.size(); i < S; ++i) { - string full_path(join_paths(include_paths[i], path)); - if (style_sheets.count(full_path)) return full_path; - contents = resolve_and_load(full_path); - if (contents) { - sources.push_back(contents); - queue.push_back(make_pair(full_path, contents)); - style_sheets[full_path] = 0; - return full_path; - } - } - return string(); - } - - void register_function(Context&, Signature sig, Native_Function f, Env* env); - void register_function(Context&, Signature sig, Native_Function f, size_t arity, Env* env); - void register_overload_stub(Context&, string name, Env* env); - void register_built_in_functions(Context&, Env* env); - void register_c_functions(Context&, Env* env, Sass_C_Function_Descriptor*); - void register_c_function(Context&, Env* env, Sass_C_Function_Descriptor); - - char* Context::compile_file() - { - Block* root = 0; - for (size_t i = 0; i < queue.size(); ++i) { - Parser p(Parser::from_c_str(queue[i].second, *this, queue[i].first)); - Block* ast = p.parse(); - if (i == 0) root = ast; - style_sheets[queue[i].first] = ast; - } - - Env tge; - Backtrace backtrace(0, "", 0, ""); - register_built_in_functions(*this, &tge); - Eval eval(*this, &tge, &backtrace); - Contextualize contextualize(*this, &eval, &tge, &backtrace); - Expand expand(*this, &eval, &contextualize, &tge, &backtrace); - Inspect inspect; - Output_Nested output_nested; - - root = root->perform(&expand)->block(); - if (expand.extensions.size()) { - Extend extend(*this, expand.extensions); - root->perform(&extend); - } - char* result = 0; - switch (output_style) { - case COMPRESSED: { - Output_Compressed output_compressed; - root->perform(&output_compressed); - result = copy_c_str(output_compressed.get_buffer().c_str()); - } break; - - default: { - Output_Nested output_nested; - root->perform(&output_nested); - result = copy_c_str(output_nested.get_buffer().c_str()); - } break; - } - - return result; - } - - char* Context::compile_string() - { - if (!source_c_str) return 0; - queue.clear(); - queue.push_back(make_pair("source string", source_c_str)); - return compile_file(); - } - - void register_function(Context& ctx, Signature sig, Native_Function f, Env* env) - { - Definition* def = make_native_function(sig, f, ctx); - def->environment(env); - (*env)[def->name() + "[f]"] = def; - } - - void register_function(Context& ctx, Signature sig, Native_Function f, size_t arity, Env* env) - { - Definition* def = make_native_function(sig, f, ctx); - stringstream ss; - ss << def->name() << "[f]" << arity; - def->environment(env); - (*env)[ss.str()] = def; - } - - void register_overload_stub(Context& ctx, string name, Env* env) - { - Definition* stub = new (ctx.mem) Definition("[built-in function]", - 0, - 0, - name, - 0, - 0, - true); - (*env)[name + "[f]"] = stub; - } - - - void register_built_in_functions(Context& ctx, Env* env) - { - using namespace Functions; - // RGB Functions - register_function(ctx, rgb_sig, rgb, env); - register_overload_stub(ctx, "rgba", env); - register_function(ctx, rgba_4_sig, rgba_4, 4, env); - register_function(ctx, rgba_2_sig, rgba_2, 2, env); - register_function(ctx, red_sig, red, env); - register_function(ctx, green_sig, green, env); - register_function(ctx, blue_sig, blue, env); - register_function(ctx, mix_sig, mix, env); - // HSL Functions - register_function(ctx, hsl_sig, hsl, env); - register_function(ctx, hsla_sig, hsla, env); - register_function(ctx, hue_sig, hue, env); - register_function(ctx, saturation_sig, saturation, env); - register_function(ctx, lightness_sig, lightness, env); - register_function(ctx, adjust_hue_sig, adjust_hue, env); - register_function(ctx, lighten_sig, lighten, env); - register_function(ctx, darken_sig, darken, env); - register_function(ctx, saturate_sig, saturate, env); - register_function(ctx, desaturate_sig, desaturate, env); - register_function(ctx, grayscale_sig, grayscale, env); - register_function(ctx, complement_sig, complement, env); - register_function(ctx, invert_sig, invert, env); - // Opacity Functions - register_function(ctx, alpha_sig, alpha, env); - register_function(ctx, opacity_sig, alpha, env); - register_function(ctx, opacify_sig, opacify, env); - register_function(ctx, fade_in_sig, opacify, env); - register_function(ctx, transparentize_sig, transparentize, env); - register_function(ctx, fade_out_sig, transparentize, env); - // Other Color Functions - register_function(ctx, adjust_color_sig, adjust_color, env); - register_function(ctx, scale_color_sig, scale_color, env); - register_function(ctx, change_color_sig, change_color, env); - register_function(ctx, ie_hex_str_sig, ie_hex_str, env); - // String Functions - register_function(ctx, unquote_sig, sass_unquote, env); - register_function(ctx, quote_sig, sass_quote, env); - // Number Functions - register_function(ctx, percentage_sig, percentage, env); - register_function(ctx, round_sig, round, env); - register_function(ctx, ceil_sig, ceil, env); - register_function(ctx, floor_sig, floor, env); - register_function(ctx, abs_sig, abs, env); - register_function(ctx, min_sig, min, env); - register_function(ctx, max_sig, max, env); - // List Functions - register_function(ctx, length_sig, length, env); - register_function(ctx, nth_sig, nth, env); - register_function(ctx, index_sig, index, env); - register_function(ctx, join_sig, join, env); - register_function(ctx, append_sig, append, env); - register_function(ctx, compact_sig, compact, env); - register_function(ctx, zip_sig, zip, env); - // Introspection Functions - register_function(ctx, type_of_sig, type_of, env); - register_function(ctx, unit_sig, unit, env); - register_function(ctx, unitless_sig, unitless, env); - register_function(ctx, comparable_sig, comparable, env); - // Boolean Functions - register_function(ctx, not_sig, sass_not, env); - register_function(ctx, if_sig, sass_if, env); - // Path Functions - register_function(ctx, image_url_sig, image_url, env); - } - - void register_c_functions(Context& ctx, Env* env, Sass_C_Function_Descriptor* descrs) - { - while (descrs->signature && descrs->function) { - register_c_function(ctx, env, *descrs); - ++descrs; - } - } - void register_c_function(Context& ctx, Env* env, Sass_C_Function_Descriptor descr) - { - Definition* def = make_c_function(descr.signature, descr.function, ctx); - def->environment(env); - (*env)[def->name() + "[f]"] = def; - } - - -} \ No newline at end of file diff --git a/src/context.hpp b/src/context.hpp deleted file mode 100644 index d2de4914b..000000000 --- a/src/context.hpp +++ /dev/null @@ -1,75 +0,0 @@ -#define SASS_CONTEXT - -#include -#include -#include -#include "kwd_arg_macros.hpp" - -#ifndef SASS_MEMORY_MANAGER -#include "memory_manager.hpp" -#endif - -#ifndef SASS_ENVIRONMENT -#include "environment.hpp" -#endif - -namespace Sass { - using namespace std; - class AST_Node; - class Block; - class Expression; - class Color; - class Backtrace; - // typedef const char* Signature; - // struct Context; - // typedef Environment Env; - // typedef Expression* (*Native_Function)(Env&, Context&, Signature, string, size_t); - - enum Output_Style { NESTED, EXPANDED, COMPACT, COMPRESSED, FORMATTED }; - - struct Context { - Memory_Manager mem; - - const char* source_c_str; - vector sources; // c-strs containing Sass file contents - vector include_paths; - vector > queue; // queue of files to be parsed - map style_sheets; // map of paths to ASTs - - string image_path; // for the image-url Sass function - bool source_comments; - bool source_maps; - Output_Style output_style; - - map names_to_colors; - map colors_to_names; - - KWD_ARG_SET(Data) { - KWD_ARG(Data, const char*, source_c_str); - KWD_ARG(Data, string, entry_point); - KWD_ARG(Data, string, image_path); - KWD_ARG(Data, const char*, include_paths_c_str); - KWD_ARG(Data, const char**, include_paths_array); - KWD_ARG(Data, vector, include_paths); - KWD_ARG(Data, bool, source_comments); - KWD_ARG(Data, bool, source_maps); - KWD_ARG(Data, Output_Style, output_style); - }; - - Context(Data); - ~Context(); - void collect_include_paths(const char* paths_str); - void collect_include_paths(const char* paths_array[]); - void setup_color_map(); - string add_file(string); - char* compile_string(); - char* compile_file(); - - // void register_built_in_functions(Env* env); - // void register_function(Signature sig, Native_Function f, Env* env); - // void register_function(Signature sig, Native_Function f, size_t arity, Env* env); - // void register_overload_stub(string name, Env* env); - - }; - -} \ No newline at end of file diff --git a/src/contextualize.cpp b/src/contextualize.cpp deleted file mode 100644 index 3cc4f46c0..000000000 --- a/src/contextualize.cpp +++ /dev/null @@ -1,110 +0,0 @@ -#include "contextualize.hpp" -#include "ast.hpp" -#include "eval.hpp" -#include "backtrace.hpp" -#include "to_string.hpp" -#include "parser.hpp" - -namespace Sass { - - Contextualize::Contextualize(Context& ctx, Eval* eval, Env* env, Backtrace* bt) - : ctx(ctx), eval(eval), env(env), parent(0), backtrace(bt) - { } - - Contextualize::~Contextualize() { } - - Selector* Contextualize::fallback_impl(AST_Node* n) - { return parent; } - - Contextualize* Contextualize::with(Selector* s, Env* e, Backtrace* bt) - { - parent = s; - env = e; - backtrace = bt; - return this; - } - - Selector* Contextualize::operator()(Selector_Schema* s) - { - To_String to_string; - string result_str(s->contents()->perform(eval->with(env, backtrace))->perform(&to_string)); - result_str += '{'; // the parser looks for a brace to end the selector - Selector* result_sel = Parser::from_c_str(result_str.c_str(), ctx, s->path(), s->line()).parse_selector_group(); - return result_sel->perform(this); - } - - Selector* Contextualize::operator()(Selector_Group* s) - { - Selector_Group* p = static_cast(parent); - Selector_Group* ss = 0; - if (p) { - ss = new (ctx.mem) Selector_Group(s->path(), s->line(), p->length() * s->length()); - for (size_t i = 0, L = p->length(); i < L; ++i) { - for (size_t j = 0, L = s->length(); j < L; ++j) { - parent = (*p)[i]; - Selector_Combination* comb = static_cast((*s)[j]->perform(this)); - if (comb) *ss << comb; - } - } - } - else { - ss = new (ctx.mem) Selector_Group(s->path(), s->line(), s->length()); - for (size_t j = 0, L = s->length(); j < L; ++j) { - Selector_Combination* comb = static_cast((*s)[j]->perform(this)); - if (comb) *ss << comb; - } - } - return ss->length() ? ss : 0; - } - - Selector* Contextualize::operator()(Selector_Combination* s) - { - Selector_Combination* ss = new (ctx.mem) Selector_Combination(*s); - if (ss->head()) ss->head(static_cast(s->head()->perform(this))); - if (ss->tail()) ss->tail(static_cast(s->tail()->perform(this))); - if (!ss->head()) { - return ss->tail(); - } - else { - return ss; - } - } - - Selector* Contextualize::operator()(Simple_Selector_Sequence* s) - { - Simple_Selector_Sequence* ss = new (ctx.mem) Simple_Selector_Sequence(s->path(), s->line(), s->length()); - for (size_t i = 0, L = s->length(); i < L; ++i) { - Simple_Selector* simp = static_cast((*s)[i]->perform(this)); - if (simp) *ss << simp; - } - return ss->length() ? ss : 0; - } - - Selector* Contextualize::operator()(Negated_Selector* s) - { return s; } - - Selector* Contextualize::operator()(Pseudo_Selector* s) - { return s; } - - Selector* Contextualize::operator()(Attribute_Selector* s) - { return s; } - - Selector* Contextualize::operator()(Selector_Qualifier* s) - { return s; } - - Selector* Contextualize::operator()(Type_Selector* s) - { return s; } - - Selector* Contextualize::operator()(Selector_Placeholder* s) - { return s; } - - Selector* Contextualize::operator()(Selector_Reference* s) - { - if (!parent) return 0; - Selector_Reference* ss = new (ctx.mem) Selector_Reference(*s); - ss->selector(parent); - return ss; - } - - -} \ No newline at end of file diff --git a/src/contextualize.hpp b/src/contextualize.hpp deleted file mode 100644 index c4fa4e9e0..000000000 --- a/src/contextualize.hpp +++ /dev/null @@ -1,63 +0,0 @@ -#define SASS_CONTEXTUALIZE - -#ifndef SASS_ENVIRONMENT -#include "environment.hpp" -#endif - -#ifndef SASS_OPERATION -#include "operation.hpp" -#endif - -namespace Sass { - class AST_Node; - class Selector; - class Selector_Schema; - class Selector_Group; - class Selector_Combination; - class Simple_Selector_Sequence; - class Negated_Selector; - class Pseudo_Selector; - class Attribute_Selector; - class Selector_Qualifier; - class Type_Selector; - class Selector_Placeholder; - class Selector_Reference; - class Simple_Selector; - class Context; - class Eval; - class Backtrace; - - typedef Environment Env; - - class Contextualize : public Operation_CRTP { - - Context& ctx; - Eval* eval; - Env* env; - Selector* parent; - Backtrace* backtrace; - - Selector* fallback_impl(AST_Node* n); - - public: - Contextualize(Context&, Eval*, Env*, Backtrace*); - virtual ~Contextualize(); - Contextualize* with(Selector*, Env*, Backtrace*); - using Operation::operator(); - - Selector* operator()(Selector_Schema*); - Selector* operator()(Selector_Group*); - Selector* operator()(Selector_Combination*); - Selector* operator()(Simple_Selector_Sequence*); - Selector* operator()(Negated_Selector*); - Selector* operator()(Pseudo_Selector*); - Selector* operator()(Attribute_Selector*); - Selector* operator()(Selector_Qualifier*); - Selector* operator()(Type_Selector*); - Selector* operator()(Selector_Placeholder*); - Selector* operator()(Selector_Reference*); - - template - Selector* fallback(U x) { return fallback_impl(x); } - }; -} \ No newline at end of file diff --git a/src/copy_c_str.cpp b/src/copy_c_str.cpp deleted file mode 100644 index ce2dc389f..000000000 --- a/src/copy_c_str.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#include -#include - -namespace Sass { - using namespace std; - - char* copy_c_str(const char* orig) - { - char* copy = (char*) malloc(sizeof(char) * strlen(orig) + 1); - strcpy(copy, orig); - return copy; - } -} \ No newline at end of file diff --git a/src/copy_c_str.hpp b/src/copy_c_str.hpp deleted file mode 100644 index 84ef998b7..000000000 --- a/src/copy_c_str.hpp +++ /dev/null @@ -1,5 +0,0 @@ -namespace Sass { - - char* copy_c_str(const char*); - -} \ No newline at end of file diff --git a/src/environment.hpp b/src/environment.hpp deleted file mode 100644 index 5a849253b..000000000 --- a/src/environment.hpp +++ /dev/null @@ -1,42 +0,0 @@ -#define SASS_ENVIRONMENT - -#include -#include -#include "ast_def_macros.hpp" - -namespace Sass { - using std::string; - using std::map; - - template - class Environment { - // TODO: test with unordered_map - map current_frame_; - ADD_PROPERTY(Environment*, parent); - - public: - Environment() : current_frame_(map()), parent_(0) { } - - map& current_frame() { return current_frame_; } - - void link(Environment& env) { parent_ = &env; } - void link(Environment* env) { parent_ = env; } - - bool has(const string key) const - { - if (current_frame_.count(key)) return true; - else if (parent_) return parent_->has(key); - else return false; - } - - bool current_frame_has(const string key) const - { return current_frame_.count(key); } - - T& operator[](const string key) - { - if (current_frame_.count(key)) return current_frame_[key]; - else if (parent_) return (*parent_)[key]; - else return current_frame_[key]; - } - }; -} \ No newline at end of file diff --git a/src/error_handling.cpp b/src/error_handling.cpp deleted file mode 100644 index 8c0132b33..000000000 --- a/src/error_handling.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#include "error_handling.hpp" -#include "backtrace.hpp" -#include "prelexer.hpp" - -namespace Sass { - - Error::Error(Type type, string path, size_t line, string message) - : type(type), path(path), line(line), message(message) - { } - - void error(string msg, string path, size_t line) - { throw Error(Error::syntax, path, line, msg); } - - void error(string msg, string path, size_t line, Backtrace* bt) - { - if (!path.empty() && Prelexer::string_constant(path.c_str())) - path = path.substr(1, path.size() - 1); - - Backtrace top(bt, path, line, ""); - msg += top.to_string(); - - throw Error(Error::syntax, path, line, msg); - } - -} \ No newline at end of file diff --git a/src/error_handling.hpp b/src/error_handling.hpp deleted file mode 100644 index f98e6be1a..000000000 --- a/src/error_handling.hpp +++ /dev/null @@ -1,24 +0,0 @@ -#define SASS_ERROR_HANDLING -#include - -namespace Sass { - using namespace std; - - struct Backtrace; - - struct Error { - enum Type { read, write, syntax, evaluation }; - - Type type; - string path; - size_t line; - string message; - - Error(Type type, string path, size_t line, string message); - - }; - - void error(string msg, string path, size_t line); - void error(string msg, string path, size_t line, Backtrace* bt); - -} \ No newline at end of file diff --git a/src/eval.cpp b/src/eval.cpp deleted file mode 100644 index 6c2860668..000000000 --- a/src/eval.cpp +++ /dev/null @@ -1,762 +0,0 @@ -#include "eval.hpp" -#include "ast.hpp" -#include "bind.hpp" -#include "to_string.hpp" -#include "inspect.hpp" -#include "to_c.hpp" -#include "context.hpp" -#include "backtrace.hpp" -#include "prelexer.hpp" -#include -#include - -#include -#include - -namespace Sass { - using namespace std; - - inline double add(double x, double y) { return x + y; } - inline double sub(double x, double y) { return x - y; } - inline double mul(double x, double y) { return x * y; } - inline double div(double x, double y) { return x / y; } // x/0 checked by caller - typedef double (*bop)(double, double); - bop ops[Binary_Expression::NUM_OPS] = { - 0, 0, // and, or - 0, 0, 0, 0, 0, 0, // eq, neq, gt, gte, lt, lte - add, sub, mul, div, fmod - }; - - Eval::Eval(Context& ctx, Env* env, Backtrace* bt) - : ctx(ctx), env(env), force(force), backtrace(bt) { } - Eval::~Eval() { } - - Eval* Eval::with(Env* e, Backtrace* bt) // for setting the env before eval'ing an expression - { - env = e; - backtrace = bt; - return this; - } - - Expression* Eval::operator()(Block* b) - { - Expression* val = 0; - for (size_t i = 0, L = b->length(); i < L; ++i) { - val = (*b)[i]->perform(this); - if (val) return val; - } - return val; - } - - Expression* Eval::operator()(Assignment* a) - { - string var(a->variable()); - if (env->has(var)) { - if(!a->is_guarded()) (*env)[var] = a->value()->perform(this); - } - else { - env->current_frame()[var] = a->value()->perform(this); - } - return 0; - } - - Expression* Eval::operator()(If* i) - { - if (*i->predicate()->perform(this)) { - return i->consequent()->perform(this); - } - else { - Block* alt = i->alternative(); - if (alt) return alt->perform(this); - } - return 0; - } - - Expression* Eval::operator()(For* f) - { - string variable(f->variable()); - Expression* low = f->lower_bound()->perform(this); - if (low->concrete_type() != Expression::NUMBER) { - error("lower bound of `@for` directive must be numeric", low->path(), low->line()); - } - Expression* high = f->upper_bound()->perform(this); - if (high->concrete_type() != Expression::NUMBER) { - error("upper bound of `@for` directive must be numeric", high->path(), high->line()); - } - double lo = static_cast(low)->value(); - double hi = static_cast(high)->value(); - if (f->is_inclusive()) ++hi; - Env new_env; - new_env[variable] = new (ctx.mem) Number(low->path(), low->line(), lo); - new_env.link(env); - env = &new_env; - Block* body = f->block(); - Expression* val = 0; - for (size_t i = lo; - i < hi; - (*env)[variable] = new (ctx.mem) Number(low->path(), low->line(), ++i)) { - val = body->perform(this); - if (val) break; - } - env = new_env.parent(); - return val; - } - - Expression* Eval::operator()(Each* e) - { - string variable(e->variable()); - Expression* expr = e->list()->perform(this); - List* list = 0; - if (expr->concrete_type() != Expression::LIST) { - list = new (ctx.mem) List(expr->path(), expr->line(), 1, List::COMMA); - *list << expr; - } - else { - list = static_cast(expr); - } - Env new_env; - new_env[variable] = 0; - new_env.link(env); - env = &new_env; - Block* body = e->block(); - Expression* val = 0; - for (size_t i = 0, L = list->length(); i < L; ++i) { - (*env)[variable] = (*list)[i]; - val = body->perform(this); - if (val) break; - } - env = new_env.parent(); - return val; - } - - Expression* Eval::operator()(While* w) - { - Expression* pred = w->predicate(); - Block* body = w->block(); - while (*pred->perform(this)) { - Expression* val = body->perform(this); - if (val) return val; - } - return 0; - } - - Expression* Eval::operator()(Return* r) - { - return r->value()->perform(this); - } - - Expression* Eval::operator()(Warning* w) - { - Expression* message = w->message()->perform(this); - To_String to_string; - string prefix("WARNING: "); - string indent(" "); - string result(unquote(message->perform(&to_string))); - cerr << prefix << result; - Backtrace top(backtrace, w->path(), w->line(), ""); - cerr << top.to_string(true); - cerr << endl << endl; - return 0; - } - - Expression* Eval::operator()(List* l) - { - List* ll = new (ctx.mem) List(l->path(), - l->line(), - l->length(), - l->separator(), - l->is_arglist()); - for (size_t i = 0, L = l->length(); i < L; ++i) { - *ll << (*l)[i]->perform(this); - } - return ll; - } - - // -- only need to define two comparisons, and the rest can be implemented in terms of them - bool eq(Expression*, Expression*, Context&, Eval*); - bool lt(Expression*, Expression*, Context&); - // -- arithmetic on the combinations that matter - Expression* op_numbers(Context&, Binary_Expression::Type, Expression*, Expression*); - Expression* op_number_color(Context&, Binary_Expression::Type, Expression*, Expression*); - Expression* op_color_number(Context&, Binary_Expression::Type, Expression*, Expression*); - Expression* op_colors(Context&, Binary_Expression::Type, Expression*, Expression*); - Expression* op_strings(Context&, Binary_Expression::Type, Expression*, Expression*); - - Expression* Eval::operator()(Binary_Expression* b) - { - Binary_Expression::Type op_type = b->type(); - // don't eval delayed expressions (the '/' when used as a separator) - if (op_type == Binary_Expression::DIV && b->is_delayed()) return b; - // the logical connectives need to short-circuit - Expression* lhs = b->left()->perform(this); - switch (op_type) { - case Binary_Expression::AND: - return *lhs ? b->right()->perform(this) : lhs; - break; - - case Binary_Expression::OR: - return *lhs ? lhs : b->right()->perform(this); - break; - - default: - break; - } - // not a logical connective, so go ahead and eval the rhs - Expression* rhs = b->right()->perform(this); - - // see if it's a relational expression - switch(op_type) { - case Binary_Expression::EQ: return new (ctx.mem) Boolean(b->path(), b->line(), eq(lhs, rhs, ctx)); - case Binary_Expression::NEQ: return new (ctx.mem) Boolean(b->path(), b->line(), !eq(lhs, rhs, ctx)); - case Binary_Expression::GT: return new (ctx.mem) Boolean(b->path(), b->line(), !lt(lhs, rhs, ctx) && !eq(lhs, rhs, ctx)); - case Binary_Expression::GTE: return new (ctx.mem) Boolean(b->path(), b->line(), !lt(lhs, rhs, ctx)); - case Binary_Expression::LT: return new (ctx.mem) Boolean(b->path(), b->line(), lt(lhs, rhs, ctx)); - case Binary_Expression::LTE: return new (ctx.mem) Boolean(b->path(), b->line(), lt(lhs, rhs, ctx) || eq(lhs, rhs, ctx)); - - default: break; - } - - Expression::Concrete_Type l_type = lhs->concrete_type(); - Expression::Concrete_Type r_type = rhs->concrete_type(); - - if (l_type == Expression::NUMBER && r_type == Expression::NUMBER) { - return op_numbers(ctx, op_type, lhs, rhs); - } - if (l_type == Expression::NUMBER && r_type == Expression::COLOR) { - return op_number_color(ctx, op_type, lhs, rhs); - } - if (l_type == Expression::COLOR && r_type == Expression::NUMBER) { - return op_color_number(ctx, op_type, lhs, rhs); - } - if (l_type == Expression::COLOR && r_type == Expression::COLOR) { - return op_colors(ctx, op_type, lhs, rhs); - } - return op_strings(ctx, op_type, lhs, rhs); - } - - Expression* Eval::operator()(Unary_Expression* u) - { - Expression* operand = u->operand()->perform(this); - if (operand->concrete_type() == Expression::NUMBER) { - Number* result = new (ctx.mem) Number(*static_cast(operand)); - result->value(u->type() == Unary_Expression::MINUS - ? -result->value() - : result->value()); - return result; - } - else { - To_String to_string; - String_Constant* result = new (ctx.mem) String_Constant(u->path(), - u->line(), - u->perform(&to_string)); - return result; - } - // unreachable - return u; - } - - Expression* Eval::operator()(Function_Call* c) - { - Arguments* args = static_cast(c->arguments()->perform(this)); - string full_name(c->name() + "[f]"); - - // if it doesn't exist, just pass it through as a literal - if (!env->has(full_name)) { - Function_Call* lit = new (ctx.mem) Function_Call(c->path(), - c->line(), - c->name(), - args); - To_String to_string; - return new (ctx.mem) String_Constant(c->path(), - c->line(), - lit->perform(&to_string)); - } - - Expression* result = c; - Definition* def = static_cast((*env)[full_name]); - Block* body = def->block(); - Native_Function func = def->native_function(); - Sass_C_Function c_func = def->c_function(); - - for (size_t i = 0, L = args->length(); i < L; ++i) { - (*args)[i]->value((*args)[i]->value()->perform(this)); - } - - Parameters* params = def->parameters(); - Env new_env; - new_env.link(def->environment()); - bind("function " + c->name(), params, args, ctx, &new_env, this); - Env* old_env = env; - env = &new_env; - - Backtrace here(backtrace, c->path(), c->line(), ", in function `" + c->name() + "`"); - backtrace = &here; - - // if it's user-defined, eval the body - if (body) { - result = body->perform(this); - if (!result) { - error(string("function ") + c->name() + " did not return a value", c->path(), c->line()); - } - } - // if it's native, invoke the underlying CPP function - else if (func) { - result = func(*env, ctx, def->signature(), c->path(), c->line(), backtrace); - } - // else if it's a user-defined c function - else if (c_func) { - To_C to_c; - Sass_Value c_val = c_func(args->perform(&to_c)); - if (c_val.unknown.tag == SASS_ERROR) { - error("error in C function " + c->name() + ": " + c_val.error.message, c->path(), c->line(), backtrace); - } - result = cval_to_astnode(c_val, ctx, backtrace, c->path(), c->line()); - } - // else it's an overloaded native function; resolve it - else if (def->is_overload_stub()) { - size_t arity = args->length(); - stringstream ss; - ss << full_name << arity; - string resolved_name(ss.str()); - if (!old_env->has(resolved_name)) error("overloaded function `" + string(c->name()) + "` given wrong number of arguments", c->path(), c->line()); - Definition* resolved_def = static_cast((*old_env)[ss.str()]); - result = resolved_def->native_function()(*env, ctx, resolved_def->signature(), c->path(), c->line(), backtrace); - } - - backtrace = here.parent; - env = old_env; - return result; - } - - Expression* Eval::operator()(Function_Call_Schema* s) - { - Expression* evaluated_name = s->name()->perform(this); - Expression* evaluated_args = s->arguments()->perform(this); - String_Schema* ss = new (ctx.mem) String_Schema(s->path(), s->line(), 2); - (*ss) << evaluated_name << evaluated_args; - return ss->perform(this); - } - - Expression* Eval::operator()(Variable* v) - { - string name(v->name()); - Expression* value = 0; - if (env->has(name)) value = static_cast((*env)[name]); - else error("unbound variable " + v->name(), v->path(), v->line()); - return value; - } - - Expression* Eval::operator()(Textual* t) - { - using Prelexer::number; - Expression* result = 0; - switch (t->type()) - { - case Textual::NUMBER: - result = new (ctx.mem) Number(t->path(), - t->line(), - atof(t->value().c_str())); - break; - case Textual::PERCENTAGE: - result = new (ctx.mem) Number(t->path(), - t->line(), - atof(t->value().c_str()), - "%"); - break; - case Textual::DIMENSION: - result = new (ctx.mem) Number(t->path(), - t->line(), - atof(t->value().c_str()), - Token(number(t->value().c_str()))); - break; - case Textual::HEX: { - string hext(t->value().substr(1)); // chop off the '#' - if (hext.length() == 6) { - string r(hext.substr(0,2)); - string g(hext.substr(2,2)); - string b(hext.substr(4,2)); - result = new (ctx.mem) Color(t->path(), - t->line(), - static_cast(strtol(r.c_str(), NULL, 16)), - static_cast(strtol(g.c_str(), NULL, 16)), - static_cast(strtol(b.c_str(), NULL, 16))); - } - else { - result = new (ctx.mem) Color(t->path(), - t->line(), - static_cast(strtol(string(2,hext[0]).c_str(), NULL, 16)), - static_cast(strtol(string(2,hext[1]).c_str(), NULL, 16)), - static_cast(strtol(string(2,hext[2]).c_str(), NULL, 16))); - } - } break; - } - return result; - } - - Expression* Eval::operator()(Number* n) - { - return n; - } - - Expression* Eval::operator()(Boolean* b) - { - return b; - } - - Expression* Eval::operator()(String_Schema* s) - { - string acc; - To_String to_string; - for (size_t i = 0, L = s->length(); i < L; ++i) { - acc += (*s)[i]->perform(this)->perform(&to_string); - } - return new (ctx.mem) String_Constant(s->path(), - s->line(), - quote(unquote(acc), s->quote_mark())); - } - - Expression* Eval::operator()(String_Constant* s) - { - if (!s->is_delayed() && ctx.names_to_colors.count(s->value())) { - Color* c = new (ctx.mem) Color(*ctx.names_to_colors[s->value()]); - c->path(s->path()); - c->line(s->line()); - return c; - } - return s; - } - - Expression* Eval::operator()(Media_Query* q) - { - String* t = q->media_type(); - t = static_cast(t ? t->perform(this) : 0); - Media_Query* qq = new (ctx.mem) Media_Query(q->path(), - q->line(), - t, - q->length(), - q->is_negated(), - q->is_restricted()); - for (size_t i = 0, L = q->length(); i < L; ++i) { - *qq << static_cast((*q)[i]->perform(this)); - } - return qq; - } - - Expression* Eval::operator()(Media_Query_Expression* e) - { - Expression* feature = e->feature(); - feature = (feature ? feature->perform(this) : 0); - Expression* value = e->value(); - value = (value ? value->perform(this) : 0); - return new (ctx.mem) Media_Query_Expression(e->path(), - e->line(), - feature, - value, - e->is_interpolated()); - } - - Expression* Eval::operator()(Null* n) - { - return n; - } - - Expression* Eval::operator()(Argument* a) - { - Expression* val = a->value(); - val->is_delayed(false); - val = val->perform(this); - val->is_delayed(false); - if (a->is_rest_argument() && (val->concrete_type() != Expression::LIST)) { - List* wrapper = new (ctx.mem) List(val->path(), - val->line(), - 0, - List::COMMA, - true); - *wrapper << val; - val = wrapper; - } - return new (ctx.mem) Argument(a->path(), - a->line(), - val, - a->name(), - a->is_rest_argument()); - } - - Expression* Eval::operator()(Arguments* a) - { - Arguments* aa = new (ctx.mem) Arguments(a->path(), a->line()); - for (size_t i = 0, L = a->length(); i < L; ++i) { - *aa << static_cast((*a)[i]->perform(this)); - } - return aa; - } - - inline Expression* Eval::fallback_impl(AST_Node* n) - { - return static_cast(n); - } - - // All the binary helpers. - - bool eq(Expression* lhs, Expression* rhs, Context& ctx) - { - Expression::Concrete_Type ltype = lhs->concrete_type(); - Expression::Concrete_Type rtype = rhs->concrete_type(); - if (ltype != rtype) return false; - switch (ltype) { - - case Expression::BOOLEAN: { - return static_cast(lhs)->value() == - static_cast(rhs)->value(); - } break; - - case Expression::NUMBER: { - Number* l = static_cast(lhs); - Number* r = static_cast(rhs); - Number tmp_r(*r); - tmp_r.normalize(l->find_convertible_unit()); - return l->unit() == tmp_r.unit() && l->value() == tmp_r.value() - ? true - : false; - } break; - - case Expression::COLOR: { - Color* l = static_cast(lhs); - Color* r = static_cast(rhs); - return l->r() == r->r() && - l->g() == r->g() && - l->b() == r->b() && - l->a() == r->a(); - } break; - - case Expression::STRING: { - return unquote(static_cast(lhs)->value()) == - unquote(static_cast(rhs)->value()); - } break; - - case Expression::LIST: { - List* l = static_cast(lhs); - List* r = static_cast(rhs); - if (l->length() != r->length()) return false; - if (l->separator() != r->separator()) return false; - for (size_t i = 0, L = l->length(); i < L; ++i) { - if (!eq((*l)[i], (*r)[i], ctx)) return false; - } - return true; - } break; - - case Expression::NULL_VAL: { - return true; - } break; - - default: break; - } - return false; - } - - bool lt(Expression* lhs, Expression* rhs, Context& ctx) - { - if (lhs->concrete_type() != Expression::NUMBER || - rhs->concrete_type() != Expression::NUMBER) - error("may only compare numbers", lhs->path(), lhs->line()); - Number* l = static_cast(lhs); - Number* r = static_cast(rhs); - Number tmp_r(*r); - tmp_r.normalize(l->find_convertible_unit()); - string l_unit(l->unit()); - string r_unit(tmp_r.unit()); - if (!l_unit.empty() && !r_unit.empty() && l->unit() != tmp_r.unit()) { - error("cannot compare numbers with incompatible units", l->path(), l->line()); - } - return l->value() < tmp_r.value(); - } - - Expression* op_numbers(Context& ctx, Binary_Expression::Type op, Expression* lhs, Expression* rhs) - { - Number* l = static_cast(lhs); - Number* r = static_cast(rhs); - double lv = l->value(); - double rv = r->value(); - if (op == Binary_Expression::DIV && !rv) { - return new (ctx.mem) String_Constant(l->path(), l->line(), "Infinity"); - } - if (op == Binary_Expression::MOD && !rv) { - error("division by zero", r->path(), r->line()); - } - - Number tmp(*r); - tmp.normalize(l->find_convertible_unit()); - string l_unit(l->unit()); - string r_unit(tmp.unit()); - if (l_unit != r_unit && !l_unit.empty() && !r_unit.empty() && - (op == Binary_Expression::ADD || op == Binary_Expression::SUB)) { - error("cannot add or subtract numbers with incompatible units", l->path(), l->line()); - } - Number* v = new (ctx.mem) Number(*l); - if (l_unit.empty() && (op == Binary_Expression::ADD || op == Binary_Expression::SUB)) { - v->numerator_units() = r->numerator_units(); - v->denominator_units() = r->denominator_units(); - } - - v->value(ops[op](lv, rv)); - if (op == Binary_Expression::MUL) { - for (size_t i = 0, S = r->numerator_units().size(); i < S; ++i) { - v->numerator_units().push_back(r->numerator_units()[i]); - } - for (size_t i = 0, S = r->denominator_units().size(); i < S; ++i) { - v->denominator_units().push_back(r->denominator_units()[i]); - } - } - else if (op == Binary_Expression::DIV) { - for (size_t i = 0, S = r->numerator_units().size(); i < S; ++i) { - v->denominator_units().push_back(r->numerator_units()[i]); - } - for (size_t i = 0, S = r->denominator_units().size(); i < S; ++i) { - v->numerator_units().push_back(r->denominator_units()[i]); - } - } - v->normalize(); - return v; - } - - Expression* op_number_color(Context& ctx, Binary_Expression::Type op, Expression* lhs, Expression* rhs) - { - Number* l = static_cast(lhs); - Color* r = static_cast(rhs); - double lv = l->value(); - switch (op) { - case Binary_Expression::ADD: - case Binary_Expression::MUL: { - return new (ctx.mem) Color(l->path(), - l->line(), - ops[op](lv, r->r()), - ops[op](lv, r->g()), - ops[op](lv, r->b()), - r->a()); - } break; - case Binary_Expression::SUB: - case Binary_Expression::DIV: { - string sep(op == Binary_Expression::SUB ? "-" : "/"); - To_String to_string; - return new (ctx.mem) String_Constant(l->path(), - l->line(), - l->perform(&to_string) - + sep - + r->perform(&to_string)); - } break; - case Binary_Expression::MOD: { - error("cannot divide a number by a color", r->path(), r->line()); - } break; - default: break; // caller should ensure that we don't get here - } - // unreachable - return l; - } - - Expression* op_color_number(Context& ctx, Binary_Expression::Type op, Expression* lhs, Expression* rhs) - { - Color* l = static_cast(lhs); - Number* r = static_cast(rhs); - double rv = r->value(); - if (op == Binary_Expression::DIV && !rv) error("division by zero", r->path(), r->line()); - return new (ctx.mem) Color(l->path(), - l->line(), - ops[op](l->r(), rv), - ops[op](l->g(), rv), - ops[op](l->b(), rv), - l->a()); - } - - Expression* op_colors(Context& ctx, Binary_Expression::Type op, Expression* lhs, Expression* rhs) - { - Color* l = static_cast(lhs); - Color* r = static_cast(rhs); - if (l->a() != r->a()) { - error("alpha channels must be equal when combining colors", r->path(), r->line()); - } - if ((op == Binary_Expression::DIV || op == Binary_Expression::MOD) && - (!r->r() || !r->g() ||!r->b())) { - error("division by zero", r->path(), r->line()); - } - return new (ctx.mem) Color(l->path(), - l->line(), - ops[op](l->r(), r->r()), - ops[op](l->g(), r->g()), - ops[op](l->b(), r->b()), - l->a()); - } - - Expression* op_strings(Context& ctx, Binary_Expression::Type op, Expression* lhs, Expression*rhs) - { - To_String to_string; - Expression::Concrete_Type ltype = lhs->concrete_type(); - Expression::Concrete_Type rtype = rhs->concrete_type(); - string lstr(lhs->perform(&to_string)); - string rstr(rhs->perform(&to_string)); - bool unquoted = false; - if (ltype == Expression::STRING && lstr[0] != '"' && lstr[0] != '\'') unquoted = true; - if (ltype == Expression::STRING && !lhs->is_delayed() && ctx.names_to_colors.count(lstr) && - rtype == Expression::STRING && !rhs->is_delayed() && ctx.names_to_colors.count(rstr)) { - return op_colors(ctx, op, ctx.names_to_colors[lstr], ctx.names_to_colors[rstr]); - } - else if (ltype == Expression::STRING && !lhs->is_delayed() && ctx.names_to_colors.count(lstr) && - rtype == Expression::NUMBER) { - return op_color_number(ctx, op, ctx.names_to_colors[lstr], rhs); - } - else if (ltype == Expression::NUMBER && - rtype == Expression::STRING && !rhs->is_delayed() && ctx.names_to_colors.count(rstr)) { - return op_number_color(ctx, op, rhs, ctx.names_to_colors[rstr]); - } - if (op == Binary_Expression::MUL) error("invalid operands for multiplication", lhs->path(), lhs->line()); - if (op == Binary_Expression::MOD) error("invalid operands for modulo", lhs->path(), lhs->line()); - string sep; - switch (op) { - case Binary_Expression::SUB: sep = "-"; break; - case Binary_Expression::DIV: sep = "/"; break; - default: break; - } - char q = '\0'; - if (lstr[0] == '"' || lstr[0] == '\'') q = lstr[0]; - else if (rstr[0] == '"' || rstr[0] == '\'') q = rstr[0]; - string result(unquote(lstr) + sep + unquote(rstr)); - return new String_Constant(lhs->path(), - lhs->line(), - unquoted ? result : quote(result, q)); - } - - Expression* cval_to_astnode(Sass_Value v, Context& ctx, Backtrace* backtrace, string path, size_t line) - { - using std::strlen; - using std::strcpy; - Expression* e = 0; - switch (v.unknown.tag) { - case SASS_BOOLEAN: { - e = new (ctx.mem) Boolean(path, line, v.boolean.value); - } break; - case SASS_NUMBER: { - e = new (ctx.mem) Number(path, line, v.number.value, v.number.unit); - } break; - case SASS_COLOR: { - e = new (ctx.mem) Color(path, line, v.color.r, v.color.g, v.color.b, v.color.a); - } break; - case SASS_STRING: { - e = new (ctx.mem) String_Constant(path, line, v.string.value); - } break; - case SASS_LIST: { - List* l = new (ctx.mem) List(path, line, v.list.length, v.list.separator == SASS_COMMA ? List::COMMA : List::SPACE); - for (size_t i = 0, L = v.list.length; i < L; ++i) { - *l << cval_to_astnode(v.list.values[i], ctx, backtrace, path, line); - } - e = l; - } break; - case SASS_NULL: { - e = new (ctx.mem) Null(path, line); - } break; - case SASS_ERROR: { - error("error in C function: " + string(v.error.message), path, line, backtrace); - } break; - } - return e; - } - -} \ No newline at end of file diff --git a/src/eval.hpp b/src/eval.hpp deleted file mode 100644 index d73c5b000..000000000 --- a/src/eval.hpp +++ /dev/null @@ -1,74 +0,0 @@ -#define SASS_EVAL - -#include - -#ifndef SASS_OPERATION -#include "operation.hpp" -#endif - -#ifndef SASS_ENVIRONMENT -#include "environment.hpp" -#endif - -#ifndef SASS -#include "sass.h" -#endif - -namespace Sass { - using namespace std; - - class Context; - typedef Environment Env; - struct Backtrace; - - class Eval : public Operation_CRTP { - - Context& ctx; - Env* env; - bool force; - - Expression* fallback_impl(AST_Node* n); - - public: - Backtrace* backtrace; - Eval(Context&, Env*, Backtrace*); - virtual ~Eval(); - Eval* with(Env* e, Backtrace* bt); // for setting the env before eval'ing an expression - using Operation::operator(); - - // for evaluating function bodies - Expression* operator()(Block*); - Expression* operator()(Assignment*); - Expression* operator()(If*); - Expression* operator()(For*); - Expression* operator()(Each*); - Expression* operator()(While*); - Expression* operator()(Return*); - Expression* operator()(Warning*); - - Expression* operator()(List*); - Expression* operator()(Binary_Expression*); - Expression* operator()(Unary_Expression*); - Expression* operator()(Function_Call*); - Expression* operator()(Function_Call_Schema*); - Expression* operator()(Variable*); - Expression* operator()(Textual*); - Expression* operator()(Number*); - Expression* operator()(Boolean*); - Expression* operator()(String_Schema*); - Expression* operator()(String_Constant*); - Expression* operator()(Media_Query*); - Expression* operator()(Media_Query_Expression*); - Expression* operator()(Null*); - Expression* operator()(Argument*); - Expression* operator()(Arguments*); - - template - Expression* fallback(U x) { return fallback_impl(x); } - }; - - Expression* cval_to_astnode(Sass_Value v, Context& ctx, Backtrace* backtrace, string path = "", size_t line = 0); - - bool eq(Expression*, Expression*, Context&); - bool lt(Expression*, Expression*, Context&); -} \ No newline at end of file diff --git a/src/expand.cpp b/src/expand.cpp deleted file mode 100644 index 461abc04a..000000000 --- a/src/expand.cpp +++ /dev/null @@ -1,333 +0,0 @@ -#include "expand.hpp" -#include "bind.hpp" -#include "eval.hpp" -#include "contextualize.hpp" -#include "to_string.hpp" -#include "backtrace.hpp" - -#include -#include - -#ifndef SASS_CONTEXT -#include "context.hpp" -#endif - -namespace Sass { - - Expand::Expand(Context& ctx, Eval* eval, Contextualize* contextualize, Env* env, Backtrace* bt) - : ctx(ctx), - eval(eval), - contextualize(contextualize), - env(env), - block_stack(vector()), - property_stack(vector()), - selector_stack(vector()), - backtrace(bt), - extensions(multimap()) - { selector_stack.push_back(0); } - - Statement* Expand::operator()(Block* b) - { - Env new_env; - new_env.link(*env); - env = &new_env; - Block* bb = new (ctx.mem) Block(b->path(), b->line(), b->length(), b->is_root()); - block_stack.push_back(bb); - append_block(b); - block_stack.pop_back(); - env = env->parent(); - return bb; - } - - Statement* Expand::operator()(Ruleset* r) - { - To_String to_string; - // if (selector_stack.back()) cerr << "expanding " << selector_stack.back()->perform(&to_string) << " and " << r->selector()->perform(&to_string) << endl; - Selector* sel_ctx = r->selector()->perform(contextualize->with(selector_stack.back(), env, backtrace)); - selector_stack.push_back(sel_ctx); - Ruleset* rr = new (ctx.mem) Ruleset(r->path(), - r->line(), - sel_ctx, - r->block()->perform(this)->block()); - selector_stack.pop_back(); - return rr; - } - - Statement* Expand::operator()(Propset* p) - { - property_stack.push_back(p->property_fragment()); - Block* expanded_block = p->block()->perform(this)->block(); - - Block* current_block = block_stack.back(); - for (size_t i = 0, L = expanded_block->length(); i < L; ++i) { - Statement* stm = (*expanded_block)[i]; - if (typeid(*stm) == typeid(Declaration)) { - Declaration* dec = static_cast(stm); - String_Schema* combined_prop = new (ctx.mem) String_Schema(p->path(), p->line()); - if (!property_stack.empty()) { - *combined_prop << property_stack.back() - << new (ctx.mem) String_Constant(p->path(), p->line(), "-") - << dec->property(); // TODO: eval the prop into a string constant - } - else { - *combined_prop << dec->property(); - } - dec->property(combined_prop); - *current_block << dec; - } - else { - error("contents of namespaced properties must result in style declarations only", stm->path(), stm->line(), backtrace); - } - } - - property_stack.pop_back(); - - return 0; - } - - Statement* Expand::operator()(Media_Block* m) - { - Expression* media_queries = m->media_queries()->perform(eval->with(env, backtrace)); - Media_Block* mm = new (ctx.mem) Media_Block(m->path(), - m->line(), - static_cast(media_queries), - m->block()->perform(this)->block()); - mm->enclosing_selector(selector_stack.back()); - return mm; - } - - Statement* Expand::operator()(At_Rule* a) - { - Block* ab = a->block(); - selector_stack.push_back(0); - Selector* as = a->selector(); - if (as) as = as->perform(contextualize->with(0, env, backtrace)); - Block* bb = ab ? ab->perform(this)->block() : 0; - At_Rule* aa = new (ctx.mem) At_Rule(a->path(), - a->line(), - a->keyword(), - as, - bb); - selector_stack.pop_back(); - return aa; - } - - Statement* Expand::operator()(Declaration* d) - { - String* old_p = d->property(); - String* new_p = static_cast(old_p->perform(eval->with(env, backtrace))); - return new (ctx.mem) Declaration(d->path(), - d->line(), - new_p, - d->value()->perform(eval->with(env, backtrace)), - d->is_important()); - } - - Statement* Expand::operator()(Assignment* a) - { - string var(a->variable()); - if (env->has(var)) { - if(!a->is_guarded()) (*env)[var] = a->value()->perform(eval->with(env, backtrace)); - } - else { - env->current_frame()[var] = a->value()->perform(eval->with(env, backtrace)); - } - return 0; - } - - Statement* Expand::operator()(Import* i) - { - return i; // TODO: eval i->urls() - } - - Statement* Expand::operator()(Import_Stub* i) - { - append_block(ctx.style_sheets[i->file_name()]); - return 0; - } - - Statement* Expand::operator()(Warning* w) - { - // eval handles this too, because warnings may occur in functions - w->perform(eval->with(env, backtrace)); - return 0; - } - - Statement* Expand::operator()(Comment* c) - { - // TODO: eval the text, once we're parsing/storing it as a String_Schema - return c; - } - - Statement* Expand::operator()(If* i) - { - if (*i->predicate()->perform(eval->with(env, backtrace))) { - append_block(i->consequent()); - } - else { - Block* alt = i->alternative(); - if (alt) append_block(alt); - } - return 0; - } - - Statement* Expand::operator()(For* f) - { - string variable(f->variable()); - Expression* low = f->lower_bound()->perform(eval->with(env, backtrace)); - if (low->concrete_type() != Expression::NUMBER) { - error("lower bound of `@for` directive must be numeric", low->path(), low->line(), backtrace); - } - Expression* high = f->upper_bound()->perform(eval->with(env, backtrace)); - if (high->concrete_type() != Expression::NUMBER) { - error("upper bound of `@for` directive must be numeric", high->path(), high->line(), backtrace); - } - double lo = static_cast(low)->value(); - double hi = static_cast(high)->value(); - if (f->is_inclusive()) ++hi; - Env new_env; - new_env[variable] = new (ctx.mem) Number(low->path(), low->line(), lo); - new_env.link(env); - env = &new_env; - Block* body = f->block(); - for (size_t i = lo; - i < hi; - (*env)[variable] = new (ctx.mem) Number(low->path(), low->line(), ++i)) { - append_block(body); - } - env = new_env.parent(); - return 0; - } - - Statement* Expand::operator()(Each* e) - { - string variable(e->variable()); - Expression* expr = e->list()->perform(eval->with(env, backtrace)); - List* list = 0; - if (expr->concrete_type() != Expression::LIST) { - list = new (ctx.mem) List(expr->path(), expr->line(), 1, List::COMMA); - *list << expr; - } - else { - list = static_cast(expr); - } - Env new_env; - new_env[variable] = 0; - new_env.link(env); - env = &new_env; - Block* body = e->block(); - for (size_t i = 0, L = list->length(); i < L; ++i) { - (*env)[variable] = (*list)[i]->perform(eval->with(env, backtrace)); - append_block(body); - } - env = new_env.parent(); - return 0; - } - - Statement* Expand::operator()(While* w) - { - Expression* pred = w->predicate(); - Block* body = w->block(); - while (*pred->perform(eval->with(env, backtrace))) { - append_block(body); - } - return 0; - } - - Statement* Expand::operator()(Return* r) - { - error("@return may only be used within a function", r->path(), r->line(), backtrace); - return 0; - } - - Statement* Expand::operator()(Extension* e) - { - Selector_Group* extender = static_cast(selector_stack.back()); - if (!extender) return 0; - Selector_Group* extendee = static_cast(e->selector()->perform(contextualize->with(0, env, backtrace))); - if (extendee->length() != 1) { - error("selector groups may not be extended", extendee->path(), extendee->line(), backtrace); - } - Selector_Combination* c = (*extendee)[0]; - if (!c->head() || c->tail()) { - error("nested selectors may not be extended", c->path(), c->line(), backtrace); - } - Simple_Selector_Sequence* s = c->head(); - for (size_t i = 0, L = extender->length(); i < L; ++i) { - extensions.insert(make_pair(*s, (*extender)[i])); - To_String to_string; - } - return 0; - } - - Statement* Expand::operator()(Definition* d) - { - env->current_frame()[d->name() + - (d->type() == Definition::MIXIN ? "[m]" : "[f]")] = d; - // set the static link so we can have lexical scoping - d->environment(env); - return 0; - } - - Statement* Expand::operator()(Mixin_Call* c) - { - string full_name(c->name() + "[m]"); - if (!env->has(full_name)) { - error("no mixin named " + c->name(), c->path(), c->line(), backtrace); - } - Definition* def = static_cast((*env)[full_name]); - Block* body = def->block(); - Parameters* params = def->parameters(); - Arguments* args = static_cast(c->arguments() - ->perform(eval->with(env, backtrace))); - Backtrace here(backtrace, c->path(), c->line(), ", in mixin `" + c->name() + "`"); - backtrace = &here; - Env new_env; - new_env.link(def->environment()); - if (c->block()) { - // reprsent mixin content blocks as thunks/closures - Definition* thunk = new (ctx.mem) Definition(c->path(), - c->line(), - "@content", - new (ctx.mem) Parameters(c->path(), c->line()), - c->block(), - Definition::MIXIN); - thunk->environment(env); - new_env.current_frame()["@content[m]"] = thunk; - } - bind("mixin " + c->name(), params, args, ctx, &new_env, eval); - Env* old_env = env; - env = &new_env; - append_block(body); - env = old_env; - backtrace = here.parent; - return 0; - } - - Statement* Expand::operator()(Content* c) - { - // convert @content directives into mixin calls to the underlying thunk - if (!env->has("@content[m]")) return 0; - Mixin_Call* call = new (ctx.mem) Mixin_Call(c->path(), - c->line(), - "@content", - new (ctx.mem) Arguments(c->path(), c->line())); - return call->perform(this); - } - - inline Statement* Expand::fallback_impl(AST_Node* n) - { - error("unknown internal error; please contact the LibSass maintainers", n->path(), n->line(), backtrace); - String_Constant* msg = new (ctx.mem) String_Constant("", 0, string("`Expand` doesn't handle ") + typeid(*n).name()); - return new (ctx.mem) Warning("", 0, msg); - } - - inline void Expand::append_block(Block* b) - { - Block* current_block = block_stack.back(); - for (size_t i = 0, L = b->length(); i < L; ++i) { - Statement* ith = (*b)[i]->perform(this); - if (ith) *current_block << ith; - } - } -} \ No newline at end of file diff --git a/src/expand.hpp b/src/expand.hpp deleted file mode 100644 index 7db6aea5b..000000000 --- a/src/expand.hpp +++ /dev/null @@ -1,76 +0,0 @@ -#define SASS_EXPAND - -#include -#include -#include - -#ifndef SASS_AST -#include "ast.hpp" -#endif - -#ifndef SASS_OPERATION -#include "operation.hpp" -#endif - -#ifndef SASS_ENVIRONMENT -#include "environment.hpp" -#endif - -namespace Sass { - using namespace std; - - class Context; - class Eval; - class Contextualize; - typedef Environment Env; - struct Backtrace; - - class Expand : public Operation_CRTP { - - Context& ctx; - Eval* eval; - Contextualize* contextualize; - Env* env; - vector block_stack; - vector property_stack; - vector selector_stack; - Backtrace* backtrace; - - Statement* fallback_impl(AST_Node* n); - - public: - Expand(Context&, Eval*, Contextualize*, Env*, Backtrace*); - virtual ~Expand() { } - - using Operation::operator(); - - Statement* operator()(Block*); - Statement* operator()(Ruleset*); - Statement* operator()(Propset*); - Statement* operator()(Media_Block*); - Statement* operator()(At_Rule*); - Statement* operator()(Declaration*); - Statement* operator()(Assignment*); - Statement* operator()(Import*); - Statement* operator()(Import_Stub*); - Statement* operator()(Warning*); - Statement* operator()(Comment*); - Statement* operator()(If*); - Statement* operator()(For*); - Statement* operator()(Each*); - Statement* operator()(While*); - Statement* operator()(Return*); - Statement* operator()(Extension*); - Statement* operator()(Definition*); - Statement* operator()(Mixin_Call*); - Statement* operator()(Content*); - - template - Statement* fallback(U x) { return fallback_impl(x); } - - void append_block(Block*); - - multimap extensions; - }; - -} \ No newline at end of file diff --git a/src/extend.cpp b/src/extend.cpp deleted file mode 100644 index b3351d18f..000000000 --- a/src/extend.cpp +++ /dev/null @@ -1,84 +0,0 @@ -#include "extend.hpp" -#include "context.hpp" -#include "to_string.hpp" -#include - -namespace Sass { - - Extend::Extend(Context& ctx, multimap& extensions) - : ctx(ctx), extensions(extensions) - { } - - void Extend::operator()(Block* b) - { - for (size_t i = 0, L = b->length(); i < L; ++i) { - (*b)[i]->perform(this); - } - } - - void Extend::operator()(Ruleset* r) - { - Selector_Group* sg = static_cast(r->selector()); - Selector_Group* ng = new (ctx.mem) Selector_Group(sg->path(), sg->line(), sg->length()); - bool extended = false; - // for each selector in the group - for (size_t i = 0, L = sg->length(); i < L; ++i) { - Selector_Combination* sel = (*sg)[i]; - *ng << sel; - // if it's supposed to be extended - Simple_Selector_Sequence* sel_base = sel->base(); - To_String to_string; - if (sel_base && extensions.count(*sel_base)) { - // extend it wrt each of its extenders - for (multimap::iterator extender = extensions.lower_bound(*sel_base), E = extensions.upper_bound(*sel_base); - extender != E; - ++extender) { - *ng += generate_extension(sel, extender->second); - extended = true; - } - } - } - if (extended) r->selector(ng); - r->block()->perform(this); - } - - void Extend::operator()(Media_Block* m) - { - m->block()->perform(this); - } - - void Extend::operator()(At_Rule* a) - { - if (a->block()) a->block()->perform(this); - } - - Selector_Group* Extend::generate_extension(Selector_Combination* extendee, Selector_Combination* extender) - { - To_String to_string; - Selector_Group* new_group = new (ctx.mem) Selector_Group(extendee->path(), extendee->line()); - Selector_Combination* extendee_context = extendee->context(ctx); - Selector_Combination* extender_context = extender->context(ctx); - if (extendee_context && extender_context) { - Selector_Combination* base = new (ctx.mem) Selector_Combination(new_group->path(), new_group->line(), Selector_Combination::ANCESTOR_OF, extender->base(), 0); - extendee_context->innermost()->tail(extender); - *new_group << extendee_context; - // make another one so we don't erroneously share tails - extendee_context = extendee->context(ctx); - extendee_context->innermost()->tail(base); - extender_context->innermost()->tail(extendee_context); - *new_group << extender_context; - } - else if (extendee_context) { - extendee_context->innermost()->tail(extender); - *new_group << extendee_context; - } - else if (extender_context) { - *new_group << extender; - } - else { - *new_group << extender; - } - return new_group; - } - -} \ No newline at end of file diff --git a/src/extend.hpp b/src/extend.hpp deleted file mode 100644 index 8721254de..000000000 --- a/src/extend.hpp +++ /dev/null @@ -1,45 +0,0 @@ -#define SASS_EXTEND - -#include -#include -#include - -#ifndef SASS_AST -#include "ast.hpp" -#endif - -#ifndef SASS_OPERATION -#include "operation.hpp" -#endif - -namespace Sass { - using namespace std; - - class Context; - - class Extend : public Operation_CRTP { - - Context& ctx; - multimap& extensions; - - void fallback_impl(AST_Node* n) { }; - - public: - Extend(Context&, multimap&); - virtual ~Extend() { } - - using Operation::operator(); - - void operator()(Block*); - void operator()(Ruleset*); - void operator()(Media_Block*); - void operator()(At_Rule*); - - Selector_Group* generate_extension(Selector_Combination*, Selector_Combination*); - - template - void fallback(U x) { return fallback_impl(x); } - }; - - -} \ No newline at end of file diff --git a/src/file.cpp b/src/file.cpp deleted file mode 100644 index 6a17204de..000000000 --- a/src/file.cpp +++ /dev/null @@ -1,77 +0,0 @@ -#include -#include -#include "file.hpp" -#include "context.hpp" - -namespace Sass { - namespace File { - using namespace std; - - string base_name(string path) - { - size_t pos = path.find_last_of('/'); - if (pos == string::npos) return path; - else return path.substr(pos+1); - } - - string dir_name(string path) - { - size_t pos = path.find_last_of('/'); - if (pos == string::npos) return ""; - else return path.substr(0, pos+1); - } - - string join_paths(string l, string r) - { - if (l.empty()) return r; - if (r.empty()) return l; - if (r[0] == '/') return r; - - if (l[l.length()-1] != '/') l += '/'; - return l + r; - } - - char* resolve_and_load(string path) - { - // Resolution order for ambiguous imports: - // (1) filename as given - // (2) underscore + given - // (3) underscore + given + extension - // (4) given + extension - char* contents = 0; - // if the file isn't found with the given filename ... - if (!(contents = read_file(path))) { - string dir(dir_name(path)); - string base(base_name(path)); - string _base("_" + base); - // if the file isn't found with '_' + filename ... - if (!(contents = read_file(dir + _base))) { - string _base_scss(_base + ".scss"); - // if the file isn't found with '_' + filename + ".scss" ... - if (!(contents = read_file(dir + _base_scss))) { - string base_scss(base + ".scss"); - // try filename + ".scss" as the last resort - contents = read_file(dir + base_scss); - } - } - } - return contents; - } - - char* read_file(string path) - { - ifstream file(path.c_str(), ios::in | ios::binary | ios::ate); - char* contents = 0; - if (file.is_open()) { - size_t size = file.tellg(); - contents = new char[size + 1]; // extra byte for the null char - file.seekg(0, ios::beg); - file.read(contents, size); - contents[size] = '\0'; - file.close(); - } - return contents; - } - - } -} \ No newline at end of file diff --git a/src/file.hpp b/src/file.hpp deleted file mode 100644 index db29e3991..000000000 --- a/src/file.hpp +++ /dev/null @@ -1,13 +0,0 @@ -#include - -namespace Sass { - using namespace std; - class Context; - namespace File { - string base_name(string); - string dir_name(string); - string join_paths(string, string); - char* resolve_and_load(string path); - char* read_file(string path); - } -} \ No newline at end of file diff --git a/src/functions.cpp b/src/functions.cpp deleted file mode 100644 index 4d395c8d1..000000000 --- a/src/functions.cpp +++ /dev/null @@ -1,949 +0,0 @@ -#include "functions.hpp" -#include "ast.hpp" -#include "context.hpp" -#include "backtrace.hpp" -#include "parser.hpp" -#include "constants.hpp" -#include "to_string.hpp" -#include "inspect.hpp" -#include "eval.hpp" - -#include -#include -#include -#include -#include - -#define ARG(argname, argtype) get_arg(argname, env, sig, path, line, backtrace) -#define ARGR(argname, argtype, lo, hi) get_arg_r(argname, env, sig, path, line, lo, hi, backtrace) - -namespace Sass { - using std::stringstream; - using std::endl; - - Definition* make_native_function(Signature sig, Native_Function f, Context& ctx) - { - Parser sig_parser = Parser::from_c_str(sig, ctx, "[built-in function]", 0); - sig_parser.lex(); - string name(sig_parser.lexed); - Parameters* params = sig_parser.parse_parameters(); - return new (ctx.mem) Definition("[built-in function]", - 0, - sig, - name, - params, - f, - false); - } - - Definition* make_c_function(Signature sig, Sass_C_Function f, Context& ctx) - { - Parser sig_parser = Parser::from_c_str(sig, ctx, "[c function]", 0); - sig_parser.lex(); - string name(sig_parser.lexed); - Parameters* params = sig_parser.parse_parameters(); - return new (ctx.mem) Definition("[c function]", - 0, - sig, - name, - params, - f, - false, true); - } - - namespace Functions { - - template - T* get_arg(const string& argname, Env& env, Signature sig, const string& path, size_t line, Backtrace* backtrace) - { - // Minimal error handling -- the expectation is that built-ins will be written correctly! - T* val = dynamic_cast(env[argname]); - if (!val) { - string msg("argument `"); - msg += argname; - msg += "` of `"; - msg += sig; - msg += "` must be a "; - msg += T::type_name(); - error(msg, path, line, backtrace); - } - return val; - } - - Number* get_arg_r(const string& argname, Env& env, Signature sig, const string& path, size_t line, double lo, double hi, Backtrace* backtrace) - { - // Minimal error handling -- the expectation is that built-ins will be written correctly! - Number* val = get_arg(argname, env, sig, path, line, backtrace); - double v = val->value(); - if (!(lo <= v && v <= hi)) { - stringstream msg; - msg << "argument `" << argname << "` of `" << sig << "` must be between "; - msg << lo << " and " << hi; - error(msg.str(), path, line, backtrace); - } - return val; - } - - //////////////// - // RGB FUNCTIONS - //////////////// - - Signature rgb_sig = "rgb($red, $green, $blue)"; - BUILT_IN(rgb) - { - return new (ctx.mem) Color(path, - line, - ARGR("$red", Number, 0, 255)->value(), - ARGR("$green", Number, 0, 255)->value(), - ARGR("$blue", Number, 0, 255)->value()); - } - - Signature rgba_4_sig = "rgba($red, $green, $blue, $alpha)"; - BUILT_IN(rgba_4) - { - return new (ctx.mem) Color(path, - line, - ARGR("$red", Number, 0, 255)->value(), - ARGR("$green", Number, 0, 255)->value(), - ARGR("$blue", Number, 0, 255)->value(), - ARGR("$alpha", Number, 0, 1)->value()); - } - - Signature rgba_2_sig = "rgba($color, $alpha)"; - BUILT_IN(rgba_2) - { - Color* c_arg = ARG("$color", Color); - Color* new_c = new (ctx.mem) Color(*c_arg); - new_c->a(ARGR("$alpha", Number, 0, 1)->value()); - return new_c; - } - - Signature red_sig = "red($color)"; - BUILT_IN(red) - { return new (ctx.mem) Number(path, line, ARG("$color", Color)->r()); } - - Signature green_sig = "green($color)"; - BUILT_IN(green) - { return new (ctx.mem) Number(path, line, ARG("$color", Color)->g()); } - - Signature blue_sig = "blue($color)"; - BUILT_IN(blue) - { return new (ctx.mem) Number(path, line, ARG("$color", Color)->b()); } - - Signature mix_sig = "mix($color-1, $color-2, $weight: 50%)"; - BUILT_IN(mix) - { - Color* color1 = ARG("$color-1", Color); - Color* color2 = ARG("$color-2", Color); - Number* weight = ARGR("$weight", Number, 0, 100); - - double p = weight->value()/100; - double w = 2*p - 1; - double a = color1->a() - color2->a(); - - double w1 = (((w * a == -1) ? w : (w + a)/(1 + w*a)) + 1)/2.0; - double w2 = 1 - w1; - - return new (ctx.mem) Color(path, - line, - std::floor(w1*color1->r() + w2*color2->r()), - std::floor(w1*color1->g() + w2*color2->g()), - std::floor(w1*color1->b() + w2*color2->b()), - color1->a()*p + color2->a()*(1-p)); - } - - //////////////// - // HSL FUNCTIONS - //////////////// - - // RGB to HSL helper function - struct HSL { double h; double s; double l; }; - HSL rgb_to_hsl(double r, double g, double b) - { - r /= 255.0; g /= 255.0; b /= 255.0; - - double max = std::max(r, std::max(g, b)); - double min = std::min(r, std::min(g, b)); - double del = max - min; - - double h = 0, s = 0, l = (max + min)/2; - - if (max == min) { - h = s = 0; // achromatic - } - else { - if (l < 0.5) s = del / (max + min); - else s = del / (2.0 - max - min); - - double dr = (((max - r)/6.0) + (del/2.0))/del; - double dg = (((max - g)/6.0) + (del/2.0))/del; - double db = (((max - b)/6.0) + (del/2.0))/del; - - if (r == max) h = db - dg; - else if (g == max) h = (1.0/3.0) + dr - db; - else if (b == max) h = (2.0/3.0) + dg - dr; - - if (h < 0) h += 1; - else if (h > 1) h -= 1; - } - HSL hsl_struct; - hsl_struct.h = static_cast(h*360)%360; - hsl_struct.s = s*100; - hsl_struct.l = l*100; - return hsl_struct; - } - - // hue to RGB helper function - double h_to_rgb(double m1, double m2, double h) { - if (h < 0) h += 1; - if (h > 1) h -= 1; - if (h*6.0 < 1) return m1 + (m2 - m1)*h*6; - if (h*2.0 < 1) return m2; - if (h*3.0 < 2) return m1 + (m2 - m1) * (2.0/3.0 - h)*6; - return m1; - } - - Color* hsla_impl(double h, double s, double l, double a, Context& ctx, const string& path, size_t line) - { - h = static_cast(((static_cast(h) % 360) + 360) % 360) / 360.0; - s = (s < 0) ? 0 : - (s > 100) ? 100 : - s; - l = (l < 0) ? 0 : - (l > 100) ? 100 : - l; - s /= 100.0; - l /= 100.0; - - double m2; - if (l <= 0.5) m2 = l*(s+1.0); - else m2 = l+s-l*s; - double m1 = l*2-m2; - // round the results -- consider moving this into the Color constructor - double r = std::floor(h_to_rgb(m1, m2, h+1.0/3.0) * 255.0 + 0.5); - double g = std::floor(h_to_rgb(m1, m2, h) * 255.0 + 0.5); - double b = std::floor(h_to_rgb(m1, m2, h-1.0/3.0) * 255.0 + 0.5); - - return new (ctx.mem) Color(path, line, r, g, b, a); - } - - Signature hsl_sig = "hsl($hue, $saturation, $lightness)"; - BUILT_IN(hsl) - { - return hsla_impl(ARG("$hue", Number)->value(), - ARGR("$saturation", Number, 0, 100)->value(), - ARGR("$lightness", Number, 0, 100)->value(), - 1.0, - ctx, - path, - line); - } - - Signature hsla_sig = "hsla($hue, $saturation, $lightness, $alpha)"; - BUILT_IN(hsla) - { - return hsla_impl(ARG("$hue", Number)->value(), - ARGR("$saturation", Number, 0, 100)->value(), - ARGR("$lightness", Number, 0, 100)->value(), - ARGR("$alpha", Number, 0, 1)->value(), - ctx, - path, - line); - } - - Signature hue_sig = "hue($color)"; - BUILT_IN(hue) - { - Color* rgb_color = ARG("$color", Color); - HSL hsl_color = rgb_to_hsl(rgb_color->r(), - rgb_color->g(), - rgb_color->b()); - return new (ctx.mem) Number(path, line, hsl_color.h, "deg"); - } - - Signature saturation_sig = "saturation($color)"; - BUILT_IN(saturation) - { - Color* rgb_color = ARG("$color", Color); - HSL hsl_color = rgb_to_hsl(rgb_color->r(), - rgb_color->g(), - rgb_color->b()); - return new (ctx.mem) Number(path, line, hsl_color.s, "%"); - } - - Signature lightness_sig = "lightness($color)"; - BUILT_IN(lightness) - { - Color* rgb_color = ARG("$color", Color); - HSL hsl_color = rgb_to_hsl(rgb_color->r(), - rgb_color->g(), - rgb_color->b()); - return new (ctx.mem) Number(path, line, hsl_color.l, "%"); - } - - Signature adjust_hue_sig = "adjust-hue($color, $degrees)"; - BUILT_IN(adjust_hue) - { - Color* rgb_color = ARG("$color", Color); - Number* degrees = ARG("$degrees", Number); - HSL hsl_color = rgb_to_hsl(rgb_color->r(), - rgb_color->g(), - rgb_color->b()); - return hsla_impl(hsl_color.h + degrees->value(), - hsl_color.s, - hsl_color.l, - rgb_color->a(), - ctx, - path, - line); - } - - Signature lighten_sig = "lighten($color, $amount)"; - BUILT_IN(lighten) - { - Color* rgb_color = ARG("$color", Color); - Number* amount = ARGR("$amount", Number, 0, 100); - HSL hsl_color = rgb_to_hsl(rgb_color->r(), - rgb_color->g(), - rgb_color->b()); - return hsla_impl(hsl_color.h, - hsl_color.s, - hsl_color.l + amount->value(), - rgb_color->a(), - ctx, - path, - line); - } - - Signature darken_sig = "darken($color, $amount)"; - BUILT_IN(darken) - { - Color* rgb_color = ARG("$color", Color); - Number* amount = ARGR("$amount", Number, 0, 100); - HSL hsl_color = rgb_to_hsl(rgb_color->r(), - rgb_color->g(), - rgb_color->b()); - return hsla_impl(hsl_color.h, - hsl_color.s, - hsl_color.l - amount->value(), - rgb_color->a(), - ctx, - path, - line); - } - - Signature saturate_sig = "saturate($color, $amount)"; - BUILT_IN(saturate) - { - Color* rgb_color = ARG("$color", Color); - Number* amount = ARGR("$amount", Number, 0, 100); - HSL hsl_color = rgb_to_hsl(rgb_color->r(), - rgb_color->g(), - rgb_color->b()); - return hsla_impl(hsl_color.h, - hsl_color.s + amount->value(), - hsl_color.l, - rgb_color->a(), - ctx, - path, - line); - } - - Signature desaturate_sig = "desaturate($color, $amount)"; - BUILT_IN(desaturate) - { - Color* rgb_color = ARG("$color", Color); - Number* amount = ARGR("$amount", Number, 0, 100); - HSL hsl_color = rgb_to_hsl(rgb_color->r(), - rgb_color->g(), - rgb_color->b()); - return hsla_impl(hsl_color.h, - hsl_color.s - amount->value(), - hsl_color.l, - rgb_color->a(), - ctx, - path, - line); - } - - Signature grayscale_sig = "grayscale($color)"; - BUILT_IN(grayscale) - { - Color* rgb_color = ARG("$color", Color); - HSL hsl_color = rgb_to_hsl(rgb_color->r(), - rgb_color->g(), - rgb_color->b()); - return hsla_impl(hsl_color.h, - 0.0, - hsl_color.l, - rgb_color->a(), - ctx, - path, - line); - } - - Signature complement_sig = "complement($color)"; - BUILT_IN(complement) - { - Color* rgb_color = ARG("$color", Color); - HSL hsl_color = rgb_to_hsl(rgb_color->r(), - rgb_color->g(), - rgb_color->b()); - return hsla_impl(hsl_color.h - 180.0, - hsl_color.s, - hsl_color.l, - rgb_color->a(), - ctx, - path, - line); - } - - Signature invert_sig = "invert($color)"; - BUILT_IN(invert) - { - Color* rgb_color = ARG("$color", Color); - return new (ctx.mem) Color(path, - line, - 255 - rgb_color->r(), - 255 - rgb_color->g(), - 255 - rgb_color->b(), - rgb_color->a()); - } - - //////////////////// - // OPACITY FUNCTIONS - //////////////////// - Signature alpha_sig = "alpha($color)"; - Signature opacity_sig = "opacity($color)"; - BUILT_IN(alpha) - { return new (ctx.mem) Number(path, line, ARG("$color", Color)->a()); } - - Signature opacify_sig = "opacify($color, $amount)"; - Signature fade_in_sig = "fade-in($color, $amount)"; - BUILT_IN(opacify) - { - Color* color = ARG("$color", Color); - double alpha = color->a() + ARGR("$amount", Number, 0, 1)->value(); - return new (ctx.mem) Color(path, - line, - color->r(), - color->g(), - color->b(), - alpha > 1.0 ? 1.0 : alpha); - } - - Signature transparentize_sig = "transparentize($color, $amount)"; - Signature fade_out_sig = "fade-out($color, $amount)"; - BUILT_IN(transparentize) - { - Color* color = ARG("$color", Color); - double alpha = color->a() - ARGR("$amount", Number, 0, 1)->value(); - return new (ctx.mem) Color(path, - line, - color->r(), - color->g(), - color->b(), - alpha < 0.0 ? 0.0 : alpha); - } - - //////////////////////// - // OTHER COLOR FUNCTIONS - //////////////////////// - - Signature adjust_color_sig = "adjust-color($color, $red: false, $green: false, $blue: false, $hue: false, $saturation: false, $lightness: false, $alpha: false)"; - BUILT_IN(adjust_color) - { - Color* color = ARG("$color", Color); - Number* r = dynamic_cast(env["$red"]); - Number* g = dynamic_cast(env["$green"]); - Number* b = dynamic_cast(env["$blue"]); - Number* h = dynamic_cast(env["$hue"]); - Number* s = dynamic_cast(env["$saturation"]); - Number* l = dynamic_cast(env["$lightness"]); - Number* a = dynamic_cast(env["$alpha"]); - - bool rgb = r || g || b; - bool hsl = h || s || l; - - if (rgb && hsl) { - error("cannot specify both RGB and HSL values for `adjust-color`", path, line); - } - if (rgb) { - return new (ctx.mem) Color(path, - line, - color->r() + (r ? r->value() : 0), - color->g() + (g ? g->value() : 0), - color->b() + (b ? b->value() : 0), - color->a() + (a ? a->value() : 0)); - } - if (hsl) { - HSL hsl_struct = rgb_to_hsl(color->r(), color->g(), color->b()); - return hsla_impl(hsl_struct.h + (h ? h->value() : 0), - hsl_struct.s + (s ? s->value() : 0), - hsl_struct.l + (l ? l->value() : 0), - color->a() + (a ? a->value() : 0), - ctx, - path, - line); - } - if (a) { - return new (ctx.mem) Color(path, - line, - color->r(), - color->g(), - color->b(), - color->a() + (a ? a->value() : 0)); - } - error("not enough arguments for `adjust-color`", path, line); - // unreachable - return color; - } - - Signature scale_color_sig = "scale-color($color, $red: false, $green: false, $blue: false, $hue: false, $saturation: false, $lightness: false, $alpha: false)"; - BUILT_IN(scale_color) - { - Color* color = ARG("$color", Color); - Number* r = dynamic_cast(env["$red"]); - Number* g = dynamic_cast(env["$green"]); - Number* b = dynamic_cast(env["$blue"]); - Number* h = dynamic_cast(env["$hue"]); - Number* s = dynamic_cast(env["$saturation"]); - Number* l = dynamic_cast(env["$lightness"]); - Number* a = dynamic_cast(env["$alpha"]); - - bool rgb = r || g || b; - bool hsl = h || s || l; - - if (rgb && hsl) { - error("cannot specify both RGB and HSL values for `scale-color`", path, line); - } - if (rgb) { - double rscale = (r ? ARGR("$red", Number, -100.0, 100.0)->value() : 0.0) / 100.0; - double gscale = (g ? ARGR("$green", Number, -100.0, 100.0)->value() : 0.0) / 100.0; - double bscale = (b ? ARGR("$blue", Number, -100.0, 100.0)->value() : 0.0) / 100.0; - double ascale = (a ? ARGR("$alpha", Number, -100.0, 100.0)->value() : 0.0) / 100.0; - return new (ctx.mem) Color(path, - line, - color->r() + rscale * (rscale > 0.0 ? 255 - color->r() : color->r()), - color->g() + gscale * (gscale > 0.0 ? 255 - color->g() : color->g()), - color->b() + bscale * (bscale > 0.0 ? 255 - color->b() : color->b()), - color->a() + ascale * (ascale > 0.0 ? 1.0 - color->a() : color->a())); - } - if (hsl) { - double hscale = (h ? ARGR("$hue", Number, -100.0, 100.0)->value() : 0.0) / 100.0; - double sscale = (s ? ARGR("$saturation", Number, -100.0, 100.0)->value() : 0.0) / 100.0; - double lscale = (l ? ARGR("$lightness", Number, -100.0, 100.0)->value() : 0.0) / 100.0; - double ascale = (a ? ARGR("$alpha", Number, -100.0, 100.0)->value() : 0.0) / 100.0; - HSL hsl_struct = rgb_to_hsl(color->r(), color->g(), color->b()); - hsl_struct.h += hscale * (hscale > 0.0 ? 360.0 - hsl_struct.h : hsl_struct.h); - hsl_struct.s += sscale * (sscale > 0.0 ? 100.0 - hsl_struct.s : hsl_struct.s); - hsl_struct.l += lscale * (lscale > 0.0 ? 100.0 - hsl_struct.l : hsl_struct.l); - double alpha = color->a() + ascale * (ascale > 0.0 ? 1.0 - color->a() : color->r()); - return hsla_impl(hsl_struct.h, hsl_struct.s, hsl_struct.l, alpha, ctx, path, line); - } - if (a) { - double ascale = (a ? ARGR("$alpha", Number, -100.0, 100.0)->value() : 0.0) / 100.0; - return new (ctx.mem) Color(path, - line, - color->r(), - color->g(), - color->b(), - color->a() + ascale * (ascale > 0.0 ? 1.0 - color->a() : color->a())); - } - error("not enough arguments for `scale-color`", path, line); - // unreachable - return color; - } - - Signature change_color_sig = "change-color($color, $red: false, $green: false, $blue: false, $hue: false, $saturation: false, $lightness: false, $alpha: false)"; - BUILT_IN(change_color) - { - Color* color = ARG("$color", Color); - Number* r = dynamic_cast(env["$red"]); - Number* g = dynamic_cast(env["$green"]); - Number* b = dynamic_cast(env["$blue"]); - Number* h = dynamic_cast(env["$hue"]); - Number* s = dynamic_cast(env["$saturation"]); - Number* l = dynamic_cast(env["$lightness"]); - Number* a = dynamic_cast(env["$alpha"]); - - bool rgb = r || g || b; - bool hsl = h || s || l; - - if (rgb && hsl) { - error("cannot specify both RGB and HSL values for `change-color`", path, line); - } - if (rgb) { - return new (ctx.mem) Color(path, - line, - r ? ARGR("$red", Number, 0, 255)->value() : color->r(), - g ? ARGR("$green", Number, 0, 255)->value() : color->g(), - b ? ARGR("$blue", Number, 0, 255)->value() : color->b(), - a ? ARGR("$alpha", Number, 0, 255)->value() : color->a()); - } - if (hsl) { - HSL hsl_struct = rgb_to_hsl(color->r(), color->g(), color->b()); - if (h) hsl_struct.h = static_cast(((static_cast(h->value()) % 360) + 360) % 360) / 360.0; - if (s) hsl_struct.s = ARGR("$saturation", Number, 0, 100)->value(); - if (l) hsl_struct.l = ARGR("$lightness", Number, 0, 100)->value(); - double alpha = a ? ARGR("$alpha", Number, 0, 1.0)->value() : color->a(); - return hsla_impl(hsl_struct.h, hsl_struct.s, hsl_struct.l, alpha, ctx, path, line); - } - if (a) { - double alpha = a ? ARGR("$alpha", Number, 0, 1.0)->value() : color->a(); - return new (ctx.mem) Color(path, - line, - color->r(), - color->g(), - color->b(), - alpha); - } - error("not enough arguments for `change-color`", path, line); - // unreachable - return color; - } - - template - static double cap_channel(double c) { - if (c > range) return range; - else if (c < 0) return 0; - else return c; - } - - Signature ie_hex_str_sig = "ie-hex-str($color)"; - BUILT_IN(ie_hex_str) - { - Color* c = ARG("$color", Color); - double r = cap_channel<0xff>(c->r()); - double g = cap_channel<0xff>(c->g()); - double b = cap_channel<0xff>(c->b()); - double a = cap_channel<1> (c->a()) * 255; - - stringstream ss; - ss << '#' << std::setw(2) << std::setfill('0'); - ss << std::hex << std::setw(2) << static_cast(std::floor(a+0.5)); - ss << std::hex << std::setw(2) << static_cast(std::floor(r+0.5)); - ss << std::hex << std::setw(2) << static_cast(std::floor(g+0.5)); - ss << std::hex << std::setw(2) << static_cast(std::floor(b+0.5)); - - string result(ss.str()); - for (size_t i = 0, L = result.length(); i < L; ++i) { - result[i] = std::toupper(result[i]); - } - return new (ctx.mem) String_Constant(path, line, result); - } - - /////////////////// - // STRING FUNCTIONS - /////////////////// - - Signature unquote_sig = "unquote($string)"; - BUILT_IN(sass_unquote) - { - To_String to_string; - AST_Node* arg = env["$string"]; - string str(unquote(arg->perform(&to_string))); - String_Constant* result = new (ctx.mem) String_Constant(path, line, str); - result->is_delayed(true); - return result; - } - - Signature quote_sig = "quote($string)"; - BUILT_IN(sass_quote) - { - To_String to_string; - AST_Node* arg = env["$string"]; - string str(quote(arg->perform(&to_string), '"')); - String_Constant* result = new (ctx.mem) String_Constant(path, line, str); - result->is_delayed(true); - return result; - } - - /////////////////// - // NUMBER FUNCTIONS - /////////////////// - - Signature percentage_sig = "percentage($value)"; - BUILT_IN(percentage) - { - Number* n = ARG("$value", Number); - if (!n->is_unitless()) error("argument $value of `" + string(sig) + "` must be unitless", path, line); - return new (ctx.mem) Number(path, line, n->value() * 100, "%"); - } - - Signature round_sig = "round($value)"; - BUILT_IN(round) - { - Number* n = ARG("$value", Number); - Number* r = new (ctx.mem) Number(*n); - r->path(path); - r->line(line); - r->value(std::floor(r->value() + 0.5)); - return r; - } - - Signature ceil_sig = "ceil($value)"; - BUILT_IN(ceil) - { - Number* n = ARG("$value", Number); - Number* r = new (ctx.mem) Number(*n); - r->path(path); - r->line(line); - r->value(std::ceil(r->value())); - return r; - } - - Signature floor_sig = "floor($value)"; - BUILT_IN(floor) - { - Number* n = ARG("$value", Number); - Number* r = new (ctx.mem) Number(*n); - r->path(path); - r->line(line); - r->value(std::floor(r->value())); - return r; - } - - Signature abs_sig = "abs($value)"; - BUILT_IN(abs) - { - Number* n = ARG("$value", Number); - Number* r = new (ctx.mem) Number(*n); - r->path(path); - r->line(line); - r->value(std::abs(r->value())); - return r; - } - - Signature min_sig = "min($x1, $x2...)"; - BUILT_IN(min) - { - Number* x1 = ARG("$x1", Number); - List* arglist = ARG("$x2", List); - Number* least = x1; - for (size_t i = 0, L = arglist->length(); i < L; ++i) { - Number* xi = dynamic_cast((*arglist)[i]); - if (!xi) error("`" + string(sig) + "` only takes numeric arguments", path, line); - if (lt(xi, least, ctx)) least = xi; - } - return least; - } - - Signature max_sig = "max($x2, $x2...)"; - BUILT_IN(max) - { - Number* x1 = ARG("$x1", Number); - List* arglist = ARG("$x2", List); - Number* greatest = x1; - for (size_t i = 0, L = arglist->length(); i < L; ++i) { - Number* xi = dynamic_cast((*arglist)[i]); - if (!xi) error("`" + string(sig) + "` only takes numeric arguments", path, line); - if (lt(greatest, xi, ctx)) greatest = xi; - } - return greatest; - } - - ///////////////// - // LIST FUNCTIONS - ///////////////// - - Signature length_sig = "length($list)"; - BUILT_IN(length) - { - List* list = dynamic_cast(env["$list"]); - return new (ctx.mem) Number(path, - line, - list ? list->length() : 1); - } - - Signature nth_sig = "nth($list, $n)"; - BUILT_IN(nth) - { - List* l = dynamic_cast(env["$list"]); - Number* n = ARG("$n", Number); - if (!l) { - l = new (ctx.mem) List(path, line, 1); - *l << ARG("$list", Expression); - } - if (l->empty()) error("argument `$list` of `" + string(sig) + "` must not be empty", path, line); - if (n->value() < 1) error("argument `$n` of `" + string(sig) + "` must be greater than or equal to 1", path, line); - return (*l)[std::floor(n->value() - 1)]; - } - - Signature index_sig = "index($list, $value)"; - BUILT_IN(index) - { - List* l = dynamic_cast(env["$list"]); - Expression* v = ARG("$value", Expression); - if (!l) { - l = new (ctx.mem) List(path, line, 1); - *l << ARG("$list", Expression); - } - for (size_t i = 0, L = l->length(); i < L; ++i) { - if (eq((*l)[i], v, ctx)) return new (ctx.mem) Number(path, line, i+1); - } - return new (ctx.mem) Boolean(path, line, false); - } - - Signature join_sig = "join($list1, $list2, $separator: auto)"; - BUILT_IN(join) - { - List* l1 = dynamic_cast(env["$list1"]); - List* l2 = dynamic_cast(env["$list2"]); - String_Constant* sep = ARG("$separator", String_Constant); - List::Separator sep_val = (l1 ? l1->separator() : List::SPACE); - if (!l1) { - l1 = new (ctx.mem) List(path, line, 1); - *l1 << ARG("$list1", Expression); - sep_val = (l2 ? l2->separator() : List::SPACE); - } - if (!l2) { - l2 = new (ctx.mem) List(path, line, 1); - *l2 << ARG("$list2", Expression); - } - size_t len = l1->length() + l2->length(); - string sep_str = unquote(sep->value()); - if (sep_str == "space") sep_val = List::SPACE; - else if (sep_str == "comma") sep_val = List::COMMA; - else if (sep_str != "auto") error("argument `$separator` of `" + string(sig) + "` must be `space`, `comma`, or `auto`", path, line); - List* result = new (ctx.mem) List(path, line, len, sep_val); - *result += l1; - *result += l2; - return result; - } - - Signature append_sig = "append($list, $val, $separator: auto)"; - BUILT_IN(append) - { - List* l = dynamic_cast(env["$list"]); - Expression* v = ARG("$val", Expression); - String_Constant* sep = ARG("$separator", String_Constant); - if (!l) { - l = new (ctx.mem) List(path, line, 1); - *l << ARG("$list", Expression); - } - List* result = new (ctx.mem) List(path, line, l->length() + 1); - string sep_str(unquote(sep->value())); - if (sep_str == "space") result->separator(List::SPACE); - else if (sep_str == "comma") result->separator(List::COMMA); - else if (sep_str != "auto") error("argument `$separator` of `" + string(sig) + "` must be `space`, `comma`, or `auto`", path, line); - *result += l; - *result << v; - return result; - } - - Signature zip_sig = "zip($lists...)"; - BUILT_IN(zip) - { - List* arglist = new (ctx.mem) List(*ARG("$lists", List)); - size_t shortest = 0; - for (size_t i = 0, L = arglist->length(); i < L; ++i) { - List* ith = dynamic_cast((*arglist)[i]); - if (!ith) { - ith = new (ctx.mem) List(path, line, 1); - *ith << (*arglist)[i]; - (*arglist)[i] = ith; - } - shortest = (i ? std::min(shortest, ith->length()) : ith->length()); - } - List* zippers = new (ctx.mem) List(path, line, shortest, List::COMMA); - size_t L = arglist->length(); - for (size_t i = 0; i < shortest; ++i) { - List* zipper = new (ctx.mem) List(path, line, L); - for (size_t j = 0; j < L; ++j) { - *zipper << (*static_cast((*arglist)[j]))[i]; - } - *zippers << zipper; - } - return zippers; - } - - Signature compact_sig = "compact($values...)"; - BUILT_IN(compact) - { - List* arglist = ARG("$values", List); - if (arglist->length() == 1) { - Expression* the_arg = (*arglist)[0]; - arglist = dynamic_cast(the_arg); - if (!arglist) { - List* result = new (ctx.mem) List(path, line, 1, List::COMMA); - *result << the_arg; - return result; - } - } - List* result = new (ctx.mem) List(path, line, 0, List::COMMA); - for (size_t i = 0, L = arglist->length(); i < L; ++i) { - Boolean* ith = dynamic_cast((*arglist)[i]); - if (ith && ith->value() == false) continue; - *result << (*arglist)[i]; - } - return result; - } - - ////////////////////////// - // INTROSPECTION FUNCTIONS - ////////////////////////// - - Signature type_of_sig = "type-of($value)"; - BUILT_IN(type_of) - { - Expression* v = ARG("$value", Expression); - if (v->concrete_type() == Expression::STRING) { - To_String to_string; - string str(v->perform(&to_string)); - if (ctx.names_to_colors.count(str)) { - return new (ctx.mem) String_Constant(path, line, "color"); - } - } - return new (ctx.mem) String_Constant(path, line, ARG("$value", Expression)->type()); - } - - Signature unit_sig = "unit($number)"; - BUILT_IN(unit) - { return new (ctx.mem) String_Constant(path, line, quote(ARG("$number", Number)->unit(), '"')); } - - Signature unitless_sig = "unitless($number)"; - BUILT_IN(unitless) - { return new (ctx.mem) Boolean(path, line, ARG("$number", Number)->is_unitless()); } - - Signature comparable_sig = "comparable($number-1, $number-2)"; - BUILT_IN(comparable) - { - Number* n1 = ARG("$number-1", Number); - Number* n2 = ARG("$number-2", Number); - if (n1->is_unitless() || n2->is_unitless()) { - return new (ctx.mem) Boolean(path, line, true); - } - Number tmp_n2(*n2); - tmp_n2.normalize(n1->find_convertible_unit()); - return new (ctx.mem) Boolean(path, line, n1->unit() == tmp_n2.unit()); - } - - //////////////////// - // BOOLEAN FUNCTIONS - //////////////////// - - Signature not_sig = "not($value)"; - BUILT_IN(sass_not) - { return new (ctx.mem) Boolean(path, line, ARG("$value", Expression)->is_false()); } - - Signature if_sig = "if($condition, $if-true, $if-false)"; - BUILT_IN(sass_if) - { return ARG("$condition", Expression)->is_false() ? ARG("$if-false", Expression) : ARG("$if-true", Expression); } - - //////////////// - // URL FUNCTIONS - //////////////// - - Signature image_url_sig = "image-url($path, $only-path: false, $cache-buster: false)"; - BUILT_IN(image_url) - { - String_Constant* ipath = ARG("$path", String_Constant); - bool only_path = !ARG("$only-path", Expression)->is_false(); - string full_path(quote(ctx.image_path + unquote(ipath->value()), '"')); - if (!only_path) full_path = "url(" + full_path + ")"; - return new (ctx.mem) String_Constant(path, line, full_path); - } - - } -} \ No newline at end of file diff --git a/src/functions.hpp b/src/functions.hpp deleted file mode 100644 index c271fc410..000000000 --- a/src/functions.hpp +++ /dev/null @@ -1,137 +0,0 @@ -#define SASS_FUNCTIONS - -#ifndef SASS_ENVIRONMENT -#include "environment.hpp" -#endif - -#ifndef SASS -#include "sass.h" -#endif - -#include - -#define BUILT_IN(name) Expression*\ -name(Env& env, Context& ctx, Signature sig, const string& path, size_t line, Backtrace* backtrace) - -namespace Sass { - class Context; - class Backtrace; - class AST_Node; - class Expression; - class Definition; - typedef Environment Env; - typedef const char* Signature; - typedef Expression* (*Native_Function)(Env&, Context&, Signature, const string&, size_t, Backtrace*); - - Definition* make_native_function(Signature, Native_Function, Context&); - Definition* make_c_function(Signature sig, Sass_C_Function f, Context& ctx); - - namespace Functions { - - extern Signature rgb_sig; - extern Signature rgba_4_sig; - extern Signature rgba_2_sig; - extern Signature red_sig; - extern Signature green_sig; - extern Signature blue_sig; - extern Signature mix_sig; - extern Signature hsl_sig; - extern Signature hsla_sig; - extern Signature hue_sig; - extern Signature saturation_sig; - extern Signature lightness_sig; - extern Signature adjust_hue_sig; - extern Signature lighten_sig; - extern Signature darken_sig; - extern Signature saturate_sig; - extern Signature desaturate_sig; - extern Signature grayscale_sig; - extern Signature complement_sig; - extern Signature invert_sig; - extern Signature alpha_sig; - extern Signature opacity_sig; - extern Signature opacify_sig; - extern Signature fade_in_sig; - extern Signature transparentize_sig; - extern Signature fade_out_sig; - extern Signature adjust_color_sig; - extern Signature scale_color_sig; - extern Signature change_color_sig; - extern Signature ie_hex_str_sig; - extern Signature unquote_sig; - extern Signature quote_sig; - extern Signature percentage_sig; - extern Signature round_sig; - extern Signature ceil_sig; - extern Signature floor_sig; - extern Signature abs_sig; - extern Signature min_sig; - extern Signature max_sig; - extern Signature length_sig; - extern Signature nth_sig; - extern Signature index_sig; - extern Signature join_sig; - extern Signature append_sig; - extern Signature zip_sig; - extern Signature compact_sig; - extern Signature type_of_sig; - extern Signature unit_sig; - extern Signature unitless_sig; - extern Signature comparable_sig; - extern Signature not_sig; - extern Signature if_sig; - extern Signature image_url_sig; - - BUILT_IN(rgb); - BUILT_IN(rgba_4); - BUILT_IN(rgba_2); - BUILT_IN(red); - BUILT_IN(green); - BUILT_IN(blue); - BUILT_IN(mix); - BUILT_IN(hsl); - BUILT_IN(hsla); - BUILT_IN(hue); - BUILT_IN(saturation); - BUILT_IN(lightness); - BUILT_IN(adjust_hue); - BUILT_IN(lighten); - BUILT_IN(darken); - BUILT_IN(saturate); - BUILT_IN(desaturate); - BUILT_IN(grayscale); - BUILT_IN(complement); - BUILT_IN(invert); - BUILT_IN(alpha); - BUILT_IN(opacify); - BUILT_IN(transparentize); - BUILT_IN(adjust_color); - BUILT_IN(scale_color); - BUILT_IN(change_color); - BUILT_IN(ie_hex_str); - BUILT_IN(sass_unquote); - BUILT_IN(sass_quote); - BUILT_IN(percentage); - BUILT_IN(round); - BUILT_IN(ceil); - BUILT_IN(floor); - BUILT_IN(abs); - BUILT_IN(min); - BUILT_IN(max); - BUILT_IN(length); - BUILT_IN(nth); - BUILT_IN(index); - BUILT_IN(join); - BUILT_IN(append); - BUILT_IN(zip); - BUILT_IN(compact); - BUILT_IN(type_of); - BUILT_IN(unit); - BUILT_IN(unitless); - BUILT_IN(comparable); - BUILT_IN(sass_not); - BUILT_IN(sass_if); - BUILT_IN(image_url); - - } -} \ No newline at end of file diff --git a/src/inspect.cpp b/src/inspect.cpp deleted file mode 100644 index 5a70d57b0..000000000 --- a/src/inspect.cpp +++ /dev/null @@ -1,604 +0,0 @@ -#include "inspect.hpp" -#include "ast.hpp" -#include -#include -#include - -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(); - buffer += ';'; - } - - void Inspect::operator()(Warning* warning) - { - buffer += "@warn "; - warning->message()->perform(this); - buffer += ';'; - } - - void Inspect::operator()(Comment* comment) - { - comment->text()->perform(this); - } - - void Inspect::operator()(If* cond) - { - buffer += "@if "; - cond->predicate()->perform(this); - cond->consequent()->perform(this); - if (cond->alternative()) { - buffer += '\n'; - indent(); - buffer += "else"; - cond->alternative()->perform(this); - } - } - - void Inspect::operator()(For* loop) - { - buffer += string("@for "); - buffer += loop->variable(); - buffer += " from "; - loop->lower_bound()->perform(this); - buffer += (loop->is_inclusive() ? " through " : " to "); - loop->upper_bound()->perform(this); - loop->block()->perform(this); - } - - void Inspect::operator()(Each* loop) - { - buffer += string("@each "); - buffer += loop->variable(); - buffer += " in "; - loop->list()->perform(this); - loop->block()->perform(this); - } - - void Inspect::operator()(While* loop) - { - buffer += "@while "; - loop->predicate()->perform(this); - loop->block()->perform(this); - } - - void Inspect::operator()(Return* ret) - { - buffer += "@return "; - ret->value()->perform(this); - buffer += ';'; - } - - void Inspect::operator()(Extension* extend) - { - buffer += "@extend "; - extend->selector()->perform(this); - buffer += ';'; - } - - void Inspect::operator()(Definition* def) - { - if (def->type() == Definition::MIXIN) buffer += "@mixin "; - else buffer += "@function "; - buffer += def->name(); - def->parameters()->perform(this); - def->block()->perform(this); - } - - void Inspect::operator()(Mixin_Call* call) - { - buffer += string("@include ") += call->name(); - if (call->arguments()) { - call->arguments()->perform(this); - } - if (call->block()) { - buffer += ' '; - call->block()->perform(this); - } - if (!call->block()) buffer += ';'; - } - - void Inspect::operator()(Content* content) - { - buffer += "@content;"; - } - - void Inspect::operator()(List* list) - { - string sep(list->separator() == List::SPACE ? " " : ", "); - if (list->empty()) return; - Expression* first = (*list)[0]; - bool first_invisible = first->is_invisible(); - if (!first_invisible) first->perform(this); - for (size_t i = 1, L = list->length(); i < L; ++i) { - Expression* next = (*list)[i]; - bool next_invisible = next->is_invisible(); - if (i == 1 && !first_invisible && !next_invisible) buffer += sep; - else if (!next_invisible) buffer += sep; - next->perform(this); - } - } - - void Inspect::operator()(Binary_Expression* expr) - { - expr->left()->perform(this); - switch (expr->type()) { - case Binary_Expression::AND: buffer += " and "; break; - case Binary_Expression::OR: buffer += " or "; break; - case Binary_Expression::EQ: buffer += " == "; break; - case Binary_Expression::NEQ: buffer += " != "; break; - case Binary_Expression::GT: buffer += " > "; break; - case Binary_Expression::GTE: buffer += " >= "; break; - case Binary_Expression::LT: buffer += " < "; break; - case Binary_Expression::LTE: buffer += " <= "; break; - case Binary_Expression::ADD: buffer += " + "; break; - case Binary_Expression::SUB: buffer += " - "; break; - case Binary_Expression::MUL: buffer += " * "; break; - case Binary_Expression::DIV: buffer += "/"; break; - case Binary_Expression::MOD: buffer += " % "; break; - default: break; // shouldn't get here - } - expr->right()->perform(this); - } - - void Inspect::operator()(Unary_Expression* expr) - { - if (expr->type() == Unary_Expression::PLUS) buffer += '+'; - else buffer += '-'; - expr->operand()->perform(this); - } - - void Inspect::operator()(Function_Call* call) - { - buffer += call->name(); - call->arguments()->perform(this); - } - - void Inspect::operator()(Function_Call_Schema* call) - { - call->name()->perform(this); - call->arguments()->perform(this); - } - - void Inspect::operator()(Variable* var) - { - buffer += var->name(); - } - - void Inspect::operator()(Textual* txt) - { - buffer += txt->value(); - } - - // helper functions for serializing numbers - string frac_to_string(double f, size_t p) { - stringstream ss; - ss.setf(ios::fixed, ios::floatfield); - ss.precision(p); - ss << f; - string result(ss.str().substr(f < 0 ? 2 : 1)); - size_t i = result.size() - 1; - while (result[i] == '0') --i; - result = result.substr(0, i+1); - return result; - } - string double_to_string(double d, size_t p) { - stringstream ss; - double ipart; - double fpart = std::modf(d, &ipart); - ss << ipart; - if (fpart != 0) ss << frac_to_string(fpart, 5); - return ss.str(); - } - - void Inspect::operator()(Number* n) - { - // buffer += double_to_string(n->value(), 5); - // buffer += n->unit(); - stringstream ss; - ss.precision(5); - ss << fixed << n->value(); - string d(ss.str()); - for (size_t i = d.length()-1; i >= 0; --i) { - if (d[i] == '0') d.resize(d.length()-1); - else break; - } - if (d[d.length()-1] == '.') d.resize(d.length()-1); - if (n->numerator_units().size() > 1 || n->denominator_units().size() > 0) { - error(d + n->unit() + " is not a valid CSS value", n->path(), n->line()); - } - buffer += d; - buffer += n->unit(); - } - - // helper function for serializing colors - template - static double cap_channel(double c) { - if (c > range) return range; - else if (c < 0) return 0; - else return c; - } - - void Inspect::operator()(Color* c) - { - stringstream ss; - double r = cap_channel<0xff>(c->r()); - double g = cap_channel<0xff>(c->g()); - double b = cap_channel<0xff>(c->b()); - double a = cap_channel<1> (c->a()); - // int numval = r * 0x10000; - // numval += g * 0x100; - // numval += b; - // if (a >= 1 && ctx.colors_to_names.count(numval)) { - // ss << ctx.colors_to_names[numval]; - // } - // else - if (a >= 1) { - ss << '#' << setw(2) << setfill('0'); - ss << hex << setw(2) << static_cast(floor(r+0.5)); - ss << hex << setw(2) << static_cast(floor(g+0.5)); - ss << hex << setw(2) << static_cast(floor(b+0.5)); - } - else { - ss << "rgba("; - ss << static_cast(r) << ", "; - ss << static_cast(g) << ", "; - ss << static_cast(b) << ", "; - ss << static_cast(a) << ')'; - } - buffer += ss.str(); - } - - void Inspect::operator()(Boolean* b) - { - buffer += (b->value() ? "true" : "false"); - } - - void Inspect::operator()(String_Schema* ss) - { - // Evaluation should turn these into String_Constants, so this method is - // only for inspection purposes. - for (size_t i = 0, L = ss->length(); i < L; ++i) { - if ((*ss)[i]->is_interpolant()) buffer += "#{"; - (*ss)[i]->perform(this); - if ((*ss)[i]->is_interpolant()) buffer += '}'; - } - } - - void Inspect::operator()(String_Constant* s) - { - buffer += (s->needs_unquoting() ? unquote(s->value()) : s->value()); - } - - void Inspect::operator()(Media_Query* mq) - { - size_t i = 0; - if (mq->media_type()) { - if (mq->is_negated()) buffer += "not "; - else if (mq->is_restricted()) buffer += "only "; - mq->media_type()->perform(this); - } - else { - (*mq)[i++]->perform(this); - } - for (size_t L = mq->length(); i < L; ++i) { - buffer += " and "; - (*mq)[i]->perform(this); - } - } - - void Inspect::operator()(Media_Query_Expression* mqe) - { - if (mqe->is_interpolated()) { - mqe->feature()->perform(this); - } - else { - buffer += "("; - mqe->feature()->perform(this); - if (mqe->value()) { - buffer += ": "; - mqe->value()->perform(this); - } - buffer += ')'; - } - } - - // void Inspect::operator()(Null* n) - // { - // buffer += "null"; - // } - - // parameters and arguments - void Inspect::operator()(Parameter* p) - { - buffer += p->name(); - if (p->default_value()) { - buffer += ": "; - p->default_value()->perform(this); - } - else if (p->is_rest_parameter()) { - buffer += "..."; - } - } - - void Inspect::operator()(Parameters* p) - { - buffer += '('; - if (!p->empty()) { - (*p)[0]->perform(this); - for (size_t i = 1, L = p->length(); i < L; ++i) { - buffer += ", "; - (*p)[i]->perform(this); - } - } - buffer += ')'; - } - - void Inspect::operator()(Argument* a) - { - if (!a->name().empty()) { - buffer += a->name(); - buffer += ": "; - } - a->value()->perform(this); - if (a->is_rest_argument()) { - buffer += "..."; - } - } - - void Inspect::operator()(Arguments* a) - { - buffer += '('; - if (!a->empty()) { - (*a)[0]->perform(this); - for (size_t i = 1, L = a->length(); i < L; ++i) { - buffer += ", "; - (*a)[i]->perform(this); - } - } - buffer += ')'; - } - - // selectors - void Inspect::operator()(Selector_Schema* s) - { - s->contents()->perform(this); - } - - void Inspect::operator()(Selector_Reference* ref) - { - if (ref->selector()) ref->selector()->perform(this); - else buffer += '&'; - } - - void Inspect::operator()(Selector_Placeholder* s) - { - buffer += s->name(); - } - - void Inspect::operator()(Type_Selector* s) - { - buffer += s->name(); - } - - void Inspect::operator()(Selector_Qualifier* s) - { - buffer += s->name(); - } - - void Inspect::operator()(Attribute_Selector* s) - { - buffer += '['; - buffer += s->name(); - if (!s->matcher().empty()) { - buffer += s->matcher(); - buffer += s->value(); - } - buffer += ']'; - } - - void Inspect::operator()(Pseudo_Selector* s) - { - buffer += s->name(); - if (s->expression()) { - s->expression()->perform(this); - buffer += ')'; - } - } - - void Inspect::operator()(Negated_Selector* s) - { - buffer += ":not("; - s->selector()->perform(this); - buffer += ')'; - } - - void Inspect::operator()(Simple_Selector_Sequence* s) - { - for (size_t i = 0, L = s->length(); i < L; ++i) { - (*s)[i]->perform(this); - } - } - - void Inspect::operator()(Selector_Combination* c) - { - Simple_Selector_Sequence* head = c->head(); - Selector_Combination* tail = c->tail(); - Selector_Combination::Combinator comb = c->combinator(); - if (head) head->perform(this); - if (head && tail) buffer += ' '; - switch (comb) { - case Selector_Combination::ANCESTOR_OF: break; - case Selector_Combination::PARENT_OF: buffer += '>'; break; - case Selector_Combination::PRECEDES: buffer += '~'; break; - case Selector_Combination::ADJACENT_TO: buffer += '+'; break; - } - if (head && tail && comb != Selector_Combination::ANCESTOR_OF) { - buffer += ' '; - } - if (tail) tail->perform(this); - } - - void Inspect::operator()(Selector_Group* g) - { - if (g->empty()) return; - (*g)[0]->perform(this); - for (size_t i = 1, L = g->length(); i < L; ++i) { - buffer += ", "; - (*g)[i]->perform(this); - } - } - - inline void Inspect::fallback_impl(AST_Node* n) - { } - - void Inspect::indent() - { buffer += string(2*indentation, ' '); } - - string unquote(const string& s) - { - if (s.empty()) return ""; - char q; - if (*s.begin() == '"' && *s.rbegin() == '"') q = '"'; - else if (*s.begin() == '\'' && *s.rbegin() == '\'') q = '\''; - else return s; - string t; - t.reserve(s.length()-2); - for (size_t i = 1, L = s.length()-1; i < L; ++i) { - // if we see a quote, we need to remove the preceding backslash from u - if (s[i] == q) t.erase(t.length()-1); - t.push_back(s[i]); - } - return t; - } - - string quote(const string& s, char q) - { - if (s.empty()) return string(2, q); - if (!q || s[0] == '"' || s[0] == '\'') return s; - string t; - t.reserve(s.length()+2); - t.push_back(q); - for (size_t i = 0, L = s.length(); i < L; ++i) { - if (s[i] == q) t.push_back('\\'); - t.push_back(s[i]); - } - t.push_back(q); - return t; - } - -} \ No newline at end of file diff --git a/src/inspect.hpp b/src/inspect.hpp deleted file mode 100644 index f44a4891a..000000000 --- a/src/inspect.hpp +++ /dev/null @@ -1,95 +0,0 @@ -#include - -#ifndef SASS_OPERATION -#include "operation.hpp" -#endif - -// #ifndef SASS_TO_STRING -// #include "to_string.hpp" -// #endif - -namespace Sass { - using namespace std; - // class To_String; - - class Inspect : public Operation_CRTP { - // import all the class-specific methods and override as desired - using Operation_CRTP::operator(); - - // To_String* to_string; - string buffer; - size_t indentation; - void indent(); - - void fallback_impl(AST_Node* n); - - public: - - Inspect(); - virtual ~Inspect(); - - string get_buffer() { return buffer; } - - // statements - virtual void operator()(Block*); - virtual void operator()(Ruleset*); - virtual void operator()(Propset*); - virtual void operator()(Media_Block*); - virtual void operator()(At_Rule*); - virtual void operator()(Declaration*); - virtual void operator()(Assignment*); - virtual void operator()(Import*); - virtual void operator()(Import_Stub*); - virtual void operator()(Warning*); - virtual void operator()(Comment*); - virtual void operator()(If*); - virtual void operator()(For*); - virtual void operator()(Each*); - virtual void operator()(While*); - virtual void operator()(Return*); - virtual void operator()(Extension*); - virtual void operator()(Definition*); - virtual void operator()(Mixin_Call*); - virtual void operator()(Content*); - // expressions - virtual void operator()(List*); - virtual void operator()(Binary_Expression*); - virtual void operator()(Unary_Expression*); - virtual void operator()(Function_Call*); - virtual void operator()(Function_Call_Schema*); - virtual void operator()(Variable*); - virtual void operator()(Textual*); - virtual void operator()(Number*); - virtual void operator()(Color*); - virtual void operator()(Boolean*); - virtual void operator()(String_Schema*); - virtual void operator()(String_Constant*); - virtual void operator()(Media_Query*); - virtual void operator()(Media_Query_Expression*); - // virtual void operator()(Null*); - // parameters and arguments - virtual void operator()(Parameter*); - virtual void operator()(Parameters*); - virtual void operator()(Argument*); - virtual void operator()(Arguments*); - // selectors - virtual void operator()(Selector_Schema*); - virtual void operator()(Selector_Reference*); - virtual void operator()(Selector_Placeholder*); - virtual void operator()(Type_Selector*); - virtual void operator()(Selector_Qualifier*); - virtual void operator()(Attribute_Selector*); - virtual void operator()(Pseudo_Selector*); - virtual void operator()(Negated_Selector*); - virtual void operator()(Simple_Selector_Sequence*); - virtual void operator()(Selector_Combination*); - virtual void operator()(Selector_Group*); - - template - void fallback(U x) { fallback_impl(x); } - }; - - string unquote(const string&); - string quote(const string&, char); - -} \ No newline at end of file diff --git a/src/kwd_arg_macros.hpp b/src/kwd_arg_macros.hpp deleted file mode 100644 index 2b9a13aeb..000000000 --- a/src/kwd_arg_macros.hpp +++ /dev/null @@ -1,23 +0,0 @@ -// Intended usage: -// KWD_ARG_SET(Args) { -// KWD_ARG(Args, string, foo); -// KWD_ARG(Args, int, bar); -// ... -// }; -// -// ... and later ... -// -// something(Args().foo("hey").bar(3)); - -#define KWD_ARG_SET(set_name) class set_name - -#define KWD_ARG(set_name, type, name) \ -private: \ - type name##_; \ -public: \ - set_name& name(type name##__) { \ - name##_ = name##__; \ - return *this; \ - } \ - type name() { return name##_; } \ -private: diff --git a/src/memory_manager.hpp b/src/memory_manager.hpp deleted file mode 100644 index 98e890408..000000000 --- a/src/memory_manager.hpp +++ /dev/null @@ -1,42 +0,0 @@ -#define SASS_MEMORY_MANAGER - -#include -#include -using namespace std; - -namespace Sass { - ///////////////////////////////////////////////////////////////////////////// - // A class for tracking allocations of AST_Node objects. The intended usage - // is something like: Some_Node* n = new (mem_mgr) Some_Node(...); - // Then, at the end of the program, the memory manager will delete all of the - // allocated nodes that have been passed to it. - // In the future, this class may implement a custom allocator. - ///////////////////////////////////////////////////////////////////////////// - template - class Memory_Manager { - vector nodes; - - public: - Memory_Manager(size_t size = 0) : nodes(vector()) - { nodes.reserve(size); } - - ~Memory_Manager() - { - for (size_t i = 0, S = nodes.size(); i < S; ++i) { - // cout << "deleting " << typeid(*nodes[i]).name() << endl; - delete nodes[i]; - } - } - - T* operator()(T* np) - { - nodes.push_back(np); - // cout << "registering " << typeid(*np).name() << endl; - return np; - } - }; -} - -template -inline void* operator new(size_t size, Sass::Memory_Manager& mem_mgr) -{ return mem_mgr(static_cast(operator new(size))); } \ No newline at end of file diff --git a/src/operation.hpp b/src/operation.hpp deleted file mode 100644 index 498a9c4a7..000000000 --- a/src/operation.hpp +++ /dev/null @@ -1,141 +0,0 @@ -#define SASS_OPERATION - -#include "ast_fwd_decl.hpp" - -#include -using namespace std; -#include - -namespace Sass { - - template - class Operation { - public: - virtual T operator()(AST_Node* x) = 0; - virtual ~Operation() { } - // statements - virtual T operator()(Block* x) = 0; - virtual T operator()(Ruleset* x) = 0; - virtual T operator()(Propset* x) = 0; - virtual T operator()(Media_Block* x) = 0; - virtual T operator()(At_Rule* x) = 0; - virtual T operator()(Declaration* x) = 0; - virtual T operator()(Assignment* x) = 0; - virtual T operator()(Import* x) = 0; - virtual T operator()(Import_Stub* x) = 0; - virtual T operator()(Warning* x) = 0; - virtual T operator()(Comment* x) = 0; - virtual T operator()(If* x) = 0; - virtual T operator()(For* x) = 0; - virtual T operator()(Each* x) = 0; - virtual T operator()(While* x) = 0; - virtual T operator()(Return* x) = 0; - virtual T operator()(Content* x) = 0; - virtual T operator()(Extension* x) = 0; - virtual T operator()(Definition* x) = 0; - virtual T operator()(Mixin_Call* x) = 0; - // expressions - virtual T operator()(List* x) = 0; - virtual T operator()(Binary_Expression* x) = 0; - virtual T operator()(Unary_Expression* x) = 0; - virtual T operator()(Function_Call* x) = 0; - virtual T operator()(Function_Call_Schema* x) = 0; - virtual T operator()(Variable* x) = 0; - virtual T operator()(Textual* x) = 0; - virtual T operator()(Number* x) = 0; - virtual T operator()(Color* x) = 0; - virtual T operator()(Boolean* x) = 0; - virtual T operator()(String_Schema* x) = 0; - virtual T operator()(String_Constant* x) = 0; - virtual T operator()(Media_Query* x) = 0; - virtual T operator()(Media_Query_Expression* x) = 0; - virtual T operator()(Null* x) = 0; - // parameters and arguments - virtual T operator()(Parameter* x) = 0; - virtual T operator()(Parameters* x) = 0; - virtual T operator()(Argument* x) = 0; - virtual T operator()(Arguments* x) = 0; - // selectors - virtual T operator()(Selector_Schema* x) = 0; - virtual T operator()(Selector_Reference* x) = 0; - virtual T operator()(Selector_Placeholder* x) = 0; - virtual T operator()(Type_Selector* x) = 0; - virtual T operator()(Selector_Qualifier* x) = 0; - virtual T operator()(Attribute_Selector* x) = 0; - virtual T operator()(Pseudo_Selector* x) = 0; - virtual T operator()(Negated_Selector* x) = 0; - virtual T operator()(Simple_Selector_Sequence* x) = 0; - virtual T operator()(Selector_Combination* x) = 0; - virtual T operator()(Selector_Group* x) = 0; - - template - T fallback(U x) { return T(); } - }; - - template - class Operation_CRTP : public Operation { - public: - virtual T operator()(AST_Node* x) { return static_cast(this)->fallback(x); } - virtual ~Operation_CRTP() = 0; - // statements - virtual T operator()(Block* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Ruleset* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Propset* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Media_Block* x) { return static_cast(this)->fallback(x); } - virtual T operator()(At_Rule* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Declaration* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Assignment* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Import* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Import_Stub* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Warning* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Comment* x) { return static_cast(this)->fallback(x); } - virtual T operator()(If* x) { return static_cast(this)->fallback(x); } - virtual T operator()(For* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Each* x) { return static_cast(this)->fallback(x); } - virtual T operator()(While* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Return* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Content* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Extension* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Definition* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Mixin_Call* x) { return static_cast(this)->fallback(x); } - // expressions - virtual T operator()(List* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Binary_Expression* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Unary_Expression* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Function_Call* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Function_Call_Schema* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Variable* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Textual* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Number* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Color* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Boolean* x) { return static_cast(this)->fallback(x); } - virtual T operator()(String_Schema* x) { return static_cast(this)->fallback(x); } - virtual T operator()(String_Constant* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Media_Query* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Media_Query_Expression* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Null* x) { return static_cast(this)->fallback(x); } - // parameters and arguments - virtual T operator()(Parameter* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Parameters* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Argument* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Arguments* x) { return static_cast(this)->fallback(x); } - // selectors - virtual T operator()(Selector_Schema* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Selector_Reference* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Selector_Placeholder* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Type_Selector* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Selector_Qualifier* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Attribute_Selector* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Pseudo_Selector* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Negated_Selector* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Simple_Selector_Sequence* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Selector_Combination* x) { return static_cast(this)->fallback(x); } - virtual T operator()(Selector_Group* x) { return static_cast(this)->fallback(x); } - - template - T fallback(U x) { return T(); } - }; - template - inline Operation_CRTP::~Operation_CRTP() { } - -} \ No newline at end of file diff --git a/src/output_compressed.cpp b/src/output_compressed.cpp deleted file mode 100644 index 107e8f921..000000000 --- a/src/output_compressed.cpp +++ /dev/null @@ -1,217 +0,0 @@ -#include "output_compressed.hpp" -#include "inspect.hpp" -#include "ast.hpp" - -namespace Sass { - using namespace std; - - Output_Compressed::Output_Compressed() : buffer("") { } - Output_Compressed::~Output_Compressed() { } - - inline void Output_Compressed::fallback_impl(AST_Node* n) - { - Inspect i; - n->perform(&i); - buffer += i.get_buffer(); - } - - void Output_Compressed::operator()(Block* b) - { - if (!b->is_root()) return; - for (size_t i = 0, L = b->length(); i < L; ++i) { - (*b)[i]->perform(this); - } - } - - void Output_Compressed::operator()(Ruleset* r) - { - Selector* s = r->selector(); - Block* b = r->block(); - - if (b->has_non_hoistable()) { - s->perform(this); - buffer += "{"; - for (size_t i = 0, L = b->length(); i < L; ++i) { - Statement* stm = (*b)[i]; - if (!stm->is_hoistable()) { - stm->perform(this); - } - } - buffer += "}"; - } - - if (b->has_hoistable()) { - for (size_t i = 0, L = b->length(); i < L; ++i) { - Statement* stm = (*b)[i]; - if (stm->is_hoistable()) { - stm->perform(this); - } - } - } - } - - void Output_Compressed::operator()(Media_Block* m) - { - List* q = m->media_queries(); - Block* b = m->block(); - - buffer += "@media "; - q->perform(this); - buffer += "{"; - - Selector* e = m->enclosing_selector(); - bool hoisted = false; - if (e && b->has_non_hoistable()) { - hoisted = true; - e->perform(this); - buffer += "{"; - } - - for (size_t i = 0, L = b->length(); i < L; ++i) { - Statement* stm = (*b)[i]; - if (!stm->is_hoistable()) { - stm->perform(this); - } - } - - if (hoisted) { - buffer += "}"; - } - - for (size_t i = 0, L = b->length(); i < L; ++i) { - Statement* stm = (*b)[i]; - if (stm->is_hoistable()) { - stm->perform(this); - } - } - - buffer += "}"; - } - - void Output_Compressed::operator()(At_Rule* a) - { - string kwd = a->keyword(); - Selector* s = a->selector(); - Block* b = a->block(); - - buffer += kwd; - if (s) { - buffer += ' '; - s->perform(this); - } - - if (!b) { - buffer += ';'; - return; - } - - buffer += "{"; - for (size_t i = 0, L = b->length(); i < L; ++i) { - Statement* stm = (*b)[i]; - if (!stm->is_hoistable()) { - stm->perform(this); - } - } - - for (size_t i = 0, L = b->length(); i < L; ++i) { - Statement* stm = (*b)[i]; - if (stm->is_hoistable()) { - stm->perform(this); - } - } - - buffer += "}"; - } - - void Output_Compressed::operator()(Declaration* d) - { - d->property()->perform(this); - buffer += ":"; - d->value()->perform(this); - if (d->is_important()) buffer += "!important"; - buffer += ';'; - } - - void Output_Compressed::operator()(List* list) - { - string sep(list->separator() == List::SPACE ? " " : ","); - if (list->empty()) return; - Expression* first = (*list)[0]; - bool first_invisible = first->is_invisible(); - if (!first_invisible) first->perform(this); - for (size_t i = 1, L = list->length(); i < L; ++i) { - Expression* next = (*list)[i]; - bool next_invisible = next->is_invisible(); - if (i == 1 && !first_invisible && !next_invisible) buffer += sep; - else if (!next_invisible) buffer += sep; - next->perform(this); - } - } - - void Output_Compressed::operator()(Media_Query_Expression* mqe) - { - if (mqe->is_interpolated()) { - mqe->feature()->perform(this); - } - else { - buffer += "("; - mqe->feature()->perform(this); - if (mqe->value()) { - buffer += ":"; - mqe->value()->perform(this); - } - buffer += ')'; - } - } - - void Output_Compressed::operator()(Argument* a) - { - if (!a->name().empty()) { - buffer += a->name(); - buffer += ":"; - } - a->value()->perform(this); - if (a->is_rest_argument()) { - buffer += "..."; - } - } - - void Output_Compressed::operator()(Arguments* a) - { - buffer += '('; - if (!a->empty()) { - (*a)[0]->perform(this); - for (size_t i = 1, L = a->length(); i < L; ++i) { - buffer += ","; - (*a)[i]->perform(this); - } - } - buffer += ')'; - } - - void Output_Compressed::operator()(Selector_Combination* c) - { - Simple_Selector_Sequence* head = c->head(); - Selector_Combination* tail = c->tail(); - Selector_Combination::Combinator comb = c->combinator(); - if (head) head->perform(this); - switch (comb) { - case Selector_Combination::ANCESTOR_OF: buffer += ' '; break; - case Selector_Combination::PARENT_OF: buffer += '>'; break; - case Selector_Combination::PRECEDES: buffer += '~'; break; - case Selector_Combination::ADJACENT_TO: buffer += '+'; break; - } - if (tail) tail->perform(this); - } - - void Output_Compressed::operator()(Selector_Group* g) - { - if (g->empty()) return; - (*g)[0]->perform(this); - for (size_t i = 1, L = g->length(); i < L; ++i) { - buffer += ","; - (*g)[i]->perform(this); - } - } - -} \ No newline at end of file diff --git a/src/output_compressed.hpp b/src/output_compressed.hpp deleted file mode 100644 index 63778c22e..000000000 --- a/src/output_compressed.hpp +++ /dev/null @@ -1,82 +0,0 @@ -#include - -#ifndef SASS_OPERATION -#include "operation.hpp" -#endif - -namespace Sass { - using namespace std; - - class Output_Compressed : public Operation_CRTP { - // import all the class-specific methods and override as desired - using Operation_CRTP::operator(); - - string buffer; - - void fallback_impl(AST_Node* n); - - public: - Output_Compressed(); - virtual ~Output_Compressed(); - - string get_buffer() { return buffer; } - - // statements - virtual void operator()(Block*); - virtual void operator()(Ruleset*); - // virtual void operator()(Propset*); - virtual void operator()(Media_Block*); - virtual void operator()(At_Rule*); - virtual void operator()(Declaration*); - // virtual void operator()(Assignment*); - // virtual void operator()(Import*); - // virtual void operator()(Import_Stub*); - // virtual void operator()(Warning*); - // virtual void operator()(Comment*); - // virtual void operator()(If*); - // virtual void operator()(For*); - // virtual void operator()(Each*); - // virtual void operator()(While*); - // virtual void operator()(Return*); - // virtual void operator()(Extension*); - // virtual void operator()(Definition*); - // virtual void operator()(Mixin_Call*); - // virtual void operator()(Content*); - // // expressions - virtual void operator()(List*); - // virtual void operator()(Binary_Expression*); - // virtual void operator()(Unary_Expression*); - // virtual void operator()(Function_Call*); - // virtual void operator()(Function_Call_Schema*); - // virtual void operator()(Variable*); - // virtual void operator()(Textual*); - // virtual void operator()(Number*); - // virtual void operator()(Color*); - // virtual void operator()(Boolean*); - // virtual void operator()(String_Schema*); - // virtual void operator()(String_Constant* x); - // virtual void operator()(Media_Query*); - virtual void operator()(Media_Query_Expression*); - // // parameters and arguments - // virtual void operator()(Parameter*); - // virtual void operator()(Parameters*); - virtual void operator()(Argument*); - virtual void operator()(Arguments*); - // // selectors - // virtual void operator()(Selector_Schema*); - // virtual void operator()(Selector_Reference*); - // virtual void operator()(Selector_Placeholder*); - // virtual void operator()(Type_Selector*); - // virtual void operator()(Selector_Qualifier*); - // virtual void operator()(Attribute_Selector*); - // virtual void operator()(Pseudo_Selector*); - // virtual void operator()(Negated_Selector*); - // virtual void operator()(Simple_Selector_Sequence*); - virtual void operator()(Selector_Combination*); - virtual void operator()(Selector_Group*); - - template - void fallback(U x) { fallback_impl(x); } - }; - -} \ No newline at end of file diff --git a/src/output_nested.cpp b/src/output_nested.cpp deleted file mode 100644 index 6935cd18e..000000000 --- a/src/output_nested.cpp +++ /dev/null @@ -1,171 +0,0 @@ -#include "output_nested.hpp" -#include "inspect.hpp" -#include "ast.hpp" - -namespace Sass { - using namespace std; - - Output_Nested::Output_Nested() : buffer(""), indentation(0) { } - Output_Nested::~Output_Nested() { } - - inline void Output_Nested::fallback_impl(AST_Node* n) - { - Inspect i; - n->perform(&i); - buffer += i.get_buffer(); - } - - void Output_Nested::operator()(Ruleset* r) - { - Selector* s = r->selector(); - Block* b = r->block(); - bool decls = false; - - if (b->has_non_hoistable()) { - decls = true; - indent(); - s->perform(this); - buffer += " {\n"; - ++indentation; - for (size_t i = 0, L = b->length(); i < L; ++i) { - Statement* stm = (*b)[i]; - if (!stm->is_hoistable()) { - if (!stm->block()) indent(); - stm->perform(this); - buffer += '\n'; - } - } - --indentation; - buffer.erase(buffer.length()-1); - buffer += " }\n"; - } - - if (b->has_hoistable()) { - if (decls) ++indentation; - // indent(); - for (size_t i = 0, L = b->length(); i < L; ++i) { - Statement* stm = (*b)[i]; - if (stm->is_hoistable()) { - stm->perform(this); - } - } - if (decls) --indentation; - } - } - - void Output_Nested::operator()(Media_Block* m) - { - List* q = m->media_queries(); - Block* b = m->block(); - bool decls = false; - - indent(); - buffer += "@media "; - q->perform(this); - buffer += " {\n"; - - Selector* e = m->enclosing_selector(); - bool hoisted = false; - if (e && b->has_non_hoistable()) { - hoisted = true; - ++indentation; - indent(); - e->perform(this); - buffer += " {\n"; - } - - ++indentation; - decls = true; - for (size_t i = 0, L = b->length(); i < L; ++i) { - Statement* stm = (*b)[i]; - if (!stm->is_hoistable()) { - if (!stm->block()) indent(); - stm->perform(this); - buffer += '\n'; - } - } - --indentation; - - if (hoisted) { - buffer.erase(buffer.length()-1); - buffer += " }\n"; - --indentation; - } - - if (decls) ++indentation; - if (hoisted) ++indentation; - for (size_t i = 0, L = b->length(); i < L; ++i) { - Statement* stm = (*b)[i]; - if (stm->is_hoistable()) { - stm->perform(this); - } - } - if (hoisted) --indentation; - if (decls) --indentation; - - buffer.erase(buffer.length()-1); - buffer += " }\n"; - } - - void Output_Nested::operator()(At_Rule* a) - { - string kwd = a->keyword(); - Selector* s = a->selector(); - Block* b = a->block(); - bool decls = false; - - // indent(); - buffer += kwd; - if (s) { - buffer += ' '; - s->perform(this); - } - - if (!b) { - buffer += ';'; - return; - } - - buffer += " {\n"; - ++indentation; - decls = true; - for (size_t i = 0, L = b->length(); i < L; ++i) { - Statement* stm = (*b)[i]; - if (!stm->is_hoistable()) { - if (!stm->block()) indent(); - stm->perform(this); - buffer += '\n'; - } - } - --indentation; - - if (decls) ++indentation; - for (size_t i = 0, L = b->length(); i < L; ++i) { - Statement* stm = (*b)[i]; - if (stm->is_hoistable()) { - stm->perform(this); - buffer += '\n'; - } - } - if (decls) --indentation; - - buffer.erase(buffer.length()-1); - if (b->has_hoistable()) { - buffer.erase(buffer.length()-1); - } - buffer += " }\n"; - } - - void Output_Nested::operator()(Block* b) - { - if (!b->is_root()) return; - for (size_t i = 0, L = b->length(); i < L; ++i) { - (*b)[i]->perform(this); - if (i < L-1) buffer += '\n'; - } - } - - void Output_Nested::indent() - { buffer += string(2*indentation, ' '); } - -} \ No newline at end of file diff --git a/src/output_nested.hpp b/src/output_nested.hpp deleted file mode 100644 index 2de939c24..000000000 --- a/src/output_nested.hpp +++ /dev/null @@ -1,94 +0,0 @@ -#include - -#ifndef SASS_OPERATION -#include "operation.hpp" -#endif - -// #ifndef SASS_TO_STRING -// #include "to_string.hpp" -// #endif - -namespace Sass { - using namespace std; - // class To_String; - - class Output_Nested : public Operation_CRTP { - // import all the class-specific methods and override as desired - using Operation_CRTP::operator(); - - // To_String* to_string; - string buffer; - size_t indentation; - void indent(); - - void fallback_impl(AST_Node* n); - - public: - - Output_Nested(); - virtual ~Output_Nested(); - - string get_buffer() { return buffer; } - - // statements - virtual void operator()(Block*); - virtual void operator()(Ruleset*); - // virtual void operator()(Propset*); - virtual void operator()(Media_Block*); - virtual void operator()(At_Rule*); - // virtual void operator()(Declaration*); - // virtual void operator()(Assignment*); - // virtual void operator()(Import*); - // virtual void operator()(Import_Stub*); - // virtual void operator()(Warning*); - // virtual void operator()(Comment*); - // virtual void operator()(If*); - // virtual void operator()(For*); - // virtual void operator()(Each*); - // virtual void operator()(While*); - // virtual void operator()(Return*); - // virtual void operator()(Extension*); - // virtual void operator()(Definition*); - // virtual void operator()(Mixin_Call*); - // virtual void operator()(Content*); - // // expressions - // virtual void operator()(List*); - // virtual void operator()(Binary_Expression*); - // virtual void operator()(Unary_Expression*); - // virtual void operator()(Function_Call*); - // virtual void operator()(Function_Call_Schema*); - // virtual void operator()(Variable*); - // virtual void operator()(Textual*); - // virtual void operator()(Number*); - // virtual void operator()(Color*); - // virtual void operator()(Boolean*); - // virtual void operator()(String_Schema*); - // virtual void operator()(String_Constant* x); - // virtual void operator()(Media_Query*); - // virtual void operator()(Media_Query_Expression*); - // // parameters and arguments - // virtual void operator()(Parameter*); - // virtual void operator()(Parameters*); - // virtual void operator()(Argument*); - // virtual void operator()(Arguments*); - // // selectors - // virtual void operator()(Selector_Schema*); - // virtual void operator()(Selector_Reference*); - // virtual void operator()(Selector_Placeholder*); - // virtual void operator()(Type_Selector*); - // virtual void operator()(Selector_Qualifier*); - // virtual void operator()(Attribute_Selector*); - // virtual void operator()(Pseudo_Selector*); - // virtual void operator()(Negated_Selector*); - // virtual void operator()(Simple_Selector_Sequence*); - // virtual void operator()(Selector_Combination*); - // virtual void operator()(Selector_Group*); - - template - void fallback(U x) { fallback_impl(x); } - }; - - string unquote(const string&); - string quote(const string&, char); - -} \ No newline at end of file diff --git a/src/parser.cpp b/src/parser.cpp deleted file mode 100644 index 2358e776c..000000000 --- a/src/parser.cpp +++ /dev/null @@ -1,1487 +0,0 @@ -#include -#include -#include "parser.hpp" -#include "file.hpp" -#include "inspect.hpp" -#include "to_string.hpp" -#include "constants.hpp" - -#ifndef SASS_PRELEXER -#include "prelexer.hpp" -#endif - -namespace Sass { - using namespace std; - using namespace Constants; - - Parser Parser::from_c_str(const char* str, Context& ctx, string path, size_t line) - { - Parser p(ctx, path, line); - p.source = str; - p.position = p.source; - p.end = str + strlen(str); - return p; - } - - Parser Parser::from_token(Token t, Context& ctx, string path, size_t line) - { - Parser p(ctx, path, line); - p.source = t.begin; - p.position = p.source; - p.end = t.end; - return p; - } - - Block* Parser::parse() - { - Block* root = new (ctx.mem) Block(path, line); - root->is_root(true); - read_bom(); - lex< optional_spaces >(); - Selector_Lookahead lookahead_result; - while (position < end) { - if (lex< block_comment >()) { - String_Constant* contents = new (ctx.mem) String_Constant(path, line, lexed); - Comment* comment = new (ctx.mem) Comment(path, line, contents); - (*root) << comment; - } - else if (peek< import >()) { - Import* imp = parse_import(); - (*root) << imp; - if (!imp->files().empty()) { - for (size_t i = 0, S = imp->files().size(); i < S; ++i) { - (*root) << new (ctx.mem) Import_Stub(path, line, imp->files()[i]); - } - } - if (!lex< exactly<';'> >()) error("top-level @import directive must be terminated by ';'"); - } - else if (peek< mixin >() || peek< function >()) { - (*root) << parse_definition(); - } - else if (peek< variable >()) { - (*root) << parse_assignment(); - if (!lex< exactly<';'> >()) error("top-level variable binding must be terminated by ';'"); - } - else if (peek< sequence< optional< exactly<'*'> >, alternatives< identifier_schema, identifier >, optional_spaces, exactly<':'>, optional_spaces, exactly<'{'> > >(position)) { - (*root) << parse_propset(); - } - else if (peek< include >() /* || peek< exactly<'+'> >() */) { - Mixin_Call* mixin_call = parse_mixin_call(); - (*root) << mixin_call; - if (!mixin_call->block() && !lex< exactly<';'> >()) error("top-level @include directive must be terminated by ';'"); - } - else if (peek< if_directive >()) { - (*root) << parse_if_directive(); - } - else if (peek< for_directive >()) { - (*root) << parse_for_directive(); - } - else if (peek< each_directive >()) { - (*root) << parse_each_directive(); - } - else if (peek< while_directive >()) { - (*root) << parse_while_directive(); - } - else if (peek< media >()) { - (*root) << parse_media_block(); - } - else if (peek< warn >()) { - (*root) << parse_warning(); - if (!lex< exactly<';'> >()) error("top-level @warn directive must be terminated by ';'"); - } - // ignore the @charset directive for now - else if (lex< exactly< charset_kwd > >()) { - lex< string_constant >(); - lex< exactly<';'> >(); - } - else if (peek< at_keyword >()) { - At_Rule* at_rule = parse_at_rule(); - (*root) << at_rule; - if (!at_rule->block() && !lex< exactly<';'> >()) error("top-level directive must be terminated by ';'"); - } - else if ((lookahead_result = lookahead_for_selector(position)).found) { - (*root) << parse_ruleset(lookahead_result); - } - else { - lex< spaces_and_comments >(); - if (position >= end) break; - error("invalid top-level expression"); - } - lex< optional_spaces >(); - } - return root; - } - - Import* Parser::parse_import() - { - lex< import >(); - Import* imp = new (ctx.mem) Import(path, line); - bool first = true; - do { - if (lex< string_constant >()) { - string import_path(lexed); - size_t dot = import_path.find_last_of('.'); - if (dot != string::npos && import_path.substr(dot, 4) == ".css") { - String_Constant* loc = new (ctx.mem) String_Constant(path, line, import_path); - Argument* loc_arg = new (ctx.mem) Argument(path, line, loc); - Arguments* loc_args = new (ctx.mem) Arguments(path, line); - (*loc_args) << loc_arg; - Function_Call* new_url = new (ctx.mem) Function_Call(path, line, "url", loc_args); - imp->urls().push_back(new_url); - } - else { - string current_dir = File::dir_name(path); - string resolved(ctx.add_file(File::join_paths(current_dir, unquote(import_path)))); - if (resolved.empty()) error("file to import not found or unreadable: " + import_path); - imp->files().push_back(resolved); - } - } - else if (peek< uri_prefix >()) { - imp->urls().push_back(parse_function_call()); - } - else { - if (first) error("@import directive requires a url or quoted path"); - else error("expecting another url or quoted path in @import list"); - } - first = false; - } while (lex< exactly<','> >()); - return imp; - } - - Definition* Parser::parse_definition() - { - Definition::Type which_type = Definition::MIXIN; - if (lex< mixin >()) which_type = Definition::MIXIN; - else if (lex< function >()) which_type = Definition::FUNCTION; - string which_str(lexed); - if (!lex< identifier >()) error("invalid name in " + which_str + " definition"); - string name(lexed); - size_t line_of_def = line; - Parameters* params = parse_parameters(); - if (!peek< exactly<'{'> >()) error("body for " + which_str + " " + name + " must begin with a '{'"); - if (which_type == Definition::MIXIN) stack.push_back(mixin_def); - else stack.push_back(function_def); - Block* body = parse_block(); - stack.pop_back(); - Definition* def = new (ctx.mem) Definition(path, line_of_def, name, params, body, which_type); - return def; - } - - Parameters* Parser::parse_parameters() - { - string name(lexed); // for the error message - Parameters* params = new (ctx.mem) Parameters(path, line); - if (lex< exactly<'('> >()) { - // if there's anything there at all - if (!peek< exactly<')'> >()) { - do (*params) << parse_parameter(); - while (lex< exactly<','> >()); - } - if (!lex< exactly<')'> >()) error("expected a variable name (e.g. $x) or ')' for the parameter list for " + name); - } - return params; - } - - Parameter* Parser::parse_parameter() - { - lex< variable >(); - string name(lexed); - Expression* val = 0; - bool is_rest = false; - if (lex< exactly<':'> >()) { // there's a default value - val = parse_space_list(); - val->is_delayed(false); - } - else if (lex< exactly< ellipsis > >()) { - is_rest = true; - } - Parameter* p = new (ctx.mem) Parameter(path, line, name, val, is_rest); - return p; - } - - Mixin_Call* Parser::parse_mixin_call() - { - lex< include >() /* || lex< exactly<'+'> >() */; - if (!lex< identifier >()) error("invalid name in @include directive"); - size_t line_of_call = line; - string name(lexed); - Arguments* args = parse_arguments(); - Block* content = 0; - if (peek< exactly<'{'> >()) { - content = parse_block(); - } - Mixin_Call* the_call = new (ctx.mem) Mixin_Call(path, line_of_call, name, args, content); - return the_call; - } - - Arguments* Parser::parse_arguments() - { - string name(lexed); - Arguments* args = new (ctx.mem) Arguments(path, line); - - if (lex< exactly<'('> >()) { - // if there's anything there at all - if (!peek< exactly<')'> >()) { - do (*args) << parse_argument(); - while (lex< exactly<','> >()); - } - if (!lex< exactly<')'> >()) error("expected a variable name (e.g. $x) or ')' for the parameter list for " + name); - } - - return args; - } - - Argument* Parser::parse_argument() - { - Argument* arg; - if (peek< sequence < variable, spaces_and_comments, exactly<':'> > >()) { - lex< variable >(); - string name(lexed); - lex< exactly<':'> >(); - Expression* val = parse_space_list(); - val->is_delayed(false); - arg = new (ctx.mem) Argument(path, line, val, name); - } - else { - bool is_arglist = false; - Expression* val = parse_space_list(); - val->is_delayed(false); - if (lex< exactly< ellipsis > >()) { - is_arglist = true; - } - arg = new (ctx.mem) Argument(path, line, val, "", is_arglist); - } - return arg; - } - - Assignment* Parser::parse_assignment() - { - lex< variable >(); - string name(lexed); - size_t var_line = line; - if (!lex< exactly<':'> >()) error("expected ':' after " + name + " in assignment statement"); - Expression* val = parse_list(); - val->is_delayed(false); - bool is_guarded = lex< default_flag >(); - Assignment* var = new (ctx.mem) Assignment(path, var_line, name, val, is_guarded); - return var; - } - - Propset* Parser::parse_propset() - { - String* property_segment; - if (peek< sequence< optional< exactly<'*'> >, identifier_schema > >()) { - property_segment = parse_identifier_schema(); - } - else { - lex< sequence< optional< exactly<'*'> >, identifier > >(); - property_segment = new (ctx.mem) String_Constant(path, line, lexed); - } - Propset* propset = new (ctx.mem) Propset(path, line, property_segment); - lex< exactly<':'> >(); - - if (!peek< exactly<'{'> >()) error("expected a '{' after namespaced property"); - - propset->block(parse_block()); - - return propset; - } - - Ruleset* Parser::parse_ruleset(Selector_Lookahead lookahead) - { - Selector* sel; - if (lookahead.has_interpolants) { - sel = parse_selector_schema(lookahead.found); - } - else { - sel = parse_selector_group(); - } - if (!peek< exactly<'{'> >()) error("expected a '{' after the selector"); - Block* block = parse_block(); - Ruleset* ruleset = new (ctx.mem) Ruleset(path, line, sel, block); - return ruleset; - } - - Selector_Schema* Parser::parse_selector_schema(const char* end_of_selector) - { - const char* i = position; - const char* p; - String_Schema* schema = new (ctx.mem) String_Schema(path, line); - - while (i < end_of_selector) { - p = find_first_in_interval< exactly >(i, end_of_selector); - if (p) { - // accumulate the preceding segment if there is one - if (i < p) (*schema) << new (ctx.mem) String_Constant(path, line, Token(i, p)); - // find the end of the interpolant and parse it - const char* j = find_first_in_interval< exactly >(p, end_of_selector); - Expression* interp_node = Parser::from_token(Token(p+2, j), ctx, path, line).parse_list(); - interp_node->is_interpolant(true); - (*schema) << interp_node; - i = j + 1; - } - else { // no interpolants left; add the last segment if there is one - if (i < end_of_selector) (*schema) << new (ctx.mem) String_Constant(path, line, Token(i, end_of_selector)); - break; - } - } - position = end_of_selector; - return new (ctx.mem) Selector_Schema(path, line, schema); - } - - Selector_Group* Parser::parse_selector_group() - { - To_String to_string; - Selector_Group* group = new (ctx.mem) Selector_Group(path, line); - do { - Selector_Combination* comb = parse_selector_combination(); - if (!comb->has_reference()) { - size_t sel_line = line; - Selector_Reference* ref = new (ctx.mem) Selector_Reference(path, sel_line); - Simple_Selector_Sequence* ref_wrap = new (ctx.mem) Simple_Selector_Sequence(path, sel_line); - (*ref_wrap) << ref; - if (!comb->head()) { - comb->head(ref_wrap); - comb->has_reference(true); - } - else { - comb = new (ctx.mem) Selector_Combination(path, sel_line, Selector_Combination::ANCESTOR_OF, ref_wrap, comb); - comb->has_reference(true); - } - } - (*group) << comb; - } - while (lex< exactly<','> >()); - return group; - } - - Selector_Combination* Parser::parse_selector_combination() - { - size_t sel_line = 0; - Simple_Selector_Sequence* lhs; - if (peek< exactly<'+'> >() || - peek< exactly<'~'> >() || - peek< exactly<'>'> >()) { - // no selector before the combinator - lhs = 0; - } - else { - lhs = parse_simple_selector_sequence(); - sel_line = line; - } - - Selector_Combination::Combinator cmb; - if (lex< exactly<'+'> >()) cmb = Selector_Combination::ADJACENT_TO; - else if (lex< exactly<'~'> >()) cmb = Selector_Combination::PRECEDES; - else if (lex< exactly<'>'> >()) cmb = Selector_Combination::PARENT_OF; - else cmb = Selector_Combination::ANCESTOR_OF; - - Selector_Combination* rhs; - if (peek< exactly<','> >() || - peek< exactly<')'> >() || - peek< exactly<'{'> >() || - peek< exactly<';'> >()) { - // no selector after the combinator - rhs = 0; - } - else { - rhs = parse_selector_combination(); - sel_line = line; - } - if (!sel_line) sel_line = line; - return new (ctx.mem) Selector_Combination(path, sel_line, cmb, lhs, rhs); - } - - Simple_Selector_Sequence* Parser::parse_simple_selector_sequence() - { - Simple_Selector_Sequence* seq = new (ctx.mem) Simple_Selector_Sequence(path, line); - // check for backref or type selector, which are only allowed at the front - if (lex< exactly<'&'> >()) { - (*seq) << new (ctx.mem) Selector_Reference(path, line); - } - else if (lex< sequence< negate< functional >, alternatives< type_selector, universal, string_constant, dimension, percentage, number > > >()) { - (*seq) << new (ctx.mem) Type_Selector(path, line, lexed); - } - else { - (*seq) << parse_simple_selector(); - } - - while (!peek< spaces >(position) && - !(peek < exactly<'+'> >(position) || - peek < exactly<'~'> >(position) || - peek < exactly<'>'> >(position) || - peek < exactly<','> >(position) || - peek < exactly<')'> >(position) || - peek < exactly<'{'> >(position) || - peek < exactly<';'> >(position))) { - (*seq) << parse_simple_selector(); - } - return seq; - } - - Simple_Selector* Parser::parse_simple_selector() - { - if (lex< id_name >() || lex< class_name >()) { - return new (ctx.mem) Selector_Qualifier(path, line, lexed); - } - - if (lex< string_constant >() || lex< number >()) { - return new (ctx.mem) Type_Selector(path, line, lexed); - } - else if (peek< pseudo_not >()) { - return parse_negated_selector(); - } - else if (peek< exactly<':'> >(position) || peek< functional >()) { - return parse_pseudo_selector(); - } - else if (peek< exactly<'['> >(position)) { - return parse_attribute_selector(); - } - else { - error("invalid selector after " + lexed); - } - // unreachable statement - return 0; - } - - Negated_Selector* Parser::parse_negated_selector() - { - lex< pseudo_not >(); - size_t nline = line; - Simple_Selector* negated = parse_simple_selector(); - if (!lex< exactly<')'> >()) error("negated selector is missing ')'"); - return new (ctx.mem) Negated_Selector(path, nline, negated); - } - - Pseudo_Selector* Parser::parse_pseudo_selector() { - if (lex< sequence< pseudo_prefix, functional > >() || lex< functional >()) { - string name(lexed); - String* expr = 0; - if (lex< alternatives< even, odd > >()) { - expr = new (ctx.mem) String_Constant(path, line, lexed); - } - else if (peek< binomial >(position)) { - lex< sequence< optional< coefficient >, exactly<'n'> > >(); - String_Constant* var_coef = new (ctx.mem) String_Constant(path, line, lexed); - lex< sign >(); - String_Constant* op = new (ctx.mem) String_Constant(path, line, lexed); - // Binary_Expression::Type op = (lexed == "+" ? Binary_Expression::ADD : Binary_Expression::SUB); - lex< digits >(); - String_Constant* constant = new (ctx.mem) String_Constant(path, line, lexed); - // expr = new (ctx.mem) Binary_Expression(path, line, op, var_coef, constant); - String_Schema* schema = new (ctx.mem) String_Schema(path, line, 3); - *schema << var_coef << op << constant; - expr = schema; - } - else if (lex< sequence< optional, - optional, - exactly<'n'> > >()) { - expr = new (ctx.mem) String_Constant(path, line, lexed); - } - else if (lex< sequence< optional, digits > >()) { - expr = new (ctx.mem) String_Constant(path, line, lexed); - } - else if (lex< identifier >()) { - expr = new (ctx.mem) String_Constant(path, line, lexed); - } - else if (lex< string_constant >()) { - expr = new (ctx.mem) String_Constant(path, line, lexed); - } - else if (peek< exactly<')'> >()) { - expr = new (ctx.mem) String_Constant(path, line, ""); - } - else { - error("invalid argument to " + name + "...)"); - } - if (!lex< exactly<')'> >()) error("unterminated argument to " + name + "...)"); - return new (ctx.mem) Pseudo_Selector(path, line, name, expr); - } - else if (lex < sequence< pseudo_prefix, identifier > >()) { - return new (ctx.mem) Pseudo_Selector(path, line, lexed); - } - else { - error("unrecognized pseudo-class or pseudo-element"); - } - // unreachable statement - return 0; - } - - Attribute_Selector* Parser::parse_attribute_selector() - { - lex< exactly<'['> >(); - if (!lex< type_selector >()) error("invalid attribute name in attribute selector"); - string name(lexed); - if (lex< exactly<']'> >()) return new (ctx.mem) Attribute_Selector(path, line, name, "", ""); - if (!lex< alternatives< exact_match, class_match, dash_match, - prefix_match, suffix_match, substring_match > >()) { - error("invalid operator in attribute selector for " + name); - } - string matcher(lexed); - if (!lex< string_constant >() && !lex< identifier >()) error("expected a string constant or identifier in attribute selector for " + name); - string value(lexed); - if (!lex< exactly<']'> >()) error("unterminated attribute selector for " + name); - return new (ctx.mem) Attribute_Selector(path, line, name, matcher, value); - } - - Block* Parser::parse_block() - { - lex< exactly<'{'> >(); - bool semicolon = false; - Selector_Lookahead lookahead_result; - Block* block = new (ctx.mem) Block(path, line); - while (!lex< exactly<'}'> >()) { - if (semicolon) { - if (!lex< exactly<';'> >()) error("non-terminal statement or declaration must end with ';'"); - semicolon = false; - while (lex< block_comment >()) { - String_Constant* contents = new (ctx.mem) String_Constant(path, line, lexed); - Comment* comment = new (ctx.mem) Comment(path, line, contents); - (*block) << comment; - } - if (lex< exactly<'}'> >()) break; - } - if (lex< block_comment >()) { - String_Constant* contents = new (ctx.mem) String_Constant(path, line, lexed); - Comment* comment = new (ctx.mem) Comment(path, line, contents); - (*block) << comment; - } - else if (peek< import >(position)) { - if (stack.back() == mixin_def || stack.back() == function_def) { - lex< import >(); // to adjust the line number - error("@import directives are not allowed inside mixins and functions"); - } - Import* imp = parse_import(); - (*block) << imp; - if (!imp->files().empty()) { - for (size_t i = 0, S = imp->files().size(); i < S; ++i) { - (*block) << new (ctx.mem) Import_Stub(path, line, imp->files()[i]); - } - } - semicolon = true; - } - else if (lex< variable >()) { - (*block) << parse_assignment(); - semicolon = true; - } - else if (peek< if_directive >()) { - (*block) << parse_if_directive(); - } - else if (peek< for_directive >()) { - (*block) << parse_for_directive(); - } - else if (peek< each_directive >()) { - (*block) << parse_each_directive(); - } - else if (peek < while_directive >()) { - (*block) << parse_while_directive(); - } - else if (lex < return_directive >()) { - (*block) << new (ctx.mem) Return(path, line, parse_list()); - semicolon = true; - } - else if (peek< warn >()) { - (*block) << parse_warning(); - semicolon = true; - } - else if (stack.back() == function_def) { - error("only variable declarations and control directives are allowed inside functions"); - } - else if (peek< mixin >() || peek< function >()) { - (*block) << parse_definition(); - } - else if (peek< include >(position)) { - Mixin_Call* the_call = parse_mixin_call(); - (*block) << the_call; - // don't need a semicolon after a content block - semicolon = (the_call->block()) ? false : true; - } - else if (lex< content >()) { - if (stack.back() != mixin_def) { - error("@content may only be used within a mixin"); - } - (*block) << new (ctx.mem) Content(path, line); - semicolon = true; - } - /* - else if (peek< exactly<'+'> >()) { - (*block) << parse_mixin_call(); - semicolon = true; - } - */ - else if (lex< extend >()) { - Selector_Lookahead lookahead = lookahead_for_extension_target(position); - if (!lookahead.found) error("invalid selector for @extend"); - Selector* target; - if (lookahead.has_interpolants) target = parse_selector_schema(lookahead.found); - else target = parse_selector_group(); - (*block) << new (ctx.mem) Extension(path, line, target); - semicolon = true; - } - else if (peek< media >()) { - (*block) << parse_media_block(); - } - // ignore the @charset directive for now - else if (lex< exactly< charset_kwd > >()) { - lex< string_constant >(); - lex< exactly<';'> >(); - } - else if (peek< at_keyword >()) { - At_Rule* at_rule = parse_at_rule(); - (*block) << at_rule; - if (!at_rule->block()) semicolon = true; - } - else if ((lookahead_result = lookahead_for_selector(position)).found) { - (*block) << parse_ruleset(lookahead_result); - } - else if (peek< sequence< optional< exactly<'*'> >, alternatives< identifier_schema, identifier >, optional_spaces, exactly<':'>, optional_spaces, exactly<'{'> > >(position)) { - (*block) << parse_propset(); - } - else if (!peek< exactly<';'> >()) { - if (peek< sequence< optional< exactly<'*'> >, identifier_schema, exactly<':'>, exactly<'{'> > >()) { - (*block) << parse_propset(); - } - else if (peek< sequence< optional< exactly<'*'> >, identifier, exactly<':'>, exactly<'{'> > >()) { - (*block) << parse_propset(); - } - else { - (*block) << parse_declaration(); - semicolon = true; - } - } - else lex< exactly<';'> >(); - while (lex< block_comment >()) { - String_Constant* contents = new (ctx.mem) String_Constant(path, line, lexed); - Comment* comment = new (ctx.mem) Comment(path, line, contents); - (*block) << comment; - } - } - return block; - } - - Declaration* Parser::parse_declaration() { - String* prop = 0; - if (peek< sequence< optional< exactly<'*'> >, identifier_schema > >()) { - prop = parse_identifier_schema(); - } - else if (lex< sequence< optional< exactly<'*'> >, identifier > >()) { - prop = new (ctx.mem) String_Constant(path, line, lexed); - } - else { - error("invalid property name"); - } - if (!lex< exactly<':'> >()) error("property \"" + string(lexed) + "\" must be followed by a ':'"); - if (peek< exactly<';'> >()) error("style declaration must contain a value"); - Expression* list = parse_list(); - return new (ctx.mem) Declaration(path, prop->line(), prop, list, lex()); - } - - Expression* Parser::parse_list() - { - return parse_comma_list(); - } - - Expression* Parser::parse_comma_list() - { - if (peek< exactly<'!'> >(position) || - peek< exactly<';'> >(position) || - peek< exactly<'}'> >(position) || - peek< exactly<'{'> >(position) || - peek< exactly<')'> >(position) || - peek< exactly<':'> >(position) || - peek< exactly >(position)) - { return new (ctx.mem) List(path, line, 0); } - Expression* list1 = parse_space_list(); - // if it's a singleton, return it directly; don't wrap it - if (!peek< exactly<','> >(position)) return list1; - - List* comma_list = new (ctx.mem) List(path, line, 2, List::COMMA); - (*comma_list) << list1; - - while (lex< exactly<','> >()) - { - Expression* list = parse_space_list(); - (*comma_list) << list; - } - - return comma_list; - } - - Expression* Parser::parse_space_list() - { - Expression* disj1 = parse_disjunction(); - // if it's a singleton, return it directly; don't wrap it - if (peek< exactly<'!'> >(position) || - peek< exactly<';'> >(position) || - peek< exactly<'}'> >(position) || - peek< exactly<'{'> >(position) || - peek< exactly<')'> >(position) || - peek< exactly<','> >(position) || - peek< exactly<':'> >(position) || - peek< exactly >(position) || - peek< default_flag >(position)) - { return disj1; } - - List* space_list = new (ctx.mem) List(path, line, 2, List::SPACE); - (*space_list) << disj1; - - while (!(peek< exactly<'!'> >(position) || - peek< exactly<';'> >(position) || - peek< exactly<'}'> >(position) || - peek< exactly<'{'> >(position) || - peek< exactly<')'> >(position) || - peek< exactly<','> >(position) || - peek< exactly<':'> >(position) || - peek< exactly >(position) || - peek< default_flag >(position))) - { - (*space_list) << parse_disjunction(); - } - - return space_list; - } - - Expression* Parser::parse_disjunction() - { - Expression* conj1 = parse_conjunction(); - // if it's a singleton, return it directly; don't wrap it - if (!peek< sequence< or_op, negate< identifier > > >()) return conj1; - - vector operands; - while (lex< sequence< or_op, negate< identifier > > >()) - operands.push_back(parse_conjunction()); - - return fold_operands(conj1, operands, Binary_Expression::OR); - } - - Expression* Parser::parse_conjunction() - { - Expression* rel1 = parse_relation(); - // if it's a singleton, return it directly; don't wrap it - if (!peek< sequence< and_op, negate< identifier > > >()) return rel1; - - vector operands; - while (lex< sequence< and_op, negate< identifier > > >()) - operands.push_back(parse_relation()); - - return fold_operands(rel1, operands, Binary_Expression::AND); - } - - Expression* Parser::parse_relation() - { - Expression* expr1 = parse_expression(); - // if it's a singleton, return it directly; don't wrap it - if (!(peek< eq_op >(position) || - peek< neq_op >(position) || - peek< gte_op >(position) || - peek< gt_op >(position) || - peek< lte_op >(position) || - peek< lt_op >(position))) - { return expr1; } - - Binary_Expression::Type op - = lex() ? Binary_Expression::EQ - : lex() ? Binary_Expression::NEQ - : lex() ? Binary_Expression::GTE - : lex() ? Binary_Expression::LTE - : lex() ? Binary_Expression::GT - : lex() ? Binary_Expression::LT - : Binary_Expression::LT; // whatever - - Expression* expr2 = parse_expression(); - - return new (ctx.mem) Binary_Expression(path, expr1->line(), op, expr1, expr2); - } - - Expression* Parser::parse_expression() - { - Expression* term1 = parse_term(); - // if it's a singleton, return it directly; don't wrap it - if (!(peek< exactly<'+'> >(position) || - peek< sequence< negate< number >, exactly<'-'> > >(position))) - { return term1; } - - vector operands; - vector operators; - while (lex< exactly<'+'> >() || lex< sequence< negate< number >, exactly<'-'> > >()) { - operators.push_back(lexed == "+" ? Binary_Expression::ADD : Binary_Expression::SUB); - operands.push_back(parse_term()); - } - - return fold_operands(term1, operands, operators); - } - - Expression* Parser::parse_term() - { - Expression* fact1 = parse_factor(); - // if it's a singleton, return it directly; don't wrap it - if (!(peek< exactly<'*'> >(position) || - peek< exactly<'/'> >(position) || - peek< exactly<'%'> >(position))) - { return fact1; } - - vector operands; - vector operators; - while (lex< exactly<'*'> >() || lex< exactly<'/'> >() || lex< exactly<'%'> >()) { - if (lexed == "*") operators.push_back(Binary_Expression::MUL); - else if (lexed == "/") operators.push_back(Binary_Expression::DIV); - else operators.push_back(Binary_Expression::MOD); - operands.push_back(parse_factor()); - } - - return fold_operands(fact1, operands, operators); - } - - Expression* Parser::parse_factor() - { - if (lex< exactly<'('> >()) { - Expression* value = parse_comma_list(); - if (!lex< exactly<')'> >()) error("unclosed parenthesis"); - value->is_delayed(false); - if (value->concrete_type() == Expression::LIST) { - List* l = static_cast(value); - if (!l->empty()) (*l)[0]->is_delayed(false); - } - return value; - } - else if (lex< sequence< exactly<'+'>, spaces_and_comments, negate< number > > >()) { - return new (ctx.mem) Unary_Expression(path, line, Unary_Expression::PLUS, parse_factor()); - } - else if (lex< sequence< exactly<'-'>, spaces_and_comments, negate< number> > >()) { - return new (ctx.mem) Unary_Expression(path, line, Unary_Expression::MINUS, parse_factor()); - } - else { - return parse_value(); - } - } - - Expression* Parser::parse_value() - { - if (lex< uri_prefix >()) { - // TODO: really need to clean up this chunk - Arguments* args = new (ctx.mem) Arguments(path, line); - Function_Call* result = new (ctx.mem) Function_Call(path, line, "url", args); - // gah, gonna have to use exception handling to do backtracking ... - const char* here = position; - try { - Expression* expr = parse_list(); - (*args) << new (ctx.mem) Argument(path, line, expr); - } - catch (Error& e) { - position = here; - if (peek< sequence< url_schema, spaces_and_comments, exactly<')'> > >()) { - lex< url_schema >(); - String_Schema* the_url = Parser::from_token(lexed, ctx, path, line).parse_url_schema(); - (*args) << new (ctx.mem) Argument(path, line, the_url); - } - else if (peek< sequence< url_value, spaces_and_comments, exactly<')'> > >()) { - lex< url_value >(); - String_Constant* the_url = new (ctx.mem) String_Constant(path, line, lexed); - (*args) << new (ctx.mem) Argument(path, line, the_url); - } - else { - const char* value = position; - const char* rparen = find_first< exactly<')'> >(position); - if (!rparen) error("URI is missing ')'"); - Token content_tok(Token(value, rparen)); - String_Constant* content_node = new (ctx.mem) String_Constant(path, line, content_tok); - (*args) << new (ctx.mem) Argument(path, line, content_node); - position = rparen; - } - } - if (!lex< exactly<')'> >()) error("URI is missing ')'"); - return result; - } - - if (peek< functional_schema >()) - { return parse_function_call_schema(); } - - if (peek< functional >()) - { return parse_function_call(); } - - if (lex< value_schema >()) - { return Parser::from_token(lexed, ctx, path, line).parse_value_schema(); } - - if (lex< sequence< true_val, negate< identifier > > >()) - { return new (ctx.mem) Boolean(path, line, true); } - - if (lex< sequence< false_val, negate< identifier > > >()) - { return new (ctx.mem) Boolean(path, line, false); } - - if (lex< sequence< null, negate< identifier > > >()) - { return new (ctx.mem) Null(path, line); } - - if (lex< identifier >()) { - String_Constant* str = new (ctx.mem) String_Constant(path, line, lexed); - str->is_delayed(true); - return str; - } - - if (lex< percentage >()) - { return new (ctx.mem) Textual(path, line, Textual::PERCENTAGE, lexed); } - - if (lex< dimension >()) - { return new (ctx.mem) Textual(path, line, Textual::DIMENSION, lexed); } - - if (lex< number >()) - { return new (ctx.mem) Textual(path, line, Textual::NUMBER, lexed); } - - if (lex< hex >()) - { return new (ctx.mem) Textual(path, line, Textual::HEX, lexed); } - - if (peek< string_constant >()) - { return parse_string(); } - - if (lex< variable >()) - { return new (ctx.mem) Variable(path, line, lexed); } - - error("error reading values after " + lexed); - - // unreachable statement - return 0; - } - - String* Parser::parse_string() - { - lex< string_constant >(); - Token str(lexed); - const char* i = str.begin; - // see if there any interpolants - const char* p = find_first_in_interval< sequence< negate< exactly<'\\'> >, exactly > >(str.begin, str.end); - if (!p) { - String_Constant* str_node = new (ctx.mem) String_Constant(path, line, str); - str_node->is_delayed(true); - return str_node; - } - - String_Schema* schema = new (ctx.mem) String_Schema(path, line); - schema->quote_mark(*str.begin); - while (i < str.end) { - p = find_first_in_interval< sequence< negate< exactly<'\\'> >, exactly > >(i, str.end); - if (p) { - if (i < p) { - (*schema) << new (ctx.mem) String_Constant(path, line, Token(i, p)); // accumulate the preceding segment if it's nonempty - } - const char* j = find_first_in_interval< exactly >(p, str.end); // find the closing brace - if (j) { - // parse the interpolant and accumulate it - Expression* interp_node = Parser::from_token(Token(p+2, j), ctx, path, line).parse_list(); - interp_node->is_interpolant(true); - (*schema) << interp_node; - i = j+1; - } - else { - // throw an error if the interpolant is unterminated - error("unterminated interpolant inside string constant " + str); - } - } - else { // no interpolants left; add the last segment if nonempty - if (i < str.end) (*schema) << new (ctx.mem) String_Constant(path, line, Token(i, str.end)); - break; - } - } - return schema; - } - - String_Schema* Parser::parse_value_schema() - { - String_Schema* schema = new (ctx.mem) String_Schema(path, line); - - while (position < end) { - if (lex< interpolant >()) { - Token insides(Token(lexed.begin + 2, lexed.end - 1)); - Expression* interp_node = Parser::from_token(insides, ctx, path, line).parse_list(); - interp_node->is_interpolant(true); - (*schema) << interp_node; - } - else if (lex< identifier >()) { - (*schema) << new (ctx.mem) String_Constant(path, line, lexed); - } - else if (lex< percentage >()) { - (*schema) << new (ctx.mem) Textual(path, line, Textual::PERCENTAGE, lexed); - } - else if (lex< dimension >()) { - (*schema) << new (ctx.mem) Textual(path, line, Textual::DIMENSION, lexed); - } - else if (lex< number >()) { - (*schema) << new (ctx.mem) Textual(path, line, Textual::NUMBER, lexed); - } - else if (lex< hex >()) { - (*schema) << new (ctx.mem) Textual(path, line, Textual::HEX, lexed); - } - else if (lex< string_constant >()) { - (*schema) << new (ctx.mem) String_Constant(path, line, lexed); - } - else if (lex< variable >()) { - (*schema) << new (ctx.mem) Variable(path, line, lexed); - } - else { - error("error parsing interpolated value"); - } - } - return schema; - } - - String_Schema* Parser::parse_url_schema() - { - String_Schema* schema = new (ctx.mem) String_Schema(path, line); - - while (position < end) { - if (position[0] == '/') { - lexed = Token(position, position+1); - (*schema) << new (ctx.mem) String_Constant(path, line, lexed); - ++position; - } - else if (lex< interpolant >()) { - Token insides(Token(lexed.begin + 2, lexed.end - 1)); - Expression* interp_node = Parser::from_token(insides, ctx, path, line).parse_list(); - interp_node->is_interpolant(true); - (*schema) << interp_node; - } - else if (lex< sequence< identifier, exactly<':'> > >()) { - (*schema) << new (ctx.mem) String_Constant(path, line, lexed); - } - else if (lex< filename >()) { - (*schema) << new (ctx.mem) String_Constant(path, line, lexed); - } - else { - error("error parsing interpolated url"); - } - } - return schema; - } - - String* Parser::parse_identifier_schema() - { - lex< sequence< optional< exactly<'*'> >, identifier_schema > >(); - Token id(lexed); - const char* i = id.begin; - // see if there any interpolants - const char* p = find_first_in_interval< sequence< negate< exactly<'\\'> >, exactly > >(id.begin, id.end); - if (!p) { - return new (ctx.mem) String_Constant(path, line, id); - } - - String_Schema* schema = new (ctx.mem) String_Schema(path, line); - while (i < id.end) { - p = find_first_in_interval< sequence< negate< exactly<'\\'> >, exactly > >(i, id.end); - if (p) { - if (i < p) { - (*schema) << new (ctx.mem) String_Constant(path, line, Token(i, p)); // accumulate the preceding segment if it's nonempty - } - const char* j = find_first_in_interval< exactly >(p, id.end); // find the closing brace - if (j) { - // parse the interpolant and accumulate it - Expression* interp_node = Parser::from_token(Token(p+2, j), ctx, path, line).parse_list(); - interp_node->is_interpolant(true); - (*schema) << interp_node; - i = j+1; - } - else { - // throw an error if the interpolant is unterminated - error("unterminated interpolant inside interpolated identifier " + id); - } - } - else { // no interpolants left; add the last segment if nonempty - if (i < id.end) (*schema) << new (ctx.mem) String_Constant(path, line, Token(i, id.end)); - break; - } - } - return schema; - } - - Function_Call* Parser::parse_function_call() - { - lex< identifier >(); - string name(lexed); - size_t line_of_call = line; - - Function_Call* the_call = new (ctx.mem) Function_Call(path, line_of_call, name, parse_arguments()); - return the_call; - } - - Function_Call_Schema* Parser::parse_function_call_schema() - { - String* name = parse_identifier_schema(); - size_t line_of_call = line; - - Function_Call_Schema* the_call = new (ctx.mem) Function_Call_Schema(path, line_of_call, name, parse_arguments()); - return the_call; - } - - If* Parser::parse_if_directive(bool else_if) - { - lex< if_directive >() || (else_if && lex< exactly >()); - size_t if_line = line; - Expression* predicate = parse_list(); - predicate->is_delayed(false); - if (!peek< exactly<'{'> >()) error("expected '{' after the predicate for @if"); - Block* consequent = parse_block(); - Block* alternative = 0; - if (lex< else_directive >()) { - if (peek< exactly >()) { - alternative = new (ctx.mem) Block(path, line); - (*alternative) << parse_if_directive(true); - } - else if (!peek< exactly<'{'> >()) { - error("expected '{' after @else"); - } - else { - alternative = parse_block(); - } - } - return new (ctx.mem) If(path, if_line, predicate, consequent, alternative); - } - - For* Parser::parse_for_directive() - { - lex< for_directive >(); - size_t for_line = line; - if (!lex< variable >()) error("@for directive requires an iteration variable"); - string var(lexed); - if (!lex< from >()) error("expected 'from' keyword in @for directive"); - Expression* lower_bound = parse_expression(); - lower_bound->is_delayed(false); - bool inclusive = false; - if (lex< through >()) inclusive = true; - else if (lex< to >()) inclusive = false; - else error("expected 'through' or 'to' keywod in @for directive"); - Expression* upper_bound = parse_expression(); - upper_bound->is_delayed(false); - if (!peek< exactly<'{'> >()) error("expected '{' after the upper bound in @for directive"); - Block* body = parse_block(); - return new (ctx.mem) For(path, for_line, var, lower_bound, upper_bound, body, inclusive); - } - - Each* Parser::parse_each_directive() - { - lex < each_directive >(); - size_t each_line = line; - if (!lex< variable >()) error("@each directive requires an iteration variable"); - string var(lexed); - if (!lex< in >()) error("expected 'in' keyword in @each directive"); - Expression* list = parse_list(); - list->is_delayed(false); - if (list->concrete_type() == Expression::LIST) { - List* l = static_cast(list); - for (size_t i = 0, L = l->length(); i < L; ++i) { - (*l)[i]->is_delayed(false); - } - } - if (!peek< exactly<'{'> >()) error("expected '{' after the upper bound in @each directive"); - Block* body = parse_block(); - return new (ctx.mem) Each(path, each_line, var, list, body); - } - - While* Parser::parse_while_directive() - { - lex< while_directive >(); - size_t while_line = line; - Expression* predicate = parse_list(); - predicate->is_delayed(false); - Block* body = parse_block(); - return new (ctx.mem) While(path, while_line, predicate, body); - } - - Media_Block* Parser::parse_media_block() - { - lex< media >(); - size_t media_line = line; - - List* media_queries = parse_media_queries(); - - if (!peek< exactly<'{'> >()) { - error("expected '{' in media query"); - } - Block* block = parse_block(); - - return new (ctx.mem) Media_Block(path, media_line, media_queries, block); - } - - List* Parser::parse_media_queries() - { - List* media_queries = new (ctx.mem) List(path, line, 0, List::COMMA); - if (!peek< exactly<'{'> >()) (*media_queries) << parse_media_query(); - while (lex< exactly<','> >()) (*media_queries) << parse_media_query(); - return media_queries; - } - - // Expression* Parser::parse_media_query() - Media_Query* Parser::parse_media_query() - { - Media_Query* media_query = new (ctx.mem) Media_Query(path, line); - - if (lex< exactly< not_kwd > >()) media_query->is_negated(true); - else if (lex< exactly< only_kwd > >()) media_query->is_restricted(true); - - if (peek< identifier_schema >()) media_query->media_type(parse_identifier_schema()); - else if (lex< identifier >()) media_query->media_type(new (ctx.mem) String_Constant(path, line, lexed)); - else (*media_query) << parse_media_expression(); - - while (lex< exactly< and_kwd > >()) (*media_query) << parse_media_expression(); - - return media_query; - } - - Media_Query_Expression* Parser::parse_media_expression() - { - if (peek< identifier_schema >()) { - String* ss = parse_identifier_schema(); - return new (ctx.mem) Media_Query_Expression(path, line, ss, 0, true); - } - if (!lex< exactly<'('> >()) { - error("media query expression must begin with '('"); - } - Expression* feature = 0; - if (peek< exactly<')'> >()) { - error("media feature required in media query expression"); - } - feature = parse_list(); - Expression* expression = 0; - if (lex< exactly<':'> >()) { - expression = parse_list(); - } - if (!lex< exactly<')'> >()) { - error("unclosed parenthesis in media query expression"); - } - return new (ctx.mem) Media_Query_Expression(path, feature->line(), feature, expression); - } - - At_Rule* Parser::parse_at_rule() - { - lex(); - string kwd(lexed); - size_t at_line = line; - Selector* sel = 0; - Selector_Lookahead lookahead = lookahead_for_extension_target(position); - if (lookahead.found) { - if (lookahead.has_interpolants) { - sel = parse_selector_schema(lookahead.found); - } - else { - sel = parse_selector_group(); - } - } - Block* body = 0; - if (peek< exactly<'{'> >()) body = parse_block(); - return new (ctx.mem) At_Rule(path, at_line, kwd, sel, body); - } - - Warning* Parser::parse_warning() - { - lex< warn >(); - return new (ctx.mem) Warning(path, line, parse_list()); - } - - Selector_Lookahead Parser::lookahead_for_selector(const char* start) - { - const char* p = start ? start : position; - const char* q; - bool saw_interpolant = false; - - while ((q = peek< identifier >(p)) || - (q = peek< type_selector >(p)) || - (q = peek< id_name >(p)) || - (q = peek< class_name >(p)) || - (q = peek< sequence< pseudo_prefix, identifier > >(p)) || - (q = peek< percentage >(p)) || - (q = peek< dimension >(p)) || - (q = peek< string_constant >(p)) || - (q = peek< exactly<'*'> >(p)) || - (q = peek< exactly<'('> >(p)) || - (q = peek< exactly<')'> >(p)) || - (q = peek< exactly<'['> >(p)) || - (q = peek< exactly<']'> >(p)) || - (q = peek< exactly<'+'> >(p)) || - (q = peek< exactly<'~'> >(p)) || - (q = peek< exactly<'>'> >(p)) || - (q = peek< exactly<','> >(p)) || - (q = peek< binomial >(p)) || - (q = peek< sequence< optional, - optional, - exactly<'n'> > >(p)) || - (q = peek< sequence< optional, - digits > >(p)) || - (q = peek< number >(p)) || - (q = peek< exactly<'&'> >(p)) || - (q = peek< alternatives >(p)) || - (q = peek< sequence< exactly<'.'>, interpolant > >(p)) || - (q = peek< sequence< exactly<'#'>, interpolant > >(p)) || - (q = peek< sequence< exactly<'-'>, interpolant > >(p)) || - (q = peek< sequence< pseudo_prefix, interpolant > >(p)) || - (q = peek< interpolant >(p))) { - p = q; - if (*(p - 1) == '}') saw_interpolant = true; - } - - Selector_Lookahead result; - result.found = peek< exactly<'{'> >(p) ? p : 0; - result.has_interpolants = saw_interpolant; - - return result; - } - - Selector_Lookahead Parser::lookahead_for_extension_target(const char* start) - { - const char* p = start ? start : position; - const char* q; - bool saw_interpolant = false; - bool saw_stuff = false; - - while ((q = peek< identifier >(p)) || - (q = peek< type_selector >(p)) || - (q = peek< id_name >(p)) || - (q = peek< class_name >(p)) || - (q = peek< sequence< pseudo_prefix, identifier > >(p)) || - (q = peek< percentage >(p)) || - (q = peek< dimension >(p)) || - (q = peek< string_constant >(p)) || - (q = peek< exactly<'*'> >(p)) || - (q = peek< exactly<'('> >(p)) || - (q = peek< exactly<')'> >(p)) || - (q = peek< exactly<'['> >(p)) || - (q = peek< exactly<']'> >(p)) || - (q = peek< exactly<'+'> >(p)) || - (q = peek< exactly<'~'> >(p)) || - (q = peek< exactly<'>'> >(p)) || - (q = peek< exactly<','> >(p)) || - (q = peek< binomial >(p)) || - (q = peek< sequence< optional, - optional, - exactly<'n'> > >(p)) || - (q = peek< sequence< optional, - digits > >(p)) || - (q = peek< number >(p)) || - (q = peek< exactly<'&'> >(p)) || - (q = peek< alternatives >(p)) || - (q = peek< sequence< exactly<'.'>, interpolant > >(p)) || - (q = peek< sequence< exactly<'#'>, interpolant > >(p)) || - (q = peek< sequence< exactly<'-'>, interpolant > >(p)) || - (q = peek< sequence< pseudo_prefix, interpolant > >(p)) || - (q = peek< interpolant >(p))) { - p = q; - if (*(p - 1) == '}') saw_interpolant = true; - saw_stuff = true; - } - - Selector_Lookahead result; - result.found = peek< alternatives< exactly<';'>, exactly<'}'>, exactly<'{'> > >(p) && saw_stuff ? p : 0; - result.has_interpolants = saw_interpolant; - - return result; - } - - void Parser::read_bom() - { - size_t skip = 0; - string encoding; - bool utf_8 = false; - switch ((unsigned char) source[0]) { - case 0xEF: - skip = check_bom_chars(source, utf_8_bom, 3); - encoding = "UTF-8"; - utf_8 = true; - break; - case 0xFE: - skip = check_bom_chars(source, utf_16_bom_be, 2); - encoding = "UTF-16 (big endian)"; - break; - case 0xFF: - skip = check_bom_chars(source, utf_16_bom_le, 2); - skip += (skip ? check_bom_chars(source, utf_32_bom_le, 4) : 0); - encoding = (skip == 2 ? "UTF-16 (little endian)" : "UTF-32 (little endian)"); - break; - case 0x00: - skip = check_bom_chars(source, utf_32_bom_be, 4); - encoding = "UTF-32 (big endian)"; - break; - case 0x2B: - skip = check_bom_chars(source, utf_7_bom_1, 4) - | check_bom_chars(source, utf_7_bom_2, 4) - | check_bom_chars(source, utf_7_bom_3, 4) - | check_bom_chars(source, utf_7_bom_4, 4) - | check_bom_chars(source, utf_7_bom_5, 5); - encoding = "UTF-7"; - break; - case 0xF7: - skip = check_bom_chars(source, utf_1_bom, 3); - encoding = "UTF-1"; - break; - case 0xDD: - skip = check_bom_chars(source, utf_ebcdic_bom, 4); - encoding = "UTF-EBCDIC"; - break; - case 0x0E: - skip = check_bom_chars(source, scsu_bom, 3); - encoding = "SCSU"; - break; - case 0xFB: - skip = check_bom_chars(source, bocu_1_bom, 3); - encoding = "BOCU-1"; - break; - case 0x84: - skip = check_bom_chars(source, gb_18030_bom, 4); - encoding = "GB-18030"; - break; - } - if (skip > 0 && !utf_8) error("only UTF-8 documents are currently supported; your document appears to be " + encoding); - position += skip; - } - - size_t check_bom_chars(const char* src, const unsigned char* bom, size_t len) - { - size_t skip = 0; - for (size_t i = 0; i < len; ++i, ++skip) { - if ((unsigned char) src[i] != bom[i]) return 0; - } - return skip; - } - - - Expression* Parser::fold_operands(Expression* base, vector& operands, Binary_Expression::Type op) - { - for (size_t i = 0, S = operands.size(); i < S; ++i) { - base = new (ctx.mem) Binary_Expression(path, line, op, base, operands[i]); - Binary_Expression* b = static_cast(base); - if (op == Binary_Expression::DIV && b->left()->is_delayed() && b->right()->is_delayed()) { - base->is_delayed(true); - } - else { - b->left()->is_delayed(false); - b->right()->is_delayed(false); - } - } - return base; - } - - Expression* Parser::fold_operands(Expression* base, vector& operands, vector& ops) - { - for (size_t i = 0, S = operands.size(); i < S; ++i) { - base = new (ctx.mem) Binary_Expression(path, line, ops[i], base, operands[i]); - Binary_Expression* b = static_cast(base); - if (ops[i] == Binary_Expression::DIV && b->left()->is_delayed() && b->right()->is_delayed()) { - base->is_delayed(true); - } - else { - b->left()->is_delayed(false); - b->right()->is_delayed(false); - } - } - return base; - } - - void Parser::error(string msg, size_t ln) - { - throw Error(Error::syntax, path, ln ? ln : line, msg); - } - -} diff --git a/src/parser.hpp b/src/parser.hpp deleted file mode 100644 index 62af259b7..000000000 --- a/src/parser.hpp +++ /dev/null @@ -1,196 +0,0 @@ -#define SASS_PARSER - -#include -#include - -#ifndef SASS_PRELEXER -#include "prelexer.hpp" -#endif - -#ifndef SASS_TOKEN -#include "token.hpp" -#endif - -#ifndef SASS_CONTEXT -#include "context.hpp" -#endif - -#ifndef SASS_AST -#include "ast.hpp" -#endif - -struct Selector_Lookahead { - const char* found; - bool has_interpolants; -}; - -namespace Sass { - using std::string; - using std::vector; - using std::map; - using namespace Prelexer; - - class Parser { - public: - class AST_Node; - - enum Syntactic_Context { nothing, mixin_def, function_def }; - - Context& ctx; - vector stack; - const char* source; - const char* position; - const char* end; - string path; - size_t line; - - - Token lexed; - - Parser(Context& ctx, string path, size_t line) - : ctx(ctx), stack(vector()), - source(0), position(0), end(0), path(path), line(line) - { stack.push_back(nothing); } - - static Parser from_string(string src, Context& ctx, string path = "", size_t line = 1); - static Parser from_c_str(const char* src, Context& ctx, string path = "", size_t line = 1); - static Parser from_token(Token t, Context& ctx, string path = "", size_t line = 1); - - template - const char* peek(const char* start = 0) - { - if (!start) start = position; - const char* after_whitespace; - if (mx == block_comment) { - after_whitespace = // start; - zero_plus< alternatives >(start); - } - else if (/*mx == ancestor_of ||*/ mx == no_spaces) { - after_whitespace = position; - } - else if (mx == spaces || mx == ancestor_of) { - after_whitespace = mx(start); - if (after_whitespace) { - return after_whitespace; - } - else { - return 0; - } - } - else if (mx == optional_spaces) { - after_whitespace = optional_spaces(start); - } - else { - after_whitespace = spaces_and_comments(start); - } - const char* after_token = mx(after_whitespace); - if (after_token) { - return after_token; - } - else { - return 0; - } - } - - template - const char* lex() - { - const char* after_whitespace; - if (mx == block_comment) { - after_whitespace = // position; - zero_plus< alternatives >(position); - } - else if (mx == ancestor_of || mx == no_spaces) { - after_whitespace = position; - } - else if (mx == spaces) { - after_whitespace = spaces(position); - if (after_whitespace) { - line += count_interval<'\n'>(position, after_whitespace); - lexed = Token(position, after_whitespace); - return position = after_whitespace; - } - else { - return 0; - } - } - else if (mx == optional_spaces) { - after_whitespace = optional_spaces(position); - } - else { - after_whitespace = spaces_and_comments(position); - } - const char* after_token = mx(after_whitespace); - if (after_token) { - line += count_interval<'\n'>(position, after_token); - lexed = Token(after_whitespace, after_token); - return position = after_token; - } - else { - return 0; - } - } - - void error(string msg, size_t ln = 0); - void read_bom(); - - Block* parse(); - Import* parse_import(); - Definition* parse_definition(); - Parameters* parse_parameters(); - Parameter* parse_parameter(); - Mixin_Call* parse_mixin_call(); - Arguments* parse_arguments(); - Argument* parse_argument(); - Assignment* parse_assignment(); - Propset* parse_propset(); - Ruleset* parse_ruleset(Selector_Lookahead lookahead); - Selector_Schema* parse_selector_schema(const char* end_of_selector); - Selector_Group* parse_selector_group(); - Selector_Combination* parse_selector_combination(); - Simple_Selector_Sequence* parse_simple_selector_sequence(); - Simple_Selector* parse_simple_selector(); - Negated_Selector* parse_negated_selector(); - Pseudo_Selector* parse_pseudo_selector(); - Attribute_Selector* parse_attribute_selector(); - Block* parse_block(); - Declaration* parse_declaration(); - Expression* parse_list(); - Expression* parse_comma_list(); - Expression* parse_space_list(); - Expression* parse_disjunction(); - Expression* parse_conjunction(); - Expression* parse_relation(); - Expression* parse_expression(); - Expression* parse_term(); - Expression* parse_factor(); - Expression* parse_value(); - Function_Call* parse_function_call(); - Function_Call_Schema* parse_function_call_schema(); - String* parse_string(); - String_Schema* parse_value_schema(); - String* parse_identifier_schema(); - String_Schema* parse_url_schema(); - If* parse_if_directive(bool else_if = false); - For* parse_for_directive(); - Each* parse_each_directive(); - While* parse_while_directive(); - Media_Block* parse_media_block(); - List* parse_media_queries(); - Media_Query* parse_media_query(); - Media_Query_Expression* parse_media_expression(); - At_Rule* parse_at_rule(); - Warning* parse_warning(); - - Selector_Lookahead lookahead_for_selector(const char* start = 0); - Selector_Lookahead lookahead_for_extension_target(const char* start = 0); - - Expression* fold_operands(Expression* base, vector& operands, Binary_Expression::Type op); - Expression* fold_operands(Expression* base, vector& operands, vector& ops); - - void throw_syntax_error(string message, size_t ln = 0); - void throw_read_error(string message, size_t ln = 0); - }; - - size_t check_bom_chars(const char* src, const unsigned char* bom, size_t len); -} diff --git a/src/prelexer.cpp b/src/prelexer.cpp deleted file mode 100644 index 19fe4a6ff..000000000 --- a/src/prelexer.cpp +++ /dev/null @@ -1,452 +0,0 @@ -#include -#include -#include "constants.hpp" -#include "prelexer.hpp" - - -namespace Sass { - using namespace Constants; - - namespace Prelexer { - using std::cerr; using std::endl; - // Matches zero characters (always succeeds without consuming input). - const char* epsilon(char *src) { - return src; - } - // Matches the empty string. - const char* empty(char *src) { - return *src ? 0 : src; - } - - // Match any single character. - const char* any_char(const char* src) { return *src ? src+1 : src; } - - // Match a single character satisfying the ctype predicates. - const char* space(const char* src) { return std::isspace(*src) ? src+1 : 0; } - const char* alpha(const char* src) { return std::isalpha(*src) ? src+1 : 0; } - const char* digit(const char* src) { return std::isdigit(*src) ? src+1 : 0; } - const char* xdigit(const char* src) { return std::isxdigit(*src) ? src+1 : 0; } - const char* alnum(const char* src) { return std::isalnum(*src) ? src+1 : 0; } - const char* punct(const char* src) { return std::ispunct(*src) ? src+1 : 0; } - // Match multiple ctype characters. - const char* spaces(const char* src) { return one_plus(src); } - const char* alphas(const char* src) { return one_plus(src); } - const char* digits(const char* src) { return one_plus(src); } - const char* xdigits(const char* src) { return one_plus(src); } - const char* alnums(const char* src) { return one_plus(src); } - const char* puncts(const char* src) { return one_plus(src); } - - // Match a line comment. - - const char* line_comment(const char* src) { return to_endl(src); } - // Match a block comment. - - - const char* block_comment(const char* src) { - return sequence< optional_spaces, delimited_by >(src); - } - // Match either comment. - const char* comment(const char* src) { - return alternatives(src); - } - // Match double- and single-quoted strings. - const char* double_quoted_string(const char* src) { - return delimited_by<'"', '"', true>(src); - } - const char* single_quoted_string(const char* src) { - return delimited_by<'\'', '\'', true>(src); - } - const char* string_constant(const char* src) { - return alternatives(src); - } - // Match interpolants. - - - const char* interpolant(const char* src) { - return delimited_by(src); - } - - // Whitespace handling. - const char* optional_spaces(const char* src) { return optional(src); } - const char* optional_comment(const char* src) { return optional(src); } - const char* spaces_and_comments(const char* src) { - return zero_plus< alternatives >(src); - } - const char* no_spaces(const char* src) { - return negate< spaces >(src); - } - - const char* backslash_something(const char* src) { - return sequence< exactly<'\\'>, any_char >(src); - } - - // Match CSS identifiers. - const char* identifier(const char* src) { - return sequence< optional< exactly<'-'> >, - alternatives< alpha, exactly<'_'>, backslash_something >, - zero_plus< alternatives< alnum, - exactly<'-'>, - exactly<'_'>, - backslash_something > > >(src); - } - - // Match CSS selectors. - const char* sel_ident(const char* src) { - return sequence< optional< alternatives< exactly<'-'>, exactly<'|'> > >, - alternatives< alpha, exactly<'_'>, backslash_something, exactly<'|'> >, - zero_plus< alternatives< alnum, - exactly<'-'>, - exactly<'_'>, - exactly<'|'>, - backslash_something > > >(src); - } - - // Match interpolant schemas - const char* identifier_schema(const char* src) { - // follows this pattern: (x*ix*)+ ... well, not quite - return one_plus< sequence< zero_plus< alternatives< identifier, exactly<'-'> > >, - interpolant, - zero_plus< alternatives< identifier, number, exactly<'-'> > > > >(src); - } - const char* value_schema(const char* src) { - // follows this pattern: ([xyz]*i[xyz]*)+ - return one_plus< sequence< zero_plus< alternatives< identifier, percentage, dimension, hex, number, string_constant > >, - interpolant, - zero_plus< alternatives< identifier, percentage, dimension, hex, number, string_constant > > > >(src); - } - const char* filename_schema(const char* src) { - return one_plus< sequence< zero_plus< alternatives< identifier, number, exactly<'.'>, exactly<'/'> > >, - interpolant, - zero_plus< alternatives< identifier, number, exactly<'.'>, exactly<'/'> > > > >(src); - } - - const char* filename(const char* src) { - return one_plus< alternatives< identifier, number, exactly<'.'> > >(src); - } - - // Match CSS '@' keywords. - const char* at_keyword(const char* src) { - return sequence, identifier>(src); - } - - const char* import(const char* src) { - return exactly(src); - } - - const char* media(const char* src) { - return exactly(src); - } - - const char* keyframes(const char* src) { - return sequence< exactly<'@'>, optional< vendor_prefix >, exactly< keyframes_kwd > >(src); - } - - const char* vendor_prefix(const char* src) { - return alternatives< exactly< vendor_opera_kwd >, exactly< vendor_webkit_kwd >, exactly< vendor_mozilla_kwd >, exactly< vendor_ms_kwd >, exactly< vendor_khtml_kwd > >(src); - } - - const char* keyf(const char* src) { - return one_plus< alternatives< to, from, percentage > >(src); - } - - const char* mixin(const char* src) { - return exactly(src); - } - - const char* function(const char* src) { - return exactly(src); - } - - const char* return_directive(const char* src) { - return exactly(src); - } - - const char* include(const char* src) { - return exactly(src); - } - - const char* content(const char* src) { - return exactly(src); - } - - const char* extend(const char* src) { - return exactly(src); - } - - - const char* if_directive(const char* src) { - return exactly(src); - } - - const char* else_directive(const char* src) { - return exactly(src); - } - const char* elseif_directive(const char* src) { - return sequence< else_directive, - spaces_and_comments, - exactly< if_after_else_kwd > >(src); - } - - const char* for_directive(const char* src) { - return exactly(src); - } - - const char* from(const char* src) { - return exactly(src); - } - - const char* to(const char* src) { - return exactly(src); - } - - const char* through(const char* src) { - return exactly(src); - } - - const char* each_directive(const char* src) { - return exactly(src); - } - - const char* in(const char* src) { - return exactly(src); - } - - const char* while_directive(const char* src) { - return exactly(src); - } - - const char* name(const char* src) { - return one_plus< alternatives< alnum, - exactly<'-'>, - exactly<'_'> > >(src); - } - - const char* warn(const char* src) { - return exactly(src); - } - - const char* directive(const char* src) { - return sequence< exactly<'@'>, identifier >(src); - } - - const char* null(const char* src) { - return exactly(src); - } - - // Match CSS type selectors - const char* namespace_prefix(const char* src) { - return sequence< optional< alternatives< identifier, exactly<'*'> > >, - exactly<'|'> >(src); - } - const char* type_selector(const char* src) { - return sequence< optional, identifier>(src); - } - const char* universal(const char* src) { - return sequence< optional, exactly<'*'> >(src); - } - // Match CSS id names. - const char* id_name(const char* src) { - return sequence, name>(src); - } - // Match CSS class names. - const char* class_name(const char* src) { - return sequence, identifier>(src); - } - // Match CSS numeric constants. - - const char* sign(const char* src) { - return class_char(src); - } - const char* unsigned_number(const char* src) { - return alternatives, - exactly<'.'>, - one_plus >, - digits>(src); - } - const char* number(const char* src) { - return sequence< optional, unsigned_number>(src); - } - const char* coefficient(const char* src) { - return alternatives< sequence< optional, digits >, - sign >(src); - } - const char* binomial(const char* src) { - return sequence< optional, - optional, - exactly<'n'>, optional_spaces, - sign, optional_spaces, - digits >(src); - } - const char* percentage(const char* src) { - return sequence< number, exactly<'%'> >(src); - } - - const char* em(const char* src) { - return sequence< number, exactly >(src); - } - const char* dimension(const char* src) { - return sequence(src); - } - const char* hex(const char* src) { - const char* p = sequence< exactly<'#'>, one_plus >(src); - int len = p - src; - return (len != 4 && len != 7) ? 0 : p; - } - - const char* rgb_prefix(const char* src) { - return exactly(src); - } - // Match CSS uri specifiers. - - const char* uri_prefix(const char* src) { - return exactly(src); - } - // TODO: rename the following two functions - const char* uri(const char* src) { - return sequence< exactly, - optional, - string_constant, - optional, - exactly<')'> >(src); - } - const char* url_value(const char* src) { - return sequence< optional< sequence< identifier, exactly<':'> > >, // optional protocol - one_plus< sequence< zero_plus< exactly<'/'> >, filename > >, // one or more folders and/or trailing filename - optional< exactly<'/'> > >(src); - } - const char* url_schema(const char* src) { - return sequence< optional< sequence< identifier, exactly<':'> > >, // optional protocol - filename_schema >(src); // optional trailing slash - } - // Match CSS "!important" keyword. - const char* important(const char* src) { - return sequence< exactly<'!'>, - spaces_and_comments, - exactly >(src); - } - // Match Sass "!default" keyword. - const char* default_flag(const char* src) { - return sequence< exactly<'!'>, - spaces_and_comments, - exactly >(src); - } - // Match CSS pseudo-class/element prefixes. - const char* pseudo_prefix(const char* src) { - return sequence< exactly<':'>, optional< exactly<':'> > >(src); - } - // Match CSS function call openers. - const char* functional_schema(const char* src) { - return sequence< identifier_schema, exactly<'('> >(src); - } - const char* functional(const char* src) { - return sequence< identifier, exactly<'('> >(src); - } - // Match the CSS negation pseudo-class. - const char* pseudo_not(const char* src) { - return exactly< pseudo_not_kwd >(src); - } - // Match CSS 'odd' and 'even' keywords for functional pseudo-classes. - const char* even(const char* src) { - return exactly(src); - } - const char* odd(const char* src) { - return exactly(src); - } - // Match CSS attribute-matching operators. - const char* exact_match(const char* src) { return exactly<'='>(src); } - const char* class_match(const char* src) { return exactly(src); } - const char* dash_match(const char* src) { return exactly(src); } - const char* prefix_match(const char* src) { return exactly(src); } - const char* suffix_match(const char* src) { return exactly(src); } - const char* substring_match(const char* src) { return exactly(src); } - // Match CSS combinators. - const char* adjacent_to(const char* src) { - return sequence< optional_spaces, exactly<'+'> >(src); - } - const char* precedes(const char* src) { - return sequence< optional_spaces, exactly<'~'> >(src); - } - const char* parent_of(const char* src) { - return sequence< optional_spaces, exactly<'>'> >(src); - } - const char* ancestor_of(const char* src) { - return sequence< spaces, negate< exactly<'{'> > >(src); - } - - // Match SCSS variable names. - const char* variable(const char* src) { - return sequence, name>(src); - } - - // Match Sass boolean keywords. - const char* true_val(const char* src) { - return exactly(src); - } - const char* false_val(const char* src) { - return exactly(src); - } - const char* and_op(const char* src) { - return exactly(src); - } - const char* or_op(const char* src) { - return exactly(src); - } - const char* not_op(const char* src) { - return exactly(src); - } - const char* eq_op(const char* src) { - return exactly(src); - } - const char* neq_op(const char* src) { - return exactly(src); - } - const char* gt_op(const char* src) { - return exactly(src); - } - const char* gte_op(const char* src) { - return exactly(src); - } - const char* lt_op(const char* src) { - return exactly(src); - } - const char* lte_op(const char* src) { - return exactly(src); - } - - // Path matching functions. - const char* folder(const char* src) { - return sequence< zero_plus< any_char_except<'/'> >, - exactly<'/'> >(src); - } - const char* folders(const char* src) { - return zero_plus< folder >(src); - } - - const char* chunk(const char* src) { - char inside_str = 0; - const char* p = src; - size_t depth = 0; - while (true) { - if (!*p) { - return 0; - } - else if (!inside_str && (*p == '"' || *p == '\'')) { - inside_str = *p; - } - else if (*p == inside_str && *(p-1) != '\\') { - inside_str = 0; - } - else if (*p == '(' && !inside_str) { - ++depth; - } - else if (*p == ')' && !inside_str) { - if (depth == 0) return p; - else --depth; - } - ++p; - } - // unreachable - return 0; - } - } -} diff --git a/src/prelexer.hpp b/src/prelexer.hpp deleted file mode 100644 index 241aa25f4..000000000 --- a/src/prelexer.hpp +++ /dev/null @@ -1,465 +0,0 @@ -#define SASS_PRELEXER - -namespace Sass { - namespace Prelexer { - - typedef int (*ctype_predicate)(int); - typedef const char* (*prelexer)(const char*); - - // Match a single character literal. - template - const char* exactly(const char* src) { - return *src == pre ? src + 1 : 0; - } - - // Match a string constant. - template - const char* exactly(const char* src) { - const char* pre = prefix; - while (*pre && *src == *pre) ++src, ++pre; - return *pre ? 0 : src; - } - - // Match a single character that satifies the supplied ctype predicate. - template - const char* class_char(const char* src) { - return pred(*src) ? src + 1 : 0; - } - - // Match a single character that is a member of the supplied class. - template - const char* class_char(const char* src) { - const char* cc = char_class; - while (*cc && *src != *cc) ++cc; - return *cc ? src + 1 : 0; - } - - // Match a sequence of characters that all satisfy the supplied ctype predicate. - template - const char* class_chars(const char* src) { - const char* p = src; - while (pred(*p)) ++p; - return p == src ? 0 : p; - } - - // Match a sequence of characters that are all members of the supplied class. - template - const char* class_chars(const char* src) { - const char* p = src; - while (class_char(p)) ++p; - return p == src ? 0 : p; - } - - // Match a sequence of characters up to the next newline. - template - const char* to_endl(const char* src) { - if (!(src = exactly(src))) return 0; - while (*src && *src != '\n') ++src; - return src; - } - - // Match a sequence of characters delimited by the supplied chars. - template - const char* delimited_by(const char* src) { - src = exactly(src); - if (!src) return 0; - const char* stop; - while (1) { - if (!*src) return 0; - stop = exactly(src); - if (stop && (!esc || *(src - 1) != '\\')) return stop; - src = stop ? stop : src + 1; - } - } - - // Match a sequence of characters delimited by the supplied strings. - template - const char* delimited_by(const char* src) { - src = exactly(src); - if (!src) return 0; - const char* stop; - while (1) { - if (!*src) return 0; - stop = exactly(src); - if (stop && (!esc || *(src - 1) != '\\')) return stop; - src = stop ? stop : src + 1; - } - } - - // Match any single character. - const char* any_char(const char* src); - // Match any single character except the supplied one. - template - const char* any_char_except(const char* src) { - return (*src && *src != c) ? src+1 : 0; - } - - // Matches zero characters (always succeeds without consuming input). - const char* epsilon(const char*); - - // Matches the empty string. - const char* empty(const char*); - - // Succeeds of the supplied matcher fails, and vice versa. - template - const char* negate(const char* src) { - return mx(src) ? 0 : src; - } - - // Tries the matchers in sequence and returns the first match (or none) - template - const char* alternatives(const char* src) { - const char* rslt; - (rslt = mx1(src)) || (rslt = mx2(src)); - return rslt; - } - - // Same as above, but with 3 arguments. - template - const char* alternatives(const char* src) { - const char* rslt; - (rslt = mx1(src)) || (rslt = mx2(src)) || (rslt = mx3(src)); - return rslt; - } - - // Same as above, but with 4 arguments. - template - const char* alternatives(const char* src) { - const char* rslt; - (rslt = mx1(src)) || (rslt = mx2(src)) || - (rslt = mx3(src)) || (rslt = mx4(src)); - return rslt; - } - - // Same as above, but with 5 arguments. - template - const char* alternatives(const char* src) { - const char* rslt; - (rslt = mx1(src)) || (rslt = mx2(src)) || (rslt = mx3(src)) || - (rslt = mx4(src)) || (rslt = mx5(src)); - return rslt; - } - - // Same as above, but with 6 arguments. - template - const char* alternatives(const char* src) { - const char* rslt; - (rslt = mx1(src)) || (rslt = mx2(src)) || (rslt = mx3(src)) || - (rslt = mx4(src)) || (rslt = mx5(src)) || (rslt = mx6(src)); - return rslt; - } - - // Same as above, but with 7 arguments. - template - const char* alternatives(const char* src) { - const char* rslt = src; - (rslt = mx1(rslt)) || (rslt = mx2(rslt)) || - (rslt = mx3(rslt)) || (rslt = mx4(rslt)) || - (rslt = mx5(rslt)) || (rslt = mx6(rslt)) || - (rslt = mx7(rslt)); - return rslt; - } - - // Same as above, but with 8 arguments. - template - const char* alternatives(const char* src) { - const char* rslt = src; - (rslt = mx1(rslt)) || (rslt = mx2(rslt)) || - (rslt = mx3(rslt)) || (rslt = mx4(rslt)) || - (rslt = mx5(rslt)) || (rslt = mx6(rslt)) || - (rslt = mx7(rslt)) || (rslt = mx8(rslt)); - return rslt; - } - - // Tries the matchers in sequence and succeeds if they all succeed. - template - const char* sequence(const char* src) { - const char* rslt = src; - (rslt = mx1(rslt)) && (rslt = mx2(rslt)); - return rslt; - } - - // Same as above, but with 3 arguments. - template - const char* sequence(const char* src) { - const char* rslt = src; - (rslt = mx1(rslt)) && (rslt = mx2(rslt)) && (rslt = mx3(rslt)); - return rslt; - } - - // Same as above, but with 4 arguments. - template - const char* sequence(const char* src) { - const char* rslt = src; - (rslt = mx1(rslt)) && (rslt = mx2(rslt)) && - (rslt = mx3(rslt)) && (rslt = mx4(rslt)); - return rslt; - } - - // Same as above, but with 5 arguments. - template - const char* sequence(const char* src) { - const char* rslt = src; - (rslt = mx1(rslt)) && (rslt = mx2(rslt)) && - (rslt = mx3(rslt)) && (rslt = mx4(rslt)) && - (rslt = mx5(rslt)); - return rslt; - } - - // Same as above, but with 6 arguments. - template - const char* sequence(const char* src) { - const char* rslt = src; - (rslt = mx1(rslt)) && (rslt = mx2(rslt)) && - (rslt = mx3(rslt)) && (rslt = mx4(rslt)) && - (rslt = mx5(rslt)) && (rslt = mx6(rslt)); - return rslt; - } - - // Same as above, but with 7 arguments. - template - const char* sequence(const char* src) { - const char* rslt = src; - (rslt = mx1(rslt)) && (rslt = mx2(rslt)) && - (rslt = mx3(rslt)) && (rslt = mx4(rslt)) && - (rslt = mx5(rslt)) && (rslt = mx6(rslt)) && - (rslt = mx7(rslt)); - return rslt; - } - - // Match a pattern or not. Always succeeds. - template - const char* optional(const char* src) { - const char* p = mx(src); - return p ? p : src; - } - - // Match zero or more of the supplied pattern - template - const char* zero_plus(const char* src) { - const char* p = mx(src); - while (p) src = p, p = mx(src); - return src; - } - - // Match one or more of the supplied pattern - template - const char* one_plus(const char* src) { - const char* p = mx(src); - if (!p) return 0; - while (p) src = p, p = mx(src); - return src; - } - - // Match a single character satisfying the ctype predicates. - const char* space(const char* src); - const char* alpha(const char* src); - const char* digit(const char* src); - const char* xdigit(const char* src); - const char* alnum(const char* src); - const char* punct(const char* src); - // Match multiple ctype characters. - const char* spaces(const char* src); - const char* alphas(const char* src); - const char* digits(const char* src); - const char* xdigits(const char* src); - const char* alnums(const char* src); - const char* puncts(const char* src); - - // Match a line comment. - const char* line_comment(const char* src); - // Match a block comment. - const char* block_comment(const char* src); - // Match either. - const char* comment(const char* src); - // Match double- and single-quoted strings. - const char* double_quoted_string(const char* src); - const char* single_quoted_string(const char* src); - const char* string_constant(const char* src); - // Match interpolants. - const char* interpolant(const char* src); - - // Whitespace handling. - const char* optional_spaces(const char* src); - const char* optional_comment(const char* src); - const char* spaces_and_comments(const char* src); - const char* no_spaces(const char* src); - - const char* backslash_something(const char* src); - - // Match a CSS identifier. - const char* identifier(const char* src); - // Match selector names. - const char* sel_ident(const char* src); - // Match interpolant schemas - const char* identifier_schema(const char* src); - const char* value_schema(const char* src); - const char* filename(const char* src); - const char* filename_schema(const char* src); - const char* url_schema(const char* src); - const char* url_value(const char* src); - const char* vendor_prefix(const char* src); - // Match CSS '@' keywords. - const char* at_keyword(const char* src); - const char* import(const char* src); - const char* media(const char* src); - const char* keyframes(const char* src); - const char* keyf(const char* src); - const char* mixin(const char* src); - const char* function(const char* src); - const char* return_directive(const char* src); - const char* include(const char* src); - const char* content(const char* src); - const char* extend(const char* src); - - const char* if_directive(const char* src); - const char* else_directive(const char* src); - const char* elseif_directive(const char* src); - - const char* for_directive(const char* src); - const char* from(const char* src); - const char* to(const char* src); - const char* through(const char* src); - - const char* each_directive(const char* src); - const char* in(const char* src); - - const char* while_directive(const char* src); - - const char* warn(const char* src); - - const char* directive(const char* src); - const char* at_keyword(const char* src); - - const char* null(const char* src); - - // Match CSS type selectors - const char* namespace_prefix(const char* src); - const char* type_selector(const char* src); - const char* universal(const char* src); - // Match CSS id names. - const char* id_name(const char* src); - // Match CSS class names. - const char* class_name(const char* src); - // Match CSS numeric constants. - const char* sign(const char* src); - const char* unsigned_number(const char* src); - const char* number(const char* src); - const char* coefficient(const char* src); - const char* binomial(const char* src); - const char* percentage(const char* src); - const char* dimension(const char* src); - const char* hex(const char* src); - const char* rgb_prefix(const char* src); - // Match CSS uri specifiers. - const char* uri_prefix(const char* src); - const char* uri(const char* src); - const char* url(const char* src); - // Match CSS "!important" keyword. - const char* important(const char* src); - // Match Sass "!default" keyword. - const char* default_flag(const char* src); - // Match CSS pseudo-class/element prefixes - const char* pseudo_prefix(const char* src); - // Match CSS function call openers. - const char* functional(const char* src); - const char* functional_schema(const char* src); - const char* pseudo_not(const char* src); - // Match CSS 'odd' and 'even' keywords for functional pseudo-classes. - const char* even(const char* src); - const char* odd(const char* src); - // Match CSS attribute-matching operators. - const char* exact_match(const char* src); - const char* class_match(const char* src); - const char* dash_match(const char* src); - const char* prefix_match(const char* src); - const char* suffix_match(const char* src); - const char* substring_match(const char* src); - // Match CSS combinators. - const char* adjacent_to(const char* src); - const char* precedes(const char* src); - const char* parent_of(const char* src); - const char* ancestor_of(const char* src); - - // Match SCSS variable names. - const char* variable(const char* src); - - // Match Sass boolean keywords. - const char* true_val(const char* src); - const char* false_val(const char* src); - const char* and_op(const char* src); - const char* or_op(const char* src); - const char* not_op(const char* src); - const char* eq_op(const char* src); - const char* neq_op(const char* src); - const char* gt_op(const char* src); - const char* gte_op(const char* src); - const char* lt_op(const char* src); - const char* lte_op(const char* src); - - // Path matching functions. - const char* folder(const char* src); - const char* folders(const char* src); - - // Utility functions for finding and counting characters in a string. - template - const char* find_first(const char* src) { - while (*src && *src != c) ++src; - return *src ? src : 0; - } - template - const char* find_first(const char* src) { - while (*src && !mx(src)) ++src; - return *src ? src : 0; - } - template - const char* find_first_in_interval(const char* beg, const char* end) { - while ((beg < end) && *beg) { - if (mx(beg)) return beg; - ++beg; - } - return 0; - } - template - unsigned int count_interval(const char* beg, const char* end) { - unsigned int counter = 0; - while (beg < end && *beg) { - if (*beg == c) ++counter; - ++beg; - } - return counter; - } - template - unsigned int count_interval(const char* beg, const char* end) { - unsigned int counter = 0; - while (beg < end && *beg) { - const char* p; - if (p = mx(beg)) { - ++counter; - beg = p; - } - else { - ++beg; - } - } - return counter; - } - - const char* chunk(const char* src); - } -} diff --git a/src/sass.cpp b/src/sass.cpp deleted file mode 100644 index 8ee18a20b..000000000 --- a/src/sass.cpp +++ /dev/null @@ -1,151 +0,0 @@ -#include -#include -#include -#include - -#ifndef SASS -#include "sass.h" -#endif - -#include "context.hpp" -#include "error_handling.hpp" - -extern "C" { - using namespace std; - - struct Sass_Context* make_sass_context() - { return (Sass_Context*) calloc(1, sizeof(Sass_Context)); } - - void free_sass_context(struct Sass_Context* ctx) - { - if (ctx->output_string) free(ctx->output_string); - if (ctx->error_message) free(ctx->error_message); - free(ctx); - } - - namespace Sass { - enum Sass_Source { FILE_SOURCE, STRING_SOURCE }; - - static void compile_sass(struct Sass_Context* c_ctx, - Sass::Sass_Source src_option) - { - using namespace Sass; - try { - Context cpp_ctx( - Context::Data().source_c_str (c_ctx->input_string) - - .entry_point (c_ctx->input_path ? - c_ctx->input_path : - "") - - .output_style ((Output_Style) - c_ctx->output_style) - - .source_comments (c_ctx->source_comments) - .source_maps (c_ctx->source_maps) - - .image_path (c_ctx->image_path ? - c_ctx->image_path : - "") - - .include_paths_c_str (c_ctx->include_paths_string) - .include_paths_array (/*c_ctx->include_paths_array*/0) - .include_paths (vector()) - ); - if (src_option == FILE_SOURCE) cpp_ctx.compile_file(); - else cpp_ctx.compile_string(); - c_ctx->error_message = 0; - c_ctx->error_status = 0; - } - catch (Error& e) { - stringstream msg_stream; - msg_stream << e.path << ":" << e.line << ": error: " << e.message << endl; - string msg(msg_stream.str()); - char* msg_str = (char*) malloc(msg.size() + 1); - strcpy(msg_str, msg.c_str()); - c_ctx->error_status = 1; - c_ctx->output_string = 0; - c_ctx->error_message = msg_str; - } - catch (bad_alloc& ba) { - stringstream msg_stream; - msg_stream << "Unable to allocate memory: " << ba.what() << endl; - string msg(msg_stream.str()); - char* msg_str = (char*) malloc(msg.size() + 1); - strcpy(msg_str, msg.c_str()); - c_ctx->error_status = 1; - c_ctx->output_string = 0; - c_ctx->error_message = msg_str; - } - } - } - - void compile_sass_file(struct Sass_Context* c_ctx) - { Sass::compile_sass(c_ctx, Sass::FILE_SOURCE); } - - void compile_sass_string(struct Sass_Context* c_ctx) - { Sass::compile_sass(c_ctx, Sass::STRING_SOURCE); } - - - union Sass_Value make_sass_boolean(int val) - { - union Sass_Value v; - v.boolean.tag = SASS_BOOLEAN; - v.boolean.value = val; - return v; - } - - union Sass_Value make_sass_number(double val, const char* unit) - { - union Sass_Value v; - v.number.tag = SASS_NUMBER; - v.number.value = val; - v.number.unit = strdup(unit); - return v; - } - - union Sass_Value make_sass_color(double r, double g, double b, double a) - { - union Sass_Value v; - v.color.tag = SASS_COLOR; - v.color.r = r; - v.color.g = g; - v.color.b = b; - v.color.a = a; - return v; - } - - union Sass_Value make_sass_string(const char* val) - { - union Sass_Value v; - v.string.tag = SASS_STRING; - v.string.value = strdup(val); - return v; - } - - union Sass_Value make_sass_list(size_t len, enum Sass_Separator sep) - { - union Sass_Value v; - v.list.tag = SASS_LIST; - v.list.length = len; - v.list.separator = sep; - v.list.values = (union Sass_Value*) malloc(sizeof(union Sass_Value)*len); - return v; - } - - union Sass_Value make_sass_null() - { - union Sass_Value v; - v.null.tag = SASS_NULL; - return v; - } - - union Sass_Value make_sass_error(const char* msg) - { - union Sass_Value v; - v.error.tag = SASS_ERROR; - v.error.message = strdup(msg); - return v; - } - -} \ No newline at end of file diff --git a/src/sass.h b/src/sass.h deleted file mode 100644 index 159cfc0f2..000000000 --- a/src/sass.h +++ /dev/null @@ -1,128 +0,0 @@ -#define SASS - -#ifdef __cplusplus -extern "C" { -#endif - -#define SASS_OUTPUT_NESTED 0 -#define SASS_OUTPUT_EXPANDED 1 -#define SASS_OUTPUT_COMPACT 2 -#define SASS_OUTPUT_COMPRESSED 3 -#define SASS_OUTPUT_FORMATTED 4 - -struct Sass_Context { - const char* input_path; - const char* input_string; - char* output_string; - - int error_status; - char* error_message; - - int output_style; - int source_comments; - int source_maps; - const char* image_path; - const char* include_paths_string; - const char** include_paths_array; -}; - -struct Sass_Context* make_sass_context (); -void free_sass_context (struct Sass_Context*); -void compile_sass_file (struct Sass_Context*); -void compile_sass_string (struct Sass_Context*); - -// type tags for Sass values -enum Sass_Tag { - SASS_BOOLEAN, - SASS_NUMBER, - SASS_COLOR, - SASS_STRING, - SASS_LIST, - SASS_NULL, - SASS_ERROR -}; - -// tags for denoting Sass list separators -enum Sass_Separator { - SASS_COMMA, - SASS_SPACE -}; - -// Component structs for the Sass value union type. -// Not meant to be used directly. -struct Sass_Unknown { - enum Sass_Tag tag; -}; - -struct Sass_Boolean { - enum Sass_Tag tag; - int value; -}; - -struct Sass_Number { - enum Sass_Tag tag; - double value; - char* unit; -}; - -struct Sass_Color { - enum Sass_Tag tag; - double r; - double g; - double b; - double a; -}; - -struct Sass_String { - enum Sass_Tag tag; - char* value; -}; - -union Sass_Value; - -struct Sass_List { - enum Sass_Tag tag; - enum Sass_Separator separator; - size_t length; - union Sass_Value* values; -}; - -struct Sass_Null { - enum Sass_Tag tag; -}; - -struct Sass_Error { - enum Sass_Tag tag; - char* message; -}; - -// represention of Sass values in C -union Sass_Value { - struct Sass_Unknown unknown; - struct Sass_Boolean boolean; - struct Sass_Number number; - struct Sass_Color color; - struct Sass_String string; - struct Sass_List list; - struct Sass_Null null; - struct Sass_Error error; -}; - -union Sass_Value make_sass_boolean (int val); -union Sass_Value make_sass_number (double val, const char* unit); -union Sass_Value make_sass_color (double r, double g, double b, double a); -union Sass_Value make_sass_string (const char* val); -union Sass_Value make_sass_list (size_t len, enum Sass_Separator sep); -union Sass_Value make_sass_null (); -union Sass_Value make_sass_error (const char* msg); - -typedef union Sass_Value(*Sass_C_Function)(union Sass_Value); - -struct Sass_C_Function_Descriptor { - const char* signature; - Sass_C_Function function; -}; - -#ifdef __cplusplus -} -#endif diff --git a/src/sass_classes.txt b/src/sass_classes.txt deleted file mode 100644 index c82596de3..000000000 --- a/src/sass_classes.txt +++ /dev/null @@ -1,88 +0,0 @@ -Node ( string, size_t ) - - Statement - Value - Selector - Parameter - Parameters - Argument - Arguments - - -Statement ( unnestable? ) - - Block ( Statement[], root? ) - Ruleset ( Selector, Block ) - Propset ( String, Block ) - Media_query ( Value, Block ) - Directive ( string, Selector, Block ) - - Declaration ( String, Value[] ) - Assignment ( String, Value, guarded? ) - Import ( String ) - Warning ( String ) - Comment ( String ) - - If ( Value, Block, Block ) - For ( string, Value, Value, Block, inclusive? ) - Each ( string, Value, Block ) - While ( Value, Block ) - - Extension ( Selector ) - - Definition ( string, Parameters, Block ) - Mixin_Call ( string, Argument[], Block ) - - -Value ( delayed?, parenthesized? ) - - List ( Value[], comma_separated? ) - Binary_Expr ( Value, Value ) - Negation ( Value ) - Function_call ( string, Argument[] ) - Variable ( string ) - Textual ( string ) - Percentage ( double ) - Dimension ( double, string[], string[] ) - Number ( double ) - Boolean ( bool ) - Color ( double, double, double, double ) - String ( Value[], quoted?, interpolated? ) - Token ( string ) - - -Selector - - Group ( Combination[] ) - Combination ( Combinator, Combination, Sequence ) - Sequence ( Simple[] ) - Simple ( string ) - Reference - Placeholder - - -Parameter ( string, Value, default_value?, packed? ) -Parameters ( Parameter[], has_default?, has_packed? ) - -Argument ( Value, string, keyword_argument?, unpacked? ) -Arguments ( Argument[], has_keyword_argument?, has_unpacked? ) - - - - - - - - - - - - - - - - - - - - diff --git a/src/sass_interface.cpp b/src/sass_interface.cpp deleted file mode 100644 index 0b0aba0af..000000000 --- a/src/sass_interface.cpp +++ /dev/null @@ -1,135 +0,0 @@ -#ifdef _WIN32 -#include -#else -#include -#endif - -#include "sass_interface.h" -#include "context.hpp" -#include "error_handling.hpp" - -#include -#include -#include -#include -#include -#include - -extern "C" { - using namespace std; - - sass_context* sass_new_context() - { return (sass_context*) calloc(1, sizeof(sass_context)); } - - void sass_free_context(sass_context* ctx) - { - if (ctx->output_string) free(ctx->output_string); - if (ctx->error_message) free(ctx->error_message); - - free(ctx); - } - - sass_file_context* sass_new_file_context() - { return (sass_file_context*) calloc(1, sizeof(sass_file_context)); } - - void sass_free_file_context(sass_file_context* ctx) - { - if (ctx->output_string) free(ctx->output_string); - if (ctx->error_message) free(ctx->error_message); - - free(ctx); - } - - sass_folder_context* sass_new_folder_context() - { return (sass_folder_context*) calloc(1, sizeof(sass_folder_context)); } - - void sass_free_folder_context(sass_folder_context* ctx) - { free(ctx); } - - int sass_compile(sass_context* c_ctx) - { - using namespace Sass; - try { - Context cpp_ctx( - Context::Data().source_c_str(c_ctx->source_string) - .entry_point("") - .output_style((Output_Style) c_ctx->options.output_style) - .source_comments(c_ctx->options.source_comments) - .source_maps(c_ctx->options.source_comments) // fix this - .image_path(c_ctx->options.image_path) - .include_paths_c_str(c_ctx->options.include_paths) - .include_paths_array(0) - .include_paths(vector()) - ); - c_ctx->output_string = cpp_ctx.compile_string(); - c_ctx->error_message = 0; - c_ctx->error_status = 0; - } - catch (Error& e) { - stringstream msg_stream; - msg_stream << e.path << ":" << e.line << ": error: " << e.message << endl; - c_ctx->error_message = strdup(msg_stream.str().c_str()); - c_ctx->error_status = 1; - c_ctx->output_string = 0; - } - catch(bad_alloc& ba) { - stringstream msg_stream; - msg_stream << "Unable to allocate memory: " << ba.what() << endl; - c_ctx->error_message = strdup(msg_stream.str().c_str()); - c_ctx->error_status = 1; - c_ctx->output_string = 0; - } - // TO DO: CATCH EVERYTHING ELSE - return 0; - } - - int sass_compile_file(sass_file_context* c_ctx) - { - using namespace Sass; - try { - Context cpp_ctx( - Context::Data().entry_point(c_ctx->input_path) - .output_style((Output_Style) c_ctx->options.output_style) - .source_comments(c_ctx->options.source_comments) - .source_maps(c_ctx->options.source_comments) // fix this - .image_path(c_ctx->options.image_path) - .include_paths_c_str(c_ctx->options.include_paths) - .include_paths_array(0) - .include_paths(vector()) - ); - c_ctx->output_string = cpp_ctx.compile_file(); - c_ctx->error_message = 0; - c_ctx->error_status = 0; - } - catch (Error& e) { - stringstream msg_stream; - msg_stream << e.path << ":" << e.line << ": error: " << e.message << endl; - c_ctx->error_message = strdup(msg_stream.str().c_str()); - c_ctx->error_status = 1; - c_ctx->output_string = 0; - } - catch(bad_alloc& ba) { - stringstream msg_stream; - msg_stream << "Unable to allocate memory: " << ba.what() << endl; - c_ctx->error_message = strdup(msg_stream.str().c_str()); - c_ctx->error_status = 1; - c_ctx->output_string = 0; - } - catch(string& bad_path) { - // couldn't find the specified file in the include paths; report an error - stringstream msg_stream; - msg_stream << "error reading file \"" << bad_path << "\"" << endl; - c_ctx->error_message = strdup(msg_stream.str().c_str()); - c_ctx->error_status = 1; - c_ctx->output_string = 0; - } - // TO DO: CATCH EVERYTHING ELSE - return 0; - } - - int sass_compile_folder(sass_folder_context* c_ctx) - { - return 1; - } - -} diff --git a/src/sass_interface.h b/src/sass_interface.h deleted file mode 100644 index 52fa51cdf..000000000 --- a/src/sass_interface.h +++ /dev/null @@ -1,66 +0,0 @@ -#define SASS_INTERFACE - -#include "sass.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define SASS_STYLE_NESTED 0 -#define SASS_STYLE_EXPANDED 1 -#define SASS_STYLE_COMPACT 2 -#define SASS_STYLE_COMPRESSED 3 - -#define SASS_SOURCE_COMMENTS_NONE 0 -#define SASS_SOURCE_COMMENTS_DEFAULT 1 -#define SASS_SOURCE_COMMENTS_MAP 2 - -struct sass_options { - int output_style; - int source_comments; // really want a bool, but C doesn't have them - char* include_paths; - char* image_path; -}; - -struct sass_context { - const char* source_string; - char* output_string; - struct sass_options options; - int error_status; - char* error_message; - struct Sass_C_Function_Data* c_functions; -}; - -struct sass_file_context { - char* input_path; - char* output_string; - struct sass_options options; - int error_status; - char* error_message; - struct Sass_C_Function_Data* c_functions; -}; - -struct sass_folder_context { - char* search_path; - char* output_path; - struct sass_options options; - int error_status; - char* error_message; - struct Sass_C_Function_Data* c_functions; -}; - -struct sass_context* sass_new_context (void); -struct sass_file_context* sass_new_file_context (void); -struct sass_folder_context* sass_new_folder_context (void); - -void sass_free_context (struct sass_context* ctx); -void sass_free_file_context (struct sass_file_context* ctx); -void sass_free_folder_context (struct sass_folder_context* ctx); - -int sass_compile (struct sass_context* ctx); -int sass_compile_file (struct sass_file_context* ctx); -int sass_compile_folder (struct sass_folder_context* ctx); - -#ifdef __cplusplus -} -#endif diff --git a/src/sassc++.cpp b/src/sassc++.cpp deleted file mode 100644 index b68f02902..000000000 --- a/src/sassc++.cpp +++ /dev/null @@ -1,37 +0,0 @@ -#include -#include -#include -#include "context.hpp" -#include "error_handling.hpp" - -using namespace std; - -int main(int argc, char** argv) -{ - if (argc < 2) { - cout << "Please specify a file on the command line." << endl; - return 1; - } - - string file_name(argv[1]); - - try { - Sass::Context ctx( - Sass::Context::Data().entry_point(file_name) - .output_style(Sass::FORMATTED) - ); - char* result = ctx.compile_file(); - if (result) { - cout << result; - free(result); - } - } - catch (Sass::Error& e) { - cout << e.path << ":" << e.line << ": " << e.message << endl; - } - catch (string& msg) { - cout << msg << endl; - } - - return 0; -} \ No newline at end of file diff --git a/src/stuff.txt b/src/stuff.txt deleted file mode 100644 index e351b79b2..000000000 --- a/src/stuff.txt +++ /dev/null @@ -1,16 +0,0 @@ - -: ; , { } [ ] ( ) . ... + - * / = == < > <= >= ~= |= ^= $= *= ~ ! \ -$[ident] %[ident] @[ident] - -+digit & dot & digit - - -NEW(pool, Some_Type, ...args) ==> - - pool.register(new Some_Type(...args)) - -... and later ... - - new (pool.alloc(sizeof(Some_Type))) Some_Type(...args) - -#define NEW(pool, type, ...) pool.register(new type(__VA_ARGS__)) \ No newline at end of file diff --git a/src/tests/#functions.scss# b/src/tests/#functions.scss# deleted file mode 100644 index 931d57678..000000000 --- a/src/tests/#functions.scss# +++ /dev/null @@ -1,16 +0,0 @@ -@function foo($x) { - @while $x { - $z: transform($z); - @return $z; - } -} - -@function bar($x) { - @if $x { - @return YES; - } -} - -div { - answer: bar(false); -} \ No newline at end of file diff --git a/src/tests/alpha.scss b/src/tests/alpha.scss deleted file mode 100644 index db7819ecf..000000000 --- a/src/tests/alpha.scss +++ /dev/null @@ -1,23 +0,0 @@ -$x: rgb(0, 255, 255); - -div { - color: rgb(255, $blue: 0, $green: 255); - background: rgb(123, 45, 6); -// flah: rgba(0, 0, 0, 1) + #111; - grah: rgba(#f0e, $alpha: .5); -// blah: rgba(1,2,3,.6); - - floo: $x; -// bloo: rgba($x, 0.7); - groo: $x; - - $x: rgb(123, 45, 6); - - hoo: red($x); - moo: green($x); - poo: blue($x); - -// goo: mix(rgba(255, 0, 0, 0.5), #00f); - - boo: invert(#123456); -} diff --git a/src/tests/another-gradient-test.scss b/src/tests/another-gradient-test.scss deleted file mode 100644 index 6f3d4d154..000000000 --- a/src/tests/another-gradient-test.scss +++ /dev/null @@ -1,5 +0,0 @@ -@import "compass-sheets/css3"; - -.test { - @include background-image(linear-gradient(#000, #FFF)); -} \ No newline at end of file diff --git a/src/tests/append.scss b/src/tests/append.scss deleted file mode 100644 index ce7ea863c..000000000 --- a/src/tests/append.scss +++ /dev/null @@ -1,5 +0,0 @@ -div { - $l: append(a b, c d); - foo: nth($l, 3); - bar: type-of($l); -} \ No newline at end of file diff --git a/src/tests/arg-eval.scss b/src/tests/arg-eval.scss deleted file mode 100644 index a72d70efe..000000000 --- a/src/tests/arg-eval.scss +++ /dev/null @@ -1,17 +0,0 @@ -@function foo() { - @return 1+2 3/4 5+6; -} - -@mixin bar($x: 3/4) { - bar-content: $x; -} - -div { - content: foobar(1+2 3/4 5+6, orange); - content: append(1+2 2/3 5+6, orange); - content: 1+2 2/3 5+6; - content: type-of(2/3); - content: type-of(orange); - content: foo(); - @include bar(); -} \ No newline at end of file diff --git a/src/tests/arglist.scss b/src/tests/arglist.scss deleted file mode 100644 index cd803e704..000000000 --- a/src/tests/arglist.scss +++ /dev/null @@ -1,9 +0,0 @@ -@mixin foo($x, $y, $zs...) { - foo-x: $x; - foo-y: $y; - foo-zs: $zs; -} - -div { - @include foo(a, b, c, d, e); -} \ No newline at end of file diff --git a/src/tests/arithmetic.scss b/src/tests/arithmetic.scss deleted file mode 100644 index 1032bac42..000000000 --- a/src/tests/arithmetic.scss +++ /dev/null @@ -1,146 +0,0 @@ -div { - /* number + whatever */ - font: 3 + 2; - font: 3 + 50%; - font: 3 + 12px; - font: 3 + #111111; - font: 3 + hello; - font: 3 + "hello"; - font: 3 + true; - font: 3 + false; - font: 3 + not-there(hello); - font: 3 + un#{quo}te("hello"); - font: 3 + (a, b, c); - font: 3 + (a b c); - /* number - whatever */ - font: 3 - 2; - font: 3 - 50%; - font: 3 - 12px; - font: 3 - #111111; - font: 3 - hello; - font: 3 - "hello"; - font: 3 - true; - font: 3 - false; - font: 3 - not-there(hello); - font: 3 - un#{quo}te("hello"); - font: 3 - (a, b, c); - font: 3 - (a b c); - /* number * whatever */ - font: 3 * 2; - font: 3 * 50%; - font: 3 * 12px; - font: 3 * #111111; - // // the following commented expressions have invalid operands - // font: 3 * hello; - // font: 3 * "hello"; - // font: 3 * true; - // font: 3 * false; - // font: 3 * not-there(hello); - // font: 3 * un#{quo}te("hello"); - // font: 3 * (a, b, c); - // font: 3 * (a b c); - /* number / whatever */ - font: 3 / 2; - font: (3 / 2); - font: 4 * 3 / 2; - font: 3 / 2 * 4; - // font: (100 / 50%); // results in mixed unit - // font: (3 / 12px); // results in mixed unit - font: (3 / #111111); - font: (3 / hello); - font: (3 / "hello"); - font: (3 / true); - font: (3 / false); - font: (3 / not-there(hello)); - font: (3 / un#{quo}te("hello")); - font: (3 / (a, b, c)); - font: (3 / (a b c)); - /* number % whatever */ - font: 3 % 2; -// font: 3 % 50%; // units not allowed -// font: 3 % 12px; -// font: 3 % #111111; // invalid operand -// font: 3 % hello; -// font: 3 % "hello"; -// font: 3 % true; -// font: 3 % false; -// font: 3 % not-there(hello); -// font: 3 % un#{quo}te("hello"); -// font: 3 % (a, b, c); -// font: 3 % (a b c); - /* */ - /* percentage + whatever */ - font: 50% + 3; - font: 50% + 100%; -// font : 50% + 10px; // incompatible units -// font: 50% + #111111; // invalid operands - font: 50% + hello; - font: 50% + "hello"; - font: 50% + undefined(hello); - font: 50% + un#{quo}te("hello"); - font: 50% + (a, b, c); - font: 50% + (a b c); - /* percentage - whatever */ - font: 50% - 3; - font: 50% - 100%; -// font: 50% - 10px; // incompatible units - font: 50% - #111111; // invalid operands - font: 50% - hello; - font: 50% - "hello"; - font: 50% - undefined(hello); - font: 50% - un#{quo}te("hello"); - font: 50% - (a, b, c); - font: 50% - (a b c); - /* percentage * whatever */ - font: 50% * 3; -// font: 50% * 100%; // results in squared units -// font: 50% * 10px; // results in mixed units -// font: 50% * #111111; // invalid operands -// font: 50% * hello; -// font: 50% * "hello"; -// font: 50% * undefined(hello); -// font: 50% * un#{quo}te("hello"); -// font: 50% * (a, b, c); -// font: 50% * (a b c); - /* percentage / whatever */ - font: (50% / 3); - font: (50% / 100%); -// font: (50% / 10px); // incompatible units - font: (50% / #111111); // invalid operands - font: (50% / hello); - font: 50%/"hello"; - font: (50% / undefined(hello)); - font: 50% / un#{quo}te("hello"); - font: 50% / (a, b, c); - font: 50% / (a b c); - /* percentage % whatever */ - /* percentage / whatever */ - font: 50% % 3; -// font: 50% % 100%; // not allowed to mod by units -// font: 50% % 10px; -// font: 50% % #111111; // invalid operands -// font: 50% % hello; -// font: 50% % "hello"; -// font: 50% % undefined(hello); -// font: 50% % un#{quo}te("hello"); -// font: 50% % (a, b, c); -// font: 50% % (a b c); -// font: 20px % 6px; - font: type-of(3 + (a b c)); - blah: (20/#abc); - blah: type-of(3 + true); - blah: (3 + true); - blah: (true + 3); - blah: (true - 5); - -// blah: 20px % 6px; - -// blah: 20 % 6px; - // blah: 20px % 6hz; -// blee: rgba(4,4,4,.3) % rgba(1,1,1,.3); - blah: (#abc / #111); - foo: type-of((1 2 3) + (a b c)); - foo: (1 2 3) + (a b c); - foo: (2px + 3px)*4em/2px; - foo: 1cm*1in/1cm; -} \ No newline at end of file diff --git a/src/tests/at-stuff.scss b/src/tests/at-stuff.scss deleted file mode 100644 index b9f1bfb3d..000000000 --- a/src/tests/at-stuff.scss +++ /dev/null @@ -1,64 +0,0 @@ -@fudge hux bloo; - -div { - color: red; - @fudge { - span { - width: 10px; - a { - font: whatever; - } - } - } - height: 20px; - @-webkit-keyframes SOMETHING { - 0% { opacity: 0; } - 50% { opacity: 0.5; } - 100% { opacity: 1.0; } - } - @-webkit-keyframes BOUNCE { - from { - left: 0px; - } - to { - left: 200px; - } - } -} - -100% { - opacity: 1.0; - color: whatever; - 50% { - opacity: 0.5; - color: something else; - } -} - - -div { - span { - font: whatever; - } - border: { - upper: { - left: 10px; - right: 9px; - } - lower: { - left: 8px; - right: 7px; - } - } - background: gray; -} - -@fudge HEY, HOO, HA:first-child { - color: blue; -} - -@mudge div span, a:visited; - -@fu#{dge} foo { - color: red; -} \ No newline at end of file diff --git a/src/tests/backrefs-in-selector-groups.scss b/src/tests/backrefs-in-selector-groups.scss deleted file mode 100644 index 8b6016b14..000000000 --- a/src/tests/backrefs-in-selector-groups.scss +++ /dev/null @@ -1,11 +0,0 @@ -a { - &:c, & d { - hey: ho; - } -} - -a b { - &:c, & d { - hey: ho; - } -} diff --git a/src/tests/backslash.scss b/src/tests/backslash.scss deleted file mode 100644 index 62237e181..000000000 --- a/src/tests/backslash.scss +++ /dev/null @@ -1,27 +0,0 @@ -div, span { - color: red; - \ foo { - color: blue; - } -} - -[data-icon='test-1']:before { - content:'\\'; -} -/* -[data-icon='test-2']:before { - content:'\''; -} - -[data-icon='test-3']:before { -// content:"\""; -} - -.\E9motion { color: red; } -.\E9 dition { color: green; } -.\0000E9dition { color: blue; } - -$open-quote: \201C; -$close-quote: \201D; - -*/ \ No newline at end of file diff --git a/src/tests/basic.scss b/src/tests/basic.scss deleted file mode 100644 index 5d1f1f803..000000000 --- a/src/tests/basic.scss +++ /dev/null @@ -1,23 +0,0 @@ -@function foo($x, $y) { - @if $x == $y { - @return false; - } -} - - -@mixin foo($x, $y: green) { - div { - color: red; - font-color: $y; - } -} - -div { - content: foobar(1+2 3/4 5+6, orange); - content: append(1+2 2/3 5+6, orange); - content: 1+2 2/3 5+6; - content: type-of(2/3); - content: type-of(orange); - content: foo(); - content: 2 3; -} \ No newline at end of file diff --git a/src/tests/blimp.scss b/src/tests/blimp.scss deleted file mode 100644 index 182b7a347..000000000 --- a/src/tests/blimp.scss +++ /dev/null @@ -1 +0,0 @@ -blimp { color: green } diff --git a/src/tests/bool.scss b/src/tests/bool.scss deleted file mode 100644 index e8223d38d..000000000 --- a/src/tests/bool.scss +++ /dev/null @@ -1,8 +0,0 @@ -div { - a: (false and "hey"); - b: ("hey" and "ho"); - b: ("hey" or "ho"); - a: false and "hey"; - b: "hey" and "ho"; - b: unquote("hey") or "ho"; -} \ No newline at end of file diff --git a/src/tests/calc.scss b/src/tests/calc.scss deleted file mode 100644 index bee819413..000000000 --- a/src/tests/calc.scss +++ /dev/null @@ -1,5 +0,0 @@ -$x: 2; -body { - width: calc($x + 2 - 3em / hoolabaloo); - height: foo(2 + 2); -} \ No newline at end of file diff --git a/src/tests/cfunc.scss b/src/tests/cfunc.scss deleted file mode 100644 index fcb7504cd..000000000 --- a/src/tests/cfunc.scss +++ /dev/null @@ -1,3 +0,0 @@ -div { - blah: say-something(); -} \ No newline at end of file diff --git a/src/tests/charset.scss b/src/tests/charset.scss deleted file mode 100644 index 55a97c1e6..000000000 --- a/src/tests/charset.scss +++ /dev/null @@ -1,7 +0,0 @@ -@charset "UTF-8"; - -div { - color: blue; - @charset "ISO-whatever"; - hey: ho; -} \ No newline at end of file diff --git a/src/tests/classes-and-ids.scss b/src/tests/classes-and-ids.scss deleted file mode 100644 index 232db9c58..000000000 --- a/src/tests/classes-and-ids.scss +++ /dev/null @@ -1,9 +0,0 @@ -div.foo { - color: red; - #hux buz { - width: auto; - } - > .mux { - text-align: center; - } -} \ No newline at end of file diff --git a/src/tests/color-names.scss b/src/tests/color-names.scss deleted file mode 100644 index 8e964e0d4..000000000 --- a/src/tests/color-names.scss +++ /dev/null @@ -1,143 +0,0 @@ -colors { - AliceBlue: #F0F8FF + 0; - AntiqueWhite: #FAEBD7 + 0; - Aqua: #00FFFF + 0; - Aquamarine: #7FFFD4 + 0; - Azure: #F0FFFF + 0; - Beige: #F5F5DC + 0; - Bisque: #FFE4C4 + 0; - Black: #000000 + 0; - BlanchedAlmond: #FFEBCD + 0; - Blue: #0000FF + 0; - BlueViolet: #8A2BE2 + 0; - Brown: #A52A2A + 0; - BurlyWood: #DEB887 + 0; - CadetBlue: #5F9EA0 + 0; - Chartreuse: #7FFF00 + 0; - Chocolate: #D2691E + 0; - Coral: #FF7F50 + 0; - CornflowerBlue: #6495ED + 0; - Cornsilk: #FFF8DC + 0; - Crimson: #DC143C + 0; - Cyan: #00FFFF + 0; - DarkBlue: #00008B + 0; - DarkCyan: #008B8B + 0; - DarkGoldenRod: #B8860B + 0; - DarkGray: #A9A9A9 + 0; - DarkGreen: #006400 + 0; - DarkKhaki: #BDB76B + 0; - DarkMagenta: #8B008B + 0; - DarkOliveGreen: #556B2F + 0; - Darkorange: #FF8C00 + 0; - DarkOrchid: #9932CC + 0; - DarkRed: #8B0000 + 0; - DarkSalmon: #E9967A + 0; - DarkSeaGreen: #8FBC8F + 0; - DarkSlateBlue: #483D8B + 0; - DarkSlateGray: #2F4F4F + 0; - DarkTurquoise: #00CED1 + 0; - DarkViolet: #9400D3 + 0; - DeepPink: #FF1493 + 0; - DeepSkyBlue: #00BFFF + 0; - DimGray: #696969 + 0; - DimGrey: #696969 + 0; - DodgerBlue: #1E90FF + 0; - FireBrick: #B22222 + 0; - FloralWhite: #FFFAF0 + 0; - ForestGreen: #228B22 + 0; - Fuchsia: #FF00FF + 0; - Gainsboro: #DCDCDC + 0; - GhostWhite: #F8F8FF + 0; - Gold: #FFD700 + 0; - GoldenRod: #DAA520 + 0; - Gray: #808080 + 0; - Green: #008000 + 0; - GreenYellow: #ADFF2F + 0; - HoneyDew: #F0FFF0 + 0; - HotPink: #FF69B4 + 0; - IndianRed: #CD5C5C + 0; - Indigo: #4B0082 + 0; - Ivory: #FFFFF0 + 0; - Khaki: #F0E68C + 0; - Lavender: #E6E6FA + 0; - LavenderBlush: #FFF0F5 + 0; - LawnGreen: #7CFC00 + 0; - LemonChiffon: #FFFACD + 0; - LightBlue: #ADD8E6 + 0; - LightCoral: #F08080 + 0; - LightCyan: #E0FFFF + 0; - LightGoldenRodYellow: #FAFAD2 + 0; - LightGray: #D3D3D3 + 0; - LightGreen: #90EE90 + 0; - LightPink: #FFB6C1 + 0; - LightSalmon: #FFA07A + 0; - LightSeaGreen: #20B2AA + 0; - LightSkyBlue: #87CEFA + 0; - LightSlateGray: #778899 + 0; - LightSteelBlue: #B0C4DE + 0; - LightYellow: #FFFFE0 + 0; - Lime: #00FF00 + 0; - LimeGreen: #32CD32 + 0; - Linen: #FAF0E6 + 0; - Magenta: #FF00FF + 0; - Maroon: #800000 + 0; - MediumAquaMarine: #66CDAA + 0; - MediumBlue: #0000CD + 0; - MediumOrchid: #BA55D3 + 0; - MediumPurple: #9370DB + 0; - MediumSeaGreen: #3CB371 + 0; - MediumSlateBlue: #7B68EE + 0; - MediumSpringGreen: #00FA9A + 0; - MediumTurquoise: #48D1CC + 0; - MediumVioletRed: #C71585 + 0; - MidnightBlue: #191970 + 0; - MintCream: #F5FFFA + 0; - MistyRose: #FFE4E1 + 0; - Moccasin: #FFE4B5 + 0; - NavajoWhite: #FFDEAD + 0; - Navy: #000080 + 0; - OldLace: #FDF5E6 + 0; - Olive: #808000 + 0; - OliveDrab: #6B8E23 + 0; - Orange: #FFA500 + 0; - OrangeRed: #FF4500 + 0; - Orchid: #DA70D6 + 0; - PaleGoldenRod: #EEE8AA + 0; - PaleGreen: #98FB98 + 0; - PaleTurquoise: #AFEEEE + 0; - PaleVioletRed: #DB7093 + 0; - PapayaWhip: #FFEFD5 + 0; - PeachPuff: #FFDAB9 + 0; - Peru: #CD853F + 0; - Pink: #FFC0CB + 0; - Plum: #DDA0DD + 0; - PowderBlue: #B0E0E6 + 0; - Purple: #800080 + 0; - Red: #FF0000 + 0; - RosyBrown: #BC8F8F + 0; - RoyalBlue: #4169E1 + 0; - SaddleBrown: #8B4513 + 0; - Salmon: #FA8072 + 0; - SandyBrown: #F4A460 + 0; - SeaGreen: #2E8B57 + 0; - SeaShell: #FFF5EE + 0; - Sienna: #A0522D + 0; - Silver: #C0C0C0 + 0; - SkyBlue: #87CEEB + 0; - SlateBlue: #6A5ACD + 0; - SlateGray: #708090 + 0; - Snow: #FFFAFA + 0; - SpringGreen: #00FF7F + 0; - SteelBlue: #4682B4 + 0; - Tan: #D2B48C + 0; - Teal: #008080 + 0; - Thistle: #D8BFD8 + 0; - Tomato: #FF6347 + 0; - Turquoise: #40E0D0 + 0; - Violet: #EE82EE + 0; - Wheat: #F5DEB3 + 0; - White: #FFFFFF + 0; - WhiteSmoke: #F5F5F5 + 0; - Yellow: #FFFF00 + 0; - YellowGreen: #9ACD32 -} \ No newline at end of file diff --git a/src/tests/colors.scss b/src/tests/colors.scss deleted file mode 100644 index 760235ae6..000000000 --- a/src/tests/colors.scss +++ /dev/null @@ -1,10 +0,0 @@ -p { - color: rgb(255, 128, 0); - color: red green blue; - color: (red) (green) (blue); - color: red + green; - color: red + hux; - color: unquote("red") + green; - color: unquote(red) + green; - color: unquote(0xf00); -} \ No newline at end of file diff --git a/src/tests/compact.scss b/src/tests/compact.scss deleted file mode 100644 index 71ada7ff5..000000000 --- a/src/tests/compact.scss +++ /dev/null @@ -1,5 +0,0 @@ -div { - content: compact(yellow, false, false, false, false); - content: type-of(compact(yellow, false, false, false, false)); - content: length(type-of(compact(yellow, false, false, false, false))); -} \ No newline at end of file diff --git a/src/tests/comparable.scss b/src/tests/comparable.scss deleted file mode 100644 index 4940eb2bb..000000000 --- a/src/tests/comparable.scss +++ /dev/null @@ -1,16 +0,0 @@ -.color-functions { - $color: red; - hue: hue($color); - hue-type: type-of(hue($color)); - hue-unit: unit(hue($color)); - hue-comparable: comparable(hue($color), hue($color)); - x: comparable(10fu, 10fu); - x: comparable(10px, 10px); - x: comparable(10, 10); - y: type-of(10px); - y: type-of(10deg); - z: lightness(red); - z: type-of(lightness(red)); - z: type-of(50%); - z: comparable(lightness(red), 50%); -} \ No newline at end of file diff --git a/src/tests/composed-args.scss b/src/tests/composed-args.scss deleted file mode 100644 index e4de8dad3..000000000 --- a/src/tests/composed-args.scss +++ /dev/null @@ -1,12 +0,0 @@ -@mixin B($width: 0, $height: 0) { - width: $width; - height: $height; -} - -@mixin A($args...) { - @include B($args...); -} - -.test { - @include A($height: 3px); -} \ No newline at end of file diff --git a/src/tests/concat.scss b/src/tests/concat.scss deleted file mode 100644 index cd7dd3b8f..000000000 --- a/src/tests/concat.scss +++ /dev/null @@ -1,6 +0,0 @@ -div { - a: hello + "goodbye"; - b: "hello" + goodbye; - c: 3 + "hello"; - d: "hello" + 3; -} \ No newline at end of file diff --git a/src/tests/cons-up.scss b/src/tests/cons-up.scss deleted file mode 100644 index 40d59f6b3..000000000 --- a/src/tests/cons-up.scss +++ /dev/null @@ -1,28 +0,0 @@ -$inputs-list: 'input[type="email"]', - 'input[type="number"]', - 'input[type="password"]', - 'input[type="search"]', - 'input[type="tel"]', - 'input[type="text"]', - 'input[type="url"]', - - // Webkit & Gecko may change the display of these in the future - 'input[type="color"]', - 'input[type="date"]', - 'input[type="datetime"]', - 'input[type="datetime-local"]', - 'input[type="month"]', - 'input[type="time"]', - 'input[type="week"]'; - -$unquoted-inputs-list: (); - -@each $input-type in $inputs-list { - $unquoted-inputs-list: append($unquoted-inputs-list, unquote($input-type), comma); -} - -div { - content: $unquoted-inputs-list; - content: append((), hello); - content: length(()); -} \ No newline at end of file diff --git a/src/tests/conversions.scss b/src/tests/conversions.scss deleted file mode 100644 index b631834b2..000000000 --- a/src/tests/conversions.scss +++ /dev/null @@ -1,5 +0,0 @@ -div { - width: 3cm * 2in * 2in / 1cm / 1cm; - width: 3cm * 2in / 1cm; - width: 4cm * (12in / 3in); -} \ No newline at end of file diff --git a/src/tests/css-import.scss b/src/tests/css-import.scss deleted file mode 100644 index 2c72f55f9..000000000 --- a/src/tests/css-import.scss +++ /dev/null @@ -1,5 +0,0 @@ -@import 'foo.css', "bar.css"; - -div { - color: red; -} \ No newline at end of file diff --git a/src/tests/default-args.scss b/src/tests/default-args.scss deleted file mode 100644 index 89e7968b0..000000000 --- a/src/tests/default-args.scss +++ /dev/null @@ -1,20 +0,0 @@ -@mixin foo($x: 1, $y: $x + 1) { - value: $x, $y; -} - -div { - @include foo(); - @include foo(2); - @include foo($y: 3); -} - -$v: hey; - -@mixin bar($x: $v) { - value: $x; -} - -div { - $v: ho; - @include bar(); -} \ No newline at end of file diff --git a/src/tests/default-parameters.scss b/src/tests/default-parameters.scss deleted file mode 100644 index 3d1247d7b..000000000 --- a/src/tests/default-parameters.scss +++ /dev/null @@ -1,13 +0,0 @@ -$a: red; - -@mixin f($a: $a) { - color: $a; -} - -h1 { - @include f; -} - -h2 { - @include f(blue); -} \ No newline at end of file diff --git a/src/tests/default-vars-in-default-params.scss b/src/tests/default-vars-in-default-params.scss deleted file mode 100644 index 81b77adc9..000000000 --- a/src/tests/default-vars-in-default-params.scss +++ /dev/null @@ -1,10 +0,0 @@ -$y: why; - -@mixin foo($x, $y: $y) { - stuff: $x $y; -} - -div { - why: $y; - @include foo(ecks); -} \ No newline at end of file diff --git a/src/tests/delayed.scss b/src/tests/delayed.scss deleted file mode 100644 index f9f8aac78..000000000 --- a/src/tests/delayed.scss +++ /dev/null @@ -1,39 +0,0 @@ -$x: a 3/4 b; -$y: hey; - -@function foo() { - @return 3/4; -} - -div { - hoo: 3/4; - goo: nth($x, 2); - foo: 15 / nth($x, 2); - foo: .25 + nth($x, 2); - coo: 2/3 / nth($x, 2); - bar: $y and true; - bar: false and true; - bar: (false) and true; - @each $elem in $x { - blah: $elem; - } - bloo: foo(); - @warn 2/3; - blix: "hey #{nth($x, 2)} ho"; -} - -@media screen and (hux: 3/4) { - div { - color: red; - } -} - -@warn "blah blah"; - -div { - blah: "ho #{nth($x, 2) } ho"; -} - -span { - fludge: (true and 3/4); -} \ No newline at end of file diff --git a/src/tests/directives-in-propsets.scss b/src/tests/directives-in-propsets.scss deleted file mode 100644 index d55e27766..000000000 --- a/src/tests/directives-in-propsets.scss +++ /dev/null @@ -1,24 +0,0 @@ -$color: red; -$position: 50%; -$x: 0; - -@mixin foo() { - image: url(foo.png); -} - -div { - background: { - something: { - color: green; - } - @if (type-of($color) == "color") { - color: $color; - } - @if (type-of($position) == "number") { - position: $position; - @include foo(); - } - groo: foo; - } - width: $x; -} \ No newline at end of file diff --git a/src/tests/directives.scss b/src/tests/directives.scss deleted file mode 100644 index ae292c327..000000000 --- a/src/tests/directives.scss +++ /dev/null @@ -1,13 +0,0 @@ -@foo div foo(bar) { - huz: buz; -} - -div { - hey: ho; -} - -// @boo 1+2 type-of("hello") div:nth-of-type(2n+1); - -1+2 type-of("hello") { - hey: ho; -} \ No newline at end of file diff --git a/src/tests/div.scss b/src/tests/div.scss deleted file mode 100644 index 29f5beac7..000000000 --- a/src/tests/div.scss +++ /dev/null @@ -1,13 +0,0 @@ -$x: 3/4; -$xs: hey 3/4 ho; - -div { - /* $x: 3/4 */ - a: $x; - b: hey $x ho; - /* $xs: hey 3/4 ho */ - c: $xs; - d: nth($xs, 2); - e: nth($xs, 2) == 0.75; - f: type-of(nth($xs, 2)); -} \ No newline at end of file diff --git a/src/tests/each-in-function.scss b/src/tests/each-in-function.scss deleted file mode 100644 index 1188fceb8..000000000 --- a/src/tests/each-in-function.scss +++ /dev/null @@ -1,17 +0,0 @@ -$GLOBAL: global; - -@function foo($g1, $g2, $g3) { - @each $value in $g1, $g2, $g3 { - $GLOBAL: $GLOBAL each $value; - $GLOBAL: $GLOBAL type1 type-of(nth($value, 1)); - $GLOBAL: $GLOBAL type2 type-of(nth($value, 2)); - } - @return 0; -} - -div { - a: foo(50% 50%, cover circle, red blue); - b: $GLOBAL; - $colors: red green blue; - c: a, b, type-of(nth($colors, 2)), d; -} \ No newline at end of file diff --git a/src/tests/each.scss b/src/tests/each.scss deleted file mode 100644 index 713535531..000000000 --- a/src/tests/each.scss +++ /dev/null @@ -1,12 +0,0 @@ -div { - $x: 3; - @each $x in singleton { - color: $x; - } - divider: $x; - @each $x in foo, bar, hux { - span { - msg: $x; - } - } -} \ No newline at end of file diff --git a/src/tests/empty-properties.scss b/src/tests/empty-properties.scss deleted file mode 100644 index 8a39a8c48..000000000 --- a/src/tests/empty-properties.scss +++ /dev/null @@ -1,9 +0,0 @@ -div { - padding: ; - color: ; - font-weight: ; - background: ; - font-size: ; - width:; - height:; -} \ No newline at end of file diff --git a/src/tests/empty-rule.scss b/src/tests/empty-rule.scss deleted file mode 100644 index 8dec45a5a..000000000 --- a/src/tests/empty-rule.scss +++ /dev/null @@ -1,5 +0,0 @@ -div { - color: red; - height: 10px; - font-weight: nth(bold () normal, 2); -} \ No newline at end of file diff --git a/src/tests/env.scss b/src/tests/env.scss deleted file mode 100644 index 4a67fde11..000000000 --- a/src/tests/env.scss +++ /dev/null @@ -1,45 +0,0 @@ -$x: 0; - -div { - /* 0 */ - font: $x; - $x: 1; - /* 1 */ - font: $x; - span { - $x: 2; - /* 2 */ - font: $x; - } - /* 2 */ - font: $x; - p { - /* 2 */ - font: $x; - } -} - -div { - @foo { - $y: 2; - font: $y; - } - @bar { - $y: 3; - font: $y; - } -} - -@mixin foo() { - content: "foo"; - @content; -} - -div { - $z: "whatever"; - @include foo() { - $z: "block for foo!"; - font: fudge; - } - width: $z; -} \ No newline at end of file diff --git a/src/tests/eq.scss b/src/tests/eq.scss deleted file mode 100644 index a690e7ede..000000000 --- a/src/tests/eq.scss +++ /dev/null @@ -1,7 +0,0 @@ -div { - foo: center == "center"; - foo: (a b c) == (a b c); - foo: a b c == a b c; - foo: compact(1 2 false 4) == compact(1 2 4); - foo: compact(1 2 4) == compact(1 2 4, false); -} \ No newline at end of file diff --git a/src/tests/extend.scss b/src/tests/extend.scss deleted file mode 100644 index f032948f5..000000000 --- a/src/tests/extend.scss +++ /dev/null @@ -1,19 +0,0 @@ -#a { - color: black; - > div { - color: white; - } - a b { - color: gray; - } -} - -#b { - @extend div#a; -} - -a b { - c { - @extend #b; - } -} \ No newline at end of file diff --git a/src/tests/foo-imp.scss b/src/tests/foo-imp.scss deleted file mode 100644 index 968981bee..000000000 --- a/src/tests/foo-imp.scss +++ /dev/null @@ -1,3 +0,0 @@ -@if (1 == 1) { - @return red; -} \ No newline at end of file diff --git a/src/tests/foo.css b/src/tests/foo.css deleted file mode 100644 index 25118c13e..000000000 --- a/src/tests/foo.css +++ /dev/null @@ -1 +0,0 @@ -div { color: red; } diff --git a/src/tests/for-in-functions.scss b/src/tests/for-in-functions.scss deleted file mode 100644 index da142f0f7..000000000 --- a/src/tests/for-in-functions.scss +++ /dev/null @@ -1,22 +0,0 @@ -@function foo() { - $limit: 10; - $y: 0; - @for $x from 1 through $limit { - $limit: 4; - $y: $y + $x; - } - @return $y; -} - -@function bar() { - $x: 0; - @for $i from 1 through 10 { - $x: $x + $i; - } - @return $x; -} - -div { - width: foo(); - height: bar(); -} \ No newline at end of file diff --git a/src/tests/for.scss b/src/tests/for.scss deleted file mode 100644 index 2c99de841..000000000 --- a/src/tests/for.scss +++ /dev/null @@ -1,8 +0,0 @@ -$limit: 10; - -@for $x from 1 through $limit { - $limit: 4; - div { - content: $limit thing $x; - } -} diff --git a/src/tests/function-names.scss b/src/tests/function-names.scss deleted file mode 100644 index a154c621d..000000000 --- a/src/tests/function-names.scss +++ /dev/null @@ -1,5 +0,0 @@ -div { - color: unquote("hello"); - color: un#{quo}te("hello"); - color: ("hello")un#{quo}te; -} diff --git a/src/tests/functions-and-mixins.scss b/src/tests/functions-and-mixins.scss deleted file mode 100644 index ebabd7485..000000000 --- a/src/tests/functions-and-mixins.scss +++ /dev/null @@ -1,24 +0,0 @@ -@function foo() { - @return "hello"; -} - -@mixin foo() { - content: "hello"; -} - -div { - span { - @function length($a, $b, $c, $d) { - @return $a + $b + $c + $d; - } - - div { - content: foo(); - @include foo(); - width: length(1,2,2,3); - } - } - - height: length(a b c d e); - -} \ No newline at end of file diff --git a/src/tests/functions.scss b/src/tests/functions.scss deleted file mode 100644 index 108797ae9..000000000 --- a/src/tests/functions.scss +++ /dev/null @@ -1,17 +0,0 @@ -@function foo($x, $y, $z) { - @while $x < $y { - $z: transform($z); - @return $z; - } -} - -@function bar($x) { - @if $x { - @return YES; - } -} - -div { - answer: bar(true); - flanswer: fudge(mux+flux) + mudge(a/b); -} \ No newline at end of file diff --git a/src/tests/hey1.scss b/src/tests/hey1.scss deleted file mode 100644 index 5623ad126..000000000 --- a/src/tests/hey1.scss +++ /dev/null @@ -1 +0,0 @@ -div { width: 1px; } diff --git a/src/tests/hey2.scss b/src/tests/hey2.scss deleted file mode 100644 index 25118c13e..000000000 --- a/src/tests/hey2.scss +++ /dev/null @@ -1 +0,0 @@ -div { color: red; } diff --git a/src/tests/huge.scss b/src/tests/huge.scss deleted file mode 100644 index d138ff606..000000000 --- a/src/tests/huge.scss +++ /dev/null @@ -1,27136 +0,0 @@ -$blah: a b c; -$bloo: "hello"; - -div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - $blah: a b c; - $bloo: "hello"; - - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - div { - color: red; - width: 100%; - p { - margin: $blah; - $blee: goodbye; - padding: 10px 5px; - a { - display: inline-block; - padding: 5px; - color: $blee; - } - foo: $bloo; - empty { - not-empty { - background: lightgray; - border: 1px solid blue; - span { - display: block; - -webkit-box-sizing: border-box; - } - } - } - } - } - } - } - } - } - } -} \ No newline at end of file diff --git a/src/tests/hyphen-interpolated.scss b/src/tests/hyphen-interpolated.scss deleted file mode 100644 index 97e4456ed..000000000 --- a/src/tests/hyphen-interpolated.scss +++ /dev/null @@ -1,4 +0,0 @@ -div { - foo: -hux-#{2+3}; - bar: hux-#{2+3}; -} \ No newline at end of file diff --git a/src/tests/ie-backslash.scss b/src/tests/ie-backslash.scss deleted file mode 100644 index 55a1ee838..000000000 --- a/src/tests/ie-backslash.scss +++ /dev/null @@ -1,3 +0,0 @@ -div { - background-color: darken(red, 10%) \9; -} \ No newline at end of file diff --git a/src/tests/ie-functions.scss b/src/tests/ie-functions.scss deleted file mode 100644 index 2cde9c48a..000000000 --- a/src/tests/ie-functions.scss +++ /dev/null @@ -1,19 +0,0 @@ -@mixin ie-opacity($opacity) { - opacity: $opacity / 100; - filter: alpha(opacity=$opacity); - bilter: alpha(opacity=$opacity); - kilter: type-of(opacity=$opacity); -} - -$startColor: red; -$endColor: green; - -foo { - filter: progid:Microsoft.foo.bar.Baz(flip=#{foo + bar}, bang=#00ff00cc); - something: blah(hux = mumble); - blah: progid:something.something(flip=foobar, bang=#abc); - blah: progid:bar.hux(); - blah: type-of(hux = mumble); - @include ie-opacity(.5); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($startColor)}', endColorstr='#{ie-hex-str($endColor)}', GradientType=1); -} \ No newline at end of file diff --git a/src/tests/ie-hex-str.scss b/src/tests/ie-hex-str.scss deleted file mode 100644 index f509ae8d5..000000000 --- a/src/tests/ie-hex-str.scss +++ /dev/null @@ -1,5 +0,0 @@ -div { - blah: foo + "bar"; - color: ie-hex-str(red) + "bar"; - color: "foo " + ie-hex-str(brown); -} \ No newline at end of file diff --git a/src/tests/if-in-function.scss b/src/tests/if-in-function.scss deleted file mode 100644 index 6e2368bf5..000000000 --- a/src/tests/if-in-function.scss +++ /dev/null @@ -1,21 +0,0 @@ -$x: true; - -@function foobar() { - @if $x { - $x: false; - @return foo; - } - @else { - $x: true; - @return bar; - } -} - -div { - content: foobar(); - content: foobar(); - content: foobar(); - content: foobar(); - $x: false; - content: foobar(); -} \ No newline at end of file diff --git a/src/tests/if-in-mixin.scss b/src/tests/if-in-mixin.scss deleted file mode 100644 index ed14e4d1b..000000000 --- a/src/tests/if-in-mixin.scss +++ /dev/null @@ -1,20 +0,0 @@ -$x: true; - -@mixin foobar() { - @if $x { - $x: false; - content: foo; - } - @else { - $x: true; - content: bar; - } -} - -div { - @include foobar(); - @include foobar(); - @include foobar(); - $x: true; - @include foobar(); -} \ No newline at end of file diff --git a/src/tests/if-in-propset.scss b/src/tests/if-in-propset.scss deleted file mode 100644 index e665f2390..000000000 --- a/src/tests/if-in-propset.scss +++ /dev/null @@ -1,9 +0,0 @@ -div { - prop: { - a: "hello"; - b: "goodbye"; - @if true { - c: "badbye"; - } - } -} \ No newline at end of file diff --git a/src/tests/if.scss b/src/tests/if.scss deleted file mode 100644 index e43e603db..000000000 --- a/src/tests/if.scss +++ /dev/null @@ -1,28 +0,0 @@ -@if false { - div { - color: red; - } -} -@else if true { - span { - color: blue; - } -} - -div { - @if true { - color: green; - } - @if false { - height: 10px; - } - @else if false { - height: 20px; - } - @else if false { - height: 30px; - } - @else { - height: 40px; - } -} \ No newline at end of file diff --git a/src/tests/image-url.scss b/src/tests/image-url.scss deleted file mode 100644 index 568ab2203..000000000 --- a/src/tests/image-url.scss +++ /dev/null @@ -1,4 +0,0 @@ -div { - blah: image-url("hello.png", false); - blah: image-url("hello.png", true); -} \ No newline at end of file diff --git a/src/tests/imp.scss b/src/tests/imp.scss deleted file mode 100644 index 25118c13e..000000000 --- a/src/tests/imp.scss +++ /dev/null @@ -1 +0,0 @@ -div { color: red; } diff --git a/src/tests/import-into-function.scss b/src/tests/import-into-function.scss deleted file mode 100644 index e0c77c452..000000000 --- a/src/tests/import-into-function.scss +++ /dev/null @@ -1,11 +0,0 @@ -@mixin boo() { - @import "foo-imp.scss"; -} - -@function foo() { - @import "foo-imp.scss"; -} - -div { - color: foo(); -} \ No newline at end of file diff --git a/src/tests/import.scss b/src/tests/import.scss deleted file mode 100644 index eb511462f..000000000 --- a/src/tests/import.scss +++ /dev/null @@ -1,10 +0,0 @@ -@import "hey1.css", "cookie.css", url("hey2.css"), "fudge.css"; - -$foo:"goodbye"; -div[name="hello"] { - color: blue; -} - -@import "../tests/imp", "blimp"; - -@import "bludge.css"; \ No newline at end of file diff --git a/src/tests/important-in-arglist.scss b/src/tests/important-in-arglist.scss deleted file mode 100644 index d4821a7dd..000000000 --- a/src/tests/important-in-arglist.scss +++ /dev/null @@ -1,10 +0,0 @@ -@mixin foo($x, $y) { - style: $x; - schtyle: $y; -} - -div { - @include foo(0px 0px 0px 0px, #ef8086 inset !important); - fludge: foo bar ! important hux; - bludge: foo bar ! important; -} \ No newline at end of file diff --git a/src/tests/important.scss b/src/tests/important.scss deleted file mode 100644 index f23e68f20..000000000 --- a/src/tests/important.scss +++ /dev/null @@ -1,4 +0,0 @@ -div { - color: red ! important; - width: 5px ! important; -} \ No newline at end of file diff --git a/src/tests/index.scss b/src/tests/index.scss deleted file mode 100644 index 1218d6ccb..000000000 --- a/src/tests/index.scss +++ /dev/null @@ -1,5 +0,0 @@ -div { - foo: index(hello goodbye futz, goodbye); - bar: index(hello goodbye futz, badbye); - baz: index((hello world) (my name) (is aaron), is aaron); -} \ No newline at end of file diff --git a/src/tests/inh.scss b/src/tests/inh.scss deleted file mode 100644 index 86330ba21..000000000 --- a/src/tests/inh.scss +++ /dev/null @@ -1,8 +0,0 @@ -foo.a { - width: 10px; -} - -bar { - color: red; - @extend foo; -} \ No newline at end of file diff --git a/src/tests/inheritance.scss b/src/tests/inheritance.scss deleted file mode 100644 index ffb827bd1..000000000 --- a/src/tests/inheritance.scss +++ /dev/null @@ -1,75 +0,0 @@ -main content a box { - border: solid; -} - -supplemtal text b sidebar { - @extend box; - background: gray; -} - -/********/ - -mammal { - blood: warm; -} - -mammal.furry.quadruped { - fur: lots; - legs: 4; -} - -human { - @extend mammal; - says: "hello"; -} - -dog { - says: "woof"; - @extend mammal.quadruped; -} - -/********/ - -region.country { - inhabitant.mouse { - eats: cheddar; - } -} - -region.city { - inhabitant.mouse { - eats: camembert; - } -} - -region.country citizen { - @extend inhabitant; - ssn: 123 45 6789; -} - -region tax-payer { - @extend inhabitant; - rate: 17%; -} - -/********/ - -foo { - color: red; -} - -.a.bar { - @extend fo#{o}; - background: gray; -} - -/********/ - -foo { - color: red; -} - -hux, .bar.a { - @extend foo; - background: blue; -} \ No newline at end of file diff --git a/src/tests/interpolated-function-call.scss b/src/tests/interpolated-function-call.scss deleted file mode 100644 index 17242fdd5..000000000 --- a/src/tests/interpolated-function-call.scss +++ /dev/null @@ -1,5 +0,0 @@ -$f: foo; - -div { - color: #{$f}(a, 1+2, c); -} \ No newline at end of file diff --git a/src/tests/interpolated-selectors.scss b/src/tests/interpolated-selectors.scss deleted file mode 100644 index 3da628607..000000000 --- a/src/tests/interpolated-selectors.scss +++ /dev/null @@ -1,3 +0,0 @@ -foo#{bar} hux { - color: red; -} \ No newline at end of file diff --git a/src/tests/interpolated-strings.scss b/src/tests/interpolated-strings.scss deleted file mode 100644 index 17de52503..000000000 --- a/src/tests/interpolated-strings.scss +++ /dev/null @@ -1,12 +0,0 @@ -$x: ecks; -$y: why; -$z: zee; - -div { - blah: "hey #{$x} ho"; - blee: hey#{$y}ho; - bluh: "foo #{$x}"; - bleg: foo#{"hey"}bar; - //blag: foo#{"-hey-"}"bar"#{"-ho-"}; - blug: -#{$x}-#{$y}-foo($z); -} \ No newline at end of file diff --git a/src/tests/interpolated-urls.scss b/src/tests/interpolated-urls.scss deleted file mode 100644 index 0310c0101..000000000 --- a/src/tests/interpolated-urls.scss +++ /dev/null @@ -1,12 +0,0 @@ -$base_url: "/static_loc/"; -div { - background-image: "url("#{$base_url}"img/beta.png)"; -} - -span { - background-image: url(#{$base_url}img/beta.png); -} - -fudge { - walnuts: blix"fludge"#{hey now}123; -} \ No newline at end of file diff --git a/src/tests/keyframes.scss b/src/tests/keyframes.scss deleted file mode 100644 index f26c41de0..000000000 --- a/src/tests/keyframes.scss +++ /dev/null @@ -1,54 +0,0 @@ -div { - color: #181818; -} - -@-webkit-keyframes uiDelayedFadeIn { - 0% { opacity: 0; } - 50% { opacity: .5; } - 100% { opacity: 1; } -} - -@-webkit-keyframes bounce { - from { - left: 0px; - } - to { - left: 200px; - } -} - -$name: bounce; - -@-webkit-keyframes #{$name} { - blah: blee; -} - -@mixin fudge() { - @content; -} - -foo { - @include fudge() { - div { - color: red; - } - } -} - -@-moz-document url-prefix() { - .fl { - float:left; - margin:12px 4px 0 0; - padding:0; - font-size:65px; - line-height:62%; - color:#ba1820; - } - .fs { - float:left; - margin:12px 4px 10px 0; - padding:0; font-size:65px; - line-height:62%; - color:#ba1820; - } -} \ No newline at end of file diff --git a/src/tests/lang-bug.scss b/src/tests/lang-bug.scss deleted file mode 100644 index 33d7e1059..000000000 --- a/src/tests/lang-bug.scss +++ /dev/null @@ -1,3 +0,0 @@ -div:lang(nb) { - color: red; -} \ No newline at end of file diff --git a/src/tests/lang.scss b/src/tests/lang.scss deleted file mode 100644 index fa785aa21..000000000 --- a/src/tests/lang.scss +++ /dev/null @@ -1,19 +0,0 @@ -h1:lang(as),h1:lang(bn),h1:lang(gu),h1:lang(hi),h1:lang(kn),h1:lang(ml),h1:lang(mr),h1:lang(or),h1:lang(pa),h1:lang(sa),h1:lang(ta),h1:lang(te) { - line-height:1.5em !important -} -h2:lang(as),h3:lang(as),h4:lang(as),h5:lang(as),h6:lang(as),h2:lang(bn),h3:lang(bn),h4:lang(bn),h5:lang(bn),h6:lang(bn),h2:lang(gu),h3:lang(gu),h4:lang(gu),h5:lang(gu),h6:lang(gu),h2:lang(hi),h3:lang(hi),h4:lang(hi),h5:lang(hi),h6:lang(hi),h2:lang(kn),h3:lang(kn),h4:lang(kn),h5:lang(kn),h6:lang(kn),h2:lang(ml),h3:lang(ml),h4:lang(ml),h5:lang(ml),h6:lang(ml),h2:lang(mr),h3:lang(mr),h4:lang(mr),h5:lang(mr),h6:lang(mr),h2:lang(or),h3:lang(or),h4:lang(or),h5:lang(or),h6:lang(or),h2:lang(pa),h3:lang(pa),h4:lang(pa),h5:lang(pa),h6:lang(pa),h2:lang(sa),h3:lang(sa),h4:lang(sa),h5:lang(sa),h6:lang(sa),h2:lang(ta),h3:lang(ta),h4:lang(ta),h5:lang(ta),h6:lang(ta),h2:lang(te),h3:lang(te),h4:lang(te),h5:lang(te),h6:lang(te) -{ - line-height:1.2em -} -ol:lang(bcc) li,ol:lang(bqi) li,ol:lang(fa) li,ol:lang(glk) li,ol:lang(kk-arab) li,ol:lang(mzn) li { - list-style-type:-moz-persian;list-style-type:persian -} -ol:lang(ckb) li { - list-style-type:-moz-arabic-indic;list-style-type:arabic-indic -} -ol:lang(as) li,ol:lang(bn) li{ - list-style-type:-moz-bengali;list-style-type:bengali -} -ol:lang(or) li { - list-style-type:-moz-oriya;list-style-type:oriya -} \ No newline at end of file diff --git a/src/tests/linear-gradient.scss b/src/tests/linear-gradient.scss deleted file mode 100644 index d0adaad68..000000000 --- a/src/tests/linear-gradient.scss +++ /dev/null @@ -1,40 +0,0 @@ -@mixin linear-gradient($pos, $G1, $G2: false, - $G3: false, $G4: false, - $G5: false, $G6: false, - $G7: false, $G8: false, - $G9: false, $G10: false, - $deprecated-pos1: left top, - $deprecated-pos2: left bottom, - $fallback: false) { - // Detect what type of value exists in $pos - $pos-type: type-of(nth($pos, 1)); - - // If $pos is missing from mixin, reassign vars and add default position - @if ($pos-type == color) or (nth($pos, 1) == "transparent") { - $G10: $G9; $G9: $G8; $G8: $G7; $G7: $G6; $G6: $G5; - $G5: $G4; $G4: $G3; $G3: $G2; $G2: $G1; $G1: $pos; - $pos: top; // Default position - } - - $full: compact($G1, $G2, $G3, $G4, $G5, $G6, $G7, $G8, $G9, $G10); - - // Set $G1 as the default fallback color - $fallback-color: nth($G1, 1); - - // If $fallback is a color use that color as the fallback color - @if (type-of($fallback) == color) or ($fallback == "transparent") { - $fallback-color: $fallback; - } - - background-color: $fallback-color; - background-image: deprecated-webkit-gradient(linear, $deprecated-pos1, $deprecated-pos2, $full); // Safari <= 5.0 - background-image: -webkit-linear-gradient($pos, $full); // Safari 5.1+, Chrome - background-image: -moz-linear-gradient($pos, $full); - background-image: -ms-linear-gradient($pos, $full); - background-image: -o-linear-gradient($pos, $full); - background-image: unquote("linear-gradient(#{$pos}, #{$full})"); -} - -div { - @include linear-gradient(top, red 0%, orange 50%, yellow 50%, green 100%); -} \ No newline at end of file diff --git a/src/tests/list-evaluation.scss b/src/tests/list-evaluation.scss deleted file mode 100644 index 113efe895..000000000 --- a/src/tests/list-evaluation.scss +++ /dev/null @@ -1,18 +0,0 @@ -div { - $things: red 2/3 blue; - content: $things; - content: nth($things, 2); - content: type-of(nth($things, 2)); - content: type-of(nth($things, 3)); - /**** #{2+2} ****/ - content: (1 / 2 3 / 4) + (5/6 7/8); - content: (1/2 3/4), (5/6 7/8); - /**** ****/ - @each $x in 1 2 3/4 { - foo: $x; - bar: $x + 1; - } - /*** ***/ - stuff: 1, (2 3/4 5), 6; - stuff: ((1 + 2)/3/4); -} \ No newline at end of file diff --git a/src/tests/lists.scss b/src/tests/lists.scss deleted file mode 100644 index 5255cb4cf..000000000 --- a/src/tests/lists.scss +++ /dev/null @@ -1,24 +0,0 @@ -div { - $list: append(1/2 3, 4); - content: (1 2 3) == (1, 2, 3); - content: (1 2 3) == (1 2 3); - content: var $list; - content: lit (1/2 3 4); - content: (1/2 3 4) == $list; - a: length((1/2 3 4)), length($list); - b: nth((1/2 3 4), 1), nth($list, 1); - content: (1/2 3 4) == (1/2 3 4); - /***/ - content: length($list); - content: type-of(nth($list, 1)); - content: nth($list, 1); - content: nth(1/2 3 4, 1); - $a: 1 2 3; - $b: (1 2 3); - content: $a == $b; - content: 1 2 () 3; - color: red == #ff0000; - $color-list : fudge red blue; - color: nth($color-list, 2) == #ff0000; - color: nth($color-list, 2) == red; -} \ No newline at end of file diff --git a/src/tests/long-selector.scss b/src/tests/long-selector.scss deleted file mode 100644 index b7b1a8921..000000000 --- a/src/tests/long-selector.scss +++ /dev/null @@ -1,12 +0,0 @@ -html, body, div, span, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, ab, br, address, cite, code, del, dfn, em, img, ins, kbd, q, samp, small, strong, su, b, sup, var, b, u, i, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, tab, le, caption, tbody, tfoot, thead, tr, th, td { - border: 0; - font-size: 100%; - font: inherit; - margin: 0; - padding: 0; - vertical-align: baseline; - hey, ho, hoo { - blah: bloo; - blee: bleh; - } -} diff --git a/src/tests/media-hoisting.scss b/src/tests/media-hoisting.scss deleted file mode 100644 index 1ed15afea..000000000 --- a/src/tests/media-hoisting.scss +++ /dev/null @@ -1,27 +0,0 @@ -@media screen { - 1 { - color: black; - height: 8px; - } -} - -1 { - color: red; - @media screen { - color: blue; - height: 10px; - } -} - -1 { - color: beige; - 2 { - color: teal; - @media screen { - color: orange; - 3 { - height: 12px; - } - } - } -} \ No newline at end of file diff --git a/src/tests/media-with-interpolation.scss b/src/tests/media-with-interpolation.scss deleted file mode 100644 index a63556967..000000000 --- a/src/tests/media-with-interpolation.scss +++ /dev/null @@ -1,12 +0,0 @@ -$viewport1: "only screen"; -$viewport2: "(min-width: 700px)"; - -$foo: "(max-width: "; -$bar: "1920px)"; - -// Will not work -@media #{$viewport1} and #{$viewport2} and #{$foo+$bar} { - body { - background: #3d3d3d; - } -} \ No newline at end of file diff --git a/src/tests/media.scss b/src/tests/media.scss deleted file mode 100644 index 46bbe6775..000000000 --- a/src/tests/media.scss +++ /dev/null @@ -1,115 +0,0 @@ -@media all and (min-width: 960px) { - b { - font-weight: normal; - } -} - -@media (min-width: 980px) { - a { - color: red; - } -} - -@media all { - /* hey */ - p { - color: blue; - a { - color: green; - &:after { - content: ">>"; - } - } - } - span { - display: inline-block; - } -} - -a b c { - /* a */ - blee: blee; - /* b */ - d e f { - blah: blah; - bloo: bloo; - } - /* c */ - g h, i j { - @media print and (foo: 1 2 3), (bar: 3px hux(muz)), not screen { - /* aa */ - hey: ho; - /* bb */ - k l m { - hee: fee; - } - /* cc */ - haa: hoo; - /* dd */ - } - } - /* d */ - blah: blah; -} - -@mixin simple-media-query($max-width, $min-width) { - @media only screen and (max-width : $max-width) and (min-width : $min-width) { - @content; - } -} - -@mixin test($value) { - border-color: $value; -} - -body { - @include test("#ccc"); - @include simple-media-query(900px, 400px) { - border-color: black; - } -} - -$foo: 23; -$bar: 45; - -@media only screen and (max-width: $foo) and (min-width: $bar) { - hey { - ho: hoo; - } -} - -@media (max-width: 200) and (min-width: 100) { - div { - color: red; - } -} - -@media not bl#{ah} and (width: 200px) { - div { - color: brown, blue, black; - } -} - -@mixin media($var1, $var2) { - @media screen and ($var1: $var2) { - @content; - } -} - -@include media(max-device-width, 500px) { - foo { - bar: "works"; - } -} - -div { - color: red; - span { - color: blue; - @media screen { - p { - color: green; - } - } - } -} \ No newline at end of file diff --git a/src/tests/media2.scss b/src/tests/media2.scss deleted file mode 100644 index 64843e53a..000000000 --- a/src/tests/media2.scss +++ /dev/null @@ -1,7 +0,0 @@ -$foo: 3; -$bar: 4; - -@media only screen and (max-width: $foo) and (min-width: $bar) { - /* hey */ - color: red; -} \ No newline at end of file diff --git a/src/tests/mixin-content-selectors.scss b/src/tests/mixin-content-selectors.scss deleted file mode 100644 index f9af22b80..000000000 --- a/src/tests/mixin-content-selectors.scss +++ /dev/null @@ -1,17 +0,0 @@ -@mixin foo($x: 1) { - foo-sel { - @content; - } -} - -div { - $x: hey; - @include foo() { - bar { - color: red; - hux { - msg: $x; - } - } - } -} \ No newline at end of file diff --git a/src/tests/mixin-content-with-no-block.scss b/src/tests/mixin-content-with-no-block.scss deleted file mode 100644 index 73dbe8089..000000000 --- a/src/tests/mixin-content-with-no-block.scss +++ /dev/null @@ -1,12 +0,0 @@ -@mixin foo { - .foo { - color: red; - @content; - } -} - -div.a { - @include foo() { - hey: now; - } -} \ No newline at end of file diff --git a/src/tests/mixin-content.scss b/src/tests/mixin-content.scss deleted file mode 100644 index c42bf8a17..000000000 --- a/src/tests/mixin-content.scss +++ /dev/null @@ -1,69 +0,0 @@ -@mixin foo() { - name: foo; - @content; - @include bar() { - stuff: content for bar; - @content; - } -} - -@mixin bar() { - name: bar; - @content; -} - -div { - /* with a content block */ - @include foo() { - stuff: content for foo; - } - /* without */ - @include foo(); -} - -@mixin foo() { - $size: 80%; - div { - color: red; - @content; - background: blue; - width: $size; - @include bar() { - color: orange; - @content; - } - } -} - -@mixin bar() { - form { - @content; - } -} - -span { - $size: 1.2em; - color: green; - @include foo() { - @media fudge { - p { - font-weight: bold; - font-size: $size; - a { - text-decoration: underline; - } - } - } - } -} - -@mixin apply-to-ie6-only { - * html { - @content; - } -} -@include apply-to-ie6-only { - #logo { - background-image: url(/logo.gif); - } -} diff --git a/src/tests/mixin.scss b/src/tests/mixin.scss deleted file mode 100644 index 0f365b75e..000000000 --- a/src/tests/mixin.scss +++ /dev/null @@ -1,52 +0,0 @@ -// @charset "UTF-8"; - -@mixin background-image-retina($file, $type, $width, $height) { - background-image: unquote(image-url("#{$file}.#{$type}", true)); - hey: length(a b c d); - ho: unquote("hello"); - hee: unquote(unit(10fudge)); - - @media (-webkit-min-device-pixel-ratio: 2), (-moz-min-device-pixel-ratio: 2) { - & { - background-image: image-url("#{$file}@2x.#{$type}"); - -webkit-background-size: $width $height; - } - } -} - -$x: foo; -$y: bar; - -div { - @include background-image-retina(test, png, 100px, 300px); - fudge: walnut; -} - -span { - blah: "#{$x} #{$y}"; - bleh: image-url("#{$x} #{$y}"); -} - - -@mixin foo($x, $y) { - foo-x: $x; - foo-y: $y; -} - -div { - @include foo(1, 2); - @include foo($y: 2, $x: 1); -} - -@mixin bar($x, $y: default) { - bar-x: $x; - bar-y: $y; -} - -div { - @include bar(1, 2); - @include bar(1); - @include bar($x: n1, $y: n2); - @include bar($x: n1); - blah: unquote("hello"); -} \ No newline at end of file diff --git a/src/tests/mixins-and-media-queries.scss b/src/tests/mixins-and-media-queries.scss deleted file mode 100644 index 73549d37e..000000000 --- a/src/tests/mixins-and-media-queries.scss +++ /dev/null @@ -1,22 +0,0 @@ -@media screen and (orientation:landscape) { - span { - background: blue; - } - /* fudge */ - // @include foo; - /* budge */ - div { - color: red; - } -} - -@mixin testComments { - /* crash */ - p { - width: 100px; - } -} - -@media screen and (orientation:landscape) { - @include testComments; -} \ No newline at end of file diff --git a/src/tests/multi-blocks.scss b/src/tests/multi-blocks.scss deleted file mode 100644 index f15d16c24..000000000 --- a/src/tests/multi-blocks.scss +++ /dev/null @@ -1,63 +0,0 @@ -a b { - color: red; - c d { - height: 10; - } - e f { - width: 12; - } -} - -@media all and (min-width: 960px) { - b { - font-weight: normal; - } -} - -@media (min-width: 980px) { - a { - color: red; - } -} - -@media screen and (all) { - /* hey */ - p { - color: blue; - a { - color: green; - &:after { - content: ">>"; - } - } - } - span { - display: inline-block; - } -} - -a b c { - /* a */ - blee: blee; - /* b */ - d e f { - blah: blah; - bloo: bloo; - } - /* c */ - g h, i j { - @media print and (foo: 1 2 3), (bar: 3px hux(muz)), not screen { - /* aa */ - hey: ho; - /* bb */ - k l m { - hee: fee; - } - /* cc */ - haa: hoo; - /* dd */ - } - } - /* d */ - blah: blah; -} \ No newline at end of file diff --git a/src/tests/multiline-var.scss b/src/tests/multiline-var.scss deleted file mode 100644 index 713c3eece..000000000 --- a/src/tests/multiline-var.scss +++ /dev/null @@ -1,10 +0,0 @@ -foo { - $var1: 1 + - 2; - $var2: true and - false; - $var3: a b - c; - a: $var1; -// b: $var2; - c: $var3; } diff --git a/src/tests/namespaces.scss b/src/tests/namespaces.scss deleted file mode 100644 index daddaed5c..000000000 --- a/src/tests/namespaces.scss +++ /dev/null @@ -1,3 +0,0 @@ -namespace:customtag { - color: red; -} \ No newline at end of file diff --git a/src/tests/negation.scss b/src/tests/negation.scss deleted file mode 100644 index f08a21b1a..000000000 --- a/src/tests/negation.scss +++ /dev/null @@ -1,7 +0,0 @@ -.asdf { - $bwidth: 52px; - left: -$bwidth/3; - right: (1/3); - center: (10000/3); - blah: (20/8); -} \ No newline at end of file diff --git a/src/tests/nested-extend.scss b/src/tests/nested-extend.scss deleted file mode 100644 index d554fea09..000000000 --- a/src/tests/nested-extend.scss +++ /dev/null @@ -1,21 +0,0 @@ -.sprites-nav { - color: red; -} - -.sprites-nav_up { - color: green; -} - -.mw_nav_button { - float: right; - width: 30px; - height: 30px; - margin: 10px 10px 10px 0; - overflow: hidden; - &[data-ur-state="disabled"] { - @extend .sprites-nav; - } - &[data-ur-state="enabled"] { - @extend .sprites-nav_up; - } -} diff --git a/src/tests/null.scss b/src/tests/null.scss deleted file mode 100644 index 71368b9ad..000000000 --- a/src/tests/null.scss +++ /dev/null @@ -1,14 +0,0 @@ -$x: 2; - -div { - $x: null; - a: length(null null null); - d: type-of($x); - e: null == null; - f: -null; - g: -fudge; - h: (null null null); - i: froo(null, 4); - j: (null), (null), 3, 4; - k: length(((null), (null), 3, 4)); -} \ No newline at end of file diff --git a/src/tests/numbers.scss b/src/tests/numbers.scss deleted file mode 100644 index 03b74e236..000000000 --- a/src/tests/numbers.scss +++ /dev/null @@ -1,6 +0,0 @@ -div { - width: 10px; - height: 20%; - blah: 12; - color: #abc; -} \ No newline at end of file diff --git a/src/tests/odd-selectors.scss b/src/tests/odd-selectors.scss deleted file mode 100644 index 64bf91a6b..000000000 --- a/src/tests/odd-selectors.scss +++ /dev/null @@ -1,13 +0,0 @@ -"fudge" 123 { - color: red; - + 456 "mudge"#foo[hey] { - font-weight: bold; - } -} - -div span { - color: red; - + p a { - font-weight: bold; - } -} \ No newline at end of file diff --git a/src/tests/percentages.scss b/src/tests/percentages.scss deleted file mode 100644 index cca28e19b..000000000 --- a/src/tests/percentages.scss +++ /dev/null @@ -1,13 +0,0 @@ -div { - width: 10% + 20%; - height: 10% - 20%; - width: 10% + 10; - width: 10 + 10%; - height: 10% - 10; - height: 10 - 10%; - blah: (20% / 4%); - flah: 12 * 75%; - grah: 75% * 12; - // hwah: (24 / 8%); - nyah: (35% / 7); -} \ No newline at end of file diff --git a/src/tests/placeholder.scss b/src/tests/placeholder.scss deleted file mode 100644 index ecab993c7..000000000 --- a/src/tests/placeholder.scss +++ /dev/null @@ -1,17 +0,0 @@ -%x.buz { - color: red; -} - -%y { - color: whatever; -} - -foo bar { - width: 10px; - @extend %x; -} - -hux baz { - height: 12px; - @extend %x; -} \ No newline at end of file diff --git a/src/tests/precision.scss b/src/tests/precision.scss deleted file mode 100644 index 22be18c37..000000000 --- a/src/tests/precision.scss +++ /dev/null @@ -1,8 +0,0 @@ -div { - a: (20/3); - b: (5/2); - c: (9/3); - d: (20/-3); - e: (-5/2); - f: -(9/3); -} \ No newline at end of file diff --git a/src/tests/propsets.scss b/src/tests/propsets.scss deleted file mode 100644 index d77ae370e..000000000 --- a/src/tests/propsets.scss +++ /dev/null @@ -1,55 +0,0 @@ -$x: ground; -$y: e; -$z: it; - -div { - back#{$x}: { - imag#{$y}: url(foo.png); - pos#{$z}ion: 50%; - } -} - -span { - background: { - image: url(bar.png); - position: 100%; - } -} - -p { - border: { - upper: { - left: 2px; - right: 3px; - } - } -} - -@warn 2 + 3; - -/* 2 + 3 */ -/* #{2 + 3} */ - -foo|div { - color: red; -} - -$-hey : hey; - -div sp\ ,#abcan { - color: red; - p, |q { - background: blue; - color: \hey; - width: \10 + \20 \ ; - a { - height: 1; - } - } -} - -d\ v, sp\ n { - a { - color: blue; - } -} \ No newline at end of file diff --git a/src/tests/quotes-in-interpolated-strings.scss b/src/tests/quotes-in-interpolated-strings.scss deleted file mode 100644 index 2b41c85f9..000000000 --- a/src/tests/quotes-in-interpolated-strings.scss +++ /dev/null @@ -1,10 +0,0 @@ -$bar: "bar"; -$foobar: "foo#{$bar}"; -#{$bar} { - #{$bar}: #{$bar}; - #{$bar}: $bar; -} -foobar { - #{$foobar}: #{$foobar}; - #{$foobar}: $foobar; -} \ No newline at end of file diff --git a/src/tests/rel.scss b/src/tests/rel.scss deleted file mode 100644 index 8b2bb105b..000000000 --- a/src/tests/rel.scss +++ /dev/null @@ -1,21 +0,0 @@ -div { - less: 3px < 3pt; - less: (1px / 1pt); - less: 23fu < 120; - eq: hello == hello; - eq: "hello" == hello; - eq: (1 2 3) == (1 2 3); - eq: (1 2 3) == (1, 2, 3); - eq: 23px == 23fu; - eq: 3.1in == 2.54cm; - eq: 2.54cm == 3.1in; - eq: (1in) == (1cm*1in/1cm); - x: 1in, (1cm*1in/1cm); - y: 1cm*1in/1in; - eq: (2cm*1in/2cm) == (1in*2cm/2cm); - blah: (1cm/1in); - in: (1in*2.54cm/1in); - lt: 1in < 2.54cm; - lt: 2.54cm < 1in; - lt: 5 < 4; -} diff --git a/src/tests/retina-image.scss b/src/tests/retina-image.scss deleted file mode 100644 index 1d2789e7f..000000000 --- a/src/tests/retina-image.scss +++ /dev/null @@ -1,27 +0,0 @@ -@mixin retina-image($filename, $background-size, $extension: png, $retina-filename: null, $asset-pipeline: false) { - @if $asset-pipeline { - background-image: image_url($filename + "." + $extension); - } - @else { - background-image: url($filename + "." + $extension); - } - @include hidpi { - @if $asset-pipeline { - @if $retina-filename { - background-image: image_url($retina-filename + "." + $extension); - } - @else { - background-image: image_url($filename + "@2x" + "." + $extension); - } - } - @else { - @if $retina-filename { - background-image: url($retina-filename + "." + $extension); - } - @else { - background-image: url($filename + "@2x" + "." + $extension); - } - } - background-size: $background-size; - } -} \ No newline at end of file diff --git a/src/tests/return.scss b/src/tests/return.scss deleted file mode 100644 index 8a2b1bd05..000000000 --- a/src/tests/return.scss +++ /dev/null @@ -1,4 +0,0 @@ -div { - @return 1; - color: red; -} \ No newline at end of file diff --git a/src/tests/scale.scss b/src/tests/scale.scss deleted file mode 100644 index 67b7020f4..000000000 --- a/src/tests/scale.scss +++ /dev/null @@ -1,7 +0,0 @@ -div { - color: scale-color(red, $red: -23%); - color: scale-color(hsl(120, 70, 80), $lightness: 50%); - color: scale-color(rgb(200, 150, 170), $green: -40%, $blue: 70%); - color: scale-color(hsl(200, 70, 80), $saturation: -90%, $alpha: 10%); - blah: #d4f7d4; -} \ No newline at end of file diff --git a/src/tests/selectors.scss b/src/tests/selectors.scss deleted file mode 100644 index c2a69dde7..000000000 --- a/src/tests/selectors.scss +++ /dev/null @@ -1,43 +0,0 @@ -div { - span, p, span { - color: red; - } - a.foo.bar.foo { - color: green; - } - &:nth(-3) { - color: blue; - } -} - -@-webkit-keyframes { - from { - left: 0px; - hence { - whatever: hoo; - } - } - to { - left: 200px; - } -} - -div { - @whatever { - blah: blah; - stuff { - blah: bloh; - } - } -} - - -a, b { - color: red; - c, d { - height: 10px; - e, f { - width: 12px; - } - } -} \ No newline at end of file diff --git a/src/tests/simple-inheritance.scss b/src/tests/simple-inheritance.scss deleted file mode 100644 index 778225550..000000000 --- a/src/tests/simple-inheritance.scss +++ /dev/null @@ -1,64 +0,0 @@ -earth { - mammal, bird { - blood: warm; - } -} - -earth { - mammal { - produces-milk: true; - } -} - -@mixin mammal-says($message) { - @extend mammal; - says: $message; -} - -dog { - @include mammal-says("Woof!"); -} - -cat { - @include mammal-says("Meow."); -} - -horse, naysayer { - @include mammal-says("Nay."); -} - -[hey] { - a: b; -} - -ho { - @extend [hey]; - c: d; -} - -fancy outer space vehicle { - insides: advanced; -} - -new american mars rover { - wheels: big; - @extend vehicle; -} - -foo { - something: whatever; -} - -a b c { - blah: blah; - @extend foo; -} - -d e f { - blah: blah; -} - -g { - @extend f; - bloo: bloo; -} \ No newline at end of file diff --git a/src/tests/simple-lists.scss b/src/tests/simple-lists.scss deleted file mode 100644 index 5d0572d8d..000000000 --- a/src/tests/simple-lists.scss +++ /dev/null @@ -1,5 +0,0 @@ -div { - hey: a, b, c, d; - ho: a b c d; - ha: unquote("a, b, c, d"); -} \ No newline at end of file diff --git a/src/tests/slice.scss b/src/tests/slice.scss deleted file mode 100644 index e02887c49..000000000 --- a/src/tests/slice.scss +++ /dev/null @@ -1,43 +0,0 @@ -@function slice($list, $start, $end: length($list)) { - $new_list: (); - @for $i from $start through $end { - $new_list: append($new_list, nth($list, $i)); - } - @return $new_list; -} - -@function slice2($list, $start, $end: length($list)) { - $new_list: (); - $i: $start; - @while $i <= $end { - $new_list: append($new_list, nth($list, $i)); - $i: $i + 1; - } - @return $new_list; -} - -@mixin slice3($list, $start, $end: length($list)) { - $new_list: (); - $i: $start; - @while $i <= $end { - $new_list: append($new_list, nth($list, $i)); - $i: $i + 1; - } - thing: $new_list; -} - -@mixin slice4($list, $start, $end: length($list)) { - $new_list: (); - @for $i from $start through $end { - $new_list: append($new_list, nth($list, $i)); - } - thing: $new_list; -} - - -div { - //@include slice3(a b c d e f, 2, 4); - //@include slice4(a b c d e f, 2, 4); - //bar: slice2(a b c d e f, 2, 4); - foo: slice(a b c d e f, 2, 4); -} \ No newline at end of file diff --git a/src/tests/strings.scss b/src/tests/strings.scss deleted file mode 100644 index c1abe32b7..000000000 --- a/src/tests/strings.scss +++ /dev/null @@ -1,8 +0,0 @@ -div { - content: blang + 1; - content: 1 + blang; - content: "blang" + 1; - content: 1 + "blang"; - content: bar + "foo"; - content: "quoted" + unquoted; -} \ No newline at end of file diff --git a/src/tests/test.scss b/src/tests/test.scss deleted file mode 100644 index 8e42af142..000000000 --- a/src/tests/test.scss +++ /dev/null @@ -1,85 +0,0 @@ -$x: 3; - -div { - noo: not $x; - poo: not 3; - doo: not($x); - goo: not(3); - zoo: not 1 + 2; - - roo: not not not $x; - hoo: not not not 3; -} - -@mixin foo($x-1, $x-2) { - goo: $x-1; - poo: $x-2; -} -$hux: "blah.css"; -span { - a: rgba(100, 20, 0, 1); - b: rgba(#abc, 1); - c: compact(hello, my, false, name, is, false, aaron, false, false); - d: join(1 2 3, 4 5 6, comma); - e: join(a b c, d e f); - f: change-color(#102030, $blue: 5); - g: change-color(#102030, $red: 120, $blue: 5); - h: hsl(25, 100%, 80%); - h: change-color(#ffc499, $alpha: 0.8, $lightness: 40%); - h: change-color(hsl(25, 100%, 80%), $alpha: 0.8, $lightness: 40%); - i: hsla(25, 100%, 40%, 0.8); - foo: url("http://blah/flah/grah"); - foo: url(http://foo/bar/buzz.css); - foo: url(hey#{1+3}ho.css); - foo: url($hux); - bug: compact(false 1 2 false 3 4 5 false); - pug: compact(false, 1, 2, false, 3, 4, 5, false); - mug: compact((flug, false, blug, false, krug, false)); -} - -@mixin bg($file) { - background: url($file) no-repeat; -} - -div { - flug: url(bug.mug); - krug: nth(1 2 3, 2px); - blug: nth(a b c d, 3); - flig: comparable(34, 22px) comparable(1%, 3) comparable(2, 1) comparable(4cm, 1in); - flug: comparable(1px, 2.3in) comparable(1%, 2pt); - flib: comparable(3ex, 2px) comparable(3em, 2cm); - glib: not(fudge) not(false) not(0) not(red + green); - trib: if(red + green, yellow, not taken); - trub: if(not(fudge), not taken, here we are); -} - -$width: 10px; -$height: 10px; -@media (-webkit-min-device-pixel-ratio: 2), (-moz-min-device-pixel-ratio: 2) { - div { - background-image: url(fudge); - -webkit-background-size: $width $height; - } -} - -span { - @media foo { - div { - blah: blah; - } - @media bar { - p { - blah: bloo; - } - } - } -} - -gudge { - fudge: 20 + "%"; - mudge: 1 + blang; -} - -h1:lang(en) { - foo: bar; -} \ No newline at end of file diff --git a/src/tests/trace.scss b/src/tests/trace.scss deleted file mode 100644 index 51b7aa874..000000000 --- a/src/tests/trace.scss +++ /dev/null @@ -1,23 +0,0 @@ -@function foo($c) { - @return hue($c); -} - -@mixin moo($c) { - border: 1px solid foo($c); - @include booboo; -} - -@mixin moomoo($c) { - @include moo($c); - color: gray; -} - -div { - @include moomoo(fudge); -} - -// div by zero -// called from foo line 2 -// called from moo line 6 -// called from moomoo line 10 -// called from line 15 \ No newline at end of file diff --git a/src/tests/types.scss b/src/tests/types.scss deleted file mode 100644 index 01dbcaab1..000000000 --- a/src/tests/types.scss +++ /dev/null @@ -1,32 +0,0 @@ - -@mixin foo($x, $y) { - color: $x, $y; -} - -div { - color: type-of(red); - color: type-of(#abc); - color: type-of(123); - color: type-of(45px); - color: type-of(98%); - color: type-of(1 2 3); - color: type-of(hey); - color: type-of("ho"); - color: type-of(#{1+2}px); - color: type-of(true); - color: type-of(false); - color: type-of(45 or false); - color: type-of(#{#abc}); - color: ty#{pe}-of(red); - color: quote(le#{ng}th(a b c d)); - color: aqua; - $x : aqua; - color: $x; - color: $x + #000000; - color: $x; - width: #{1+2}+3; - thing: url(type-of(3+3)); - //foo + bar: 3px; -} - -//@import url(type-of(3+3)); \ No newline at end of file diff --git a/src/tests/unary-ops.scss b/src/tests/unary-ops.scss deleted file mode 100644 index a5ccb6d62..000000000 --- a/src/tests/unary-ops.scss +++ /dev/null @@ -1,14 +0,0 @@ -$x: 20%; - -div { - a: -10; - b: -10px + 10px; - c: +10; - d: +10px + -10px; - e: -$x; - f: +$x; - g: -hello; - h: +hello; - i: + hello; - j: type-of(+ hello); -} \ No newline at end of file diff --git a/src/tests/units.scss b/src/tests/units.scss deleted file mode 100644 index cc31c79b9..000000000 --- a/src/tests/units.scss +++ /dev/null @@ -1,6 +0,0 @@ -div { - hey: ((5in + 3cm) * 10px * 100pt * 10fu / 2px / 2fu / 3pt); - ho: (23in/2fu) > (23cm/2fu); -// hoo: unit((23px/2fu/12emu/1.2gnu)); -// hee: unit((2in/3cm/4cm)); -} \ No newline at end of file diff --git a/src/tests/unquote.scss b/src/tests/unquote.scss deleted file mode 100644 index c019b932c..000000000 --- a/src/tests/unquote.scss +++ /dev/null @@ -1,15 +0,0 @@ -div { - a: unquote("foo"); - b: unquote("I'm a \"fashion\" \"expert\"."); - c: unquote(\"wha); - d: unquote("column1\tcolumn2"); - e: unquote(23+1); - f: percentage(.37); - g: type-of(null); - // h: hello + null; - j: length(null); - k: nth(1 2 3, 2); - l: join(a, b, auto); - m: zip(a b c, 1 2); - n: min(1, 2%, 3px); -} \ No newline at end of file diff --git a/src/tests/url.scss b/src/tests/url.scss deleted file mode 100644 index c519ea57e..000000000 --- a/src/tests/url.scss +++ /dev/null @@ -1,30 +0,0 @@ -$x: pop; -$y: 123; - - - -div { - foo: url(bloo/blah.css); - bar: url(http://foo/bar/hux.css); - foo: url(fudge#{$x}.css); - bar: url("http://fudge#{$x}/styles.css"); - hux: url(http://box_#{$y}////fudge#{$x}.css); - @each $i in (1 2 3 4 5) { - hux: url(http://box_#{$y}////fudge#{$x}.css); - foo: url(http://blah.com/bar-#{$i}.css); - } - gloo: url("hey#{1+2}.css"); - floo: url(hadoop-#{$y+321}.css); - flum: image-url("fudge.png", hux); - /*****/ - $bg: "image.png"; - background: url("#{$bg}"); - //gudge: url(type-of(hello) + length(a b c)); - mudge: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAACeElEQVR42nySy29McRTHP/fOnTvT6bQNrdHKMGGhFkTSELGxwoJY8Q9YWFhYEUJsRSKCsJWikjYSJBIbinpVPJLSRlEkKK2WTnXmvl+/Y4F4tPVJPqtvzjcnJ0cTEQxdY/miFH6gcAJpaWrQl86t05rR9axSKD8UZ6KqJscm5bMdyDDgAYgIBoCORm2G1u0b6w8unJ/bmDG1QtpUmIYiZ8Zk0zEpYmW76tujV9J3/Ep04v0XdR2IDYAdWxYt27Sa8/l8btWIlaYSupgqpNaMUYbC0DUa8qKXWpLGNSvZEETpZO/Z4B5gGQCRMio1xdVfioUIa3AQJ/ZARWhJgkQJKq3wfJ3RwETGhRtPgx7ABtBEhCVNBqViU2tn5+5bLfXmgurIYwJrGFEJmqZh2T4jo2X0YIreZ+7dfeejrcCEiKADfCon3O4fHzp25Nx+8nnqF65lXnEphQUtNBYKaKkMcRgxVY29093JUWCCn+gAORMaTLh0dbCjo/1KO3X1kC6BGIR+QLVioSc+F+9HnW/G1DX+QAcw0j8c/QaHj3UfeN0/MMicEmSL+J5P6DkMDUcfLvZGJ4FwWoHl/lAEXo344zv3dO3ynXJIpg7XdnBtj46bwSnblwH+QQdQ8lsNeNg32nOm/fIh3CGS0OXOQHCv90XYwUyICM2NNX85f26WUnOu5smFzX0vu9qktZjeNtusAbB+XdvfAWDZnjeurX2XST1Y8X6s7zmzYABUrHBaYNshYRC4k340FcZU/1vg2JVpgeP4uJXypHK8soD134In/W+mb+AJvffvvC022It/ve1MaCJCXU6f4UCQy1CbNVONH7/Gw7Md8fsAtddMUh5fveYAAAAASUVORK5CYII=); - nudge: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGElEQVQYV2N4DwX/oYBhgARgDJjEAAkAAEC99wFuu0VFAAAAAElFTkSuQmCC); - pudge: url(http://wiki.jbussdieker.name/skins/common/images/Checker-16x16.png?2012-05-02T13:40:00Z); -} - -p:after { - content:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAACeElEQVR42nySy29McRTHP/fOnTvT6bQNrdHKMGGhFkTSELGxwoJY8Q9YWFhYEUJsRSKCsJWikjYSJBIbinpVPJLSRlEkKK2WTnXmvl+/Y4F4tPVJPqtvzjcnJ0cTEQxdY/miFH6gcAJpaWrQl86t05rR9axSKD8UZ6KqJscm5bMdyDDgAYgIBoCORm2G1u0b6w8unJ/bmDG1QtpUmIYiZ8Zk0zEpYmW76tujV9J3/Ep04v0XdR2IDYAdWxYt27Sa8/l8btWIlaYSupgqpNaMUYbC0DUa8qKXWpLGNSvZEETpZO/Z4B5gGQCRMio1xdVfioUIa3AQJ/ZARWhJgkQJKq3wfJ3RwETGhRtPgx7ABtBEhCVNBqViU2tn5+5bLfXmgurIYwJrGFEJmqZh2T4jo2X0YIreZ+7dfeejrcCEiKADfCon3O4fHzp25Nx+8nnqF65lXnEphQUtNBYKaKkMcRgxVY29093JUWCCn+gAORMaTLh0dbCjo/1KO3X1kC6BGIR+QLVioSc+F+9HnW/G1DX+QAcw0j8c/QaHj3UfeN0/MMicEmSL+J5P6DkMDUcfLvZGJ4FwWoHl/lAEXo344zv3dO3ynXJIpg7XdnBtj46bwSnblwH+QQdQ8lsNeNg32nOm/fIh3CGS0OXOQHCv90XYwUyICM2NNX85f26WUnOu5smFzX0vu9qktZjeNtusAbB+XdvfAWDZnjeurX2XST1Y8X6s7zmzYABUrHBaYNshYRC4k340FcZU/1vg2JVpgeP4uJXypHK8soD134In/W+mb+AJvffvvC022It/ve1MaCJCXU6f4UCQy1CbNVONH7/Gw7Md8fsAtddMUh5fveYAAAAASUVORK5CYII= ); -} \ No newline at end of file diff --git a/src/tests/var-args.scss b/src/tests/var-args.scss deleted file mode 100644 index 7a72b3bc5..000000000 --- a/src/tests/var-args.scss +++ /dev/null @@ -1,56 +0,0 @@ -@mixin foo($x, $y, $zs...) { - grarh: type-of(false); - f: $zs; - fa: $x, $y, $zs; - fv: $zs; - ft: type-of($zs); - fj: join(1 2 3, $zs); - fjt: type-of(join(1 2 3, $zs)); - fkt: type-of(join($zs, 1 2 3)); - hoopla: length(a b c d e); - boopla: type-of(123+234); - koopla: type-of(length(a b c d)); -} - -@mixin bar($x, $y, $z) { - ba: $x, $y, $z; - bv: $z; - bt: type-of($z); - bj: join(1 2 3, $z); - bjt: type-of(join(1 2 3, $z)); -} - -$stuff: hey hoo ha; - -@mixin mudge($x, $y, $zs...) { - x: $x; - y: $y; - z: $zs; -} - -div { - @include foo(a, b, c d e f); - @include bar(a, b, c d e f); - @include foo(a, b, c d e...); - @include bar(a, b, c d e...); - @include foo(a, c d e...); - @include bar(a, c d e...); - @include foo(a, $stuff...); - new: type-of("hello"); -} - -@mixin bad($x, $y, $z) { - first: $x; - second: $y; - rest: $z; -} - -@mixin foo($x, $y, $z) { - a: type-of(join($x, $y)); - b: type-of($z); - c: type-of(length($x)); -} - -div { - @include foo(a b c, d e, false); -} \ No newline at end of file diff --git a/src/tests/vars.scss b/src/tests/vars.scss deleted file mode 100644 index 2f99da233..000000000 --- a/src/tests/vars.scss +++ /dev/null @@ -1,7 +0,0 @@ -$x: hello; -$y: 1/2 3/4 (2+3); - -div { - content: 1 2 $x; - content: $y; -} \ No newline at end of file diff --git a/src/tests/warnings.scss b/src/tests/warnings.scss deleted file mode 100644 index 4d28f84b2..000000000 --- a/src/tests/warnings.scss +++ /dev/null @@ -1,33 +0,0 @@ -@function foo() { - @warn "FOO"; - @return 5; -} - -@mixin moo() { - @warn "MOO"; - moo: moo; -} - -@warn "global!"; - -div { - foo: foo(); - @include moo(); - @warn "the end!"; -} - -@mixin inner() { - @warn "inner"; - color: red; - @include super-inner; -} - -@mixin outer() { - @warn "outer"; - @include inner(); - color: pink; -} - -div { - @include outer(); -} \ No newline at end of file diff --git a/src/tests/weird-selectors.scss b/src/tests/weird-selectors.scss deleted file mode 100644 index 92b3ac1e5..000000000 --- a/src/tests/weird-selectors.scss +++ /dev/null @@ -1,13 +0,0 @@ -> > E { - color: red; -} - -E > > { - color: red; -} - -> > E > > { - > > F > > { - color: red; - } -} \ No newline at end of file diff --git a/src/tests/while.scss b/src/tests/while.scss deleted file mode 100644 index e19f269d8..000000000 --- a/src/tests/while.scss +++ /dev/null @@ -1,10 +0,0 @@ -div { - $x : true; - @while $x { - stuff: 1; - more-stuff: 2; - even-more-stuff: 3; - lets-stop-now: 4; - $x: false; - } -} \ No newline at end of file diff --git a/src/tests/wrong.scss b/src/tests/wrong.scss deleted file mode 100644 index 73c66930b..000000000 --- a/src/tests/wrong.scss +++ /dev/null @@ -1,9 +0,0 @@ -div { - val: 1in*2.54cm/1in; - val: 1in*1cm/1cm; - val: 2.54cm*1in/2.54cm; - val: 1in/2.54cm*1in; - val: (1 2 3) == (1 2 3); - val: 2in*3cm/1cm*1cm; - val: (1/3); -} \ No newline at end of file diff --git a/src/to_c.cpp b/src/to_c.cpp deleted file mode 100644 index 4cd2b15f9..000000000 --- a/src/to_c.cpp +++ /dev/null @@ -1,47 +0,0 @@ -#include "to_c.hpp" -#include "ast.hpp" - -namespace Sass { - using namespace std; - - Sass_Value To_C::fallback_impl(AST_Node* n) - { return make_sass_null(); } - - Sass_Value To_C::operator()(Boolean* b) - { return make_sass_boolean(b->value()); } - - Sass_Value To_C::operator()(Number* n) - { return make_sass_number(n->value(), n->unit().c_str()); } - - Sass_Value To_C::operator()(Color* c) - { return make_sass_color(c->r(), c->g(), c->b(), c->a()); } - - Sass_Value To_C::operator()(String_Constant* s) - { return make_sass_string(s->value().c_str()); } - - Sass_Value To_C::operator()(List* l) - { - Sass_Value v = make_sass_list(l->length(), l->separator() == List::COMMA ? SASS_COMMA : SASS_SPACE); - for (size_t i = 0, L = l->length(); i < L; ++i) { - v.list.values[i] = (*l)[i]->perform(this); - } - return v; - } - - Sass_Value To_C::operator()(Arguments* a) - { - Sass_Value v = make_sass_list(a->length(), SASS_COMMA); - for (size_t i = 0, L = a->length(); i < L; ++i) { - v.list.values[i] = (*a)[i]->perform(this); - } - return v; - } - - Sass_Value To_C::operator()(Argument* a) - { return a->value()->perform(this); } - - // not strictly necessary because of the fallback - Sass_Value To_C::operator()(Null* n) - { return make_sass_null(); } - -}; \ No newline at end of file diff --git a/src/to_c.hpp b/src/to_c.hpp deleted file mode 100644 index 63aae3ccf..000000000 --- a/src/to_c.hpp +++ /dev/null @@ -1,44 +0,0 @@ -#define SASS_TO_C - -#ifndef SASS_OPERATION -#include "operation.hpp" -#endif - -#ifndef SASS -#include "sass.h" -#endif - -namespace Sass { - using namespace std; - - class AST_Node; - class Boolean; - class Number; - class String_Constant; - class List; - class Null; - - class To_C : public Operation_CRTP { - - Sass_Value fallback_impl(AST_Node* n); - - public: - - To_C() { } - virtual ~To_C() { } - using Operation::operator(); - - Sass_Value operator()(Boolean*); - Sass_Value operator()(Number*); - Sass_Value operator()(Color*); - Sass_Value operator()(String_Constant*); - Sass_Value operator()(List*); - Sass_Value operator()(Null*); - Sass_Value operator()(Arguments*); - Sass_Value operator()(Argument*); - - template - Sass_Value fallback(U x) { return fallback_impl(x); } - }; - -} \ No newline at end of file diff --git a/src/to_string.cpp b/src/to_string.cpp deleted file mode 100644 index 96e843143..000000000 --- a/src/to_string.cpp +++ /dev/null @@ -1,26 +0,0 @@ -#include -#include -#include - -#ifndef SASS_TO_STRING -#include "to_string.hpp" -#endif - -#include "inspect.hpp" -#include "ast.hpp" -#include - -namespace Sass { - using namespace std; - - To_String::To_String() { } - To_String::~To_String() { } - - inline string To_String::fallback_impl(AST_Node* n) - { - Inspect i; - n->perform(&i); - return i.get_buffer(); - } - -} \ No newline at end of file diff --git a/src/to_string.hpp b/src/to_string.hpp deleted file mode 100644 index 0fbe2874c..000000000 --- a/src/to_string.hpp +++ /dev/null @@ -1,25 +0,0 @@ -#define SASS_TO_STRING - -#include - -#ifndef SASS_OPERATION -#include "operation.hpp" -#endif - -namespace Sass { - using namespace std; - - class To_String : public Operation_CRTP { - // import all the class-specific methods and override as desired - using Operation::operator(); - // override this to define a catch-all - string fallback_impl(AST_Node* n); - - public: - To_String(); - virtual ~To_String(); - - template - string fallback(U n) { return fallback_impl(n); } - }; -} \ No newline at end of file diff --git a/src/token.hpp b/src/token.hpp deleted file mode 100644 index 665950413..000000000 --- a/src/token.hpp +++ /dev/null @@ -1,32 +0,0 @@ -#define SASS_TOKEN - -#include -#include -#include - -namespace Sass { - using namespace std; - - // Token type for representing lexed chunks of text - struct Token { - - const char* begin; - const char* end; - - Token() : begin(0), end(0) { } - Token(const char* s) : begin(s), end(s + strlen(s)) { } - Token(const char* b, const char* e) : begin(b), end(e) { } - - size_t length() const { return end - begin; } - string to_string() const { return string(begin, end - begin); } - - string unquote() const; - void unquote_to_stream(stringstream& buf) const; - - operator bool() { return begin && end && begin >= end; } - operator string() { return to_string(); } - - bool operator==(Token t) { return to_string() == t.to_string(); } - }; - -} \ No newline at end of file diff --git a/src/units.cpp b/src/units.cpp deleted file mode 100644 index 671cb737c..000000000 --- a/src/units.cpp +++ /dev/null @@ -1,44 +0,0 @@ -#include "units.hpp" - -namespace Sass { - - double conversion_factors[6][6] = { - /* in cm pc mm pt px */ - /* in */ { 1, 2.54, 6, 25.4, 72, 96 }, - /* cm */ { 1.0/2.54, 1, 6.0/2.54, 10, 72.0/2.54, 96.0/2.54 }, - /* pc */ { 1.0/6.0, 2.54/6.0, 1, 25.4/6.0, 72.0/6.0, 96.0/6.0 }, - /* mm */ { 1.0/25.4, 1.0/10.0, 6.0/25.4, 1, 72.0/25.4, 96.0/25.4 }, - /* pt */ { 1.0/72.0, 2.54/72.0, 6.0/72.0, 25.4/72.0, 1, 96.0/72.0 }, - /* px */ { 1.0/96.0, 2.54/96.0, 6.0/96.0, 25.4/96.0, 72.0/96.0, 1 } - }; - - Unit string_to_unit(const string& s) - { - if (s == "in") return IN; - else if (s == "cm") return CM; - else if (s == "pc") return PC; - else if (s == "mm") return MM; - else if (s == "pt") return PT; - else if (s == "px") return PX; - else return INCOMMENSURABLE; - } - - double conversion_factor(const string& s1, const string& s2) - { - Unit u1 = string_to_unit(s1); - Unit u2 = string_to_unit(s2); - double factor; - if (u1 == INCOMMENSURABLE || u2 == INCOMMENSURABLE) - factor = 0; - else - factor = conversion_factors[u1][u2]; - return factor; - } - - double convert(double n, const string& from, const string& to) - { - double factor = conversion_factor(from, to); - return factor ? factor * n : n; - } - -} \ No newline at end of file diff --git a/src/units.hpp b/src/units.hpp deleted file mode 100644 index d43853f2b..000000000 --- a/src/units.hpp +++ /dev/null @@ -1,11 +0,0 @@ -#include - -namespace Sass { - using namespace std; - - enum Unit { IN, CM, PC, MM, PT, PX, INCOMMENSURABLE }; - extern double conversion_factors[6][6]; - Unit string_to_unit(const string&); - double conversion_factor(const string&, const string&); - double convert(double, const string&, const string&); -} \ No newline at end of file