all files / lib/languages/ scss.js

100% Statements 10/10
100% Branches 0/0
100% Functions 0/0
100% Lines 10/10
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75                                                                                                                                 
"use strict";
 
Object.defineProperty(exports, "__esModule", {
    value: true
});
exports.scss = undefined;
 
var _utils = require("../utils");
 
var _css = require("./css");
 
var scss = _utils.lang.extend(_css.css, {
    comment: {
        pattern: /(^|[^\\])(?:\/\*[\w\W]*?\*\/|\/\/.*)/,
        lookbehind: true
    },
    atrule: {
        pattern: /@[\w-]+(?:\([^()]+\)|[^(])*?(?=\s+[{;])/,
        inside: {
            rule: /@[\w-]+/,
            _order: ["rule"]
        }
    },
    // url, compassified
    url: /(?:[-a-z]+-)*url(?=\()/i,
    // CSS selector regex is not appropriate for Sass
    // since there can be lot more things (var, @ directive, nesting..)
    // a selector must start at the end of a property or after a brace (end of other rules or nesting)
    // it can contain some characters that aren't used for defining rules or end of selector, & (parent selector), or interpolated variable
    // the end of a selector is found when there is no rules in it ( {} or {\s}) or if there is a property (because an interpolated var
    // can "pass" as a selector- e.g: proper#{$erty})
    // this one was hard to do, so please be careful if you edit this one :)
    selector: {
        // Initial look-ahead is used to prevent matching of blank selectors
        pattern: /(?=\S)[^@;\{\}\(\)]?([^@;\{\}\(\)]|&|#\{\$[-_\w]+\})+(?=\s*\{(\}|\s|[^\}]+(:|\{)[^\}]+))/m,
        inside: {
            placeholder: /%[-_\w]+/,
            _order: ["placeholder"]
        }
    },
    _order: ["comment", "atrule", "url", "selector"]
});
 
_utils.lang.insertBefore(scss, "atrule", {
    keyword: [/@(?:if|else(?: if)?|for|each|while|import|extend|debug|warn|mixin|include|function|return|content)/i, {
        pattern: /( +)(?:from|through)(?= )/,
        lookbehind: true
    }],
    _order: ["keyword"]
});
 
_utils.lang.insertBefore(scss, "property", {
    // var and interpolated vars
    variable: /\$[-_\w]+|#\{\$[-_\w]+\}/,
    _order: ["variable"]
});
 
_utils.lang.insertBefore(scss, "function", {
    placeholder: {
        pattern: /%[-_\w]+/,
        alias: "selector"
    },
    statement: /\B!(?:default|optional)\b/i,
    "boolean": /\b(?:true|false)\b/,
    "null": /\bnull\b/,
    operator: {
        pattern: /(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|or|not)(?=\s)/,
        lookbehind: true
    },
    _order: ["placeholder", "statement", "boolean", "null", "operator"]
});
 
_utils.lang.insertAfter(scss.atrule.inside, "rule", _utils.lang.clone(scss));
 
exports.scss = scss;