Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

📦 NEW: Compile multiple CSS files into different directories #125

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
<tr>
<td align='left' width='100%' colspan='2'>
<strong>WPGulp (WordPress Gulp)</strong><br />
🎯 An advanced & extensively documented Gulp WordPress workflow. Kick start a build-workflow for your WordPress plugins and themes with Gulp.
🎯 An advanced & extensively documented Gulp WordPress workflow. Kick-start a build-workflow for your WordPress plugins and themes with Gulp.
</td>
</tr>
<tr>
Expand All @@ -34,7 +34,7 @@

## 📦 WPGulp Can Do `THAT™`

`WPGulp` is an advanced & extensively documented `Gulp.js` + `WordPress` workflow. It can help you kick start a build-workflow for your WordPress plugins and themes with `Gulp.js`, save you a lot of grunt work time, follow the DRY (Don't Repeat Yourself) principle, and `#0CJS` Zero-config JavaScript startup but still configurable via `wpgulp.config.js` file. It is:
`WPGulp` is an advanced & extensively documented `Gulp.js` + `WordPress` workflow. It can help you kick-start a build-workflow for your WordPress plugins and themes with `Gulp.js`, save you a lot of grunt work time, follow the DRY (Don't Repeat Yourself) principle, and `#0CJS` Zero-config JavaScript startup but still configurable via `wpgulp.config.js` file. It is:

- 🥞 Versioned ✓
- 🤠 Updatable ✓
Expand Down Expand Up @@ -157,7 +157,7 @@ npm start
To optimize images and generate WP POT translation file, or generate a RTL stylesheet you can run the following commands

```sh
# To optimize images
# To optimize images.
gulp images

# To generate WP POT translation file.
Expand Down
120 changes: 119 additions & 1 deletion src/gulpfile.babel.js
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ const cache = require( 'gulp-cache' ); // Cache files in stream for later use.
const remember = require( 'gulp-remember' ); // Adds all the files it has ever seen back into the stream.
const plumber = require( 'gulp-plumber' ); // Prevent pipe breaking caused by errors from gulp plugins.
const beep = require( 'beepbeep' );
const merge = require( 'merge-stream' );

/**
* Custom Error Handler.
Expand Down Expand Up @@ -143,6 +144,63 @@ gulp.task( 'styles', () => {
.pipe( notify({ message: '\n\n✅ ===> STYLES — completed!\n', onLast: true }) );
});

/**
* Task: `addonStyles`.
*
* Compiles Sass, Autoprefixes it and Minifies CSS.
*
* This task does the following:
* 1. Gets the source scss file
* 2. Compiles Sass to CSS
* 3. Writes Sourcemaps for it
* 4. Autoprefixes it and generates CSS file
* 5. Renames the CSS file with suffix .min.css
* 6. Minifies the CSS file and generates .min.css
* 7. Injects CSS or reloads the browser via browserSync
*/
gulp.task( 'addonStyles', ( done ) => {
// Exit task when no addon styles
if ( config.addonStyles.length === 0 ) {
return done();
}

// Process each addon style
var tasks = config.addonStyles.map( function ( addon ) {

return gulp
.src( addon.styleSRC, { allowEmpty: true })
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wish there was less repetition. This styles task is repeated four times now, maybe we can make a function that can be used everywhere in styles, stylesRTL and addonStyles/RTL tasks? Would you be up for it?

.pipe( plumber( errorHandler ) )
.pipe( sourcemaps.init() )
.pipe(
sass({
errLogToConsole: config.errLogToConsole,
outputStyle: config.outputStyle,
precision: config.precision
})
)
.on( 'error', sass.logError )
.pipe( sourcemaps.write({ includeContent: false }) )
.pipe( sourcemaps.init({ loadMaps: true }) )
.pipe( autoprefixer( config.BROWSERS_LIST ) )
.pipe( sourcemaps.write( './' ) )
.pipe( lineec() ) // Consistent Line Endings for non UNIX systems.
.pipe( gulp.dest( addon.styleDestination ) )
.pipe( filter( '**/*.css' ) ) // Filtering stream to only css files.
.pipe( mmq({ log: true }) ) // Merge Media Queries only for .min.css version.
.pipe( browserSync.stream() ) // Reloads CSS file if that is enqueued.
.pipe( rename({ suffix: '.min' }) )
.pipe( minifycss({ maxLineLen: 10 }) )
.pipe( lineec() ) // Consistent Line Endings for non UNIX systems.
.pipe( gulp.dest( addon.styleDestination ) )
.pipe( filter( '**/*.css' ) ) // Filtering stream to only css files.
.pipe( browserSync.stream() ) // Reloads .min.css if that is enqueued.
.pipe( notify({ message: '\n\n✅ ===> ADDON STYLES — completed!\n', onLast: true }) );

} );

return merge( tasks );
});

/**
* Task: `stylesRTL`.
*
Expand Down Expand Up @@ -191,6 +249,66 @@ gulp.task( 'stylesRTL', () => {
.pipe( notify({ message: '\n\n✅ ===> STYLES RTL — completed!\n', onLast: true }) );
});

/**
* Task: `addonStylesRTL`.
*
* Compiles Sass, Autoprefixes it, Generates RTL stylesheet, and Minifies CSS.
*
* This task does the following:
* 1. Gets the source scss file
* 2. Compiles Sass to CSS
* 4. Autoprefixes it and generates style.css
* 5. Renames the CSS file with suffix -rtl and generates -rtl.css
* 6. Writes Sourcemaps for -rtl.css
* 7. Renames the CSS files with suffix .min.css
* 8. Minifies the CSS file and generates -rtl.min.css
* 9. Injects CSS or reloads the browser via browserSync
*/
gulp.task( 'addonStylesRTL', ( done ) => {
// Exit task when no addon styles
if ( config.addonStyles.length === 0 ) {
return done();
}

// Process each addon style
var tasks = config.addonStyles.map( function ( addon ) {

return gulp
.src( addon.styleSRC, { allowEmpty: true })
.pipe( plumber( errorHandler ) )
.pipe( sourcemaps.init() )
.pipe(
sass({
errLogToConsole: config.errLogToConsole,
outputStyle: config.outputStyle,
precision: config.precision
})
)
.on( 'error', sass.logError )
.pipe( sourcemaps.write({ includeContent: false }) )
.pipe( sourcemaps.init({ loadMaps: true }) )
.pipe( autoprefixer( config.BROWSERS_LIST ) )
.pipe( lineec() ) // Consistent Line Endings for non UNIX systems.
.pipe( rename({ suffix: '-rtl' }) ) // Append "-rtl" to the filename.
.pipe( rtlcss() ) // Convert to RTL.
.pipe( sourcemaps.write( './' ) ) // Output sourcemap for -rtl.css.
.pipe( gulp.dest( addon.styleDestination ) )
.pipe( filter( '**/*.css' ) ) // Filtering stream to only css files.
.pipe( browserSync.stream() ) // Reloads .css or -rtl.css, if that is enqueued.
.pipe( mmq({ log: true }) ) // Merge Media Queries only for .min.css version.
.pipe( rename({ suffix: '.min' }) )
.pipe( minifycss({ maxLineLen: 10 }) )
.pipe( lineec() ) // Consistent Line Endings for non UNIX systems.
.pipe( gulp.dest( addon.styleDestination ) )
.pipe( filter( '**/*.css' ) ) // Filtering stream to only css files.
.pipe( browserSync.stream() ) // Reloads .css or -rtl.css, if that is enqueued.
.pipe( notify({ message: '\n\n✅ ===> ADDON STYLES RTL — completed!\n', onLast: true }) );

} );

return merge( tasks );
});

/**
* Task: `vendorsJS`.
*
Expand Down Expand Up @@ -357,7 +475,7 @@ gulp.task(
'default',
gulp.parallel( 'styles', 'vendorsJS', 'customJS', 'images', browsersync, () => {
gulp.watch( config.watchPhp, reload ); // Reload on PHP file changes.
gulp.watch( config.watchStyles, gulp.parallel( 'styles' ) ); // Reload on SCSS file changes.
gulp.watch( config.watchStyles, gulp.parallel( 'styles', 'addonStyles' ) ); // Reload on SCSS file changes.
gulp.watch( config.watchJsVendor, gulp.series( 'vendorsJS', reload ) ); // Reload on vendorsJS file changes.
gulp.watch( config.watchJsCustom, gulp.series( 'customJS', reload ) ); // Reload on customJS file changes.
gulp.watch( config.imgSRC, gulp.series( 'images', reload ) ); // Reload on customJS file changes.
Expand Down
5 changes: 4 additions & 1 deletion src/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,15 @@
"gulp-sourcemaps": "^2.6.2",
"gulp-uglify": "^3.0.0",
"gulp-uglifycss": "^1.0.6",
"gulp-wp-pot": "^2.0.7"
"gulp-wp-pot": "^2.0.7",
"merge-stream": "^1.0.1"
},
"scripts": {
"start": "gulp",
"styles": "gulp styles",
"addonStyles": "gulp addonStyles",
"stylesRTL": "gulp stylesRTL",
"addonStylesRTL": "gulp addonStylesRTL",
"vendorsJS": "gulp vendorsJS",
"customJS": "gulp customJS",
"images": "gulp images",
Expand Down
9 changes: 9 additions & 0 deletions src/wpgulp.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,15 @@ module.exports = {
errLogToConsole: true,
precision: 10,

// Add-on Style options
// The following list is a set of SCSS/CSS files which you want to process and place it on a different folder.
addonStyles: [
{
styleSRC: './assets/css/addon.scss', // Path to .scss file.
styleDestination: './', // Path to place the compiled CSS file. Default set to root folder.
},
],

mintbird marked this conversation as resolved.
Show resolved Hide resolved
// JS Vendor options.
jsVendorSRC: './assets/js/vendor/*.js', // Path to JS vendor folder.
jsVendorDestination: './assets/js/', // Path to place the compiled JS vendors file.
Expand Down