From 70ca3fef77ee8bdc6e3ac28589a6fa08c024cc69 Mon Sep 17 00:00:00 2001 From: AlexanderCurl Date: Sat, 18 Apr 2026 17:46:06 +0100 Subject: Replaced file structures for themes in the correct format --- .../quickshell/Common/markdown2html.js | 117 +++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/Common/markdown2html.js (limited to 'raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/Common/markdown2html.js') diff --git a/raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/Common/markdown2html.js b/raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/Common/markdown2html.js new file mode 100644 index 0000000..04a9b52 --- /dev/null +++ b/raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/Common/markdown2html.js @@ -0,0 +1,117 @@ +.pragma library +// This exists only because I haven't been able to get linkColor to work with MarkdownText +// May not be necessary if that's possible tbh. +function markdownToHtml(text) { + if (!text) return ""; + + // Store code blocks and inline code to protect them from further processing + const codeBlocks = []; + const inlineCode = []; + let blockIndex = 0; + let inlineIndex = 0; + + // First, extract and replace code blocks with placeholders + let html = text.replace(/```([\s\S]*?)```/g, (match, code) => { + // Trim leading and trailing blank lines only + const trimmedCode = code.replace(/^\n+|\n+$/g, ''); + // Escape HTML entities in code + const escapedCode = trimmedCode.replace(/&/g, '&') + .replace(//g, '>'); + codeBlocks.push(`
${escapedCode}
`); + return `\x00CODEBLOCK${blockIndex++}\x00`; + }); + + // Extract and replace inline code + html = html.replace(/`([^`]+)`/g, (match, code) => { + // Escape HTML entities in code + const escapedCode = code.replace(/&/g, '&') + .replace(//g, '>'); + inlineCode.push(`${escapedCode}`); + return `\x00INLINECODE${inlineIndex++}\x00`; + }); + + // Extract plain URLs before escaping so & in query strings is preserved + const urls = []; + let urlIndex = 0; + html = html.replace(/(^|[\s])((?:https?|file):\/\/[^\s]+)/gm, (match, prefix, url) => { + urls.push(url); + return prefix + `\x00URL${urlIndex++}\x00`; + }); + + // Escape HTML entities (but not in code blocks or URLs) + html = html.replace(/&/g, '&') + .replace(//g, '>'); + + // Headers + html = html.replace(/^### (.*?)$/gm, '

$1

'); + html = html.replace(/^## (.*?)$/gm, '

$1

'); + html = html.replace(/^# (.*?)$/gm, '

$1

'); + + // Bold and italic (order matters!) + html = html.replace(/\*\*\*(.*?)\*\*\*/g, '$1'); + html = html.replace(/\*\*(.*?)\*\*/g, '$1'); + html = html.replace(/\*(.*?)\*/g, '$1'); + html = html.replace(/___(.*?)___/g, '$1'); + html = html.replace(/__(.*?)__/g, '$1'); + html = html.replace(/_(.*?)_/g, '$1'); + + // Links + html = html.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '$1'); + + // Lists + html = html.replace(/^\* (.*?)$/gm, '
  • $1
  • '); + html = html.replace(/^- (.*?)$/gm, '
  • $1
  • '); + html = html.replace(/^\d+\. (.*?)$/gm, '
  • $1
  • '); + + // Wrap consecutive list items in ul/ol tags + html = html.replace(/(
  • [\s\S]*?<\/li>\s*)+/g, function(match) { + return ''; + }); + + // Restore extracted URLs as anchor tags (preserves raw & in href) + html = html.replace(/\x00URL(\d+)\x00/g, (_, index) => { + const url = urls[parseInt(index)]; + const display = url.replace(/&/g, '&').replace(//g, '>'); + return `${display}`; + }); + + // Restore code blocks and inline code BEFORE line break processing + html = html.replace(/\x00CODEBLOCK(\d+)\x00/g, (match, index) => { + return codeBlocks[parseInt(index)]; + }); + + html = html.replace(/\x00INLINECODE(\d+)\x00/g, (match, index) => { + return inlineCode[parseInt(index)]; + }); + + // Line breaks (after code blocks are restored) + html = html.replace(/\n\n/g, '

    '); + html = html.replace(/\n/g, '
    '); + + // Wrap in paragraph tags if not already wrapped + if (!html.startsWith('<')) { + html = '

    ' + html + '

    '; + } + + // Clean up the final HTML + // Remove
    tags immediately before block elements + html = html.replace(/\s*
    /g, '
    ');
    +    html = html.replace(/\s*
      /g, '
        '); + html = html.replace(/\s*/g, ''); + + // Remove empty paragraphs + html = html.replace(/

        \s*<\/p>/g, ''); + html = html.replace(/

        \s*\s*<\/p>/g, ''); + + // Remove excessive line breaks + html = html.replace(/(){3,}/g, '

        '); // Max 2 consecutive line breaks + html = html.replace(/(<\/p>)\s*(

        )/g, '$1$2'); // Remove whitespace between paragraphs + + // Remove leading/trailing whitespace + html = html.trim(); + + return html; +} -- cgit v1.3