From a4d84e6c84b242f17e4bbb879cc2d61a2f73747b Mon Sep 17 00:00:00 2001 From: Cynthia Foxwell Date: Sat, 7 May 2022 17:42:22 -0600 Subject: [PATCH] codePreviews: impl gitlab and gitea support --- src/modules/codePreviews.js | 122 ++++++++++++++++++++---------------- 1 file changed, 68 insertions(+), 54 deletions(-) diff --git a/src/modules/codePreviews.js b/src/modules/codePreviews.js index bca4807..971bbb8 100644 --- a/src/modules/codePreviews.js +++ b/src/modules/codePreviews.js @@ -19,6 +19,63 @@ function unindent(str) { return str.replace(new RegExp(`^ {${minIndent}}`, "gm"), ""); } +async function processFile(link) { + const file = await fetch(link).then((res) => res.text()); + const lines = file.replace(/\r/g, "").split("\n"); + + const fileName = link.substring( + link.lastIndexOf("/") + 1, + link.indexOf("#") == -1 ? link.length : link.indexOf("#") + ); + const fileType = + fileName.indexOf(".") == -1 + ? "" + : fileName.substring(fileName.indexOf(".") + 1); + + const lineStr = link.match(/#L\d+(-L?\d+)?/)?.[0]; + let startLine, endLine; + let entireFile = false; + + if (lineStr) { + const [start, end] = link.match(/\d+/g); + if (!end) { + startLine = endLine = start; + } else { + startLine = start; + endLine = end; + } + } else { + entireFile = true; + startLine = 1; + endLine = lines.length; + } + + const whichLines = entireFile + ? "" + : startLine == endLine + ? "Line " + startLine + : "Lines " + startLine + "-" + endLine; + + startLine--; + endLine--; + + const targetLines = ( + entireFile ? lines : lines.slice(startLine, endLine + 1) + ).join("\n"); + + return ( + "**" + + fileName + + ": **" + + whichLines + + "\n```" + + fileType + + "\n" + + unindent(targetLines) + + "\n```\n" + ); +} + events.add("messageCreate", "codePreviews", async function (msg) { if (!msg.guildID) return; if (!hasFlag(msg.guildID, "codePreviews")) return; @@ -31,62 +88,19 @@ events.add("messageCreate", "codePreviews", async function (msg) { if (githubLinks?.length) { for (const link of githubLinks) { - const rawLink = link.replace("/blob/", "/raw/"); - const file = await fetch(rawLink).then((res) => res.text()); - const lines = file.replace(/\r/g, "").split("\n"); + out += await processFile(link.replace("/blob/", "/raw/")); + } + } - const fileName = link.substring( - link.lastIndexOf("/") + 1, - link.indexOf("#") == -1 ? link.length : link.indexOf("#") - ); - const fileType = - fileName.indexOf(".") == -1 - ? "" - : fileName.substring(fileName.indexOf(".") + 1); + if (gitlabLinks?.length) { + for (const link of gitlabLinks) { + out += await processFile(link.replace("/blob/", "/raw/")); + } + } - const lineStr = link.match(/#L\d+(-L\d+)?/)?.[0]; - let startLine, endLine; - let entireFile = false; - - if (lineStr) { - let [start, end] = link.match(/L\d+/g); - start = parseInt(start.replace("L", "")); - if (!end) { - startLine = endLine = start; - } else { - end = parseInt(end.replace("L", "")); - startLine = start; - endLine = end; - } - } else { - entireFile = true; - startLine = 1; - endLine = lines.length; - } - - const whichLines = entireFile - ? "" - : startLine == endLine - ? "Line " + startLine - : "Lines " + startLine + "-" + endLine; - - startLine--; - endLine--; - - const targetLines = ( - entireFile ? lines : lines.slice(startLine, endLine + 1) - ).join("\n"); - - out += - "**" + - fileName + - ": **" + - whichLines + - "\n```" + - fileType + - "\n" + - unindent(targetLines) + - "\n```\n"; + if (giteaLinks?.length) { + for (const link of giteaLinks) { + out += await processFile(link.replace("/src/", "/raw/")); } }