Skip to content

Commit

Permalink
Rearranged setClasses a bit: can now be reused by async tests (to avo…
Browse files Browse the repository at this point in the history
…id duplicating regexes)
  • Loading branch information
stucox committed Mar 23, 2013
1 parent 43e3e72 commit b56de42
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 17 deletions.
7 changes: 3 additions & 4 deletions src/addTest.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
define(['ModernizrProto', 'Modernizr', 'docElement', 'hasOwnProp'], function( ModernizrProto, Modernizr, docElement, hasOwnProp ) {
define(['ModernizrProto', 'Modernizr', 'hasOwnProp', 'setClasses'], function( ModernizrProto, Modernizr, hasOwnProp, setClasses ) {
/**
* addTest allows the user to define their own feature tests
* the result will be added onto the Modernizr object,
Expand Down Expand Up @@ -29,11 +29,10 @@ define(['ModernizrProto', 'Modernizr', 'docElement', 'hasOwnProp'], function( Mo

test = typeof test == 'function' ? test() : test;

if (Modernizr._config.enableClasses) {
docElement.className += ' ' + (Modernizr._config.classPrefix || '') + (test ? '' : 'no-') + feature;
}
Modernizr[feature] = test;

// Set a single class (either `feature` or `no-feature`)
setClasses([(test ? '' : 'no-') + feature]);
}

return Modernizr; // allow chaining.
Expand Down
6 changes: 3 additions & 3 deletions src/generate.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ define(['underscore'], function( _ ) {

// Needed named module requires
if (setClasses) {
output += ', "setClasses"';
output += ', "setClasses", "classes"';
}

// Load in the rest of the options (they dont return values, so they aren't declared
Expand All @@ -34,7 +34,7 @@ define(['underscore'], function( _ ) {

// Needed named module declarations
if (setClasses) {
output += ', setClasses';
output += ', setClasses, classes';
}

output += ') {\n' +
Expand All @@ -45,7 +45,7 @@ define(['underscore'], function( _ ) {
// Actually run the setClasses function
if (setClasses) {
output += ' // Remove the "no-js" class if it exists\n' +
' setClasses();\n' +
' setClasses(classes);\n' +
'\n';
}

Expand Down
38 changes: 28 additions & 10 deletions src/setClasses.js
Original file line number Diff line number Diff line change
@@ -1,17 +1,35 @@
define(['Modernizr', 'docElement', 'classes'], function( Modernizr, docElement, classes ) {
define(['Modernizr', 'docElement'], function( Modernizr, docElement ) {
// Pass in an element to this function
// if you'd like to change the classe on
// something other than the html element.
function setClasses( elem ) {
var theElem = elem || docElement;
var features = classes.concat('js');
var featurePattern = new RegExp('(^|\\s)no-(' + features.join('|') + ')(\\s|$)', 'g');
function setClasses( classes ) {
var className = docElement.className;
var removeClasses = [];
var regex;

// Change `no-js` to `js` (we do this regardles of the `enableClasses`
// option)
className = className.replace(/(^|\s)no-js(\s|$)/, '$1js$2');

if(Modernizr._config.enableClasses) {
// Need to remove any existing `no-*` classes for features we've detected
for(var i = 0; i < classes.length; i++) {
if(!classes[i].match('^no-')) {
removeClasses.push('no-' + classes[i]);
}
}

// Use a regex to remove the old...
regex = new RegExp('(^|\\s)' + removeClasses.join('|') + '(\\s|$)', 'g');
className = className.replace(regex, '$1$2');

// Then add the new...
className += ' ' + classes.join(' ' + (Modernizr._config.classPrefix || ''));

// Apply
docElement.className = className;
}

theElem.className =
// Remove relevant 'no-<feature>' classes
theElem.className.replace(featurePattern, '$1$3') +
// Add the new classes to the <html> element.
(Modernizr._config.enableClasses ? ' js ' + (classes.length ? Modernizr._config.classPrefix || '' : '') + classes.join(' ' + (Modernizr._config.classPrefix || '')) : '');
}

return setClasses;
Expand Down

0 comments on commit b56de42

Please sign in to comment.