diff --git a/.gitignore b/.gitignore index c078762c7..7fa7ed1ce 100755 --- a/.gitignore +++ b/.gitignore @@ -3,8 +3,8 @@ test/coverage/ coverage/ src/**/site/ dist/ -src/semantic.config -semantic.config +theme.config +semantic.json # Numerous always-ignore extensions *.diff diff --git a/gulpfile.js b/gulpfile.js index 7b160caed..de764852f 100755 --- a/gulpfile.js +++ b/gulpfile.js @@ -400,19 +400,21 @@ gulp.task('check install', false, function () { }); gulp.task('install', 'Set-up project for first time', function () { - console.clear(); return gulp .src(defaults.paths.source.config) - .pipe(prompt.prompt(questions.setup, function( answers ) { + .pipe(prompt.prompt(questions.setup, function(answers) { var - trailingSlash = /(\/$|\\$)+/mg, - templates = { + siteVariable = /@siteFolder .*\'(.*)\'/mg, + templates = { theme : './src/theme.config.example', json : './semantic.json.example', site : './src/_site' }, siteDestination = answers.site || './src/site', + themeDestination = './src/theme.config', + + pathToSite = path.relative(path.resolve('./src'), path.resolve(siteDestination)), configExists = fs.existsSync('./semantic.json'), themeConfigExists = fs.existsSync('./src/theme.config'), @@ -428,10 +430,16 @@ gulp.task('install', 'Set-up project for first time', function () { } } ; + + // exit if config exists and user specifies no overwrite if(answers.overwrite !== undefined && answers.overwrite == 'no') { return; } + console.clear(); + console.log('Installing'); + console.log('------------------------------'); + // create site files if(siteExists) { console.info('Site folder exists, merging files (no overwrite)', siteDestination); @@ -439,26 +447,32 @@ gulp.task('install', 'Set-up project for first time', function () { else { console.info('Creating site theme folder', siteDestination); } - // need wrench for recursive copy without overwrite + // copy recursively without overwrite wrench.copyDirSyncRecursive(templates.site, siteDestination, settings.wrench.recursive); - // write theme less config if(themeConfigExists) { - console.log('./src/theme.config already exists, skipping'); + console.error('./src/theme.config already exists, skipping'); } else { console.info('Creating src/theme.config (LESS config)'); - fs.createReadStream(templates.theme) - .pipe(fs.createWriteStream('./src/theme.config', { flags: 'wx+' })) + gulp.src(templates.theme) + .pipe(gulp.dest(themeDestination)) ; } - // write semantic json config + // adjust less variable for site folder location + console.info('Adjusting @siteFolder', pathToSite); + gulp.src(themeDestination) + .pipe(replace(siteVariable, pathToSite)) + .pipe(gulp.dest(themeDestination)) + ; + + // determine semantic.json config if(answers.components) { json.components = answers.components; } if(answers.dist) { - answers.dist = answers.dist.replace(trailingSlash, ''); + answers.dist = answers.dist; json.paths.output = { packaged : answers.dist + '/', uncompressed : answers.dist + '/components/', @@ -467,28 +481,25 @@ gulp.task('install', 'Set-up project for first time', function () { }; } if(answers.site) { - answers.site = answers.site.replace(trailingSlash, ''); json.paths.source.site = answers.site + '/'; } if(answers.packaged) { - answers.packaged = answers.packaged.replace(trailingSlash, ''); json.paths.output.packaged = answers.packaged + '/'; } if(answers.compressed) { - answers.compressed = answers.compressed.replace(trailingSlash, ''); json.paths.output.compressed = answers.compressed + '/'; } if(answers.uncompressed) { - answers.uncompressed = answers.uncompressed.replace(trailingSlash, ''); json.paths.output.uncompressed = answers.uncompressed + '/'; } + + // write semantic.json if(configExists) { console.info('Extending semantic.json (Gulp config)'); gulp.src(jsonSource) .pipe(plumber()) .pipe(rename(settings.rename.json)) .pipe(jeditor(json)) - .pipe(debug()) .pipe(gulp.dest('./')) ; } @@ -498,21 +509,40 @@ gulp.task('install', 'Set-up project for first time', function () { .pipe(plumber()) .pipe(rename({ extname : '' })) .pipe(jeditor(json)) - .pipe(debug()) .pipe(gulp.dest('./')) ; } + console.log(''); + console.log(''); + })) + .pipe(prompt.prompt(questions.cleanup, function(answers) { + if(answers.cleanup == 'yes') { + del([ + './src/theme.config.example', + './semantic.json.example', + './src/_site' + ]); + } + if(answers.build == 'yes') { + gulp.start('build'); + } })) -/* .pipe(prompt.prompt(questions.site, function( answers ) { + ; +}); + + +/* TODO add site theming into install process + +gulp.task('config', 'Configure basic site settings', function () { + gulp.src('./') + .pipe(prompt.prompt(questions.site, function(answers) { console.clear(); console.log('Creating site theme file'); console.info('Creating site variables file'); - }))*/ - ; + })) }); -gulp.task('config', 'Configure basic site settings', function () { -}); +*/ diff --git a/src/theme.config b/src/theme.config deleted file mode 100644 index 0476e83c6..000000000 --- a/src/theme.config +++ /dev/null @@ -1,125 +0,0 @@ -/* - -███████╗███████╗███╗ ███╗ █████╗ ███╗ ██╗████████╗██╗ ██████╗ ██╗ ██╗██╗ -██╔════╝██╔════╝████╗ ████║██╔══██╗████╗ ██║╚══██╔══╝██║██╔════╝ ██║ ██║██║ -███████╗█████╗ ██╔████╔██║███████║██╔██╗ ██║ ██║ ██║██║ ██║ ██║██║ -╚════██║██╔══╝ ██║╚██╔╝██║██╔══██║██║╚██╗██║ ██║ ██║██║ ██║ ██║██║ -███████║███████╗██║ ╚═╝ ██║██║ ██║██║ ╚████║ ██║ ██║╚██████╗ ╚██████╔╝██║ -╚══════╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═╝ - -*/ - -/******************************* - Folders -*******************************/ - -/* Path to theme packages */ -@themesFolder : 'themes/'; - -/* Path to site override folder */ -@siteFolder : '_site/'; - - -/******************************* - Themes -*******************************/ - -/* To override a theme for an individual element - specify theme name below - - Be sure to update the user folder name (see README) -*/ - -/* Global */ -@site : 'default'; -@reset : 'default'; - -/* Elements */ -@button : 'default'; -@container : 'default'; -@icon : 'default'; -@divider : 'default'; -@flag : 'default'; -@header : 'default'; -@image : 'default'; -@input : 'default'; -@label : 'default'; -@list : 'default'; -@loader : 'default'; -@progress : 'default'; -@rail : 'default'; -@reveal : 'default'; -@segment : 'default'; -@step : 'default'; - -/* Collections */ -@breadcrumb : 'default'; -@form : 'default'; -@grid : 'default'; -@menu : 'default'; -@message : 'default'; -@table : 'default'; - -/* Modules */ -@accordion : 'default'; -@chatroom : 'default'; -@checkbox : 'default'; -@dimmer : 'default'; -@dropdown : 'default'; -@modal : 'default'; -@nag : 'default'; -@popup : 'default'; -@rating : 'default'; -@search : 'default'; -@shape : 'default'; -@sidebar : 'default'; -@sticky : 'default'; -@tab : 'default'; -@transition : 'default'; -@video : 'default'; - -/* Views */ -@card : 'default'; -@comment : 'default'; -@feed : 'default'; -@item : 'default'; -@statistic : 'default'; - - -/******************************* - Import Directives -*******************************/ - -@theme : @@element; - -/*------------------ - Load Default --------------------*/ - -@import "@{themesFolder}/default/globals/site.variables"; -@import "@{themesFolder}/default/@{type}s/@{element}.variables"; - -/*------------------ - Load Theme --------------------*/ - -@import "@{themesFolder}/@{site}/globals/site.variables"; -@import "@{themesFolder}/@{theme}/@{type}s/@{element}.variables"; - -/*------------------ - Load Site --------------------*/ - -@import "@{siteFolder}/globals/site.variables"; -@import "@{siteFolder}/@{type}s/@{element}.variables"; - -/*------------------ - Overrides --------------------*/ - -.loadUIOverrides() { - @import "@{themesFolder}/@{theme}/@{type}s/@{element}.overrides"; - @import "@{siteFolder}/@{type}s/@{element}.overrides"; -} - -/* End Config */ \ No newline at end of file diff --git a/tasks/defaults.js b/tasks/defaults.js old mode 100644 new mode 100755 index 0d4dbe573..b08e2ae8f --- a/tasks/defaults.js +++ b/tasks/defaults.js @@ -5,10 +5,10 @@ module.exports = { paths: { source: { - config : 'src/', - definitions : 'src/', - site : 'src/', - themes : 'src/' + config : 'src/theme.config', + definitions : 'src/definitions', + site : 'src/site', + themes : 'src/themes' }, output: { packaged : 'dist/', diff --git a/tasks/questions.js b/tasks/questions.js index 6e530be48..de3018e84 100755 --- a/tasks/questions.js +++ b/tasks/questions.js @@ -2,11 +2,17 @@ Install Questions *******************************/ -var defaults, fs, when; +var defaults, fs, filter, when; fs = require('fs'); defaults = require('./defaults'); +filter = { + removeTrailingSlash: function(path) { + return path.replace(/(\/$|\\$)+/mg, ''); + } +}; + when = { // set-up @@ -133,6 +139,7 @@ module.exports = { name: 'dist', message: 'Where should we output Semantic UI?', default: defaults.paths.output.packaged, + filter: filter.removeTrailingSlash, when: when.express }, { @@ -140,6 +147,7 @@ module.exports = { name: 'site', message: 'Where should we put your site folder?', default: defaults.paths.source.site, + filter: filter.removeTrailingSlash, when: when.custom }, { @@ -147,6 +155,7 @@ module.exports = { name: 'packaged', message: 'Where should we output a packaged version?', default: defaults.paths.output.packaged, + filter: filter.removeTrailingSlash, when: when.custom }, { @@ -154,6 +163,7 @@ module.exports = { name: 'compressed', message: 'Where should we output compressed components?', default: defaults.paths.output.compressed, + filter: filter.removeTrailingSlash, when: when.custom }, { @@ -161,10 +171,44 @@ module.exports = { name: 'uncompressed', message: 'Where should we output uncompressed components?', default: defaults.paths.output.uncompressed, + filter: filter.removeTrailingSlash, when: when.custom } ], + + cleanup: [ + { + type: 'list', + name: 'cleanup', + message: 'Install Complete! Should we remove set-up files?', + choices: [ + { + name: 'Yes (re-install will require redownloading semantic).', + value: 'yes' + }, + { + name: 'No Thanks', + value: 'no' + } + ] + }, + { + type: 'list', + name: 'build', + message: 'Do you want to build Semantic now?', + choices: [ + { + name: 'Yes, make those files', + value: 'yes' + }, + { + name: 'No, I\'ll do it later', + value: 'no' + } + ] + }, + ], site: [ { type: 'list',