Skip to content
Snippets Groups Projects
server.js 2.43 KiB
Newer Older
const browserSyncPort = 3000;
Alice Poggioli's avatar
Alice Poggioli committed
const distPath = "www";
const fs = require("fs");
const path = require("path");

// express server
Alice Poggioli's avatar
Alice Poggioli committed
const { join } = require("path");
const express = require("express");
const app = express();
Alice Poggioli's avatar
Alice Poggioli committed
let cookieParser = require("cookie-parser");
Alice Poggioli's avatar
Alice Poggioli committed
//By defaut the language should be english.
const default_lang = "en";
Alice Poggioli's avatar
Alice Poggioli committed
/**
 * Get the languages of the user's navigator and covert it in a array of exploitable datas.
Alice Poggioli's avatar
Alice Poggioli committed
 * @param {string} stringData
Alice Poggioli's avatar
Alice Poggioli committed
 */
function parseLanguageData(stringData) {
Alice Poggioli's avatar
Alice Poggioli committed
  var arrayData = stringData
    .split(",")
    .map(element => element.split(/[-;]/).shift());
  arrayData.push(default_lang);
  return arrayData;
Alice Poggioli's avatar
Alice Poggioli committed
/**
 * Get the language we can display.
 */
function getAvailableLanguage() {
Alice Poggioli's avatar
Alice Poggioli committed
  const langs = fs
    .readdirSync(distPath)
    .filter(f => path.basename(f, ".yml").match(/^index-[a-z]{2}\.html/))
    .map(f => f.match(/^index-([a-z]{2})\.html/)[1]);
  return langs;
Alice Poggioli's avatar
Alice Poggioli committed
/**
 * Compare the languages possibles with the languages avalaible and return the matched language.
Alice Poggioli's avatar
Alice Poggioli committed
 * @param {array} availableLanguages
 * @param {array} userLanguages
Alice Poggioli's avatar
Alice Poggioli committed
 */
function matchLanguage(availableLanguages, userLanguages) {
  for (let index = 0; index < userLanguages.length; index++) {
    const userLanguage = userLanguages[index];
    for (let index = 0; index < availableLanguages.length; index++) {
      const availableLanguage = availableLanguages[index];
      if (userLanguage === availableLanguage) {
Alice Poggioli's avatar
Alice Poggioli committed
        return userLanguage;
Alice Poggioli's avatar
Alice Poggioli committed
  .use(cookieParser())
  .use(express.static(distPath))
  // .use('/src', express.static(join(__dirname, 'src')))
Alice Poggioli's avatar
Alice Poggioli committed

  .get(/^[^.]*$/, (req, rep) => {
    // If we have no language's cookie, we take the language of the navigator's user and set a cookie, else we take the language of the cookie.
    if (!req.cookies.langData.langIndice) {
Alice Poggioli's avatar
Alice Poggioli committed
      var langRequired = matchLanguage(
        getAvailableLanguage(),
        parseLanguageData(req.headers["accept-language"])
      );
      langAsked = {
        langIndice: langRequired
      };
      rep.cookie("langData", langAsked);
    } else {
      langAsked = req.cookies.langData.langIndice
    rep.sendFile(join(__dirname, distPath, `/index-${langAsked}.html`));
Alice Poggioli's avatar
Alice Poggioli committed
  })
  .listen(port);

// browser sync
Alice Poggioli's avatar
Alice Poggioli committed
const bs = require("browser-sync").create();
Alice Poggioli's avatar
Alice Poggioli committed
  files: [distPath + "/**/*"],
  proxy: `http://localhost:${port}`,
  open: false,
  notify: false,
  port: browserSyncPort
  // tunnel: true,
});