| | |
| | | quoteIcon: `<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 21c3 0 7-1 7-8V5c0-1.25-.756-2.017-2-2H4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2 1 0 1 0 1 1v1c0 1-1 2-2 2s-1 .008-1 1.031V20c0 1 0 1 1 1z"></path><path d="M15 21c3 0 7-1 7-8V5c0-1.25-.757-2.017-2-2h-4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2h.75c0 2.25.25 4-2.75 4v3c0 1 0 1 1 1z"></path></svg>`, |
| | | } |
| | | |
| | | function canonicalizeCallout(calloutName: string): keyof typeof callouts { |
| | | let callout = calloutName.toLowerCase() as keyof typeof calloutMapping |
| | | |
| | | const calloutMapping: Record<string, keyof typeof callouts> = { |
| | | note: "note", |
| | | abstract: "abstract", |
| | | info: "info", |
| | | todo: "todo", |
| | | tip: "tip", |
| | | hint: "tip", |
| | | important: "tip", |
| | | success: "success", |
| | | check: "success", |
| | | done: "success", |
| | | question: "question", |
| | | help: "question", |
| | | faq: "question", |
| | | warning: "warning", |
| | | attention: "warning", |
| | | caution: "warning", |
| | | failure: "failure", |
| | | missing: "failure", |
| | | fail: "failure", |
| | | danger: "danger", |
| | | error: "danger", |
| | | bug: "bug", |
| | | example: "example", |
| | | quote: "quote", |
| | | cite: "quote", |
| | | } |
| | | |
| | | return calloutMapping[callout] |
| | | } |
| | | |
| | | const callouts = { |
| | | note: icons.pencilIcon, |
| | | abstract: icons.clipboardListIcon, |
| | |
| | | quote: icons.quoteIcon, |
| | | } |
| | | |
| | | const calloutMapping: Record<string, keyof typeof callouts> = { |
| | | note: "note", |
| | | abstract: "abstract", |
| | | info: "info", |
| | | todo: "todo", |
| | | tip: "tip", |
| | | hint: "tip", |
| | | important: "tip", |
| | | success: "success", |
| | | check: "success", |
| | | done: "success", |
| | | question: "question", |
| | | help: "question", |
| | | faq: "question", |
| | | warning: "warning", |
| | | attention: "warning", |
| | | caution: "warning", |
| | | failure: "failure", |
| | | missing: "failure", |
| | | fail: "failure", |
| | | danger: "danger", |
| | | error: "danger", |
| | | bug: "bug", |
| | | example: "example", |
| | | quote: "quote", |
| | | cite: "quote", |
| | | } |
| | | |
| | | function canonicalizeCallout(calloutName: string): keyof typeof callouts { |
| | | let callout = calloutName.toLowerCase() as keyof typeof calloutMapping |
| | | return calloutMapping[callout] ?? calloutName |
| | | } |
| | | |
| | | const capitalize = (s: string): string => { |
| | | return s.substring(0, 1).toUpperCase() + s.substring(1) |
| | | } |
| | |
| | | |
| | | // embed cases |
| | | if (value.startsWith("!")) { |
| | | const ext: string | undefined = path.extname(fp).toLowerCase() |
| | | const ext: string = path.extname(fp).toLowerCase() |
| | | const url = slugifyFilePath(fp as FilePath) + ext |
| | | if ([".png", ".jpg", ".jpeg", ".gif", ".bmp", ".svg"].includes(ext)) { |
| | | const dims = alias ?? "" |
| | |
| | | type: "html", |
| | | value: `<iframe src="${url}"></iframe>`, |
| | | } |
| | | } else { |
| | | // TODO: this is the node embed case |
| | | } else if (ext === "") { |
| | | // TODO: note embed |
| | | } |
| | | // otherwise, fall through to regular link |
| | | } |
| | | |
| | | // internal link |
| | | // const url = transformInternalLink(fp + anchor) |
| | | const url = fp + anchor |
| | | return { |
| | | type: "link", |
| | |
| | | const match = firstLine.match(calloutRegex) |
| | | if (match && match.input) { |
| | | const [calloutDirective, typeString, collapseChar] = match |
| | | const calloutType = typeString.toLowerCase() as keyof typeof callouts |
| | | const calloutType = canonicalizeCallout( |
| | | typeString.toLowerCase() as keyof typeof calloutMapping, |
| | | ) |
| | | const collapse = collapseChar === "+" || collapseChar === "-" |
| | | const defaultState = collapseChar === "-" ? "collapsed" : "expanded" |
| | | const title = |
| | |
| | | value: `<div |
| | | class="callout-title" |
| | | > |
| | | <div class="callout-icon">${callouts[canonicalizeCallout(calloutType)]}</div> |
| | | <div class="callout-icon">${callouts[calloutType]}</div> |
| | | <div class="callout-title-inner">${title}</div> |
| | | ${collapse ? toggleIcon : ""} |
| | | </div>`, |
| | |
| | | js.push({ |
| | | script: ` |
| | | import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.esm.min.mjs'; |
| | | mermaid.initialize({ startOnLoad: true }); |
| | | const darkMode = document.documentElement.getAttribute('saved-theme') === 'dark' |
| | | mermaid.initialize({ |
| | | startOnLoad: false, |
| | | securityLevel: 'loose', |
| | | theme: darkMode ? 'dark' : 'default' |
| | | }); |
| | | document.addEventListener('nav', async () => { |
| | | await mermaid.run({ |
| | | querySelector: '.mermaid' |
| | | }) |
| | | }); |
| | | `, |
| | | loadTime: "afterDOMReady", |
| | | moduleType: "module", |