Hi all, I am having some trouble with this lab.
First, here is my code:
HTML (unchanged)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Markdown to HTML Converter</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<h1>Markdown to HTML Converter</h1>
<div id="container">
<div class="container">
<h2>Markdown Input:</h2>
<textarea id="markdown-input" placeholder="Enter your markdown here..."></textarea>
</div>
<div class="container">
<h2>Raw HTML Output:</h2>
<div id="html-output"></div>
</div>
<div class="container">
<h2>HTML Preview:</h2>
<div id="preview"></div>
</div>
</div>
<script src="script.js"></script> </body>
</html>
CSS (unchanged)
* {
box-sizing: border-box;
}
body {
font-family: Arial, sans-serif;
padding: 20px;
}
#markdown-input {
width: 100%;
height: 100px;
}
#html-output, #preview {
height: 100px;
display: inline-block;
width: 100%;
border: 1px solid #ccc;
padding: 10px;
margin: auto;
white-space: pre-wrap;
background-color: #f9f9f9;
}
@media (min-width: 600px) {
#markdown-input, #html-output, #preview {
height: 200px;
margin: 0;
}
#container {
display: flex;
justify-content: space-evenly;
gap: 10px;
}
}
JS
const markdownInput = document.getElementById("markdown-input");
const previewHTML = document.getElementById("preview");
const rawHTML = document.getElementById("html-output");
const headingRegex = /^(#{1,6})\s+(.*)$/gm;
const boldTextRegex = /(\*{2}|_{2})(.*?)(\1)/gm;
const italicTextRegex = /(\*|_)(.*?)\1/gm;
const imgRegex = /[!]\[(.*?)\]\(([^)]*)\)/gm;
const linkRegex = /\[(.*?)\]\(([^)]*)\)/gm;
const quoteRegex = /^>(\s.*)/gm;
const newLine = /\n+/gm;
const regexPatterns = [
{ name: "heading", regex: headingRegex },
{ name: "bold", regex: boldTextRegex },
{ name: "italic", regex: italicTextRegex },
{ name: "img", regex: imgRegex },
{ name: "link", regex: linkRegex },
{ name: "quote", regex: quoteRegex },
{ name: "newLine", regex: newLine },
];
let raw = "";
markdownInput.addEventListener("input", updateValue);
function updateValue(e) {
raw = e.target.value;
rawHTML.textContent = raw;
previewHTML.textContent = raw;
convertMarkdown();
}
function findMatches(currentString) {
let matchedRegexPatterns = [];
for (let i = 0; i < regexPatterns.length; i++) {
regexPatterns[i].regex.lastIndex = 0;
if (regexPatterns[i].regex.test(currentString) === true) {
matchedRegexPatterns.push(regexPatterns[i]);
// console.log(`${regexPatterns[i].name} is true`)
}
}
return matchedRegexPatterns;
}
function convertMarkdown() {
let matchedRegexPatterns = findMatches(raw);
let found;
let transformedText = raw;
//heading
if (matchedRegexPatterns.find((p) => p.name === "heading")) {
found = matchedRegexPatterns.find((p) => p.name === "heading");
// console.log(`${found.name} regex is working`);
let rawMinusMarkdown1 = transformedText.replace(
found.regex,
(fullMatch, group1, group2) => {
let hCount = group1.length;
return `<h${hCount}>${group2.trim()}</h${hCount}>`;
},
);
transformedText = rawMinusMarkdown1;
}
matchedRegexPatterns = findMatches(transformedText);
//quote
if (matchedRegexPatterns.find((p) => p.name === "quote")) {
found = matchedRegexPatterns.find((p) => p.name === "quote");
// console.log(`${found.name} regex is working`);
let rawMinusMarkdown1 = transformedText.replace(
found.regex,
(fullMatch, group1) => {
return `<blockquote>${group1.trim()}</blockquote>`;
},
);
transformedText = rawMinusMarkdown1;
}
matchedRegexPatterns = findMatches(transformedText);
//bold
if (matchedRegexPatterns.find((p) => p.name === "bold")) {
found = matchedRegexPatterns.find((p) => p.name === "bold");
// console.log(`${found.name} regex is working`);
let rawMinusMarkdown1 = transformedText.replace(
found.regex,
(fullMatch, group1, group2, group3) => {
return `<strong>${group2}</strong>`;
},
);
transformedText = rawMinusMarkdown1;
}
matchedRegexPatterns = findMatches(transformedText);
//italic
if (matchedRegexPatterns.find((p) => p.name === "italic")) {
found = matchedRegexPatterns.find((p) => p.name === "italic");
// console.log(`${found.name} regex is working`);
let rawMinusMarkdown1 = transformedText.replace(
found.regex,
(fullMatch, group1, group2, group3) => {
return `<em>${group2}</em>`;
},
);
transformedText = rawMinusMarkdown1;
}
matchedRegexPatterns = findMatches(transformedText);
//img
if (matchedRegexPatterns.find((p) => p.name === "img")) {
found = matchedRegexPatterns.find((p) => p.name === "img");
// console.log(`${found.name} regex is working`);
let rawMinusMarkdown1 = transformedText.replace(
found.regex,
(fullMatch, group1, group2) => {
return `<img alt="${group1}" src="${group2}">`;
},
);
transformedText = rawMinusMarkdown1;
}
matchedRegexPatterns = findMatches(transformedText);
//link
if (matchedRegexPatterns.find((p) => p.name === "link")) {
found = matchedRegexPatterns.find((p) => p.name === "link");
// console.log(`${found.name} regex is working`);
let rawMinusMarkdown1 = transformedText.replace(
found.regex,
(fullMatch, group1, group2) => {
return `<a href="${group2}">${group1}</a>`;
},
);
transformedText = rawMinusMarkdown1;
}
matchedRegexPatterns = findMatches(transformedText);
transformedText = transformedText.replace(/\n+/gm, "");
rawHTML.textContent = transformedText;
previewHTML.innerHTML = transformedText;
}
convertMarkdown();
My issue is that my code appears to work. But some tests are not passing.
For example, I keep failing step 2 (but passing step 3):
When the value of
#markdown-input
is# title 1
,convertMarkdown()
should return<h1>title 1</h1>
.
Yet, it all looks fine on my end
Same thing is happening on steps 6, 7, 11, 12, 16 (etc.)
If anyone has any ideas where I can start troubleshooting, I would really appreciate it.