irongit

A better version of regex 101

moonregex/src/builder.js
63 lines1.7 KBJavaScript
1export const readVars = (str) => {
2 let lines = str.split("\n");
3 const vars = {};
4 for (let i = 0; i < lines.length; i++) {
5 let line = lines[i];
6 let lineSplit = line.split(":==");
7 if ((lineSplit.length = 2)) {
8 let [name, val] = lineSplit;
9 vars[name] = val;
10 }
11 }
12 return vars;
13};
14
15const parseBuilder = (str, vars) => {
16 let lines = str.split("\n");
17 const ref = {};
18 for (let line of lines) {
19 if (!line.trim()) continue;
20 const r =
21 /^(?<tabs>\s*)(?<name>\w*)(?<optional>[\*\+\?]*)(?<type>[:>])(?<regex>.*)/.exec(
22 line
23 );
24 if (!r) return "";
25 const lineData = r.groups;
26 console.log(lineData);
27 const tabs = lineData.tabs.length;
28 if (!ref[tabs]) ref[tabs] = [lineData];
29 else ref[tabs].push(lineData);
30 if (tabs) {
31 const parentRefInd = ref[tabs - 1].length - 1;
32 let parent = ref[tabs - 1][parentRefInd];
33 if (!parent.children) parent.children = [lineData];
34 else parent.children.push(lineData);
35 }
36 }
37 return buildToRegex(ref[0], vars);
38};
39
40const buildToRegex = (build, vars) => {
41 const re = buildToRegexRecursion(build, "", vars);
42 return re;
43};
44
45const buildToRegexRecursion = (build, re, vars) => {
46 if (!build?.length) return re;
47 const val = build.shift();
48 console.log(vars);
49 if (Object.keys(vars).includes(val.regex)) val.regex = vars[val.regex];
50 if (val.type === ":") {
51 if (val.name) re += `(?P<${val.name}>${val.regex}`;
52 else re += `(?:${val.regex}`;
53 if (val.children) re += buildToRegexRecursion(val.children, "");
54 re += `)${val.optional}`;
55 } else if (val.type === ">") {
56 re += val.regex;
57 if (val.children) re += buildToRegexRecursion(val.children, "");
58 }
59
60 return buildToRegexRecursion(build, re);
61};
62
63export default parseBuilder;