Diff
diff --git a/docs/plugins/mermaid.js b/docs/plugins/mermaid.js
index 8dd63e6..78c5765 100644
--- a/docs/plugins/mermaid.js
+++ b/docs/plugins/mermaid.js
@@ -1,2 +1,2 @@
-import { parseCodeText } from "./parser.js";
-import { DOM, Fmt, style } from "./html.js";
+function parseCodeText(codeText) {
+ const language = detectLanguage(codeText);
@@ -4,7 +4,106 @@ import { DOM, Fmt, style } from "./html.js";
-let blockquote = DOM("blockquote");
-let p = DOM("p");
-let table = DOM("table");
-let thead = DOM("thead");
-let tr = DOM("tr");
-let th = DOM("th");
-let td = DOM("td");
+ switch (language) {
+ case "javascript":
+ return {
+ language: "javascript",
+ functions: parseJavaScriptFunctions(codeText),
+ };
+ case "python":
+ return { language: "python", functions: parsePythonFunctions(codeText) };
+ case "go":
+ return { language: "go", functions: parseGoFunctions(codeText) };
+ case "rust":
+ return { language: "rust", functions: parseRustFunctions(codeText) };
+ default:
+ return { language: "unknown", functions: [] };
+ }
+}
+
+function detectLanguage(codeText) {
+ // For simplicity, let's assume we have some predefined patterns for each language
+ if (/function/.test(codeText)) {
+ return "javascript";
+ } else if (/def\s+\w+\(.*\):/.test(codeText)) {
+ return "python";
+ } else if (/func\s+\w+\(.*\)/.test(codeText)) {
+ return "go";
+ } else if (/fn\s+\w+\(.*\)/.test(codeText)) {
+ return "rust";
+ } else {
+ return "unknown";
+ }
+}
+function parseGoFunctions(code) {
+ const functionRegex = /func\s*(?:\(([^)]*)\))?\s*(\w+)\(([^)]*)\)([^{]*)\{/g;
+ let functions = [];
+ let match;
+
+ while ((match = functionRegex.exec(code)) !== null) {
+ let name = match[2];
+ let parameters = match[3].split(",").map((param) => param.trim());
+ if (match[1]) {
+ parameters.unshift(match[1]);
+ }
+ for (let i = 0; i < parameters.length; i++) {
+ const element = parameters[i].split(" ");
+ parameters[i] = {
+ name: element[0],
+ type: element[1],
+ };
+ }
+ let ret = match[4].trim();
+ functions.push({ name, parameters, return: ret, definition: match[0] });
+ }
+
+ return functions;
+}
+
+function parseJavaScriptFunctions(code) {
+ const functionRegex = /(?:function\s+)?(\w+)\s*\((.*?)\)\s*{/g;
+ let functions = [];
+ let match;
+
+ while ((match = functionRegex.exec(code)) !== null) {
+ let name = match[1];
+ let parameters = match[2].split(",").map((param) => param.trim());
+ functions.push({ name, parameters, definition: match[0] });
+ }
+
+ return functions;
+}
+
+function parsePythonFunctions(code) {
+ const functionRegex = /def\s+(\w+)\((.*?)\):/g;
+ let functions = [];
+ let match;
+
+ while ((match = functionRegex.exec(code)) !== null) {
+ let name = match[1];
+ let parameters = match[2].split(",").map((param) => param.trim());
+ functions.push({ name, parameters, definition: match[0] });
+ }
+
+ return functions;
+}
+
+function parseRustFunctions(code) {
+ const functionRegex = /fn\s+(\w+)\((.*?)\)\s*(?:->\s*(\w+))?/g;
+ let functions = [];
+ let match;
+
+ while ((match = functionRegex.exec(code)) !== null) {
+ let name = match[1];
+ let parameters = match[2].split(",").map((param) => {
+ const parts = param.trim().split(":");
+ return { name: parts[0], type: parts[1] ? parts[1].trim() : null };
+ });
+ let returnType = match[3] ? match[3].trim() : null;
+ functions.push({
+ name,
+ parameters,
+ return: returnType,
+ definition: match[0],
+ });
+ }
+
+ return functions;
+}
@@ -13 +112 @@ let td = DOM("td");
- let code = document.querySelectorAll("pre code");
+ let code = document.querySelectorAll("pre code");
@@ -15 +114 @@ let td = DOM("td");
- let functions = {};
+ let functions = {};
@@ -17,6 +116,4 @@ let td = DOM("td");
- for (let i = 0; i < code.length; i++) {
- let res = parseCodeText(code[i].innerText);
- if (functions[res.language] == undefined) {
- functions[res.language] = [];
- }
- functions[res.language].push(...res.functions);
+ for (let i = 0; i < code.length; i++) {
+ let res = parseCodeText(code[i].innerText);
+ if (functions[res.language] == undefined) {
+ functions[res.language] = [];
@@ -23,0 +121,71 @@ let td = DOM("td");
+ functions[res.language].push(...res.functions);
+ }
+
+ let hs = document.querySelectorAll("h1,h2,h3,h4,h5,h6");
+
+ let tagMatch = /\w+\?\((\w+)\)/;
+
+ for (let i = 0; i < hs.length; i++) {
+ const element = hs[i];
+ if (tagMatch.test(element.innerText)) {
+ let match = tagMatch.exec(element.innerText);
+ let name = match[0].slice(0, match[0].indexOf("?"));
+ let lang = match[1];
+ element.innerHTML = element.innerHTML.slice(
+ 0,
+ element.innerHTML.indexOf("?")
+ );
+
+ let func = functions[lang].filter((e) => {
+ return e.name == name;
+ })[0];
+
+ // Inject blockquote
+
+ let bq = document.createElement("blockquote");
+ let p = document.createElement("p");
+ p.innerText = func.definition;
+ bq.appendChild(p);
+ element.parentElement.insertBefore(bq, element);
+
+ let table = document.createElement("table");
+ let head = document.createElement("thead");
+
+ let headtr = document.createElement("tr");
+ let th1 = document.createElement("th");
+ th1.innerHTML = "Name";
+ headtr.appendChild(th1);
+ let th2 = document.createElement("th");
+ th2.innerHTML = "Type";
+ headtr.appendChild(th2);
+
+ head.appendChild(headtr);
+
+ table.appendChild(head);
+
+ let body = document.createElement("tbody");
+
+ for (let i = 0; i < func.parameters.length; i++) {
+ const element = func.parameters[i];
+ let bodytr = document.createElement("tr");
+ let th1 = document.createElement("td");
+ th1.innerHTML = element.name;
+ bodytr.appendChild(th1);
+ let th2 = document.createElement("td");
+ th2.innerHTML = element.type;
+ bodytr.appendChild(th2);
+
+ body.appendChild(bodytr);
+ }
+
+ let bodytr = document.createElement("tr");
+ th1 = document.createElement("th");
+ th1.innerHTML = "return";
+ bodytr.appendChild(th1);
+ th2 = document.createElement("th");
+ th2.innerHTML = func.return;
+ bodytr.appendChild(th2);
+
+ body.appendChild(bodytr);
+
+ table.appendChild(body);
@@ -25,49 +193 @@ let td = DOM("td");
- let hs = document.querySelectorAll("h1,h2,h3,h4,h5,h6");
-
- let tagMatch = /\w+\?\((\w+)\)/;
-
- for (let i = 0; i < hs.length; i++) {
- const element = hs[i];
- if (tagMatch.test(element.innerText)) {
- let match = tagMatch.exec(element.innerText);
- let name = match[0].slice(0, match[0].indexOf("?"));
- let lang = match[1];
- element.innerHTML = element.innerHTML.slice(
- 0,
- element.innerHTML.indexOf("?")
- );
-
- let func = functions[lang].filter((e) => {
- return e.name == name;
- })[0];
-
- // Inject blockquote
-
- let bq = Fmt`${blockquote``}
- ${p`innerText="${func.definition}"`}`;
- element.parentElement.insertBefore(bq, element);
-
- let body = document.createElement("tbody");
-
- for (let i = 0; i < func.parameters.length; i++) {
- const element = func.parameters[i];
- body.appendChild(Fmt`${tr``}
- ${td`innerHTML="${element.name}"`}
- ${td`innerHTML="${element.type}"`}
- `);
- }
-
- body.appendChild(Fmt`${tr``}
- ${td`innerHTML="return"`}
- ${td`innerHTML="${func.return}"`}
- `);
-
- let t = Fmt`${table``}
- ${thead``}
- ${tr``}
- ${th`innerHTML="Name"`}
- ${th`innerHTML="Type"`}
- ${body}`;
-
- element.insertAdjacentElement("afterend", t);
- }
+ element.insertAdjacentElement("afterend", table);
@@ -74,0 +195 @@ let td = DOM("td");
+ }