src/components/atoms/CodeBox/parser.ts   A
last analyzed

Complexity

Total Complexity 4
Complexity/F 0

Size

Lines of Code 94
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 4
eloc 65
mnd 4
bc 4
fnc 0
dl 0
loc 94
ccs 23
cts 23
cp 1
rs 10
bpm 0
cpm 0
noi 0
c 0
b 0
f 0
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