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 |
|
---|
9 | function haskell(hljs) {
|
---|
10 | const COMMENT = {
|
---|
11 | variants: [
|
---|
12 | hljs.COMMENT('--', '$'),
|
---|
13 | hljs.COMMENT(
|
---|
14 | /\{-/,
|
---|
15 | /-\}/,
|
---|
16 | {
|
---|
17 | contains: ['self']
|
---|
18 | }
|
---|
19 | )
|
---|
20 | ]
|
---|
21 | };
|
---|
22 |
|
---|
23 | const PRAGMA = {
|
---|
24 | className: 'meta',
|
---|
25 | begin: /\{-#/,
|
---|
26 | end: /#-\}/
|
---|
27 | };
|
---|
28 |
|
---|
29 | const PREPROCESSOR = {
|
---|
30 | className: 'meta',
|
---|
31 | begin: '^#',
|
---|
32 | end: '$'
|
---|
33 | };
|
---|
34 |
|
---|
35 | const CONSTRUCTOR = {
|
---|
36 | className: 'type',
|
---|
37 | begin: '\\b[A-Z][\\w\']*', // TODO: other constructors (build-in, infix).
|
---|
38 | relevance: 0
|
---|
39 | };
|
---|
40 |
|
---|
41 | const LIST = {
|
---|
42 | begin: '\\(',
|
---|
43 | end: '\\)',
|
---|
44 | illegal: '"',
|
---|
45 | contains: [
|
---|
46 | PRAGMA,
|
---|
47 | PREPROCESSOR,
|
---|
48 | {
|
---|
49 | className: 'type',
|
---|
50 | begin: '\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?'
|
---|
51 | },
|
---|
52 | hljs.inherit(hljs.TITLE_MODE, {
|
---|
53 | begin: '[_a-z][\\w\']*'
|
---|
54 | }),
|
---|
55 | COMMENT
|
---|
56 | ]
|
---|
57 | };
|
---|
58 |
|
---|
59 | const RECORD = {
|
---|
60 | begin: /\{/,
|
---|
61 | end: /\}/,
|
---|
62 | contains: LIST.contains
|
---|
63 | };
|
---|
64 |
|
---|
65 | return {
|
---|
66 | name: 'Haskell',
|
---|
67 | aliases: ['hs'],
|
---|
68 | keywords:
|
---|
69 | 'let in if then else case of where do module import hiding ' +
|
---|
70 | 'qualified type data newtype deriving class instance as default ' +
|
---|
71 | 'infix infixl infixr foreign export ccall stdcall cplusplus ' +
|
---|
72 | 'jvm dotnet safe unsafe family forall mdo proc rec',
|
---|
73 | contains: [
|
---|
74 | // Top-level constructions.
|
---|
75 | {
|
---|
76 | beginKeywords: 'module',
|
---|
77 | end: 'where',
|
---|
78 | keywords: 'module where',
|
---|
79 | contains: [
|
---|
80 | LIST,
|
---|
81 | COMMENT
|
---|
82 | ],
|
---|
83 | illegal: '\\W\\.|;'
|
---|
84 | },
|
---|
85 | {
|
---|
86 | begin: '\\bimport\\b',
|
---|
87 | end: '$',
|
---|
88 | keywords: 'import qualified as hiding',
|
---|
89 | contains: [
|
---|
90 | LIST,
|
---|
91 | COMMENT
|
---|
92 | ],
|
---|
93 | illegal: '\\W\\.|;'
|
---|
94 | },
|
---|
95 | {
|
---|
96 | className: 'class',
|
---|
97 | begin: '^(\\s*)?(class|instance)\\b',
|
---|
98 | end: 'where',
|
---|
99 | keywords: 'class family instance where',
|
---|
100 | contains: [
|
---|
101 | CONSTRUCTOR,
|
---|
102 | LIST,
|
---|
103 | COMMENT
|
---|
104 | ]
|
---|
105 | },
|
---|
106 | {
|
---|
107 | className: 'class',
|
---|
108 | begin: '\\b(data|(new)?type)\\b',
|
---|
109 | end: '$',
|
---|
110 | keywords: 'data family type newtype deriving',
|
---|
111 | contains: [
|
---|
112 | PRAGMA,
|
---|
113 | CONSTRUCTOR,
|
---|
114 | LIST,
|
---|
115 | RECORD,
|
---|
116 | COMMENT
|
---|
117 | ]
|
---|
118 | },
|
---|
119 | {
|
---|
120 | beginKeywords: 'default',
|
---|
121 | end: '$',
|
---|
122 | contains: [
|
---|
123 | CONSTRUCTOR,
|
---|
124 | LIST,
|
---|
125 | COMMENT
|
---|
126 | ]
|
---|
127 | },
|
---|
128 | {
|
---|
129 | beginKeywords: 'infix infixl infixr',
|
---|
130 | end: '$',
|
---|
131 | contains: [
|
---|
132 | hljs.C_NUMBER_MODE,
|
---|
133 | COMMENT
|
---|
134 | ]
|
---|
135 | },
|
---|
136 | {
|
---|
137 | begin: '\\bforeign\\b',
|
---|
138 | end: '$',
|
---|
139 | keywords: 'foreign import export ccall stdcall cplusplus jvm ' +
|
---|
140 | 'dotnet safe unsafe',
|
---|
141 | contains: [
|
---|
142 | CONSTRUCTOR,
|
---|
143 | hljs.QUOTE_STRING_MODE,
|
---|
144 | COMMENT
|
---|
145 | ]
|
---|
146 | },
|
---|
147 | {
|
---|
148 | className: 'meta',
|
---|
149 | begin: '#!\\/usr\\/bin\\/env\ runhaskell',
|
---|
150 | end: '$'
|
---|
151 | },
|
---|
152 | // "Whitespaces".
|
---|
153 | PRAGMA,
|
---|
154 | PREPROCESSOR,
|
---|
155 |
|
---|
156 | // Literals and names.
|
---|
157 |
|
---|
158 | // TODO: characters.
|
---|
159 | hljs.QUOTE_STRING_MODE,
|
---|
160 | hljs.C_NUMBER_MODE,
|
---|
161 | CONSTRUCTOR,
|
---|
162 | hljs.inherit(hljs.TITLE_MODE, {
|
---|
163 | begin: '^[_a-z][\\w\']*'
|
---|
164 | }),
|
---|
165 | COMMENT,
|
---|
166 | { // No markup, relevance booster
|
---|
167 | begin: '->|<-'
|
---|
168 | }
|
---|
169 | ]
|
---|
170 | };
|
---|
171 | }
|
---|
172 |
|
---|
173 | module.exports = haskell;
|
---|