| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 | module.exports = function(hljs) {  var FUNCTION_LIKE = {    begin: /[\w-]+\(/, returnBegin: true,    contains: [      {        className: 'built_in',        begin: /[\w-]+/      },      {        begin: /\(/, end: /\)/,        contains: [          hljs.APOS_STRING_MODE,          hljs.QUOTE_STRING_MODE,          hljs.CSS_NUMBER_MODE,        ]      }    ]  }  var ATTRIBUTE = {    className: 'attribute',    begin: /\S/, end: ':', excludeEnd: true,    starts: {      endsWithParent: true, excludeEnd: true,      contains: [        FUNCTION_LIKE,        hljs.CSS_NUMBER_MODE,        hljs.QUOTE_STRING_MODE,        hljs.APOS_STRING_MODE,        hljs.C_BLOCK_COMMENT_MODE,        {          className: 'number', begin: '#[0-9A-Fa-f]+'        },        {          className: 'meta', begin: '!important'        }      ]    }  }  var AT_IDENTIFIER = '@[a-z-]+' // @font-face  var AT_MODIFIERS = "and or not only"  var MEDIA_TYPES = "all print screen speech"  var AT_PROPERTY_RE = /@\-?\w[\w]*(\-\w+)*/ // @-webkit-keyframes  var IDENT_RE = '[a-zA-Z-][a-zA-Z0-9_-]*';  var RULE = {    begin: /(?:[A-Z\_\.\-]+|--[a-zA-Z0-9_-]+)\s*:/, returnBegin: true, end: ';', endsWithParent: true,    contains: [      ATTRIBUTE    ]  };  return {    case_insensitive: true,    illegal: /[=\/|'\$]/,    contains: [      hljs.C_BLOCK_COMMENT_MODE,      {        className: 'selector-id', begin: /#[A-Za-z0-9_-]+/      },      {        className: 'selector-class', begin: /\.[A-Za-z0-9_-]+/      },      {        className: 'selector-attr',        begin: /\[/, end: /\]/,        illegal: '$',        contains: [          hljs.APOS_STRING_MODE,          hljs.QUOTE_STRING_MODE,        ]      },      {        className: 'selector-pseudo',        begin: /:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/      },      // matching these here allows us to treat them more like regular CSS      // rules so everything between the {} gets regular rule highlighting,      // which is what we want for page and font-face      {        begin: '@(page|font-face)',        lexemes: AT_IDENTIFIER,        keywords: '@page @font-face'      },      {        begin: '@', end: '[{;]', // at_rule eating first "{" is a good thing                                 // because it doesn’t let it to be parsed as                                 // a rule set but instead drops parser into                                 // the default mode which is how it should be.        illegal: /:/, // break on Less variables @var: ...        returnBegin: true,        contains: [          {            className: 'keyword',            begin: AT_PROPERTY_RE          },          {            begin: /\s/, endsWithParent: true, excludeEnd: true,            relevance: 0,            keywords: AT_MODIFIERS,            contains: [              {                begin: /[a-z-]+:/,                className:"attribute"              },              hljs.APOS_STRING_MODE,              hljs.QUOTE_STRING_MODE,              hljs.CSS_NUMBER_MODE            ]          }        ]      },      {        className: 'selector-tag', begin: IDENT_RE,        relevance: 0      },      {        begin: '{', end: '}',        illegal: /\S/,        contains: [          hljs.C_BLOCK_COMMENT_MODE,          RULE,        ]      }    ]  };};
 |