ghost
Version:
The professional publishing platform
156 lines (124 loc) • 6.44 kB
JavaScript
const {addCreateDocumentOption} = require('../render-utils/add-create-document-option');
const {renderEmptyContainer} = require('../render-utils/render-empty-container');
const {escapeHtml} = require('../render-utils/escape-html');
const {bytesToSize} = require('../render-utils/size-byte-converter');
function renderFileNode(node, options = {}) {
addCreateDocumentOption(options);
const document = options.createDocument();
if (!node.src || node.src.trim() === '') {
return renderEmptyContainer(document);
}
if (options.target === 'email') {
return emailTemplate(node, document, options);
} else {
return cardTemplate(node, document);
}
}
function emailTemplate(node, document, options) {
let iconCls;
if (!node.fileTitle && !node.fileCaption) {
iconCls = 'margin-top: 6px; height: 20px; width: 20px; max-width: 20px; padding-top: 4px; padding-bottom: 4px;';
} else {
iconCls = 'margin-top: 6px; height: 24px; width: 24px; max-width: 24px;';
}
const html = (`
<table cellspacing="0" cellpadding="4" border="0" class="kg-file-card" width="100%">
<tr>
<td>
<table cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td valign="middle" style="vertical-align: middle;">
${node.fileTitle ? `
<table cellspacing="0" cellpadding="0" border="0" width="100%"><tr><td>
<a href="${escapeHtml(options.postUrl)}" class="kg-file-title">${escapeHtml(node.fileTitle)}</a>
</td></tr></table>
` : ``}
${node.fileCaption ? `
<table cellspacing="0" cellpadding="0" border="0" width="100%"><tr><td>
<a href="${escapeHtml(options.postUrl)}" class="kg-file-description">${escapeHtml(node.fileCaption)}</a>
</td></tr></table>
` : ``}
<table cellspacing="0" cellpadding="0" border="0" width="100%"><tr><td>
<a href="${escapeHtml(options.postUrl)}" class="kg-file-meta"><span class="kg-file-name">${escapeHtml(node.fileName)}</span> • ${bytesToSize(node.fileSize)}</a>
</td></tr></table>
</td>
<td width="80" valign="middle" class="kg-file-thumbnail">
<a href="${escapeHtml(options.postUrl)}" style="display: block; top: 0; right: 0; bottom: 0; left: 0;">
<img src="https://static.ghost.org/v4.0.0/images/download-icon-darkmode.png" style="${escapeHtml(iconCls)}">
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
`);
const container = document.createElement('div');
container.innerHTML = html.trim();
return {element: container.firstElementChild};
}
function cardTemplate(node, document) {
const card = document.createElement('div');
card.setAttribute('class', 'kg-card kg-file-card');
const container = document.createElement('a');
container.setAttribute('class', 'kg-file-card-container');
container.setAttribute('href', node.src);
container.setAttribute('title', 'Download');
container.setAttribute('download', '');
const contents = document.createElement('div');
contents.setAttribute('class', 'kg-file-card-contents');
const title = document.createElement('div');
title.setAttribute('class', 'kg-file-card-title');
title.textContent = node.fileTitle || '';
const caption = document.createElement('div');
caption.setAttribute('class', 'kg-file-card-caption');
caption.textContent = node.fileCaption || '';
const metadata = document.createElement('div');
metadata.setAttribute('class', 'kg-file-card-metadata');
const filename = document.createElement('div');
filename.setAttribute('class', 'kg-file-card-filename');
filename.textContent = node.fileName || '';
const filesize = document.createElement('div');
filesize.setAttribute('class', 'kg-file-card-filesize');
filesize.textContent = node.formattedFileSize || '';
metadata.appendChild(filename);
metadata.appendChild(filesize);
contents.appendChild(title);
contents.appendChild(caption);
contents.appendChild(metadata);
container.appendChild(contents);
const icon = document.createElement('div');
icon.setAttribute('class', 'kg-file-card-icon');
const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
svg.setAttribute('viewBox', '0 0 24 24');
const defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');
const style = document.createElementNS('http://www.w3.org/2000/svg', 'style');
style.textContent = '.a{fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5px;}';
defs.appendChild(style);
const titleElement = document.createElementNS('http://www.w3.org/2000/svg', 'title');
titleElement.textContent = 'download-circle';
const polyline = document.createElementNS('http://www.w3.org/2000/svg', 'polyline');
polyline.setAttribute('class', 'a');
polyline.setAttribute('points', '8.25 14.25 12 18 15.75 14.25');
const line = document.createElementNS('http://www.w3.org/2000/svg', 'line');
line.setAttribute('class', 'a');
line.setAttribute('x1', '12');
line.setAttribute('y1', '6.75');
line.setAttribute('x2', '12');
line.setAttribute('y2', '18');
const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle');
circle.setAttribute('class', 'a');
circle.setAttribute('cx', '12');
circle.setAttribute('cy', '12');
circle.setAttribute('r', '11.25');
svg.appendChild(defs);
svg.appendChild(titleElement);
svg.appendChild(polyline);
svg.appendChild(line);
svg.appendChild(circle);
icon.appendChild(svg);
container.appendChild(icon);
card.appendChild(container);
return {element: card};
}
module.exports = renderFileNode;