104 lines
2.8 KiB
TypeScript
104 lines
2.8 KiB
TypeScript
class Features {
|
|
public bold = true;
|
|
public breaks = true;
|
|
public code = true;
|
|
public headings = true;
|
|
public horizontalRule = true;
|
|
public italics = true;
|
|
public images = true;
|
|
public links = true;
|
|
public strikethrough = true;
|
|
}
|
|
|
|
interface Reference {
|
|
markdown: string;
|
|
}
|
|
|
|
function transformHeadings(reference: Reference): void {
|
|
reference.markdown = reference.markdown.replace(
|
|
/^# ([^\n]+)/gm,
|
|
"<h1>$1</h1>",
|
|
);
|
|
reference.markdown = reference.markdown.replace(
|
|
/^## ([^\n]+)/gm,
|
|
"<h2>$1</h2>",
|
|
);
|
|
reference.markdown = reference.markdown.replace(
|
|
/^### ([^\n]+)/gm,
|
|
"<h3>$1</h3>",
|
|
);
|
|
}
|
|
|
|
function transformHorizontalRule(reference: Reference): void {
|
|
reference.markdown = reference.markdown.replace(/^---$/gm, "<hr>");
|
|
}
|
|
|
|
function transformBold(reference: Reference): void {
|
|
reference.markdown = reference.markdown.replace(
|
|
/\*([^\*]+)\*/gm,
|
|
"<strong>$1</strong>",
|
|
);
|
|
}
|
|
|
|
function transformItalics(reference: Reference): void {
|
|
reference.markdown = reference.markdown.replace(/_([^_]+)_/gm, "<em>$1</em>");
|
|
}
|
|
|
|
function transformStrikethrough(reference: Reference): void {
|
|
reference.markdown = reference.markdown.replace(/~([^~]+)~/gm, "<s>$1</s>");
|
|
}
|
|
|
|
function transformCode(reference: Reference): void {
|
|
reference.markdown = reference.markdown.replace(
|
|
/```\n([^`]+)\n```/gm,
|
|
"<pre><code>$1</code></pre>",
|
|
);
|
|
reference.markdown = reference.markdown.replace(
|
|
/```([^`]+)```/gm,
|
|
"<code>$1</code>",
|
|
);
|
|
}
|
|
|
|
function transformImages(reference: Reference): void {
|
|
reference.markdown = reference.markdown.replace(
|
|
/!\[([^\]]+)\]\(([^\)]+)\)/g,
|
|
'<img src="$2" alt="$1">',
|
|
);
|
|
}
|
|
|
|
function transformLinks(reference: Reference): void {
|
|
reference.markdown = reference.markdown.replace(
|
|
/\[([^\]]+)\]\(([^\)]+)\)/g,
|
|
'<a href="$2">$1</a>',
|
|
);
|
|
}
|
|
|
|
function transformBreaks(reference: Reference): void {
|
|
reference.markdown = reference.markdown.replace(/\s\s\n/g, "<br>");
|
|
reference.markdown = reference.markdown.replace(/\n\n/g, "<br>");
|
|
}
|
|
|
|
/**
|
|
* Parse markdown into HTML.
|
|
* @param markdown The markdown string.
|
|
* @param features _(Optional)_ A record of features to enable/disable.
|
|
* @returns The parsed HTML string.
|
|
*/
|
|
export function markdownParse(
|
|
markdown: string,
|
|
features: Partial<Features> = new Features(),
|
|
): string {
|
|
const reference: Reference = { markdown };
|
|
|
|
if (features.headings) transformHeadings(reference);
|
|
if (features.horizontalRule) transformHorizontalRule(reference);
|
|
if (features.bold) transformBold(reference);
|
|
if (features.italics) transformItalics(reference);
|
|
if (features.strikethrough) transformStrikethrough(reference);
|
|
if (features.code) transformCode(reference);
|
|
if (features.images) transformImages(reference);
|
|
if (features.links) transformLinks(reference);
|
|
if (features.breaks) transformBreaks(reference);
|
|
|
|
return reference.markdown;
|
|
}
|