-
Notifications
You must be signed in to change notification settings - Fork 0
/
parser.js
161 lines (139 loc) · 4.56 KB
/
parser.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
module.exports = {
parseCustomSyntax: (input) => {
const result = {
tag: null,
class: null,
id: null,
params: {},
text: null,
customCode: null,
rawHTML: null, // Added to store raw HTML content
};
// Regex to match raw HTML delimiters and other components
const rawHtmlRegex = /<!([\s\S]*?)!>/;
const rawHtmlMatch = input.match(rawHtmlRegex);
if (rawHtmlMatch) {
result.rawHTML = rawHtmlMatch[1].trim();
input = input.replace(rawHtmlRegex, "").trim();
}
const regex =
/^([a-zA-Z0-9]+)(?:\.([a-zA-Z0-9]+))?(?:#([a-zA-Z0-9]+))?(?: \(([^)]+)\))? ?([^$!]*)? ?(\$\!\{.*?\})?$/;
const match = input.match(regex);
if (match) {
result.tag = match[1];
result.class = match[2] || null;
result.id = match[3] || null;
result.customCode = match[6] || null;
if (match[4]) {
const paramsString = match[4];
const paramsArray = paramsString
.split(",")
.map((param) => param.split("="));
paramsArray.forEach(([key, value]) => {
result.params[key.trim()] = value.replace(/^"(.*)"$/, "$1");
});
}
result.text = match[5] || "";
}
return result;
},
evaluateExpression: (expression, context) => {
try {
return new Function(
...Object.keys(context),
`return ${expression}`
).apply(context, Object.values(context));
} catch (e) {
console.error(`Error evaluating expression: ${expression}`, e);
return "";
}
},
processTextWithExpressions: (text, context) => {
return text.replace(/\$\{([^}]+)\}/g, (match, expr) => {
return evaluateExpression(expr, context);
});
},
createDOMElement: (parsedObject, context) => {
if (!parsedObject.tag) {
if (parsedObject.rawHTML) {
// Create a temporary container to hold the raw HTML
const tempDiv = document.createElement("div");
tempDiv.innerHTML = parsedObject.rawHTML;
return tempDiv.firstChild; // Return the first child of the container
}
return null;
}
const element = document.createElement(parsedObject.tag);
if (parsedObject.class) {
element.className = parsedObject.class;
}
if (parsedObject.id) {
element.id = parsedObject.id;
}
for (const [key, value] of Object.entries(parsedObject.params)) {
element.setAttribute(key, value);
}
const processedText = processTextWithExpressions(
parsedObject.text,
context
);
if (processedText) {
element.appendChild(document.createTextNode(processedText));
}
if (parsedObject.customCode) {
try {
new Function(parsedObject.customCode).call(element);
} catch (e) {
console.error(
`Error executing custom code: ${parsedObject.customCode}`,
e
);
}
}
return element;
},
processMultipleLines: (input, context = {}, rootElement) => {
const lines = input.split("\n").filter((line) => line.trim() !== "");
const stack = [];
let currentParent = rootElement;
lines.forEach((line) => {
const indentation = line.match(/^\s*/)[0].length;
const parsedResult = parseCustomSyntax(line.trim());
const domElement = createDOMElement(parsedResult, context);
while (
stack.length > 0 &&
stack[stack.length - 1].indentation >= indentation
) {
stack.pop();
currentParent =
stack.length > 0 ? stack[stack.length - 1].element : rootElement;
}
if (domElement) {
currentParent.appendChild(domElement);
stack.push({ element: domElement, indentation });
currentParent = domElement;
}
});
},
cookie: (name) => {
// Construct the name of the cookie to search for
const nameEQ = name + "=";
// Split cookies string into individual cookies
const cookies = document.cookie.split(";");
// Loop through each cookie
for (let i = 0; i < cookies.length; i++) {
let cookie = cookies[i];
// Remove leading whitespace
while (cookie.charAt(0) === " ") {
cookie = cookie.substring(1);
}
// Check if the cookie starts with the desired name
if (cookie.indexOf(nameEQ) === 0) {
// Return the cookie value (after the '=')
return cookie.substring(nameEQ.length);
}
}
// Return null if the cookie is not found
return null;
},
};