rewrap text

This commit is contained in:
s2
2015-04-18 00:20:42 +02:00
parent 133f073acd
commit daafe2cef4
2 changed files with 154 additions and 17 deletions

View File

@@ -2,17 +2,16 @@
var validquotechars = ['>']; var validquotechars = ['>'];
var quoteline = function(line, maxlength, qc) { var quoteline = function(line, maxlength, qc) {
if (line.length > maxlength) { if (line.length > maxlength) {
var lastspace = line.lastIndexOf(' ', maxlength); var lastspace = line.lastIndexOf(' ', maxlength - 1);
if (lastspace != -1) { if (lastspace != -1) {
line = line.substr(0, lastspace) + ' \n' + quoteline(line.substr(lastspace + 1), maxlength, qc); line = line.substr(0, lastspace) + '\n' + quoteline(line.substr(lastspace + 1), maxlength, qc);
} }
} }
//this must be after the code before, because this inserts a space in the string //this must be after the code before, because this inserts a space in the string
return qc + ' ' + line; return qc + line.trimRight();
}; };
@@ -24,22 +23,75 @@
length = 75; length = 75;
} }
var quoted = text.split('\n').map(function(v, i) { //cut the signature
//if this is already quoted text, return it as is var signPosition = text.lastIndexOf('-- ');
if (validquotechars.indexOf(v.charAt(0)) > -1) { if (signPosition > 0) {
return v; text = text.substr(0, signPosition);
} }
return quoteline(v, length, quotechar); var quoted = text.split('\n').map(function(v, i) {
//if this is already quoted text, return it as is,
//but trim the right spaces (thunderbird does this)
if (validquotechars.indexOf(v.charAt(0)) > -1) {
return quotechar + v.trimRight();
}
return quoteline(v, length, quotechar + ' ');
}).join('\n'); }).join('\n');
//remove eventual '> ' from the end of the quoted text
var bsa = quoted.split('\n');
var fixlastlines = function() {
if (bsa[bsa.length -1] === '> ') {
bsa.splice(-1,1);
quoted = bsa.join('\n') + '\n';
fixlastlines();
}
};
fixlastlines();
return quoted; return quoted;
}; };
var rewrapper = function(line, maxlength) {
if (line.length > maxlength) {
var lastspace = line.lastIndexOf(' ', maxlength - 1);
if (lastspace != -1) {
line = line.substr(0, lastspace) + ' \n' + rewrapper(line.substr(lastspace + 1), maxlength);
}
}
//this must be after the code before, because this inserts a space in the string
return line;
};
var rewrap = function(text, length) {
if (typeof(length) === 'undefined') {
length = 75;
}
var rewrapped = text.split('\n').map(function(v, i) {
//if this is already quoted text, return it as is,
//but trim the right spaces (thunderbird does this)
if (validquotechars.indexOf(v.charAt(0)) > -1) {
return v.trimRight();
}
return rewrapper(v, length);
}).join('\n');
return rewrapped;
};
var e = {
quote: quote,
rewrap: rewrap
};
if (typeof(window) === 'undefined') { if (typeof(window) === 'undefined') {
module.exports = quote; module.exports = e;
} else { } else {
window.quote = quote; window.quote = e;
} }
})(); })();

101
tests.js
View File

