1
0
mirror of https://github.com/Jermolene/TiddlyWiki5 synced 2024-12-24 17:10:29 +00:00

Merge pull request #2161 from matabele/patch-3

Tidied up the code in the x-listops filters
This commit is contained in:
Jeremy Ruston 2016-01-05 15:30:39 +00:00
commit 31b4f104e4

View File

@ -8,185 +8,182 @@ Extended filter operators to manipulate the current list.
\*/ \*/
(function () { (function () {
/*jslint node: true, browser: true */ /*jslint node: true, browser: true */
/*global $tw: false */ /*global $tw: false */
"use strict"; "use strict";
var prepare_results = function (source) { /*
Fetch titles from the current list
*/
var prepare_results = function (source) {
var results = []; var results = [];
source(function (tiddler, title) { source(function (tiddler, title) {
results.push(title); results.push(title);
}); });
return results; return results;
}; };
/* /*
Moves a number of items from the tail of the current list before the item named in the operand Moves a number of items from the tail of the current list before the item named in the operand
*/ */
exports.putbefore = function (source, operator, options) { exports.putbefore = function (source, operator) {
var results = prepare_results(source), var results = prepare_results(source),
index = results.indexOf(operator.operand), index = results.indexOf(operator.operand),
count = parseInt(operator.suffix) || 1; count = parseInt(operator.suffix) || 1;
if (index === -1) { return (index === -1) ?
return results.slice(0, -1); results.slice(0, -1) :
} results.slice(0, index).concat(results.slice(-count)).concat(results.slice(index, -count));
return results.slice(0, index).concat(results.slice(-count)).concat(results.slice(index, -count)); };
};
/* /*
Moves a number of items from the tail of the current list after the item named in the operand Moves a number of items from the tail of the current list after the item named in the operand
*/ */
exports.putafter = function (source, operator, options) { exports.putafter = function (source, operator) {
var results = prepare_results(source), var results = prepare_results(source),
index = results.indexOf(operator.operand), index = results.indexOf(operator.operand),
count = parseInt(operator.suffix) || 1; count = parseInt(operator.suffix) || 1;
if (index === -1) { return (index === -1) ?
return results.slice(0, -1); results.slice(0, -1) :
} results.slice(0, index + 1).concat(results.slice(-count)).concat(results.slice(index + 1, -count));
return results.slice(0, index + 1).concat(results.slice(-count)).concat(results.slice(index + 1, -count)); };
};
/* /*
Replaces the item named in the operand with a number of items from the tail of the current list Replaces the item named in the operand with a number of items from the tail of the current list
*/ */
exports.replace = function (source, operator, options) { exports.replace = function (source, operator) {
var results = prepare_results(source), var results = prepare_results(source),
index = results.indexOf(operator.operand), index = results.indexOf(operator.operand),
count = parseInt(operator.suffix) || 1; count = parseInt(operator.suffix) || 1;
if (index === -1) { return (index === -1) ?
return results.slice(0, -count); results.slice(0, -count) :
} results.slice(0, index).concat(results.slice(-count)).concat(results.slice(index + 1, -count));
return results.slice(0, index).concat(results.slice(-count)).concat(results.slice(index + 1, -count)); };
};
/* /*
Moves a number of items from the tail of the current list to the head of the list Moves a number of items from the tail of the current list to the head of the list
*/ */
exports.putfirst = function (source, operator, options) { exports.putfirst = function (source, operator) {
var results = prepare_results(source), var results = prepare_results(source),
count = parseInt(operator.suffix) || 1; count = parseInt(operator.suffix) || 1;
return results.slice(-count).concat(results.slice(0, -count)); return results.slice(-count).concat(results.slice(0, -count));
}; };
/* /*
Moves a number of items from the head of the current list to the tail of the list Moves a number of items from the head of the current list to the tail of the list
*/ */
exports.putlast = function (source, operator, options) { exports.putlast = function (source, operator) {
var results = prepare_results(source), var results = prepare_results(source),
count = parseInt(operator.suffix) || 1; count = parseInt(operator.suffix) || 1;
return results.slice(count).concat(results.slice(0, count)); return results.slice(count).concat(results.slice(0, count));
}; };
/* /*
Moves the item named in the operand a number of places forward or backward in the list Moves the item named in the operand a number of places forward or backward in the list
*/ */
exports.move = function (source, operator, options) { exports.move = function (source, operator) {
var results = prepare_results(source), var results = prepare_results(source),
index = results.indexOf(operator.operand), index = results.indexOf(operator.operand),
count = parseInt(operator.suffix) || 1, count = parseInt(operator.suffix) || 1,
marker = results.splice(index, 1); marker = results.splice(index, 1);
return results.slice(0, index + count).concat(marker).concat(results.slice(index + count)); return results.slice(0, index + count).concat(marker).concat(results.slice(index + count));
}; };
/* /*
Returns the items from the current list that are after the item named in the operand Returns the items from the current list that are after the item named in the operand
*/ */
exports.allafter = function (source, operator, options) { exports.allafter = function (source, operator) {
var results = prepare_results(source), var results = prepare_results(source),
index = results.indexOf(operator.operand); index = results.indexOf(operator.operand);
if (index === -1 || index > (results.length - 2)) { return (index === -1 || index > (results.length - 2)) ? [] :
return []; (operator.suffix) ? results.slice(index) :
} results.slice(index + 1);
if (operator.suffix) { };
return results.slice(index);
}
return results.slice(index + 1);
};
/* /*
Returns the items from the current list that are before the item named in the operand Returns the items from the current list that are before the item named in the operand
*/ */
exports.allbefore = function (source, operator, options) { exports.allbefore = function (source, operator) {
var results = prepare_results(source), var results = prepare_results(source),
index = results.indexOf(operator.operand); index = results.indexOf(operator.operand);
if (index <= 0) { return (index <= 0) ? [] :
return []; (operator.suffix) ? results.slice(0, index + 1) :
} results.slice(0, index);
if (operator.suffix) { };
return results.slice(0, index + 1);
}
return results.slice(0, index);
};
/* /*
Appends the items listed in the operand array to the tail of the current list Appends the items listed in the operand array to the tail of the current list
*/ */
exports.append = function (source, operator, options) { exports.append = function (source, operator) {
var append = $tw.utils.parseStringArray(operator.operand), var append = $tw.utils.parseStringArray(operator.operand, "true"),
results = prepare_results(source), results = prepare_results(source),
count = parseInt(operator.suffix) || append.length; count = parseInt(operator.suffix) || append.length;
if (append.length === 0) { return (append.length === 0) ? results :
return results; (operator.prefix) ? results.concat(append.slice(-count)) :
} results.concat(append.slice(0, count));
if (operator.prefix) { };
return results.concat(append.slice(-count));
} else {
return results.concat(append.slice(0, count));
}
};
/* /*
Prepends the items listed in the operand array to the head of the current list Prepends the items listed in the operand array to the head of the current list
*/ */
exports.prepend = function (source, operator, options) { exports.prepend = function (source, operator) {
var prepend = $tw.utils.parseStringArray(operator.operand), var prepend = $tw.utils.parseStringArray(operator.operand, "true"),
results = prepare_results(source), results = prepare_results(source),
count = parseInt(operator.suffix) || prepend.length; count = parseInt(operator.suffix) || prepend.length;
if (prepend.length === 0) { return (prepend.length === 0) ? results :
return results; (operator.prefix) ? prepend.slice(-count).concat(results) :
} prepend.slice(0, count).concat(results);
if (operator.prefix) { };
return prepend.slice(-count).concat(results);
} else {
return prepend.slice(0, count).concat(results);
}
};
/* /*
Returns all items from the current list except the items listed in the operand array Returns all items from the current list except the items listed in the operand array
*/ */
exports.remove = function (source, operator, options) { exports.remove = function (source, operator) {
var array = $tw.utils.parseStringArray(operator.operand), var array = $tw.utils.parseStringArray(operator.operand, "true"),
results = prepare_results(source), results = prepare_results(source),
count = parseInt(operator.suffix) || array.length, count = parseInt(operator.suffix) || array.length,
p, len, index; p,
len = array.length - 1; len,
for (p = 0; p < count; ++p) { index;
if (operator.prefix) { len = array.length - 1;
index = results.indexOf(array[len - p]); for (p = 0; p < count; ++p) {
} else { if (operator.prefix) {
index = results.indexOf(array[p]); index = results.indexOf(array[len - p]);
} } else {
if (index !== -1) { index = results.indexOf(array[p]);
results.splice(index, 1); }
} if (index !== -1) {
} results.splice(index, 1);
return results; }
}; }
return results;
};
/* /*
Returns all items from the current list sorted in the order of the items in the operand array Returns all items from the current list sorted in the order of the items in the operand array
*/ */
exports.sortby = function (source, operator, options) { exports.sortby = function (source, operator) {
var results = prepare_results(source); var results = prepare_results(source);
if (!results || results.length < 2) { if (!results || results.length < 2) {
return results; return results;
} }
var lookup = $tw.utils.parseStringArray(operator.operand); var lookup = $tw.utils.parseStringArray(operator.operand, "true");
results.sort(function (a, b) { results.sort(function (a, b) {
return lookup.indexOf(a) - lookup.indexOf(b); return lookup.indexOf(a) - lookup.indexOf(b);
}); });
return results; return results;
}; };
/*
Removes all duplicate items from the current list
*/
exports.unique = function (source, operator) {
var results = prepare_results(source);
var set = results.reduce(function (a, b) {
if (a.indexOf(b) < 0) {
a.push(b);
}
return a;
}, []);
return set;
};
})(); })();