haskell.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. /*
  2. Language: Haskell
  3. Author: Jeremy Hull <sourdrums@gmail.com>
  4. Contributors: Zena Treep <zena.treep@gmail.com>
  5. Website: https://www.haskell.org
  6. Category: functional
  7. */
  8. function haskell(hljs) {
  9. var COMMENT = {
  10. variants: [
  11. hljs.COMMENT('--', '$'),
  12. hljs.COMMENT(
  13. '{-',
  14. '-}',
  15. {
  16. contains: ['self']
  17. }
  18. )
  19. ]
  20. };
  21. var PRAGMA = {
  22. className: 'meta',
  23. begin: '{-#', end: '#-}'
  24. };
  25. var PREPROCESSOR = {
  26. className: 'meta',
  27. begin: '^#', end: '$'
  28. };
  29. var CONSTRUCTOR = {
  30. className: 'type',
  31. begin: '\\b[A-Z][\\w\']*', // TODO: other constructors (build-in, infix).
  32. relevance: 0
  33. };
  34. var LIST = {
  35. begin: '\\(', end: '\\)',
  36. illegal: '"',
  37. contains: [
  38. PRAGMA,
  39. PREPROCESSOR,
  40. {className: 'type', begin: '\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?'},
  41. hljs.inherit(hljs.TITLE_MODE, {begin: '[_a-z][\\w\']*'}),
  42. COMMENT
  43. ]
  44. };
  45. var RECORD = {
  46. begin: '{', end: '}',
  47. contains: LIST.contains
  48. };
  49. return {
  50. name: 'Haskell',
  51. aliases: ['hs'],
  52. keywords:
  53. 'let in if then else case of where do module import hiding ' +
  54. 'qualified type data newtype deriving class instance as default ' +
  55. 'infix infixl infixr foreign export ccall stdcall cplusplus ' +
  56. 'jvm dotnet safe unsafe family forall mdo proc rec',
  57. contains: [
  58. // Top-level constructions.
  59. {
  60. beginKeywords: 'module', end: 'where',
  61. keywords: 'module where',
  62. contains: [LIST, COMMENT],
  63. illegal: '\\W\\.|;'
  64. },
  65. {
  66. begin: '\\bimport\\b', end: '$',
  67. keywords: 'import qualified as hiding',
  68. contains: [LIST, COMMENT],
  69. illegal: '\\W\\.|;'
  70. },
  71. {
  72. className: 'class',
  73. begin: '^(\\s*)?(class|instance)\\b', end: 'where',
  74. keywords: 'class family instance where',
  75. contains: [CONSTRUCTOR, LIST, COMMENT]
  76. },
  77. {
  78. className: 'class',
  79. begin: '\\b(data|(new)?type)\\b', end: '$',
  80. keywords: 'data family type newtype deriving',
  81. contains: [PRAGMA, CONSTRUCTOR, LIST, RECORD, COMMENT]
  82. },
  83. {
  84. beginKeywords: 'default', end: '$',
  85. contains: [CONSTRUCTOR, LIST, COMMENT]
  86. },
  87. {
  88. beginKeywords: 'infix infixl infixr', end: '$',
  89. contains: [hljs.C_NUMBER_MODE, COMMENT]
  90. },
  91. {
  92. begin: '\\bforeign\\b', end: '$',
  93. keywords: 'foreign import export ccall stdcall cplusplus jvm ' +
  94. 'dotnet safe unsafe',
  95. contains: [CONSTRUCTOR, hljs.QUOTE_STRING_MODE, COMMENT]
  96. },
  97. {
  98. className: 'meta',
  99. begin: '#!\\/usr\\/bin\\/env\ runhaskell', end: '$'
  100. },
  101. // "Whitespaces".
  102. PRAGMA,
  103. PREPROCESSOR,
  104. // Literals and names.
  105. // TODO: characters.
  106. hljs.QUOTE_STRING_MODE,
  107. hljs.C_NUMBER_MODE,
  108. CONSTRUCTOR,
  109. hljs.inherit(hljs.TITLE_MODE, {begin: '^[_a-z][\\w\']*'}),
  110. COMMENT,
  111. {begin: '->|<-'} // No markup, relevance booster
  112. ]
  113. };
  114. }
  115. module.exports = haskell;