| 
									
										
										
										
											2015-10-11 23:05:33 -04:00
										 |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-16 08:44:55 -05:00
										 |  |  | const nconf = require('nconf'); | 
					
						
							|  |  |  | const validator = require('validator'); | 
					
						
							| 
									
										
										
										
											2021-05-25 12:44:17 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-30 10:47:28 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-16 08:44:55 -05:00
										 |  |  | const plugins = require('../plugins'); | 
					
						
							|  |  |  | const meta = require('../meta'); | 
					
						
							|  |  |  | const translator = require('../translator'); | 
					
						
							|  |  |  | const widgets = require('../widgets'); | 
					
						
							|  |  |  | const utils = require('../utils'); | 
					
						
							| 
									
										
										
										
											2021-05-25 12:44:17 -04:00
										 |  |  | const helpers = require('./helpers'); | 
					
						
							| 
									
										
										
										
											2020-10-26 10:43:18 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | const relative_path = nconf.get('relative_path'); | 
					
						
							| 
									
										
										
										
											2015-10-11 23:05:33 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | module.exports = function (middleware) { | 
					
						
							| 
									
										
										
										
											2018-12-17 16:36:43 -05:00
										 |  |  | 	middleware.processRender = function processRender(req, res, next) { | 
					
						
							| 
									
										
										
										
											2015-10-11 23:05:33 -04:00
										 |  |  | 		// res.render post-processing, modified from here: https://gist.github.com/mrlannigan/5051687
 | 
					
						
							| 
									
										
										
										
											2021-02-06 14:10:15 -07:00
										 |  |  | 		const { render } = res; | 
					
						
							| 
									
										
										
										
											2021-06-18 12:36:04 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		res.render = async function renderOverride(template, options, fn) { | 
					
						
							| 
									
										
										
										
											2019-12-16 08:44:55 -05:00
										 |  |  | 			const self = this; | 
					
						
							| 
									
										
										
										
											2021-02-06 14:10:15 -07:00
										 |  |  | 			const { req } = this; | 
					
						
							| 
									
										
										
										
											2021-06-18 12:36:04 -04:00
										 |  |  | 			async function renderMethod(template, options, fn) { | 
					
						
							|  |  |  | 				options = options || {}; | 
					
						
							|  |  |  | 				if (typeof options === 'function') { | 
					
						
							|  |  |  | 					fn = options; | 
					
						
							|  |  |  | 					options = {}; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2015-10-11 23:05:33 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-18 12:36:04 -04:00
										 |  |  | 				options.loggedIn = req.uid > 0; | 
					
						
							|  |  |  | 				options.relative_path = relative_path; | 
					
						
							|  |  |  | 				options.template = { name: template, [template]: true }; | 
					
						
							|  |  |  | 				options.url = (req.baseUrl + req.path.replace(/^\/api/, '')); | 
					
						
							|  |  |  | 				options.bodyClass = helpers.buildBodyClass(req, res, options); | 
					
						
							| 
									
										
										
										
											2019-12-16 08:44:55 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-18 12:36:04 -04:00
										 |  |  | 				const buildResult = await plugins.hooks.fire(`filter:${template}.build`, { req: req, res: res, templateData: options }); | 
					
						
							|  |  |  | 				if (res.headersSent) { | 
					
						
							|  |  |  | 					return; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				const templateToRender = buildResult.templateData.templateToRender || template; | 
					
						
							| 
									
										
										
										
											2019-12-16 08:44:55 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-18 12:36:04 -04:00
										 |  |  | 				const renderResult = await plugins.hooks.fire('filter:middleware.render', { req: req, res: res, templateData: buildResult.templateData }); | 
					
						
							|  |  |  | 				if (res.headersSent) { | 
					
						
							|  |  |  | 					return; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				options = renderResult.templateData; | 
					
						
							|  |  |  | 				options._header = { | 
					
						
							|  |  |  | 					tags: await meta.tags.parse(req, renderResult, res.locals.metaTags, res.locals.linkTags), | 
					
						
							|  |  |  | 				}; | 
					
						
							|  |  |  | 				options.widgets = await widgets.render(req.uid, { | 
					
						
							|  |  |  | 					template: `${template}.tpl`, | 
					
						
							|  |  |  | 					url: options.url, | 
					
						
							|  |  |  | 					templateData: options, | 
					
						
							|  |  |  | 					req: req, | 
					
						
							|  |  |  | 					res: res, | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 				res.locals.template = template; | 
					
						
							|  |  |  | 				options._locals = undefined; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				if (res.locals.isAPI) { | 
					
						
							|  |  |  | 					if (req.route && req.route.path === '/api/') { | 
					
						
							|  |  |  | 						options.title = '[[pages:home]]'; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					req.app.set('json spaces', global.env === 'development' || req.query.pretty ? 4 : 0); | 
					
						
							|  |  |  | 					return res.json(options); | 
					
						
							| 
									
										
										
										
											2019-12-16 08:44:55 -05:00
										 |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-18 12:36:04 -04:00
										 |  |  | 				const results = await utils.promiseParallel({ | 
					
						
							|  |  |  | 					header: renderHeaderFooter('renderHeader', req, res, options), | 
					
						
							|  |  |  | 					content: renderContent(render, templateToRender, req, res, options), | 
					
						
							|  |  |  | 					footer: renderHeaderFooter('renderFooter', req, res, options), | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				const str = `${results.header + | 
					
						
							|  |  |  | 					(res.locals.postHeader || '') + | 
					
						
							|  |  |  | 					results.content | 
					
						
							|  |  |  | 				}<script id="ajaxify-data" type="application/json">${ | 
					
						
							|  |  |  | 					JSON.stringify(options).replace(/<\//g, '<\\/') | 
					
						
							|  |  |  | 				}</script>${ | 
					
						
							|  |  |  | 					res.locals.preFooter || '' | 
					
						
							|  |  |  | 				}${results.footer}`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				if (typeof fn !== 'function') { | 
					
						
							|  |  |  | 					self.send(str); | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					fn(null, str); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2019-12-16 08:44:55 -05:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2021-06-18 12:24:07 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			try { | 
					
						
							|  |  |  | 				await renderMethod(template, options, fn); | 
					
						
							|  |  |  | 			} catch (err) { | 
					
						
							|  |  |  | 				next(err); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2015-10-11 23:05:33 -04:00
										 |  |  | 		}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		next(); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-26 10:43:18 -04:00
										 |  |  | 	async function renderContent(render, tpl, req, res, options) { | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 		return new Promise((resolve, reject) => { | 
					
						
							|  |  |  | 			render.call(res, tpl, options, async (err, str) => { | 
					
						
							| 
									
										
										
										
											2020-10-26 10:43:18 -04:00
										 |  |  | 				if (err) reject(err); | 
					
						
							|  |  |  | 				else resolve(await translate(str, getLang(req, res))); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-03 19:07:08 -04:00
										 |  |  | 	async function renderHeaderFooter(method, req, res, options) { | 
					
						
							| 
									
										
										
										
											2020-10-26 10:43:18 -04:00
										 |  |  | 		let str = ''; | 
					
						
							| 
									
										
										
										
											2020-11-15 16:43:06 -05:00
										 |  |  | 		if (res.locals.renderHeader) { | 
					
						
							|  |  |  | 			str = await middleware[method](req, res, options); | 
					
						
							|  |  |  | 		} else if (res.locals.renderAdminHeader) { | 
					
						
							|  |  |  | 			str = await middleware.admin[method](req, res, options); | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			str = ''; | 
					
						
							| 
									
										
										
										
											2020-10-26 10:43:18 -04:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-11-15 16:43:06 -05:00
										 |  |  | 		return await translate(str, getLang(req, res)); | 
					
						
							| 
									
										
										
										
											2016-10-05 15:22:35 +03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-26 10:43:18 -04:00
										 |  |  | 	function getLang(req, res) { | 
					
						
							| 
									
										
										
										
											2019-12-16 08:44:55 -05:00
										 |  |  | 		let language = (res.locals.config && res.locals.config.userLang) || 'en-GB'; | 
					
						
							| 
									
										
										
										
											2018-02-12 17:12:18 -05:00
										 |  |  | 		if (res.locals.renderAdminHeader) { | 
					
						
							|  |  |  | 			language = (res.locals.config && res.locals.config.acpLang) || 'en-GB'; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-10-26 10:43:18 -04:00
										 |  |  | 		return req.query.lang ? validator.escape(String(req.query.lang)) : language; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	async function translate(str, language) { | 
					
						
							| 
									
										
										
										
											2019-12-16 08:44:55 -05:00
										 |  |  | 		const translated = await translator.translate(str, language); | 
					
						
							|  |  |  | 		return translator.unescape(translated); | 
					
						
							| 
									
										
										
										
											2016-10-05 15:22:35 +03:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-03-20 15:11:32 -05:00
										 |  |  | }; |