You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
133 lines
3.9 KiB
133 lines
3.9 KiB
/**
|
|
* @preserve jQuery Column cell selector v1.0
|
|
*
|
|
* Licensed under the new BSD License.
|
|
* Copyright 2009-2012, Bram Stein
|
|
* All rights reserved.
|
|
*/
|
|
/*global jQuery*/
|
|
(function ($) {
|
|
var equationRegExp = /([\+\-]?\d*)[nN]([\+\-]?\d*)/,
|
|
cache, equation,
|
|
pseudoSelector = jQuery.expr.filter.PSEUDO;
|
|
|
|
function parseEquation(str) {
|
|
var tmp = [],
|
|
result = {
|
|
multiplier: 0,
|
|
offset: 0
|
|
};
|
|
|
|
if (str === 'even') {
|
|
str = '2n';
|
|
} else if (str === 'odd') {
|
|
str = '2n+1';
|
|
} else if (/^\d*$/.test(str)) {
|
|
str = '0n+' + str;
|
|
}
|
|
|
|
tmp = equationRegExp.exec(str);
|
|
|
|
if (tmp !== null) {
|
|
result.multiplier = tmp[1] - 0;
|
|
result.offset = tmp[2] - 0;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
function generateCache(cells, equation) {
|
|
var currentRow, currentSection, matrix = [], first = 0, lookup = [];
|
|
|
|
$.each(cells, function (k, cell) {
|
|
var i = 0, j = 0,
|
|
rowSpan = cell.rowSpan || 1,
|
|
colSpan = cell.colSpan || 1;
|
|
|
|
if (cell.parentNode !== currentRow) {
|
|
currentRow = cell.parentNode;
|
|
|
|
if (currentRow.parentNode !== currentSection) {
|
|
currentSection = currentRow.parentNode;
|
|
matrix = [];
|
|
}
|
|
|
|
first = 0;
|
|
|
|
if (matrix[currentRow.rowIndex] === undefined) {
|
|
matrix[currentRow.rowIndex] = [];
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < matrix[currentRow.rowIndex].length + 1; i += 1) {
|
|
if (matrix[currentRow.rowIndex][i] === undefined) {
|
|
first = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
lookup[k] = first;
|
|
|
|
for (i = currentRow.rowIndex; i < currentRow.rowIndex + rowSpan; i += 1) {
|
|
if (matrix[i] === undefined) {
|
|
matrix[i] = [];
|
|
}
|
|
|
|
for (j = first; j < first + colSpan; j += 1) {
|
|
matrix[i][j] = true;
|
|
}
|
|
}
|
|
});
|
|
return lookup;
|
|
}
|
|
|
|
function nthCol(element, match, index) {
|
|
var difference = cache[index] - (equation.offset - 1);
|
|
if (equation.multiplier === 0) {
|
|
return difference === 0;
|
|
} else {
|
|
return (difference % equation.multiplier === 0 && difference / equation.multiplier >= 0);
|
|
}
|
|
}
|
|
|
|
$.extend(jQuery.fn, {
|
|
nthCol: function (e) {
|
|
equation = parseEquation(e);
|
|
cache = generateCache(this);
|
|
return $(this).filter(function (i) {
|
|
return nthCol(this, undefined, i);
|
|
});
|
|
}
|
|
});
|
|
|
|
$.extend(jQuery.expr.match, {
|
|
COLUMN: new RegExp(":nth-col\\((even|odd|[\\dnN\\+\\-]*)\\)(?![\\^\\[]*\\])(?![\\^\\(]*\\))")
|
|
});
|
|
|
|
$.extend(jQuery.expr.leftMatch, {
|
|
COLUMN: new RegExp("(^(?:.|\\r|\\n)*?):nth-col\\((even|odd|[\\dnN\\+\\-]*)\\)(?![\\^\\[]*\\])(?![\\^\\(]*\\))")
|
|
});
|
|
|
|
$.extend(jQuery.expr.preFilter, {
|
|
COLUMN: function (match, items) {
|
|
equation = parseEquation(match[1]);
|
|
cache = generateCache(items);
|
|
return match;
|
|
}
|
|
});
|
|
|
|
$.extend(jQuery.expr.filter, {
|
|
// Override the pseudo selector and go past the "unrecognized
|
|
// expression" error message if nth-col is part of the
|
|
// expression. This is only necessary on jQuery >= 1.4.x.
|
|
PSEUDO: function (elem, match, i, array) {
|
|
var name = match[1];
|
|
if (name !== 'nth-col') {
|
|
return pseudoSelector(elem, match, i, array);
|
|
}
|
|
}
|
|
});
|
|
|
|
$.extend(jQuery.expr.filter, {
|
|
COLUMN: nthCol
|
|
});
|
|
}(jQuery));
|