Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
124 changes: 114 additions & 10 deletions scripts/background.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,86 @@ import {
extractRepoNameAndDirectoryName,
} from "./helperFunctions.js";

const languageCommentDelimiters = {
agda: { line: "--" },
bf: { line: null },
c: { line: "//" },
cfml: { blockStart: "<!---", blockEnd: "--->" },
cpp: { line: "//" },
cobol: { line: "*" },
coffeescript: { line: "#" },
clojure: { line: ";;" },
commonlisp: { line: ";;" },
coq: { blockStart: "(*", blockEnd: "*)" },
crystal: { line: "#" },
"c#": { line: "//" },
d: { line: "//" },
dart: { line: "//" },
elixir: { line: "#" },
elm: { line: "--" },
erlang: { line: "%" },
factor: { line: "!" },
forth: { line: "\\" },
fortran: { line: "!" },
fsharp: { line: "//" },
go: { line: "//" },
groovy: { line: "//" },
haskell: { line: "--" },
haxe: { line: "//" },
idris: { line: "--" },
java: { line: "//" },
javascript: { line: "//" },
julia: { line: "#" },
kotlin: { line: "//" },
lambdacalc: { line: null },
lean: { line: "--" },
lua: { line: "--" },
nasm: { line: ";" },
nim: { line: "#" },
objc: { line: "//" },
ocaml: { blockStart: "(*", blockEnd: "*)" },
pascal: { blockStart: "{", blockEnd: "}" },
perl: { line: "#" },
php: { line: "//" },
powershell: { line: "#" },
prolog: { line: "%" },
purescript: { line: "--" },
python: { line: "#" },
r: { line: "#" },
reason: { blockStart: "/*", blockEnd: "*/" },
racket: { line: ";" },
raku: { line: "#" },
riscv: { line: "#" },
ruby: { line: "#" },
rust: { line: "//" },
scala: { line: "//" },
solidity: { line: "//" },
shell: { line: "#" },
sql: { line: "--" },
swift: { line: "//" },
typescript: { line: "//" },
vb: { line: "'" },
};

const makeCommentHeader = (language, kataUrl, solutionUrl) => {
const delimiters = languageCommentDelimiters[language] || { line: "#" };
const lines = [`Kata: ${kataUrl}`, `My solution: ${solutionUrl}`];
if (delimiters.line) {
return `${lines.map((line) => `${delimiters.line} ${line}`).join("\n")}\n\n`;
}
if (delimiters.blockStart && delimiters.blockEnd) {
return `${delimiters.blockStart}\n${lines.join("\n")}\n${delimiters.blockEnd}\n\n`;
}
return "";
};

const getSolutionPath = (folderStructure, rank, language, directoryName, fileName) => {
if (folderStructure === "language-problem") return `${language}/${directoryName}/${fileName}`;
if (folderStructure === "language-level-problem") return `${language}/${rank}/${directoryName}/${fileName}`;
if (folderStructure === "level-language-problem") return `${rank}/${language}/${directoryName}/${fileName}`;
return `${rank}/${directoryName}/${fileName}`;
};