@@ -1,5 +1,8 @@
var quote = require('./quote.js'); var quote = require('./quote.js').quote;
var rewrap = require('./quote.js').rewrap;
//my awesome test framework
var test = function(name, what, ref, c) { var test = function(name, what, ref, c) {
process.stdout.write(name); process.stdout.write(name);
@@ -18,13 +21,15 @@ var test = function(name, what, ref, c) {
process.stdout.write(' ✓'); process.stdout.write(' ✓');
} else { } else {
process.stdout.write(' ⛝\n'); process.stdout.write(' ⛝\n');
process.stdout.write(' ----> expected | ' + ref + '\n'); process.stdout.write(' ----> expected | ' + ref.replace(/ /g, '·') + '\n');
process.stdout.write(' ----> got | ' + what + '\n'); process.stdout.write(' ----> got | ' + what.replace(/ /g, '·') + '\n');
} }
process.stdout.write('\n'); process.stdout.write('\n');
}; };
//quote tests
test('simple short text', test('simple short text',
quote('simple short text'), quote('simple short text'),
'> simple short text' '> simple short text'
@@ -32,7 +37,7 @@ test('simple short text',
test('an already quoted line', test('an already quoted line',
quote('> simple short text'), quote('> simple short text'),
'> simple short text' '>> simple short text'
); );
test('a line longer than 75 chars with no spaces', test('a line longer than 75 chars with no spaces',
@@ -42,7 +47,7 @@ test('a line longer than 75 chars with no spaces',
test('a line longer than 75 chars with spaces', test('a line longer than 75 chars with spaces',
quote('1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890', 75), quote('1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890', 75),
'> 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 \n> 1234567890 1234567890' '> 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890\n> 1234567890 1234567890'
); );
test('three lines with a hard break', test('three lines with a hard break',
@@ -54,9 +59,89 @@ test('three lines, one long line, two with a hard break in between',
quote('1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890\n' + quote('1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890\n' +
'1234567890 1234567890 1234567890 1234567890\n' + '1234567890 1234567890 1234567890 1234567890\n' +
'1234567890 1234567890 1234567890 1234567890\n'), '1234567890 1234567890 1234567890 1234567890\n'),
'> 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 \n' + '> 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890\n' +
'> 1234567890 1234567890\n' + '> 1234567890 1234567890\n' +
'> 1234567890 1234567890 1234567890 1234567890\n' + '> 1234567890 1234567890 1234567890 1234567890\n' +
'> 1234567890 1234567890 1234567890 1234567890\n' + '> 1234567890 1234567890 1234567890 1234567890\n'
'> '
); );
test('three lines, one long line with a soft breake, two with a hard break in between',
quote('1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 \n1234567890 1234567890\n' +
'1234567890 1234567890 1234567890 1234567890\n' +
'1234567890 1234567890 1234567890 1234567890\n'),
'> 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890\n' +
'> 1234567890 1234567890\n' +
'> 1234567890 1234567890 1234567890 1234567890\n' +
'> 1234567890 1234567890 1234567890 1234567890\n'
);
var mail =
"Il 15/04/15 12:39, Fabri / Joker197cinque ha scritto:\n" +
"> minchius_maximus wrote on 15/04/2015 :\n" +
">\n" +
">> (finito il main e due dlc su tre)\n" +
">\n" +
"> Abbracciamocih.\n" +
">\n" +
"\n" +
"sisi, avevo letto che anche tu ti eri fermato al secondo...\n" +
"ma, dopo aver fatto i primi due mi ero dedicato ad un sano e buon PVP \n" +
"nella covenant del drago... quante mazzate, ma divertente...\n" +
"\n" +
"sto scholar mi sta facendo calare l'hype...\n" +
"\n" +
"-- \n" +
"minchius_maximus";
var correctly_quoted =
"> Il 15/04/15 12:39, Fabri / Joker197cinque ha scritto:\n" +
">> minchius_maximus wrote on 15/04/2015 :\n" +
">>\n" +
">>> (finito il main e due dlc su tre)\n" +
">>\n" +
">> Abbracciamocih.\n" +
">>\n" +
"> \n" +
"> sisi, avevo letto che anche tu ti eri fermato al secondo...\n" +
"> ma, dopo aver fatto i primi due mi ero dedicato ad un sano e buon PVP\n" +
"> nella covenant del drago... quante mazzate, ma divertente...\n" +
"> \n" +
"> sto scholar mi sta facendo calare l'hype...\n";
test('a long real email with a signature',
quote(mail),
correctly_quoted
);
//rewrap tests
test('rewrap long text',
rewrap('1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 ', 75, ''),
'1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 \n1234567890 1234567890 '
);
var mailrewrap =
"Il 15/04/15 12:39, Fabri / Joker197cinque ha scritto:\n" +
"> minchius_maximus wrote on 15/04/2015 :\n" +
">\n" +
">> (finito il main e due dlc su tre)\n" +
">\n" +
"> Abbracciamocih.\n" +
">\n" +
"\n" +
"sisi, avevo letto che anche tu ti eri fermato al secondo...\n" +
"ma, dopo aver fatto i primi due mi ero dedicato ad un sano e buon PVP nella covenant del drago... quante mazzate, ma divertente...\n" +
"\n" +
"sto scholar mi sta facendo calare l'hype...\n" +
"\n" +
"-- \n" +
"minchius_maximus";
test('rewrap long text with something quoted before',
rewrap(mailrewrap),
mail
);