module.exports = function(grunt) {
"use strict";
+ var btoa = require('btoa')
// Project configuration.
grunt.initConfig({
// Metadata.
pkg: grunt.file.readJSON('package.json'),
- banner: '/**\n' +
- '* <%= pkg.name %>.js v<%= pkg.version %> by @fat and @mdo\n' +
- '* Copyright <%= grunt.template.today("yyyy") %> <%= pkg.author %>\n' +
- '* <%= _.pluck(pkg.licenses, "url").join(", ") %>\n' +
- '*/\n',
- jqueryCheck: 'if (!jQuery) { throw new Error(\"Bootstrap requires jQuery\") }\n\n',
+ banner: '/*!\n' +
+ ' * Bootstrap v<%= pkg.version %> by @fat and @mdo\n' +
+ ' * Copyright <%= grunt.template.today("yyyy") %> <%= pkg.author %>\n' +
+ ' * Licensed under <%= _.pluck(pkg.licenses, "url").join(", ") %>\n' +
+ ' *\n' +
+ ' * Designed and built with all the love in the world by @mdo and @fat.\n' +
+ ' */\n\n',
+ jqueryCheck: 'if (typeof jQuery === "undefined") { throw new Error("Bootstrap requires jQuery") }\n\n',
// Task configuration.
clean: {
uglify: {
options: {
- banner: '<%= banner %>'
+ banner: '<%= banner %>',
+ report: 'min'
},
bootstrap: {
src: ['<%= concat.bootstrap.dest %>'],
recess: {
options: {
- compile: true
+ compile: true,
+ banner: '<%= banner %>'
},
bootstrap: {
src: ['less/bootstrap.less'],
},
src: ['less/bootstrap.less'],
dest: 'dist/css/<%= pkg.name %>.min.css'
+ },
+ theme: {
+ src: ['less/theme.less'],
+ dest: 'dist/css/<%= pkg.name %>-theme.css'
+ },
+ theme_min: {
+ options: {
+ compress: true
+ },
+ src: ['less/theme.less'],
+ dest: 'dist/css/<%= pkg.name %>-theme.min.css'
+ }
+ },
+
+ copy: {
+ fonts: {
+ expand: true,
+ src: ["fonts/*"],
+ dest: 'dist/'
}
},
validation: {
options: {
reset: true,
+ relaxerror: [
+ "Bad value X-UA-Compatible for attribute http-equiv on element meta.",
+ "Element img is missing required attribute src."
+ ]
},
files: {
src: ["_gh_pages/**/*.html"]
// These plugins provide necessary tasks.
+ grunt.loadNpmTasks('browserstack-runner');
grunt.loadNpmTasks('grunt-contrib-clean');
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-contrib-connect');
+ grunt.loadNpmTasks('grunt-contrib-copy');
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-qunit');
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-html-validation');
grunt.loadNpmTasks('grunt-jekyll');
grunt.loadNpmTasks('grunt-recess');
- grunt.loadNpmTasks('browserstack-runner');
-
// Docs HTML validation task
- grunt.registerTask('validate-docs', ['jekyll', 'validation']);
+ grunt.registerTask('validate-html', ['jekyll', 'validation']);
// Test task.
- var testSubtasks = ['jshint', 'qunit', 'validate-docs'];
+ var testSubtasks = ['dist-css', 'jshint', 'qunit', 'validate-html'];
// Only run BrowserStack tests under Travis
if (process.env.TRAVIS) {
// Only run BrowserStack tests if this is a mainline commit in twbs/bootstrap, or you have your own BrowserStack key
// CSS distribution task.
grunt.registerTask('dist-css', ['recess']);
+ // Fonts distribution task.
+ grunt.registerTask('dist-fonts', ['copy']);
+
// Full distribution task.
- grunt.registerTask('dist', ['clean', 'dist-css', 'dist-js']);
+ grunt.registerTask('dist', ['clean', 'dist-css', 'dist-fonts', 'dist-js']);
// Default task.
- grunt.registerTask('default', ['test', 'dist']);
+ grunt.registerTask('default', ['test', 'dist', 'build-customizer']);
// task for building customizer
grunt.registerTask('build-customizer', 'Add scripts/less files to customizer.', function () {
var files = {}
fs.readdirSync(type)
.filter(function (path) {
- return new RegExp('\\.' + type + '$').test(path)
+ return type == 'fonts' ? true : new RegExp('\\.' + type + '$').test(path)
})
.forEach(function (path) {
- return files[path] = fs.readFileSync(type + '/' + path, 'utf8')
+ var fullPath = type + '/' + path
+ return files[path] = (type == 'fonts' ? btoa(fs.readFileSync(fullPath)) : fs.readFileSync(fullPath, 'utf8'))
})
return 'var __' + type + ' = ' + JSON.stringify(files) + '\n'
}
- var customize = fs.readFileSync('customize.html', 'utf-8')
- var files = '<!-- generated -->\n<script id="files">\n' + getFiles('js') + getFiles('less') + '<\/script>\n<!-- /generated -->'
- fs.writeFileSync('customize.html', customize.replace(/<!-- generated -->(.|[\n\r])*<!-- \/generated -->/, files))
+ var files = getFiles('js') + getFiles('less') + getFiles('fonts')
+ fs.writeFileSync('docs-assets/js/raw-files.js', files)
});
};