mirror of
https://github.com/JuanCanham/HackMyResume.git
synced 2024-11-23 00:40:10 +00:00
Refactor.
This commit is contained in:
parent
97c9ba08d0
commit
5e51beddf7
@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
Definition of the TemplateGenerator class.
|
Definition of the TemplateGenerator class.
|
||||||
@license MIT. Copyright (c) 2015 James Devlin / FluentDesk.
|
@license MIT. See LICENSE.md for details.
|
||||||
@module template-generator.js
|
@module template-generator.js
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -78,7 +78,14 @@ Definition of the TemplateGenerator class.
|
|||||||
@method invoke
|
@method invoke
|
||||||
@param rez A FreshResume object.
|
@param rez A FreshResume object.
|
||||||
@param opts Generator options.
|
@param opts Generator options.
|
||||||
@returns An array of strings representing generated output files.
|
@returns An array of objects representing the generated output files. Each
|
||||||
|
object has this format:
|
||||||
|
|
||||||
|
{
|
||||||
|
files: [ { info: { }, data: [ ] }, { ... } ],
|
||||||
|
themeInfo: { }
|
||||||
|
}
|
||||||
|
|
||||||
*/
|
*/
|
||||||
invoke: function( rez, opts ) {
|
invoke: function( rez, opts ) {
|
||||||
|
|
||||||
@ -183,6 +190,8 @@ Definition of the TemplateGenerator class.
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return genInfo;
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,19 +1,27 @@
|
|||||||
|
/**
|
||||||
|
Implementation of the 'generate' verb for HackMyResume.
|
||||||
|
@module generate.js
|
||||||
|
@license MIT. See LICENSE.md for details.
|
||||||
|
*/
|
||||||
|
|
||||||
(function() {
|
(function() {
|
||||||
|
|
||||||
var PATH = require('path')
|
var PATH = require('path')
|
||||||
, FS = require('fs')
|
, FS = require('fs')
|
||||||
, parsePath = require('parse-filepath')
|
|
||||||
, MD = require('marked')
|
, MD = require('marked')
|
||||||
, MKDIRP = require('mkdirp')
|
, MKDIRP = require('mkdirp')
|
||||||
|
, EXTEND = require('../utils/extend')
|
||||||
|
, parsePath = require('parse-filepath')
|
||||||
, _opts = require('../core/default-options')
|
, _opts = require('../core/default-options')
|
||||||
, FluentTheme = require('../core/fresh-theme')
|
, FluentTheme = require('../core/fresh-theme')
|
||||||
, JRSTheme = require('../core/jrs-theme')
|
, JRSTheme = require('../core/jrs-theme')
|
||||||
, ResumeFactory = require('../core/resume-factory')
|
, ResumeFactory = require('../core/resume-factory')
|
||||||
, _ = require('underscore')
|
, _ = require('underscore')
|
||||||
, _fmts = require('../core/default-formats')
|
, _fmts = require('../core/default-formats')
|
||||||
, unused = require('string.prototype.startswith')
|
|
||||||
, _err, _log, rez;
|
, _err, _log, rez;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Handle an exception.
|
Handle an exception.
|
||||||
*/
|
*/
|
||||||
@ -21,7 +29,7 @@
|
|||||||
throw ex;
|
throw ex;
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports =
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Given a source resume in FRESH or JRS format, a destination resume path, and a
|
Given a source resume in FRESH or JRS format, a destination resume path, and a
|
||||||
@ -31,33 +39,18 @@
|
|||||||
@param theme Friendly name of the resume theme. Defaults to "modern".
|
@param theme Friendly name of the resume theme. Defaults to "modern".
|
||||||
@param logger Optional logging override.
|
@param logger Optional logging override.
|
||||||
*/
|
*/
|
||||||
function generate( src, dst, opts, logger, errHandler ) {
|
function build( src, dst, opts, logger, errHandler ) {
|
||||||
|
|
||||||
|
// Housekeeping...
|
||||||
_log = logger || console.log;
|
_log = logger || console.log;
|
||||||
_err = errHandler || error;
|
_err = errHandler || error;
|
||||||
|
|
||||||
//_opts = extend( true, _opts, opts );
|
//_opts = extend( true, _opts, opts );
|
||||||
_opts.theme = (opts.theme && opts.theme.toLowerCase().trim())|| 'modern';
|
_opts.theme = (opts.theme && opts.theme.toLowerCase().trim())|| 'modern';
|
||||||
_opts.prettify = opts.prettify === true ? _opts.prettify : false;
|
_opts.prettify = opts.prettify === true ? _opts.prettify : false;
|
||||||
|
|
||||||
// Verify the specified theme name/path
|
// Load the theme...
|
||||||
var relativeThemeFolder = '../../node_modules/fluent-themes/themes';
|
var tFolder = verify_theme( _opts.theme );
|
||||||
var tFolder = PATH.resolve( __dirname, relativeThemeFolder, _opts.theme);
|
var theTheme = load_theme( tFolder );
|
||||||
var exists = require('path-exists').sync;
|
|
||||||
if( !exists( tFolder ) ) {
|
|
||||||
tFolder = PATH.resolve( _opts.theme );
|
|
||||||
if (!exists( tFolder )) {
|
|
||||||
throw { fluenterror: 1, data: _opts.theme };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load the theme
|
|
||||||
var theTheme = _opts.theme.startsWith('jsonresume-theme') ?
|
|
||||||
new JRSTheme().open(tFolder) : new FluentTheme().open( tFolder );
|
|
||||||
_opts.themeObj = theTheme;
|
|
||||||
var numFormats = theTheme.formats ? Object.keys(theTheme.formats).length : 2;
|
|
||||||
_log( 'Applying '.info + theTheme.name.toUpperCase().infoBold +
|
|
||||||
(' theme (' + numFormats + ' formats)').info);
|
|
||||||
|
|
||||||
// Load input resumes...
|
// Load input resumes...
|
||||||
if( !src || !src.length ) { throw { fluenterror: 3 }; }
|
if( !src || !src.length ) { throw { fluenterror: 3 }; }
|
||||||
@ -73,41 +66,28 @@
|
|||||||
});
|
});
|
||||||
msg && _log(msg);
|
msg && _log(msg);
|
||||||
|
|
||||||
// Expand output resumes... (can't use map() here)
|
// Expand output resumes...
|
||||||
var targets = [], that = this;
|
var targets = expand( dst, theTheme );
|
||||||
( (dst && dst.length && dst) || ['resume.all'] ).forEach( function(t) {
|
|
||||||
|
|
||||||
var to = PATH.resolve(t),
|
|
||||||
pa = parsePath(to),
|
|
||||||
fmat = pa.extname || '.all';
|
|
||||||
|
|
||||||
targets.push.apply(
|
|
||||||
targets, fmat === '.all' ?
|
|
||||||
|
|
||||||
Object.keys( theTheme.formats ).map(function(k){
|
|
||||||
var z = theTheme.formats[k];
|
|
||||||
return { file: to.replace(/all$/g,z.outFormat), fmt: z };
|
|
||||||
}) :
|
|
||||||
|
|
||||||
[{ file: to, fmt: theTheme.getFormat( fmat.slice(1) ) }]);
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
// Run the transformation!
|
// Run the transformation!
|
||||||
var finished = targets.map( function(t) { return single(t, theTheme); });
|
var finished = targets.map( function(t) {
|
||||||
|
return EXTEND(true, t, { markup: single(t, theTheme) });
|
||||||
|
});
|
||||||
|
|
||||||
// Don't send the client back empty-handed
|
// Don't send the client back empty-handed
|
||||||
return { sheet: rez, targets: targets, processed: finished };
|
return { sheet: rez, targets: targets, processed: finished };
|
||||||
};
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Generate a single resume of a specific format.
|
Generate a single resume of a specific format. TODO: Refactor.
|
||||||
@param f Full path to the destination resume to generate, for example,
|
@param targInfo Information for the target resume.
|
||||||
"/foo/bar/resume.pdf" or "c:\foo\bar\resume.txt".
|
@param theme A FRESHTheme or JRSTheme object.
|
||||||
*/
|
*/
|
||||||
function single( targInfo, theme ) {
|
function single( targInfo, theme ) {
|
||||||
|
|
||||||
function MDIN(txt) {
|
function MDIN(txt) { // TODO: Move this
|
||||||
return MD(txt || '' ).replace(/^\s*<p>|<\/p>\s*$/gi, '');
|
return MD(txt || '' ).replace(/^\s*<p>|<\/p>\s*$/gi, '');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -117,14 +97,13 @@
|
|||||||
, fName = PATH.basename(f, '.' + fType)
|
, fName = PATH.basename(f, '.' + fType)
|
||||||
, theFormat;
|
, theFormat;
|
||||||
|
|
||||||
|
_log( 'Generating '.useful +
|
||||||
|
targInfo.fmt.outFormat.toUpperCase().useful.bold +
|
||||||
|
' resume: '.useful + PATH.relative(process.cwd(), f ).useful.bold );
|
||||||
|
|
||||||
// If targInfo.fmt.files exists, this format is backed by a document.
|
// If targInfo.fmt.files exists, this format is backed by a document.
|
||||||
// Fluent/FRESH themes are handled here.
|
// Fluent/FRESH themes are handled here.
|
||||||
if( targInfo.fmt.files && targInfo.fmt.files.length ) {
|
if( targInfo.fmt.files && targInfo.fmt.files.length ) {
|
||||||
|
|
||||||
_log( 'Generating '.useful +
|
|
||||||
targInfo.fmt.outFormat.toUpperCase().useful.bold +
|
|
||||||
' resume: '.useful + PATH.relative(process.cwd(), f ).replace(/\\/g,'/').useful.bold);
|
|
||||||
|
|
||||||
theFormat = _fmts.filter(
|
theFormat = _fmts.filter(
|
||||||
function(fmt) { return fmt.name === targInfo.fmt.outFormat; })[0];
|
function(fmt) { return fmt.name === targInfo.fmt.outFormat; })[0];
|
||||||
MKDIRP.sync( PATH.dirname( f ) ); // Ensure dest folder exists;
|
MKDIRP.sync( PATH.dirname( f ) ); // Ensure dest folder exists;
|
||||||
@ -134,9 +113,6 @@
|
|||||||
// Otherwise this is either a) a JSON Resume theme or b) an ad-hoc format
|
// Otherwise this is either a) a JSON Resume theme or b) an ad-hoc format
|
||||||
// (JSON, YML, or PNG) that every theme gets "for free".
|
// (JSON, YML, or PNG) that every theme gets "for free".
|
||||||
else {
|
else {
|
||||||
_log( 'Generating '.useful +
|
|
||||||
targInfo.fmt.outFormat.toUpperCase().useful.bold +
|
|
||||||
' resume: '.useful + PATH.relative(process.cwd(), f ).replace(/\\/g,'/').useful.bold);
|
|
||||||
|
|
||||||
theFormat = _fmts.filter( function(fmt) {
|
theFormat = _fmts.filter( function(fmt) {
|
||||||
return fmt.name === targInfo.fmt.outFormat;
|
return fmt.name === targInfo.fmt.outFormat;
|
||||||
@ -175,9 +151,12 @@
|
|||||||
|
|
||||||
// Save the file
|
// Save the file
|
||||||
FS.writeFileSync( f, rezHtml );
|
FS.writeFileSync( f, rezHtml );
|
||||||
|
|
||||||
|
// Return markup to the client
|
||||||
|
return rezHtml;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
theFormat.gen.generate( rez, f, _opts );
|
return theFormat.gen.generate( rez, f, _opts );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -186,4 +165,72 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Expand output files.
|
||||||
|
*/
|
||||||
|
function expand( dst, theTheme ) {
|
||||||
|
var targets = [];
|
||||||
|
// (can't use map() here).
|
||||||
|
( (dst && dst.length && dst) || ['resume.all'] ).forEach( function(t) {
|
||||||
|
|
||||||
|
var to = PATH.resolve(t),
|
||||||
|
pa = parsePath(to),
|
||||||
|
fmat = pa.extname || '.all';
|
||||||
|
|
||||||
|
targets.push.apply(
|
||||||
|
targets, fmat === '.all' ?
|
||||||
|
|
||||||
|
Object.keys( theTheme.formats ).map(function(k){
|
||||||
|
var z = theTheme.formats[k];
|
||||||
|
return { file: to.replace(/all$/g,z.outFormat), fmt: z };
|
||||||
|
}) :
|
||||||
|
|
||||||
|
[{ file: to, fmt: theTheme.getFormat( fmat.slice(1) ) }]);
|
||||||
|
|
||||||
|
});
|
||||||
|
return targets;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Verify the specified theme name/path.
|
||||||
|
*/
|
||||||
|
function verify_theme( themeNameOrPath ) {
|
||||||
|
var tFolder = PATH.resolve(
|
||||||
|
__dirname,
|
||||||
|
'../../node_modules/fluent-themes/themes',
|
||||||
|
themeNameOrPath
|
||||||
|
);
|
||||||
|
var exists = require('path-exists').sync;
|
||||||
|
if( !exists( tFolder ) ) {
|
||||||
|
tFolder = PATH.resolve( themeNameOrPath );
|
||||||
|
if( !exists( tFolder ) ) {
|
||||||
|
throw { fluenterror: 1, data: _opts.theme };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return tFolder;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Load the specified theme.
|
||||||
|
*/
|
||||||
|
function load_theme( tFolder ) {
|
||||||
|
var theTheme = _opts.theme.indexOf('jsonresume-theme-') > -1 ?
|
||||||
|
new JRSTheme().open(tFolder) : new FluentTheme().open( tFolder );
|
||||||
|
_opts.themeObj = theTheme;
|
||||||
|
var numFormats = Object.keys(theTheme.formats).length;
|
||||||
|
_log( 'Applying '.info + theTheme.name.toUpperCase().infoBold +
|
||||||
|
(' theme (' + numFormats + ' formats)').info);
|
||||||
|
return theTheme;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
module.exports = build;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}());
|
}());
|
||||||
|
Loading…
Reference in New Issue
Block a user