From 6c9fe257e57e4279d395b0c9496b27ed2342a2d0 Mon Sep 17 00:00:00 2001 From: Michael Schmidt Date: Sat, 2 Mar 2019 17:43:23 +0100 Subject: [PATCH] gulp: Refactoring (#1780) Refactored gulpfile.js --- gulpfile.js | 253 +++++++++++++++++++++++++--------------------------- 1 file changed, 123 insertions(+), 130 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index 6759e12fc6..0e1a88e4bb 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,110 +1,99 @@ -var gulp = require('gulp'), - rename = require('gulp-rename'), - uglify = require('gulp-uglify'), - header = require('gulp-header'), - concat = require('gulp-concat'), - replace = require('gulp-replace'), - pump = require('pump'), - fs = require('fs'), - - paths = { - componentsFile: 'components.json', - componentsFileJS: 'components.js', - components: ['components/**/*.js', '!components/index.js', '!components/**/*.min.js'], - main: [ - 'components/prism-core.js', - 'components/prism-markup.js', - 'components/prism-css.js', - 'components/prism-clike.js', - 'components/prism-javascript.js', - 'plugins/file-highlight/prism-file-highlight.js' - ], - plugins: ['plugins/**/*.js', '!plugins/**/*.min.js'], - showLanguagePlugin: 'plugins/show-language/prism-show-language.js', - autoloaderPlugin: 'plugins/autoloader/prism-autoloader.js', - changelog: 'CHANGELOG.md' - }, - - componentsPromise = new Promise(function (resolve, reject) { - fs.readFile(paths.componentsFile, { - encoding: 'utf-8' - }, function (err, data) { - if (!err) { - resolve(JSON.parse(data)); - } else { - reject(err); - } - }); - }), - - inlineRegexSource = function () { - return replace( - /\/((?:[^\n\r[\\\/]|\\.|\[(?:[^\n\r\\\]]|\\.)*\])*)\/\.source\b/g, - function (m, source) { - // escape backslashes - source = source.replace(/\\/g, '\\\\'); - // escape single quotes - source = source.replace(/'/g, "\\'"); - // unescape characters like \\n and \\t to \n and \t - source = source.replace(/(^|[^\\])\\\\([nrt0])/g, '$1\\$2'); - // wrap source in single quotes - return "'" + source + "'"; - } - ); - }; - -gulp.task('components', function(cb) { - pump( - [ - gulp.src(paths.components), - inlineRegexSource(), - uglify(), - rename({ suffix: '.min' }), - gulp.dest('components') - ], - cb - ); -}); - -gulp.task('build', function() { - return gulp.src(paths.main) - .pipe(header('\n/* **********************************************\n' + - ' Begin <%= file.relative %>\n' + - '********************************************** */\n\n')) - .pipe(concat('prism.js')) - .pipe(gulp.dest('./')); +const { src, dest, series, parallel, watch } = require('gulp'); + +const rename = require('gulp-rename'); +const uglify = require('gulp-uglify'); +const header = require('gulp-header'); +const concat = require('gulp-concat'); +const replace = require('gulp-replace'); +const pump = require('pump'); +const fs = require('fs'); + +const paths = { + componentsFile: 'components.json', + componentsFileJS: 'components.js', + components: ['components/**/*.js', '!components/index.js', '!components/**/*.min.js'], + main: [ + 'components/prism-core.js', + 'components/prism-markup.js', + 'components/prism-css.js', + 'components/prism-clike.js', + 'components/prism-javascript.js', + 'plugins/file-highlight/prism-file-highlight.js' + ], + plugins: ['plugins/**/*.js', '!plugins/**/*.min.js'], + showLanguagePlugin: 'plugins/show-language/prism-show-language.js', + autoloaderPlugin: 'plugins/autoloader/prism-autoloader.js', + changelog: 'CHANGELOG.md' +}; + +const componentsPromise = new Promise((resolve, reject) => { + fs.readFile(paths.componentsFile, { + encoding: 'utf-8' + }, (err, data) => { + if (!err) { + resolve(JSON.parse(data)); + } else { + reject(err); + } + }); }); -function plugins(cb) { - pump( - [ - gulp.src(paths.plugins), - inlineRegexSource(), - uglify(), - rename({ suffix: '.min' }), - gulp.dest('plugins') - ], - cb +function inlineRegexSource() { + return replace( + /\/((?:[^\n\r[\\\/]|\\.|\[(?:[^\n\r\\\]]|\\.)*\])*)\/\.source\b/g, + (m, source) => { + // escape backslashes + source = source.replace(/\\/g, '\\\\'); + // escape single quotes + source = source.replace(/'/g, "\\'"); + // unescape characters like \\n and \\t to \n and \t + source = source.replace(/(^|[^\\])\\\\([nrt0])/g, '$1\\$2'); + // wrap source in single quotes + return "'" + source + "'"; + } ); } -gulp.task('components-json', function (cb) { - componentsPromise.then(function (data) { - data = 'var components = ' + JSON.stringify(data) + ';\n' + - 'if (typeof module !== \'undefined\' && module.exports) { module.exports = components; }'; - fs.writeFile(paths.componentsFileJS, data, cb); +function minifyJS() { + return [ + inlineRegexSource(), + uglify() + ]; +} + + +function minifyComponents(cb) { + pump([src(paths.components), ...minifyJS(), rename({ suffix: '.min' }), dest('components')], cb); +} +function minifyPlugins(cb) { + pump([src(paths.plugins), ...minifyJS(), rename({ suffix: '.min' }), dest('plugins')], cb); +} +function build(cb) { + pump([src(paths.main), header(` +/* ********************************************** + Begin <%= file.relative %> +********************************************** */ + +`), concat('prism.js'), dest('./')], cb); +} + +function componentsJsonToJs(cb) { + componentsPromise.then(data => { + const js = `var components = ${JSON.stringify(data)}; +if (typeof module !== 'undefined' && module.exports) { module.exports = components; }`; + fs.writeFile(paths.componentsFileJS, js, cb); }); -}); +} -gulp.task('watch', function() { - gulp.watch(paths.components, gulp.parallel('components', 'build')); - gulp.watch(paths.plugins, gulp.parallel('plugins', 'build')); -}); +function watchComponentsAndPlugins() { + watch(paths.components, parallel(minifyComponents, build)); + watch(paths.plugins, parallel(minifyPlugins, build)); +} -gulp.task('languages-plugins', function (cb) { - componentsPromise.then(function (data) { - var languagesMap = {}; - var dependenciesMap = {}; +function languagePlugins(cb) { + componentsPromise.then(data => { + const languagesMap = {}; + const dependenciesMap = {}; /** * Tries to guess the name of a language given its id. @@ -127,13 +116,13 @@ gulp.task('languages-plugins', function (cb) { } } - for (var p in data.languages) { + for (const p in data.languages) { if (p !== 'meta') { - var title = data.languages[p].displayTitle || data.languages[p].title; + const title = data.languages[p].displayTitle || data.languages[p].title; addLanguageTitle(p, title); - for (var name in data.languages[p].aliasTitles) { + for (const name in data.languages[p].aliasTitles) { addLanguageTitle(name, data.languages[p].aliasTitles[name]); } @@ -153,52 +142,56 @@ gulp.task('languages-plugins', function (cb) { } } - var jsonLanguagesMap = JSON.stringify(languagesMap); - var jsonDependenciesMap = JSON.stringify(dependenciesMap); + const jsonLanguagesMap = JSON.stringify(languagesMap); + const jsonDependenciesMap = JSON.stringify(dependenciesMap); - var tasks = [ - {plugin: paths.showLanguagePlugin, map: jsonLanguagesMap}, - {plugin: paths.autoloaderPlugin, map: jsonDependenciesMap} + const tasks = [ + { plugin: paths.showLanguagePlugin, map: jsonLanguagesMap }, + { plugin: paths.autoloaderPlugin, map: jsonDependenciesMap } ]; - var cpt = 0; - var l = tasks.length; - var done = function() { + let cpt = 0; + const l = tasks.length; + const done = () => { cpt++; - if(cpt === l) { + if (cpt === l) { cb && cb(); } }; - tasks.forEach(function(task) { - var stream = gulp.src(task.plugin) + for (const task of tasks) { + const stream = src(task.plugin) .pipe(replace( /\/\*languages_placeholder\[\*\/[\s\S]*?\/\*\]\*\//, '/*languages_placeholder[*/' + task.map + '/*]*/' )) - .pipe(gulp.dest(task.plugin.substring(0, task.plugin.lastIndexOf('/')))); + .pipe(dest(task.plugin.substring(0, task.plugin.lastIndexOf('/')))); stream.on('error', done); stream.on('end', done); - }); + } }); -}); - -gulp.task('plugins', gulp.series('languages-plugins', plugins)); +} -gulp.task('changelog', function (cb) { - return gulp.src(paths.changelog) - .pipe(replace( +function changelog(cb) { + return pump([ + src(paths.changelog), + replace( /#(\d+)(?![\d\]])/g, '[#$1](https://github.com/PrismJS/prism/issues/$1)' - )) - .pipe(replace( + ), + replace( /\[[\da-f]+(?:, *[\da-f]+)*\]/g, - function (match) { - return match.replace(/([\da-f]{7})[\da-f]*/g, '[`$1`](https://github.com/PrismJS/prism/commit/$1)'); - } - )) - .pipe(gulp.dest('.')); -}); + m => m.replace(/([\da-f]{7})[\da-f]*/g, '[`$1`](https://github.com/PrismJS/prism/commit/$1)') + ), + dest('.') + ], cb); +} + +const components = minifyComponents; +const plugins = series(languagePlugins, minifyPlugins); + -gulp.task('default', gulp.parallel('components', 'components-json', 'plugins', 'build')); +exports.watch = watchComponentsAndPlugins; +exports.default = parallel(components, plugins, componentsJsonToJs, build); +exports.changelog = changelog;