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 4 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
22 changes: 19 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 @@ -139,6 +139,22 @@ Configure the project paths and other variables inside the `wpgulp.config.js` fi

![wpgulp config](https://on.ahmda.ws/f2ca9bb4a740/c)

#### Add-on Styles Option
Copy link
Owner

Choose a reason for hiding this comment

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

This is not the right place for content like this. Kindly, create a new heading after installation call it, FAQs, ask a question and then answer it. 👍


This option is allow you to add more SCSS files for compilation to a different destination folder. Here is an example

```javascript
addonStyles: [
{
styleSRC: './assets/css/addon-1.scss', // Path to .scss file.
styleDestination: './', // Path to place the compiled CSS file. Default set to root folder.
},
{
styleSRC: './assets/css/addon-2.scss', // Path to .scss file.
styleDestination: './foo/bar/', // Path to place the compiled CSS file. Set to some folder.
},
],
```

### → `STEP #3` — Start your project

Expand All @@ -157,7 +173,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
167 changes: 119 additions & 48 deletions src/gulpfile.babel.js
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,9 @@ 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' );
const gulpif = require('gulp-if');
const defaults = require('lodash.defaults');

/**
* Custom Error Handler.
Expand Down Expand Up @@ -99,22 +102,22 @@ const reload = done => {
};

/**
* Task: `styles`.
*
* 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 style.css
* This function does the following:
* 1. Compiles Sass to CSS
* 2. Writes Sourcemaps for it
* 3. Autoprefixes it and generates .css
* 4. Renames the CSS file with suffix -rtl and generates -rtl.css
* 5. Renames the CSS file with suffix .min.css
* 6. Minifies the CSS file and generates style.min.css
* 6. Minifies the CSS file and generates .min.css
* 7. Injects CSS or reloads the browser via browserSync
*/
gulp.task( 'styles', () => {
return gulp
.src( config.styleSRC, { allowEmpty: true })
function processStyle( gulpStream, processOptions = {} ) {
processOptions = defaults( processOptions, {
isRTL: false,
styleDestination: './',
Copy link
Owner

Choose a reason for hiding this comment

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

Even with simple styles the styleDestination should always be provided for folks who change the location of it for some reason.

} );

return gulpStream
.pipe( plumber( errorHandler ) )
.pipe( sourcemaps.init() )
.pipe(
Expand All @@ -128,19 +131,75 @@ gulp.task( 'styles', () => {
.pipe( sourcemaps.write({ includeContent: false }) )
.pipe( sourcemaps.init({ loadMaps: true }) )
.pipe( autoprefixer( config.BROWSERS_LIST ) )
.pipe( sourcemaps.write( './' ) )
.pipe( gulpif( ! processOptions.isRTL, sourcemaps.write( './' ) ) ) // Write source map at this step if not RTL.
.pipe( lineec() ) // Consistent Line Endings for non UNIX systems.
.pipe( gulp.dest( config.styleDestination ) )
mintbird marked this conversation as resolved.
Show resolved Hide resolved
.pipe( gulpif( processOptions.isRTL, rename({ suffix: '-rtl' }) ) ) // Append "-rtl" to the filename.
.pipe( gulpif( processOptions.isRTL, rtlcss() ) ) // Convert to RTL.
.pipe( gulpif( processOptions.isRTL, sourcemaps.write( './' ) ) ) // Write source map at this step if RTL.
.pipe( gulp.dest( processOptions.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 style.css if that is enqueued.
.pipe( rename({ suffix: '.min' }) )
.pipe( minifycss({ maxLineLen: 10 }) )
.pipe( lineec() ) // Consistent Line Endings for non UNIX systems.
.pipe( gulp.dest( config.styleDestination ) )
.pipe( gulp.dest( processOptions.styleDestination ) )
.pipe( filter( '**/*.css' ) ) // Filtering stream to only css files.
.pipe( browserSync.stream() ) // Reloads style.min.css if that is enqueued.
.pipe( notify({ message: '\n\n✅ ===> STYLES — completed!\n', onLast: true }) );
;
}

/**
* Task: `styles`.
*
* 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 style.css
* 5. Renames the CSS file with suffix .min.css
* 6. Minifies the CSS file and generates style.min.css
* 7. Injects CSS or reloads the browser via browserSync
*/
gulp.task( 'styles', () => {
return processStyle(
gulp.src( config.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.

Missing styleDestination.

).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 processStyle(
gulp.src( addon.styleSRC, { allowEmpty: true }),
{ styleDestination: addon.styleDestination }
).pipe( notify({ message: '\n\n✅ ===> ADDON STYLES — completed!\n', onLast: true }) );

} );

return merge( tasks );
});

/**
Expand All @@ -159,36 +218,48 @@ gulp.task( 'styles', () => {
* 9. Injects CSS or reloads the browser via browserSync
*/
gulp.task( 'stylesRTL', () => {
return gulp
.src( config.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 style-rtl.css.
.pipe( gulp.dest( config.styleDestination ) )
.pipe( filter( '**/*.css' ) ) // Filtering stream to only css files.
.pipe( browserSync.stream() ) // Reloads style.css or style-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( config.styleDestination ) )
.pipe( filter( '**/*.css' ) ) // Filtering stream to only css files.
.pipe( browserSync.stream() ) // Reloads style.css or style-rtl.css, if that is enqueued.
.pipe( notify({ message: '\n\n✅ ===> STYLES RTL — completed!\n', onLast: true }) );
return processStyle(
gulp.src( config.styleSRC, { allowEmpty: true }),
mintbird marked this conversation as resolved.
Show resolved Hide resolved
{ isRTL: true }
).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 processStyle(
gulp.src( addon.styleSRC, { allowEmpty: true }),
{
styleDestination: addon.styleDestination,
isRTL: true,
}
).pipe( notify({ message: '\n\n✅ ===> ADDON STYLES RTL — completed!\n', onLast: true }) );

} );

return merge( tasks );
});

/**
Expand Down Expand Up @@ -357,7 +428,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
7 changes: 6 additions & 1 deletion src/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
"gulp-cache": "^1.0.2",
"gulp-concat": "^2.5.2",
"gulp-filter": "^5.1.0",
"gulp-if": "^2.0.2",
"gulp-imagemin": "^4.1.0",
"gulp-line-ending-corrector": "^1.0.1",
"gulp-merge-media-queries": "^0.2.1",
Expand All @@ -35,12 +36,16 @@
"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",
"lodash.defaults": "^4.2.0",
"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
5 changes: 5 additions & 0 deletions src/wpgulp.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@ 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.
// Please see README.md for usage.
addonStyles: [],

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