elixir.js 2.5 KB

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