elixir.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. module.exports = function(hljs) {
  2. var ELIXIR_IDENT_RE = '[a-zA-Z_][a-zA-Z0-9_.]*(\\!|\\?)?';
  3. var ELIXIR_METHOD_RE = '[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?';
  4. var ELIXIR_KEYWORDS =
  5. 'and false then defined module in return redo retry end for true self when ' +
  6. 'next until do begin unless nil break not case cond alias while ensure or ' +
  7. 'include use alias fn quote require import with|0';
  8. var SUBST = {
  9. className: 'subst',
  10. begin: '#\\{', end: '}',
  11. lexemes: ELIXIR_IDENT_RE,
  12. keywords: ELIXIR_KEYWORDS
  13. };
  14. var STRING = {
  15. className: 'string',
  16. contains: [hljs.BACKSLASH_ESCAPE, SUBST],
  17. variants: [
  18. {
  19. begin: /'/, end: /'/
  20. },
  21. {
  22. begin: /"/, end: /"/
  23. }
  24. ]
  25. };
  26. var FUNCTION = {
  27. className: 'function',
  28. beginKeywords: 'def defp defmacro', end: /\B\b/, // the mode is ended by the title
  29. contains: [
  30. hljs.inherit(hljs.TITLE_MODE, {
  31. begin: ELIXIR_IDENT_RE,
  32. endsParent: true
  33. })
  34. ]
  35. };
  36. var CLASS = hljs.inherit(FUNCTION, {
  37. className: 'class',
  38. beginKeywords: 'defimpl defmodule defprotocol defrecord', end: /\bdo\b|$|;/
  39. });
  40. var ELIXIR_DEFAULT_CONTAINS = [
  41. STRING,
  42. hljs.HASH_COMMENT_MODE,
  43. CLASS,
  44. FUNCTION,
  45. {
  46. begin: '::'
  47. },
  48. {
  49. className: 'symbol',
  50. begin: ':(?![\\s:])',
  51. contains: [STRING, {begin: ELIXIR_METHOD_RE}],
  52. relevance: 0
  53. },
  54. {
  55. className: 'symbol',
  56. begin: ELIXIR_IDENT_RE + ':(?!:)',
  57. relevance: 0
  58. },
  59. {
  60. className: 'number',
  61. begin: '(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b',
  62. relevance: 0
  63. },
  64. {
  65. className: 'variable',
  66. begin: '(\\$\\W)|((\\$|\\@\\@?)(\\w+))'
  67. },
  68. {
  69. begin: '->'
  70. },
  71. { // regexp container
  72. begin: '(' + hljs.RE_STARTERS_RE + ')\\s*',
  73. contains: [
  74. hljs.HASH_COMMENT_MODE,
  75. {
  76. className: 'regexp',
  77. illegal: '\\n',
  78. contains: [hljs.BACKSLASH_ESCAPE, SUBST],
  79. variants: [
  80. {
  81. begin: '/', end: '/[a-z]*'
  82. },
  83. {
  84. begin: '%r\\[', end: '\\][a-z]*'
  85. }
  86. ]
  87. }
  88. ],
  89. relevance: 0
  90. }
  91. ];
  92. SUBST.contains = ELIXIR_DEFAULT_CONTAINS;
  93. return {
  94. lexemes: ELIXIR_IDENT_RE,
  95. keywords: ELIXIR_KEYWORDS,
  96. contains: ELIXIR_DEFAULT_CONTAINS
  97. };
  98. };