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

/**
* @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));