diff --git a/README.md b/README.md index 704c16e..e34a1a6 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,15 @@ it when you need to submit, upload, print, or email resumes in specific formats. fluentcv BUILD r1.json r2.json TO out/rez.html out/rez.md foo/rez.all ``` +- `new` creates a new resume in FRESH or JSON Resume format. + + ```bash + # fluentcv NEW [-f ] + fluentcv NEW resume.json + fluentcv NEW resume.json -f fresh + fluentcv NEW r1.json r2.json -f jrs + ``` + - `convert` converts your source resume between FRESH and JSON Resume formats. Use it to convert between the two formats to take advantage of tools and services. diff --git a/src/core/empty-fresh.json b/src/core/empty-fresh.json new file mode 100644 index 0000000..347def5 --- /dev/null +++ b/src/core/empty-fresh.json @@ -0,0 +1,182 @@ +{ + + "name": "", + + "meta": { + "format": "FRESH@0.1.0", + "version": "0.1.0" + }, + + "info": { + "label": "", + "characterClass": "", + "brief": "", + "image": "" + }, + + "contact": { + "website": "", + "phone": "", + "email": "", + "other": [] + }, + + "location": { + "address": "", + "city": "", + "region": "", + "code": "", + "country": "" + }, + + "social": [ + { + "label": "", + "network": "", + "user": "", + "url": "" + } + ], + + "employment": { + "summary": "", + "history": [ + { + "employer": "", + "url": "", + "position": "", + "summary": "", + "start": "", + "keywords": [], + "highlights": [] + } + ] + }, + + "education": { + "summary": "", + "level": "", + "degree": "", + "history": [ + { + "institution": "", + "url": "", + "start": "", + "end": "", + "grade": "", + "summary": "", + "curriculum": [] + } + ] + }, + + "service": { + "summary": "", + "history": [ + { + "flavor": "", + "position": "", + "organization": "", + "url": "", + "start": "", + "end": "", + "summary": "", + "highlights": [] + } + ] + }, + + "skills": { + + "sets": [ + { + "name": "", + "skills": [] + } + ], + + "list": [ ] + }, + + "samples": [ + { + "title": "", + "summary": "", + "url": "", + "date": "" + } + ], + + "writing": [ + { + "title": "", + "flavor": "", + "date": "", + "publisher": { + "name": "", + "url": "" + }, + "url": "" + } + ], + + "reading": [ + { + "title": "", + "flavor": "", + "url": "", + "author": "" + } + ], + + "recognition": [ + { + "flavor": "", + "from": "", + "title": "", + "event": "", + "date": "", + "summary": "" + } + ], + + "references": [ + { + "name": "", + "flavor": "", + "private": true, + "contact": [ + { + "label": "", + "flavor": "", + "value": "" + } + ] + } + ], + + "testimonials": [ + { + "name": "", + "flavor": "", + "quote": "" + } + ], + + "languages": [ + { + "language": "", + "level": "", + "years": 0 + } + ], + + "interests": [ + { + "name": "", + "summary": "", + "keywords": [] + } + ] + +} diff --git a/src/core/empty.json b/src/core/empty-jrs.json similarity index 100% rename from src/core/empty.json rename to src/core/empty-jrs.json diff --git a/src/core/fresh-resume.js b/src/core/fresh-resume.js index fafe024..fb647ef 100644 --- a/src/core/fresh-resume.js +++ b/src/core/fresh-resume.js @@ -143,9 +143,10 @@ Definition of the FRESHResume class. delete this.employment; delete this.service; delete this.education; - //delete this.awards; - delete this.publications; - //delete this.interests; + delete this.recognition; + delete this.reading; + delete this.writing; + delete this.interests; delete this.skills; delete this.social; }; @@ -154,7 +155,7 @@ Definition of the FRESHResume class. Get the default (empty) sheet. */ FreshResume.default = function() { - return new FreshResume().open( PATH.join( __dirname, 'empty.json'), 'Empty' ); + return new FreshResume().open( PATH.join( __dirname, 'empty-fresh.json'), 'Empty' ); } /** @@ -243,7 +244,7 @@ Definition of the FRESHResume class. // return( a.safeDate.isBefore(b.safeDate) ) ? 1 // : ( a.safeDate.isAfter(b.safeDate) && -1 ) || 0; // }); - this.publications && this.publications.sort( function(a, b) { + this.writing && this.writing.sort( function(a, b) { return( a.safe.date.isBefore(b.safe.date) ) ? 1 : ( a.safe.date.isAfter(b.safe.date) && -1 ) || 0; }); diff --git a/src/core/jrs-resume.js b/src/core/jrs-resume.js index b7fed04..b7bfba3 100644 --- a/src/core/jrs-resume.js +++ b/src/core/jrs-resume.js @@ -50,7 +50,7 @@ Definition of the JRSResume class. */ JRSResume.prototype.stringify = function() { function replacer( key,value ) { // Exclude these keys from stringification - return _.some(['meta', 'warnings', 'computed', 'filt', 'ctrl', 'index', + return _.some(['imp', 'warnings', 'computed', 'filt', 'ctrl', 'index', 'safeStartDate', 'safeEndDate', 'safeDate', 'safeReleaseDate', 'result', 'isModified', 'htmlPreview', 'display_progress_bar'], function( val ) { return key.trim() === val; } @@ -126,7 +126,7 @@ Definition of the JRSResume class. Get the default (empty) sheet. */ JRSResume.default = function() { - return new JRSResume().open( PATH.join( __dirname, 'empty.json'), 'Empty' ); + return new JRSResume().open( PATH.join( __dirname, 'empty-jrs.json'), 'Empty' ); } /** diff --git a/src/fluentcmd.js b/src/fluentcmd.js index 2a329ba..b836d5d 100644 --- a/src/fluentcmd.js +++ b/src/fluentcmd.js @@ -104,7 +104,7 @@ module.exports = function () { var theFormat = _fmts.filter( function( fmt ) { return fmt.name === fi.fmt.pre; })[0]; - MKDIRP.sync( path.dirname(fOut) ); // Ensure dest folder exists; + MKDIRP.sync( path.dirname( fOut ) ); // Ensure dest folder exists; theFormat.gen.generate( rez, fOut, _opts ); } catch( ex ) { @@ -227,6 +227,20 @@ module.exports = function () { }); } + /** + Create a new empty resume in either FRESH or JRS format. + */ + function create( src, dst, opts, logger ) { + _log = logger || console.log; + dst = src || ['resume.json']; + dst.forEach( function( t ) { + var safeFormat = opts.format.toUpperCase(); + _log('Creating '.useful +safeFormat.useful.bold+ ' resume: '.useful + t.useful.bold); + MKDIRP.sync( path.dirname( t ) ); // Ensure dest folder exists; + FLUENT[ safeFormat + 'Resume' ].default().save( t ); + }); + } + /** Display help documentation. */ @@ -275,6 +289,7 @@ module.exports = function () { build: generate, validate: validate, convert: convert, + new: create, help: help }, lib: require('./fluentlib'), diff --git a/src/index.js b/src/index.js index bb4b5f9..b5dd466 100644 --- a/src/index.js +++ b/src/index.js @@ -59,17 +59,14 @@ function main() { var splitAt = _.indexOf( params, 'to' ); if( splitAt === a._.length - 1 ) { // 'TO' cannot be the last argument - logMsg('Please '.warn + 'specify an output file'.warnBold + - ' for this operation or '.warn + 'omit the TO keyword'.warnBold + '.'.warn ); + logMsg('Please '.warn + 'specify an output file'.warn.bold + + ' for this operation or '.warn + 'omit the TO keyword'.warn.bold + + '.'.warn ); return; } var src = a._.slice(1, splitAt === -1 ? undefined : splitAt ); var dst = splitAt === -1 ? [] : a._.slice( splitAt + 1 ); - - // Preload our params array - //var dst = (a.o && ((typeof a.o === 'string' && [ a.o ]) || a.o)) || []; - //dst = (dst === true) ? [] : dst; // Handle -o with missing output file var parms = [ src, dst, opts, logMsg ]; // Invoke the action @@ -86,6 +83,7 @@ function getOpts( args ) { noPretty = noPretty && (noPretty === true || noPretty === 'true'); return { theme: args.t || 'modern', + format: args.f || 'FRESH', prettify: !noPretty, silent: args.s || args.silent }; @@ -105,7 +103,7 @@ function handleError( ex ) { Object.keys( FCMD.verbs ).map( function(v, idx, ar) { return (idx === ar.length - 1 ? 'or '.guide : '') + v.toUpperCase().guide; - }).join(', '.guide) + ") to get started.\n\n".guide + FS.readFileSync( PATH.join(__dirname, 'use.txt'), 'utf8' ).info.bold; + }).join(', '.guide) + ").\n\n".guide + FS.readFileSync( PATH.join(__dirname, 'use.txt'), 'utf8' ).info.bold; break; //case 4: msg = title + '\n' + ; break; case 5: msg = 'Please '.guide + 'specify the output resume file'.guide.bold + ' that should be created in the new format.'.guide; break; diff --git a/src/use.txt b/src/use.txt index 1072347..69249c3 100644 --- a/src/use.txt +++ b/src/use.txt @@ -2,21 +2,23 @@ Usage: fluentcv [TO ] [-t ] - should be BUILD, CONVERT, VALIDATE, or HELP. should + should be BUILD, NEW, CONVERT, VALIDATE, or HELP. should be the path to one or more FRESH or JSON Resume format resumes. should be the name of the destination resume to be created, if any. The parameter should be the name of a predefined theme (for example: -COMPACT, MINIMIST, MODERN, or HELLO-WORLD) or the relative path to a -custom theme. +COMPACT, MINIMIST, MODERN, or HELLO-WORLD) or the relative path to a custom +theme. fluentcv BUILD resume.json TO out/resume.all + fluentcv NEW resume.json fluentcv CONVERT resume.json TO resume-jrs.json fluentcv VALIDATE resume.json Both SOURCES and TARGETS can accept multiple files: fluentCV BUILD r1.json r2.json TO out/resume.all out2/resume.html + fluentCV NEW r1.json r2.json r3.json fluentCV VALIDATE resume.json resume2.json resume3.json -See https://github.com/fluentdesk/fluentCV/blob/master/README.md -for more information. +See https://github.com/fluentdesk/fluentCV/blob/master/README.md for more +information.