Note : après avoir publié vos modifications, il se peut que vous deviez forcer le rechargement complet du cache de votre navigateur pour voir les changements.

  • Firefox / Safari : maintenez la touche Maj (Shift) en cliquant sur le bouton Actualiser ou appuyez sur Ctrl + F5 ou Ctrl + R (⌘ + R sur un Mac).
  • Google Chrome : appuyez sur Ctrl + Maj + R (⌘ + Shift + R sur un Mac).
  • Internet Explorer / Edge : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl + F5.
  • Opera : appuyez sur Ctrl + F5.
// Fonction JavaScript pour Convertir les listings anglais en listings français.

var translateListing = function() {

  var handler = {
      get: function(target, name){
          return name in target?
              target[name] :
              "";
      }
  };

  function convert(parsing) {
  	let p = new Proxy(parsing.tags, handler);
    let mapping = {
        'see': 'Voir',
        'do': 'Faire',
        'buy': 'Acheter',
        'eat': 'Manger',
        'drink': 'Sortir',
        'sleep': 'Se loger',
    };
    let type = parsing.type in mapping ? mapping[parsing.type] : parsing.type;
    return `* {{${type}
| nom=${p.name} | alt=${p.alt} | url=${p.url} | email=${p.email} | wikipédia=${p.wikipedia} | wikidata=${p.wikidata} | facebook=${p.facebook} 
| adresse=${p.address} | latitude=${p.lat} | longitude=${p.long} | direction=${p.directions}
| image = ${p.image}
| téléphone=${p.phone} | numéro gratuit=${p.tollfree} | téléphone portable= | fax= ${p.fax}
| prix=${p.price} | horaire= ${p.hours}
| wifi= | handicap= | mise à jour=${p.lastedit}
| description=${p.content}
}}`;
  }

  var tmplTagSearchExpr = /([^$*])$([^ ]+).*/;

  var exprParams = /\*\s*{{\s*([\S]+)([\S\s]*)/;
  var exprNextTag = /([\S\s]*?)(\||{{|\[\[|\]\]|\}\})([\S\s]*)/;

  function pushNotEmpty(arr, text) {
    if (text.trim()!=""){
      arr.push(text);
    }
  }

  function parseTokens(text) {
      // search keyword
      var ret = [];
      for(;;) {
          res = exprNextTag.exec(text)
          if (res == null ) {
              pushNotEmpty(ret, text)
              return ret;
          }
          pushNotEmpty(ret, res[1]);
          pushNotEmpty(ret, res[2]);
          text = res[3];
          if (text=="") {
              return ret
          }
      }
  }

  function processParamEnd(ctx, tok) {
    if (tok.trim()=="|" || (tok.trim()=="}}" && ctx.stack.length==0)) {
      if (ctx.stack.length==0) {
        if (ctx.param!="") {
          let tmp = ctx.param.trim().split("=")
          var value = "";
          if (tmp.length==2) {
            ctx.param = tmp[0].trim();
            value = tmp[1].trim();
          }
          // console.log(ctx.param)
          value = value.trim();
          if (value!="") {
            ctx.res[ctx.param] = value;
          }
        }
        ctx.param = "";
      } else {
        ctx.param += tok;
      }
      return true;
    } else {
      return false;
    }
  }

  function processIn(ctx, tok, expectIn) {
    if (tok.trim()==expectIn) {
      ctx.param += tok
      ctx.stack.push(tok);
      return true;
    }
    return false;
  }

  function processOut(ctx, tok, expectIn, expectOut) {
    if (tok.trim()==expectOut) {
      if (ctx.stack.length==0) {
        console.log("bad pop " + expectOut);
      } else {
        let last = ctx.stack[ctx.stack.length-1];
        if (last!=expectIn) {
          console.log("bad pop " + expectOut);
        } else {
          ctx.param += tok;
          ctx.stack.pop();
        }
      }
      return true;
    }
    return false;
  }

  function processOther(ctx, tok) {
    ctx.param += tok;
  }

  function parseTemplate(text) {
      // search template start
      let res = exprParams.exec(text)
      if (res==null) { return; }
      let type = res[1];
      let rest = res[2];
      let tokens = parseTokens(rest)
      let ctx = new Object();
      ctx.param = "";
      ctx.stack = [];
      ctx.res = new Object();
      // console.log("Tokens: ", tokens)
      for(let idx in tokens) {
        let tok = tokens[idx];
        processParamEnd(ctx, tok) || processIn(ctx, tok, "[[") || processOut(ctx, tok, "[[", "]]") || processIn(ctx, tok, "{{") ||
        processOut(ctx, tok, "{{", "}}") || processOther(ctx, tok);
        // processPipe(ctx, "|");
      } 
      return {type: type, tags: ctx.res}
  }

  function pad(num) {
      num = parseInt(num);
      return (num<10)?"0"+num:String(num)
  }

  var timeExpr = /(\d+)(?::(\d+))?(AM|PM)/;
  function postProcessTime(value) {
    var out = "";
    var offset = 0;
    for(;;) {
      var remaining = value.substr(offset);
      var res = remaining.match(timeExpr);
      if (res==null) {
        out += remaining;
        break;
      }
      out += remaining.substr(0, res.index);
      var hour = parseInt(res[1]);
      if (res[3].toLowerCase()=="pm" && hour!=12) {
        hour += 12;
      }
      out += "{{Heure|" + hour;
      if (res[2]) {
        out += "|" + pad(res[2]);
      }
          out += "}}";
      offset += res.index+res[0].length;
    }
      out = out.replace("Mon", "lun");
      out = out.replace("Wed", "mer");
      out = out.replace("Fri", "ven");
      out = out.replace("Sat", "sam");
      out = out.replace("Sun", "dim");
    return out;
  }

  var priceExpr = /¥((?:[\d ,]+)?[\d,])/;
  function postProcessPrice(value) {
    var out = "";
    var offset = 0;
    for(;;) {
      var remaining = value.substr(offset);
      var res = remaining.match(priceExpr);
      if (res==null) {
        out += remaining;
        break;
      }
      out += remaining.substr(0, res.index);
      var price = res[1].replace(/[ ,]/, "");
      out += "{{Prix|" + parseInt(price) + "|¥}}";
      offset += res.index+res[0].length;
    }
      out = out.replace(/free/i, "gratuit");
    return out;
  }

  function postProcessDirection(value) {
      return value.replace(/walk/g, "à pied").replace(/Station/g, "gare");
  }

  function postProcess(key, value) {
    value = value.replace(/&yen;/g, "¥");
    if (key=="hours") {
      return postProcessTime(value);
    }
    else if (key=="price") {
      return postProcessPrice(value);
    }
    else if (key=="directions") {
      return postProcessDirection(value);
    }
    return value;
  }

  function postProcessTags(tags) {
    for(let key in tags) {
      tags[key] = postProcess(key, tags[key]);
    }
  }

  function inner(orig) { 
    let parsing = parseTemplate(orig);
    // console.log(tags);
    postProcessTags(parsing.tags);
    return convert(parsing);
  }
  return inner;
}();