const {JSDOM} = require("jsdom"); const shaca = require("./shaca/shaca"); const assetPath = require("../services/asset_path"); const shareRoot = require('./share_root'); const escapeHtml = require('escape-html'); function getContent(note) { if (note.isProtected) { return { header: '', content: '

Protected note cannot be displayed

', isEmpty: false }; } const result = { content: note.getContent(), header: '', isEmpty: false }; if (note.type === 'text') { renderText(result, note); } else if (note.type === 'code') { renderCode(result); } else if (note.type === 'mermaid') { renderMermaid(result); } else if (note.type === 'image' || note.type === 'canvas') { renderImage(result, note); } else if (note.type === 'file') { renderFile(note, result); } else if (note.type === 'book') { result.isEmpty = true; } else { result.content = '

This note type cannot be displayed.

'; } return result; } function renderIndex(result) { result.content += ''; } function renderText(result, note) { const document = new JSDOM(result.content || "").window.document; result.isEmpty = document.body.textContent.trim().length === 0 && document.querySelectorAll("img").length === 0; if (!result.isEmpty) { for (const linkEl of document.querySelectorAll("a")) { const href = linkEl.getAttribute("href"); if (!href?.startsWith("#")) { continue; } const linkRegExp = /attachmentId=([a-zA-Z0-9_]+)/g; let attachmentMatch if (attachmentMatch = linkRegExp.exec(href)) { const attachmentId = attachmentMatch[1]; const attachment = shaca.getAttachment(attachmentId); if (attachment) { linkEl.setAttribute("href", `api/attachments/${attachmentId}/download`); linkEl.classList.add(`attachment-link`); linkEl.classList.add(`role-${attachment.role}`); linkEl.innerText = attachment.title; } else { linkEl.removeAttribute("href"); } } else { const [notePath] = href.split('?'); const notePathSegments = notePath.split("/"); const noteId = notePathSegments[notePathSegments.length - 1]; const linkedNote = shaca.getNote(noteId); if (linkedNote) { const isExternalLink = linkedNote.hasLabel("shareExternalLink"); const href = isExternalLink ? linkedNote.getLabelValue("shareExternalLink") : `./${linkedNote.shareId}`; linkEl.setAttribute("href", href); if (isExternalLink) { linkEl.setAttribute("target", "_blank"); linkEl.setAttribute("rel", "noopener noreferrer"); } linkEl.classList.add(`type-${linkedNote.type}`); } else { linkEl.removeAttribute("href"); } } } result.content = document.body.innerHTML; if (result.content.includes(``)) { result.header += ` `; } if (note.hasLabel("shareIndex")) { renderIndex(result); } } } function renderCode(result) { if (!result.content?.trim()) { result.isEmpty = true; } else { const document = new JSDOM().window.document; const preEl = document.createElement('pre'); preEl.appendChild(document.createTextNode(result.content)); result.content = preEl.outerHTML; } } function renderMermaid(result) { result.content = `
${escapeHtml(result.content)}

Chart source
${escapeHtml(result.content)}
` result.header += ``; } function renderImage(result, note) { result.content = ``; } function renderFile(note, result) { if (note.mime === 'application/pdf') { result.content = `` } else { result.content = ``; } } module.exports = { getContent };