grunt.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. var fs = require('fs');
  2. var path = require('path');
  3. var _ = require('lodash');
  4. let iconsIndex = [];
  5. // Merge a `source` object to a `target` recursively
  6. function merge(target, source) {
  7. // Check if font name is changed
  8. if(source['font-name']) {
  9. target['font-name'] = source['font-name'];
  10. }
  11. // Check if root dir is changed
  12. if(source['root-dir']) {
  13. target['root-dir'] = source['root-dir'];
  14. }
  15. // Check for icons changes
  16. if(source.icons) {
  17. for(let icon of source['icons']) {
  18. let index = iconsIndex.indexOf(icon.name);
  19. // Icon is replaced
  20. if(index !== -1) {
  21. target.icons[index] = icon;
  22. }
  23. // New icon is added
  24. else {
  25. target.icons.push(icon);
  26. iconsIndex.push(icon.name);
  27. }
  28. }
  29. }
  30. return target;
  31. }
  32. module.exports = function(grunt) {
  33. grunt.initConfig({
  34. sass: {
  35. dist: {
  36. files: {
  37. 'css/videojs-icons.css': 'scss/videojs-icons.scss'
  38. }
  39. }
  40. },
  41. watch: {
  42. all: {
  43. files: ['**/*.hbs', '**/*.js', './icons.json'],
  44. tasks: ['default']
  45. }
  46. }
  47. });
  48. grunt.registerTask('generate-font', function() {
  49. var done = this.async();
  50. let webfontsGenerator = require('webfonts-generator');
  51. let iconConfig = require('../icons.json');
  52. let svgRootDir = iconConfig['root-dir'];
  53. let icons = iconConfig.icons;
  54. const paths = (grunt.option('custom-json') || '').split(',').filter(Boolean);
  55. // Index icons
  56. for (let i = 0; i < icons.length; i++) {
  57. iconsIndex.push(icons[i].name);
  58. }
  59. // Merge config
  60. for (let i = 0; i < paths.length; i++) {
  61. iconConfig = merge(iconConfig, require(path.resolve(process.cwd(), paths[i])));
  62. }
  63. let iconFiles = icons.map(function(icon) {
  64. // If root-dir is specified for a specific icon, use that.
  65. if (icon['root-dir']) {
  66. return icon['root-dir'] + icon.svg;
  67. }
  68. // Otherwise, use the default root-dir.
  69. return svgRootDir + icon.svg;
  70. });
  71. webfontsGenerator({
  72. files: iconFiles,
  73. dest: 'fonts/',
  74. fontName: iconConfig['font-name'],
  75. cssDest: 'scss/_icons.scss',
  76. cssTemplate: './templates/scss.hbs',
  77. htmlDest: 'index.html',
  78. htmlTemplate: './templates/html.hbs',
  79. html: true,
  80. rename: function(iconPath) {
  81. let fileName = path.basename(iconPath);
  82. let iconName = _.result(_.find(icons, function(icon) {
  83. let svgName = path.basename(icon.svg);
  84. return svgName === fileName;
  85. }), 'name');
  86. return iconName;
  87. },
  88. types: ['svg', 'ttf', 'woff', 'eot']
  89. }, function(error) {
  90. if (error) {
  91. console.error(error);
  92. done(false);
  93. }
  94. done();
  95. });
  96. });
  97. grunt.registerTask('update-base64', function() {
  98. let iconScssFile = './scss/_icons.scss';
  99. let iconConfig = require('../icons.json');
  100. let fontName = iconConfig['font-name'];
  101. let fontFiles = {
  102. ttf: './fonts/' + fontName + '.ttf',
  103. woff: './fonts/' + fontName + '.woff'
  104. };
  105. let scssContents = fs.readFileSync(iconScssFile).toString();
  106. Object.keys(fontFiles).forEach(function(font) {
  107. let fontFile = fontFiles[font];
  108. let fontContent = fs.readFileSync(fontFile);
  109. let regex = new RegExp(`(url.*font-${font}.*base64,)([^\\s]+)(\\).*)`);
  110. scssContents = scssContents.replace(regex, `$1${fontContent.toString('base64')}$3`);
  111. });
  112. fs.writeFileSync(iconScssFile, scssContents);
  113. });
  114. grunt.registerTask('default', ['generate-font', 'update-base64', 'sass']);
  115. };