const Handlebars = require('handlebars'); const { site, analytics, claim: claimDefaults } = require('../config/speechConfig.js'); function determineOgTitle (storedTitle, defaultTitle) { return ifEmptyReturnOther(storedTitle, defaultTitle); }; function determineOgDescription (storedDescription, defaultDescription) { return ifEmptyReturnOther(storedDescription, defaultDescription); }; function ifEmptyReturnOther (value, replacement) { if (value === '') { return replacement; } return value; } function determineContentTypeFromFileExtension (fileExtension) { switch (fileExtension) { case 'jpeg': case 'jpg': return 'image/jpeg'; case 'png': return 'image/png'; case 'gif': return 'image/gif'; case 'mp4': return 'video/mp4'; default: return 'image/jpeg'; } }; function determineOgThumbnailContentType (thumbnail) { if (thumbnail) { if (thumbnail.lastIndexOf('.') !== -1) { return determineContentTypeFromFileExtension(thumbnail.substring(thumbnail.lastIndexOf('.'))); } } return ''; } function createOpenGraphDataFromClaim (claim, defaultTitle, defaultDescription) { let openGraphData = {}; openGraphData['embedUrl'] = `${site.host}/${claim.claimId}/${claim.name}`; openGraphData['showUrl'] = `${site.host}/${claim.claimId}/${claim.name}`; openGraphData['source'] = `${site.host}/${claim.claimId}/${claim.name}.${claim.fileExt}`; openGraphData['directFileUrl'] = `${site.host}/${claim.claimId}/${claim.name}.${claim.fileExt}`; openGraphData['ogTitle'] = determineOgTitle(claim.title, defaultTitle); openGraphData['ogDescription'] = determineOgDescription(claim.description, defaultDescription); openGraphData['ogThumbnailContentType'] = determineOgThumbnailContentType(claim.thumbnail); return openGraphData; }; module.exports = { placeCommonHeaderTags () { const headerBoilerplate = `${site.title}`; return new Handlebars.SafeString(headerBoilerplate); }, googleAnalytics () { const googleApiKey = analytics.googleId; const gaCode = ``; return new Handlebars.SafeString(gaCode); }, addOpenGraph (claim) { const { ogTitle, contentType, ogDescription, thumbnail, showUrl, source, ogThumbnailContentType } = createOpenGraphDataFromClaim(claim, claimDefaults.defaultTitle, claimDefaults.defaultDescription); const ogTitleTag = ``; const ogUrlTag = ``; const ogSiteNameTag = ``; const ogDescriptionTag = ``; const ogImageWidthTag = ''; const ogImageHeightTag = ''; const basicTags = `${ogTitleTag} ${ogUrlTag} ${ogSiteNameTag} ${ogDescriptionTag} ${ogImageWidthTag} ${ogImageHeightTag}`; let ogImageTag = ``; let ogImageTypeTag = ``; let ogTypeTag = ``; if (contentType === 'video/mp4') { const ogVideoTag = ``; const ogVideoSecureUrlTag = ``; const ogVideoTypeTag = ``; ogImageTag = ``; ogImageTypeTag = ``; ogTypeTag = ``; return new Handlebars.SafeString(`${basicTags} ${ogImageTag} ${ogImageTypeTag} ${ogTypeTag} ${ogVideoTag} ${ogVideoSecureUrlTag} ${ogVideoTypeTag}`); } else { if (contentType === 'image/gif') { ogTypeTag = ``; }; return new Handlebars.SafeString(`${basicTags} ${ogImageTag} ${ogImageTypeTag} ${ogTypeTag}`); } }, addTwitterCard (claim) { const { contentType, embedUrl, directFileUrl } = createOpenGraphDataFromClaim(claim, claimDefaults.defaultTitle, claimDefaults.defaultDescription); const basicTwitterTags = ``; if (contentType === 'video/mp4') { const twitterName = ''; const twitterPlayer = ``; const twitterPlayerWidth = ''; const twitterTextPlayerWidth = ''; const twitterPlayerHeight = ''; const twitterPlayerStream = ``; const twitterPlayerStreamContentType = ''; return new Handlebars.SafeString(`${basicTwitterTags} ${twitterName} ${twitterPlayer} ${twitterPlayerWidth} ${twitterTextPlayerWidth} ${twitterPlayerHeight} ${twitterPlayerStream} ${twitterPlayerStreamContentType}`); } else { const twitterCard = ''; return new Handlebars.SafeString(`${basicTwitterTags} ${twitterCard}`); } }, ifConditional (varOne, operator, varTwo, options) { switch (operator) { case '===': return (varOne === varTwo) ? options.fn(this) : options.inverse(this); case '!==': return (varOne !== varTwo) ? options.fn(this) : options.inverse(this); case '<': return (varOne < varTwo) ? options.fn(this) : options.inverse(this); case '<=': return (varOne <= varTwo) ? options.fn(this) : options.inverse(this); case '>': return (varOne > varTwo) ? options.fn(this) : options.inverse(this); case '>=': return (varOne >= varTwo) ? options.fn(this) : options.inverse(this); case '&&': return (varOne && varTwo) ? options.fn(this) : options.inverse(this); case '||': return (varOne || varTwo) ? options.fn(this) : options.inverse(this); case 'mod3': return ((parseInt(varOne) % 3) === 0) ? options.fn(this) : options.inverse(this); default: return options.inverse(this); } }, };