Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

templating.js 2.2KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. const handlebars = require("handlebars");
  2. const fs = require("fs");
  3. const path = require("path");
  4. const url = require("url");
  5. const accept_language_parser = require('accept-language-parser');
  6. /**
  7. * Associations from language to translation dictionnaries
  8. * @const
  9. * @type {object}
  10. */
  11. const TRANSLATIONS = JSON.parse(fs.readFileSync(path.join(__dirname, "translations.json")));
  12. const languages = Object.keys(TRANSLATIONS);
  13. handlebars.registerHelper({
  14. json: JSON.stringify.bind(JSON)
  15. });
  16. function findBaseUrl(req) {
  17. var proto = req.headers['X-Forwarded-Proto'] || (req.connection.encrypted ? 'https' : 'http');
  18. var host = req.headers['X-Forwarded-Host'] || req.headers.host;
  19. return proto + '://' + host;
  20. }
  21. class Template {
  22. constructor(path) {
  23. const contents = fs.readFileSync(path, { encoding: 'utf8' });
  24. this.template = handlebars.compile(contents);
  25. }
  26. parameters(parsedUrl, request) {
  27. const accept_languages = parsedUrl.query.lang || request.headers['accept-language'];
  28. const language = accept_language_parser.pick(languages, accept_languages) || 'en';
  29. const translations = TRANSLATIONS[language] || {};
  30. const baseUrl = findBaseUrl(request);
  31. return { baseUrl, languages, language, translations };
  32. }
  33. serve(request, response) {
  34. const parsedUrl = url.parse(request.url, true);
  35. const parameters = this.parameters(parsedUrl, request);
  36. var body = this.template(parameters);
  37. var headers = {
  38. 'Content-Length': Buffer.byteLength(body),
  39. 'Content-Type': 'text/html',
  40. 'Cache-Control': 'public, max-age=3600',
  41. };
  42. if (!parsedUrl.query.lang) {
  43. headers["Vary"] = 'Accept-Language';
  44. }
  45. response.writeHead(200, headers);
  46. response.end(body);
  47. }
  48. }
  49. class BoardTemplate extends Template {
  50. parameters(parsedUrl, request) {
  51. const params = super.parameters(parsedUrl, request);
  52. const parts = parsedUrl.pathname.split('boards/', 2);
  53. const boardUriComponent = parts[1];
  54. params['boardUriComponent'] = boardUriComponent;
  55. params['board'] = decodeURIComponent(boardUriComponent);
  56. return params;
  57. }
  58. }
  59. module.exports = { Template, BoardTemplate };