diff --git a/Gruntfile.js b/Gruntfile.js
index 6eaff731d5335b72fd2994d0d5de4117794cba0b..29f99000ec4402383aad2b55f52fd42d0dd9a20b 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -11,6 +11,7 @@ module.exports = function (grunt) {
   }
 
   var fs = require('fs')
+  var generateGlyphiconsData = require('./docs/grunt/bs-glyphicons-data-generator.js')
   var generateRawFilesJs = require('./docs/grunt/bs-raw-files-generator.js')
 
   // Project configuration.
@@ -335,29 +336,7 @@ module.exports = function (grunt) {
   // This can be overzealous, so its changes should always be manually reviewed!
   grunt.registerTask('change-version-number', ['sed']);
 
-  grunt.registerTask('build-glyphicons-data', function () {
-    // Pass encoding, utf8, so `readFileSync` will return a string instead of a
-    // buffer
-    var glyphiconsFile = fs.readFileSync('less/glyphicons.less', 'utf8')
-    var glpyhiconsLines = glyphiconsFile.split('\n')
-
-    // Use any line that starts with ".glyphicon-" and capture the class name
-    var iconClassName = /^\.(glyphicon-[^\s]+)/
-    var glyphiconsData = '# This file is generated via Grunt task. **Do not edit directly.** \n' +
-                         '# See the \'build-glyphicons-data\' task in Gruntfile.js.\n\n';
-    for (var i = 0, len = glpyhiconsLines.length; i < len; i++) {
-      var match = glpyhiconsLines[i].match(iconClassName)
-
-      if (match != null) {
-        glyphiconsData += '- ' + match[1] + '\n'
-      }
-    }
-
-    // Create the `_data` directory if it doesn't already exist
-    if (!fs.existsSync('docs/_data')) fs.mkdirSync('docs/_data')
-
-    fs.writeFileSync('docs/_data/glyphicons.yml', glyphiconsData)
-  });
+  grunt.registerTask('build-glyphicons-data', generateGlyphiconsData);
 
   // task for building customizer
   grunt.registerTask('build-customizer', 'Add scripts/less files to customizer.', generateRawFilesJs);
diff --git a/docs/grunt/bs-glyphicons-data-generator.js b/docs/grunt/bs-glyphicons-data-generator.js
new file mode 100644
index 0000000000000000000000000000000000000000..2ecd543930e941b77c00ec53c20819de17fbceb0
--- /dev/null
+++ b/docs/grunt/bs-glyphicons-data-generator.js
@@ -0,0 +1,27 @@
+/* jshint node: true */
+
+var fs = require('fs')
+
+module.exports = function generateGlyphiconsData() {
+  // Pass encoding, utf8, so `readFileSync` will return a string instead of a
+  // buffer
+  var glyphiconsFile = fs.readFileSync('less/glyphicons.less', 'utf8')
+  var glpyhiconsLines = glyphiconsFile.split('\n')
+
+  // Use any line that starts with ".glyphicon-" and capture the class name
+  var iconClassName = /^\.(glyphicon-[^\s]+)/
+  var glyphiconsData = '# This file is generated via Grunt task. **Do not edit directly.** \n' +
+                       '# See the \'build-glyphicons-data\' task in Gruntfile.js.\n\n';
+  for (var i = 0, len = glpyhiconsLines.length; i < len; i++) {
+    var match = glpyhiconsLines[i].match(iconClassName)
+
+    if (match != null) {
+      glyphiconsData += '- ' + match[1] + '\n'
+    }
+  }
+
+  // Create the `_data` directory if it doesn't already exist
+  if (!fs.existsSync('docs/_data')) fs.mkdirSync('docs/_data')
+
+  fs.writeFileSync('docs/_data/glyphicons.yml', glyphiconsData)
+}