Ghost/core/frontend/services/theme-engine/preview.js

71 lines
2.0 KiB
JavaScript
Raw Normal View History

// @TODO: put together a plan for how the frontend should exist as modules and move this out
// The preview header contains a query string with the custom preview data
// This is deliberately slightly obscure & means we don't need to add body parsing to the frontend :D
// If we start passing in strings like title or description we will probably need to change this
const PREVIEW_HEADER_NAME = 'x-ghost-preview';
const _ = require('lodash');
function decodeValue(value) {
if (value === '' || value === 'null' || value === 'undefined') {
return null;
}
return value;
}
function getPreviewData(previewHeader, customThemeSettingKeys = []) {
// Keep the string shorter with short codes for certain parameters
const supportedSettings = {
c: 'accent_color',
icon: 'icon',
logo: 'logo',
cover: 'cover_image',
custom: 'custom',
d: 'description'
};
let opts = new URLSearchParams(previewHeader);
const previewData = {};
opts.forEach((value, key) => {
value = decodeValue(value);
if (supportedSettings[key]) {
_.set(previewData, supportedSettings[key], value);
}
});
if (previewData.custom) {
try {
const custom = {};
const previewCustom = JSON.parse(previewData.custom);
if (typeof previewCustom === 'object') {
customThemeSettingKeys.forEach((key) => {
custom[key] = previewCustom[key];
});
}
previewData.custom = custom;
} catch (e) {
previewData.custom = {};
}
}
previewData._preview = previewHeader;
return previewData;
}
module.exports._PREVIEW_HEADER_NAME = PREVIEW_HEADER_NAME;
module.exports.handle = (req, customThemeSettingKeys) => {
let previewData = {};
if (req && req.header(PREVIEW_HEADER_NAME)) {
previewData = getPreviewData(req.header(PREVIEW_HEADER_NAME), customThemeSettingKeys);
}
return previewData;
};