(function(Prism) { Prism.languages.sass = Prism.languages.extend('css', { // Sass comments don't need to be closed, only indented 'comment': /^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t]+.+)*/m }); Prism.languages.insertBefore('sass', 'atrule', { // We want to consume the whole line 'atrule-line': { // Includes support for = and + shortcuts pattern: /^(?:[ \t]*)[@+=].+/m, inside: { 'atrule': /^(?:[ \t]*)(?:@[\w-]+|[+=])/m } } }); delete Prism.languages.sass.atrule; var variable = /((\$[-_\w]+)|(#\{\$[-_\w]+\}))/i; var operator = /[-+]{1,2}|==?|!=|\|?\||\?|\*|\/|%/; Prism.languages.insertBefore('sass', 'property', { // We want to consume the whole line 'variable-line': { pattern: /(^|(?:\r?\n|\r))[ \t]*\$.+/, lookbehind: true, inside: { 'punctuation': /:/, 'variable': variable, 'operator': operator } }, // We want to consume the whole line 'property-line': { pattern: /(^|(?:\r?\n|\r))[ \t]*(?:[^:\s]+[ ]*:.*|:[^:\s]+.*)/i, lookbehind: true, inside: { 'property': [ /[^:\s]+(?=\s*:)/, { pattern: /(:)[^:\s]+/, lookbehind: true } ], 'punctuation': /:/, 'variable': variable, 'operator': operator, 'important': Prism.languages.sass.important } } }); delete Prism.languages.sass.property; delete Prism.languages.sass.important; // Now that whole lines for other patterns are consumed, // what's left should be selectors delete Prism.languages.sass.selector; Prism.languages.insertBefore('sass', 'punctuation', { 'selector': { pattern: /([ \t]*).+(?:,(?:\r?\n|\r)\1[ \t]+.+)*/, lookbehind: true } }); }(Prism));