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 76 77 78 79 80 | 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× | "use strict"; var _utils = require("../utils"); var _css = require("./css"); var sass = _utils.lang.extend(_css.css, { // Sass comments don't need to be closed, only indented comment: { pattern: /^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t]+.+)*/m, lookbehind: true }, _order: ["comment"] }); _utils.lang.insertBefore(sass, "atrule", { // We want to consume the whole line "atrule-line": { // Includes support for = and + shortcuts pattern: /^(?:[ \t]*)[@+=].+/m, inside: { atrule: /(?:@[\w-]+|[+=])/m, _order: ["atrule"] } }, _order: ["atrule-line"] }); delete sass.atrule; var variable = /((\$[-_\w]+)|(#\{\$[-_\w]+\}))/i; var operator = [/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|or|not)\b/, { pattern: /(\s+)-(?=\s)/, lookbehind: true }]; _utils.lang.insertBefore(sass, "property", { // We want to consume the whole line "variable-line": { pattern: /^[ \t]*\$.+/m, inside: { punctuation: /:/, variable: variable, operator: operator, _order: ["punctuation", "variable", "operator"] } }, // We want to consume the whole line "property-line": { pattern: /^[ \t]*(?:[^:\s]+ *:.*|:[^:\s]+.*)/m, inside: { property: [/[^:\s]+(?=\s*:)/, { pattern: /(:)[^:\s]+/, lookbehind: true }], punctuation: /:/, variable: variable, operator: operator, important: sass.important, _order: ["property", "punctuation", "variable", "operator", "important"] } }, _order: ["variable-line", "property-line"] }); delete sass.property; delete sass.important; // Now that whole lines for other patterns are consumed, // what's left should be selectors delete sass.selector; _utils.lang.insertBefore(sass, "punctuation", { selector: { pattern: /([ \t]*)\S(?:,?[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,?[^,\r\n]+)*)*/, lookbehind: true }, _order: ["selector"] }); |