NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name SuperAlign
// @namespace Daring-Do
// @author Daring-Do
// @description Les espaces et les entrées multiples de vos messages, publics comme privés, sont désormais pris en compte.
// @match http://*.jeuxvideo.com/forums/*
// @match http://*.jeuxvideo.com/messages-prives/*
// @match http://*.forumjv.com/forums/*
// @version 3
// @grant none
// ==/UserScript==
function selectedText(e) {
return (e.selectionStart !== e.selectionEnd);
}
//http://blog.vishalon.net/index.php/javascript-getting-and-setting-caret-position-in-textarea/
function doGetCaretPosition(ctrl) {
var CaretPos = 0; // IE Support
if (document.selection) {
ctrl.focus();
var Sel = document.selection.createRange();
Sel.moveStart('character', -ctrl.value.length);
CaretPos = Sel.text.length;
}
// Firefox support
else if (ctrl.selectionStart || ctrl.selectionStart == '0')
CaretPos = ctrl.selectionStart;
return (CaretPos);
}
function setCaretPosition(ctrl, pos) {
if (ctrl.setSelectionRange)
{
ctrl.focus();
ctrl.setSelectionRange(pos, pos);
}
else if (ctrl.createTextRange) {
var range = ctrl.createTextRange();
range.collapse(true);
range.moveEnd('character', pos);
range.moveStart('character', pos);
range.select();
}
}
function clean(element) {
var pos = doGetCaretPosition(element);
var use = false;
var diff = 0;
//Remove useless \u200C characters
element.value = element.value.replace(/([^\n ])?\u200C([^\n ])?/g, function ($0, $1, $2) {
//At least 1 char before/after \u200C
if (typeof $1 !== "undefined" || typeof $2 !== "undefined") {
use = true;
diff++;
return $0.replace(/\u200C/g, "");
} else { //Empty line
return $0;
}
});
if (use === true) {
setCaretPosition(element, pos - diff);
}
//Replace multiple spaces in quotes with simple spaces
var lines = element.value.split('\n');
for (var i = 0; i < lines.length; i++) {
if (lines[i].charAt(0) === ">") {
lines[i] = lines[i].replace(/ {2,}/g, " ");
} else { //Remove \u200C if the previous line was a quote
if (i > 0 && lines[i - 1].charAt(0) === ">") {
lines[i] = lines[i].replace(/^\u200C$/g, "");
}
}
}
element.value = lines.join("\n");
}
function replaceSpaces(element) {
var pos = doGetCaretPosition(element);
var use = false;
var diff = 0;
element.value = element.value.replace(/(^ )|( {2})/gm, function ($0) {
use = true;
diff++;
//First space of a line
if ($0.length === 1) {
return s + " ";
}
return " " + s + " ";
});
if (use === true) {
setCaretPosition(element, pos + diff);
}
}
function replaceEnters(element) {
var pos = doGetCaretPosition(element);
var use = false;
var diff = 0;
element.value = element.value.replace(/^$/gm, function () {
diff++;
use = true;
return s;
});
if (use === true) {
setCaretPosition(element, pos + diff);
}
}
function start() {
var el = document.getElementsByTagName('textarea')[0];
el.onkeyup = function (e) {
clean(this);
//Space. The condition is commented out because you can press Enter while your cursor being before a space, for example.
//if (e.keyCode === 32) {
replaceSpaces(this);
//}
//Enter
if (e.keyCode === 13) {
replaceEnters(this);
}
clean(this);
};
el.addEventListener('paste', function (e) {
setTimeout(function () {
clean(el);
replaceSpaces(el);
replaceEnters(el);
clean(el);
}, 0);
}, true);
//Delete \u200C characters on the fly
el.onkeydown = function (e) {
if (!selectedText(el)) {
//Backspace
if (e.keyCode === 8) {
var pos = doGetCaretPosition(this);
if (pos > 1) {
var char = this.value.substr(pos - 1, 1);
var code = char.charCodeAt(0);
var previousChar = this.value.substr(pos - 2, 1);
var previousCharCode = previousChar.charCodeAt(0);
if (code === 8204 || previousCharCode === 8204) {
e.preventDefault();
//console.log("Will be deleted: '" + char + "', code: " + code + ". The character before it is: '" + previousChar + "', code: " + previousCharCode);
el.value = el.value.slice(0, pos - 2) + el.value.slice(pos);
setCaretPosition(el, pos - 2);
}
}
}
//Del
if (e.keyCode === 46) {
var pos = doGetCaretPosition(this);
var char = this.value.substr(pos, 1);
var code = char.charCodeAt(0);
var nextChar = this.value.substr(pos + 1, 1);
var nextCharCode = nextChar.charCodeAt(0);
if (char !== "" && nextChar !== "" && (code === 8204 || nextCharCode === 8204)) {
e.preventDefault();
//console.log("Will be deleted: '" + char + "', code: " + code + ". The character after it is: '" + nextChar + "', code: " + nextCharCode);
el.value = el.value.slice(0, pos) + el.value.slice(pos + 2);
setCaretPosition(el, pos);
}
}
}
};
}
//s = separator
var s = String.fromCharCode(8204);
start();
addEventListener('instantclick:newpage', start);