chrome.runtime.onInstalled.addListener(({ reason }) => {
if (reason === "install") {
chrome.tabs.create({
Expand All @@ -23,6 +103,7 @@ chrome.runtime.onInstalled.addListener(({ reason }) => {
isUserAuthenticated: false,
isRepoConnected: false,
folderStructure: "level-problem-language",
addReadmeFile: true,
});
}
chrome.runtime.setUninstallURL(
Expand All @@ -48,7 +129,7 @@ chrome.runtime.onMessage.addListener(async (request, sender, sendResponse) => {
chrome.tabs.onUpdated.addListener(onTabUpdate);
}

if (request.action === "connectExistingRepo") {
if (request.action === "connectExistingRepo") {
const { userInput } = request;
if (userInput.length === 0 || userInput.length > 100) {
chrome.runtime.sendMessage({
Expand Down Expand Up @@ -178,20 +259,43 @@ chrome.runtime.onMessage.addListener(async (request, sender, sendResponse) => {
description,
rank,
} = request.codewarsData;
const { folderStructure = "level-problem-language", addReadmeFile = true } = await chrome.storage.local.get(["folderStructure", "addReadmeFile"]);
const fileExtension = supportedFileExtensions[languageOfUserSolution];
const fileName = directoryName + fileExtension;
const encodedSolution = btoa(unescape(encodeURIComponent(userSolution)));
const encodedReadMe = btoa(unescape(encodeURIComponent(description)));
await addReadme(
githubUsername,
repo,
directory,
const fileName =
folderStructure === "language-problem"
? `mysolution${fileExtension}`
: directoryName + fileExtension;
const solutionPath = getSolutionPath(
folderStructure,
rank,
languageOfUserSolution,
directoryName,
fileName
);
const solutionUrl = `https://github.com/${githubUsername}/${repo}/blob/main/${
directory ? `${directory}/` : ""
}${solutionPath}`;
const commentHeader = makeCommentHeader(
languageOfUserSolution,
encodedReadMe,
accessToken
request.codewarsData.kataUrl,
solutionUrl
);
const encodedSolution = btoa(
unescape(encodeURIComponent(`${commentHeader}${userSolution}`))
);
const encodedReadMe = btoa(unescape(encodeURIComponent(description)));
if (addReadmeFile) {
await addReadme(
githubUsername,
repo,
directory,
rank,
directoryName,
languageOfUserSolution,
encodedReadMe,
accessToken
);
}
await addOrUpdateSolution(
githubUsername,
repo,
Expand Down
1 change: 1 addition & 0 deletions scripts/codewars.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ chrome.storage.local.get(["isRepoConnected"], (result) => {
data["name"] = nameOfChallenge;
data["description"] = `${descriptionHeader}${parsedDescription}`;
data["directoryName"] = json["slug"];
data["kataUrl"] = url;
} catch (e) {
console.log("Error! Unable to get description and rank: ", e);
}
Expand Down
9 changes: 6 additions & 3 deletions scripts/codewarsToGithub.js
Original file line number Diff line number Diff line change
Expand Up @@ -125,11 +125,14 @@ const getUrl = (
directory ? directory + "/" : ""
}`;

if (folderStructure === "level-problem-language") {
if (folderStructure === "language-problem") {
return (
url + `${rank}/${directoryName}/${isReadmeFile ? "README.md" : fileName}`
url +
`${languageOfUserSolution}/${directoryName}/${
isReadmeFile ? "README.md" : fileName
}`
);
} else if (folderStructure === "language-level-problem") {
} else if (folderStructure === "level-problem-language") {
return (
url +
`${languageOfUserSolution}/${rank}/${directoryName}/${
Expand Down
6 changes: 4 additions & 2 deletions scripts/welcome.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,18 @@ const settingsIcon = document.querySelector("#settings-icon");
const settingsModal = document.querySelector("#settings-modal");
const saveSettingsBtn = document.querySelector("#save-settings-btn");
const closeModal = document.querySelector(".close");
const addReadmeFileCheckbox = document.querySelector("#add-readme-file");

document.addEventListener("DOMContentLoaded", () => {
chrome.storage.local.get("folderStructure", (result) => {
chrome.storage.local.get(["folderStructure", "addReadmeFile"], (result) => {
const saved = result.folderStructure || "level-problem-language";
const radio = document.querySelector(
`input[name="folder-structure"][value="${saved}"]`
);
if (radio) {
radio.checked = true;
}
addReadmeFileCheckbox.checked = result.addReadmeFile !== false;
});

const params = new URLSearchParams(window.location.search);
Expand Down Expand Up @@ -56,7 +58,7 @@ saveSettingsBtn.addEventListener("click", () => {
const selected = document.querySelector(
'input[name="folder-structure"]:checked'
).value;
chrome.storage.local.set({ folderStructure: selected }, () => {
chrome.storage.local.set({ folderStructure: selected, addReadmeFile: addReadmeFileCheckbox.checked }, () => {
settingsModal.style.display = "none";
removeOpenSettingsParam();
});
Expand Down
17 changes: 17 additions & 0 deletions welcome.html
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,12 @@ <h3>Folder Structure Organization</h3>
Choose how you want CodeHub to organize your solutions in your
GitHub repository:
</p>
<div class="folder-option">
<input type="checkbox" id="add-readme-file" checked />
<label for="add-readme-file">
<strong>Create README.md for each kata</strong>
</label>
</div>
<div class="folder-option">
<input
type="radio"
Expand Down Expand Up @@ -183,6 +189,17 @@ <h3>Folder Structure Organization</h3>
</div>
</label>
</div>
<div class="folder-option">
<input
type="radio"
id="language-problem"
name="folder-structure"
value="language-problem"
/>
<label for="language-problem">
<strong>Language → Problem → mysolution.ext</strong>
</label>
</div>
</div>
<div class="modal-footer">
<button id="save-settings-btn">Save Settings</button>
Expand Down