1
|
1 |
|
import { CODE_LANGUAGES } from "./languages"; |
2
|
|
|
import { CodeBlock, SupportedEnvironment } from "./types"; |
3
|
|
|
|
4
|
|
|
/** Basic code parsers */ |
5
|
1 |
|
const BASIC_PARSER = ( |
6
|
|
|
code: string, |
7
|
|
|
handleOtherElements: ((code: string) => CodeBlock[]) | null |
8
|
|
|
) => { |
9
|
2 |
|
const parsedCode: { code: string; color: string | null }[] = []; |
10
|
2 |
|
code.split(/(\'.+?\')/g).forEach((codeBlock, codeIndex) => { |
11
|
4 |
|
if (codeIndex % 2 !== 0) { |
12
|
1 |
|
parsedCode.push({ |
13
|
|
|
code: codeBlock, |
14
|
|
|
color: CODE_LANGUAGES.common.STRING, |
15
|
|
|
}); |
16
|
|
|
} else { |
17
|
3 |
|
codeBlock.split(/(\".+?\")/g).forEach((codeMicroPart, index) => { |
18
|
5 |
|
if (index % 2 !== 0) { |
19
|
1 |
|
parsedCode.push({ |
20
|
|
|
code: codeMicroPart, |
21
|
|
|
color: CODE_LANGUAGES.common.STRING, |
22
|
|
|
}); |
23
|
|
|
} else { |
24
|
|
|
/* istanbul ignore next */ |
25
|
|
|
if (handleOtherElements) { |
26
|
|
|
handleOtherElements(codeMicroPart).forEach((element) => |
27
|
|
|
parsedCode.push(element) |
28
|
|
|
); |
29
|
|
|
} else { |
30
|
|
|
parsedCode.push({ |
31
|
|
|
code: codeMicroPart, |
32
|
|
|
color: null, |
33
|
|
|
}); |
34
|
|
|
} |
35
|
|
|
} |
36
|
|
|
}); |
37
|
|
|
} |
38
|
|
|
}); |
39
|
|
|
|
40
|
2 |
|
return parsedCode; |
41
|
|
|
}; |
42
|
|
|
|
43
|
|
|
const PARSERS: Record< |
44
|
|
|
SupportedEnvironment, |
45
|
|
|
((code: string) => CodeBlock[]) | null |
46
|
1 |
|
> = { |
47
|
|
|
javascript: null, |
48
|
|
|
common: null, |
49
|
|
|
python: null, |
50
|
|
|
terminal: null, |
51
|
|
|
}; |
52
|
|
|
|
53
|
1 |
|
const getHighlightedCode = ( |
54
|
|
|
code: CodeBlock[], |
55
|
|
|
environment: SupportedEnvironment |
56
|
|
|
) => { |
57
|
2 |
|
let actualEnv = environment; |
58
|
2 |
|
let splittedCode: CodeBlock<string>[] = []; |
59
|
2 |
|
code |
60
|
6 |
|
.filter((part) => part.code.length > 0) |
61
|
|
|
.forEach((codeBlock) => { |
62
|
4 |
|
if (!codeBlock.color) { |
63
|
2 |
|
codeBlock.code.split(" ").forEach((subCodeBlock) => { |
64
|
10 |
|
splittedCode.push({ |
65
|
|
|
color: |
66
|
|
|
CODE_LANGUAGES[actualEnv][subCodeBlock] || |
67
|
|
|
CODE_LANGUAGES.common[subCodeBlock] || |
68
|
|
|
CODE_LANGUAGES.common.DEFAULT_VALUE, |
69
|
|
|
code: `${subCodeBlock} `, |
70
|
|
|
}); |
71
|
|
|
}); |
72
|
|
|
} else { |
73
|
2 |
|
splittedCode.push(codeBlock); |
74
|
|
|
} |
75
|
|
|
}); |
76
|
2 |
|
return splittedCode; |
77
|
|
|
}; |
78
|
|
|
|
79
|
|
|
/** Parse the given code, and return it splitted into multiple code blocks, with specific highlight color for each block |
80
|
|
|
* |
81
|
|
|
* @param code code to parse |
82
|
|
|
* @param environment selected environment, the highlight colors are based on it (default to `terminal`) |
83
|
|
|
* |
84
|
|
|
* @author Cataldo Cianciaruso <https://github.com/CianciarusoCataldo> |
85
|
|
|
* |
86
|
|
|
* @copyright 2022 Cataldo Cianciaruso |
87
|
|
|
*/ |
88
|
1 |
|
export const parseCode = (code: string, environment: SupportedEnvironment) => { |
89
|
2 |
|
return getHighlightedCode( |
90
|
|
|
BASIC_PARSER(code, PARSERS[environment]), |
91
|
|
|
environment |
92
|
|
|
); |
93
|
|
|
}; |
94
|
|
|
|