Utilisateur:Fabimaru/listingEdit.js
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(/¥/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;
}();