1
0
mirror of https://github.com/JuanCanham/HackMyResume.git synced 2024-11-22 16:30:11 +00:00

Reaffirm string-based generation.

In recent commits, HackMyResume generation logic, much like the pilots
in Top Gun who became too reliant on air-to-air missiles and lost the
true art of dogfighting, has become dependent on file-based generation
as implicit file assumptions have crept in. This commit reaffirms the
file-less, string-based nature of the generation process and, as a side
effect, adjusts the behavior of (binary) PDF generation to match.
This commit is contained in:
hacksalot 2015-12-21 00:36:08 -05:00
parent 7c0354046c
commit a54476eede
5 changed files with 88 additions and 46 deletions

View File

@ -134,7 +134,7 @@ Definition of the Theme class.
action: 'transform', action: 'transform',
path: absPath, path: absPath,
major: isMajor, major: isMajor,
orgPath: PATH.relative(that.folder, absPath), orgPath: PATH.relative(tplFolder, absPath),
ext: pathInfo.ext.slice(1), ext: pathInfo.ext.slice(1),
title: friendlyName( outFmt ), title: friendlyName( outFmt ),
pre: outFmt, pre: outFmt,

View File

@ -161,7 +161,7 @@ Generic template helper definitions for FluentCV.
} }
else { else {
idx = Math.min( lvl / 2, 4 ); idx = Math.min( lvl / 2, 4 );
idx = Math.max( 0, intVal ); idx = Math.max( 0, idx );
} }
return idx; return idx;
} }

View File

@ -22,16 +22,6 @@ Definition of the HTMLGenerator class.
the HTML resume prior to saving. the HTML resume prior to saving.
*/ */
onBeforeSave: function( info ) { onBeforeSave: function( info ) {
var cssSrc = PATH.join( info.theme.folder, 'src', '*.css' )
, outFolder = PATH.parse( info.outputFile ).dir, that = this;
info.theme.cssFiles.forEach( function( f ) {
var fi = PATH.parse( f.path );
FS.copySync( f.path, PATH.join( outFolder, fi.base ), { clobber: true }, function( e ) {
throw { fluenterror: that.codes.copyCss, data: [cssSrc,cssDst] };
});
});
return this.opts.prettify ? return this.opts.prettify ?
HTML.prettyPrint( info.mk, this.opts.prettify ) : info.mk; HTML.prettyPrint( info.mk, this.opts.prettify ) : info.mk;
} }

View File

@ -23,8 +23,8 @@ Definition of the HtmlPdfGenerator class.
Generate the binary PDF. Generate the binary PDF.
*/ */
onBeforeSave: function( info ) { onBeforeSave: function( info ) {
pdf(info.mk, info.outputFile); pdf( info.mk, info.outputFile );
return info.mk; return null; // halt further processing
} }
}); });

View File

@ -38,7 +38,9 @@ Definition of the TemplateGenerator class.
raw: function( txt ) { return txt; }, raw: function( txt ) { return txt; },
xml: function( txt ) { return XML(txt); }, xml: function( txt ) { return XML(txt); },
md: function( txt ) { return MD( txt || '' ); }, md: function( txt ) { return MD( txt || '' ); },
mdin: function( txt ) { return MD(txt || '' ).replace(/^\s*<p>|<\/p>\s*$/gi, ''); }, mdin: function( txt ) {
return MD(txt || '' ).replace(/^\s*<p>|<\/p>\s*$/gi, '');
},
lower: function( txt ) { return txt.toLowerCase(); }, lower: function( txt ) { return txt.toLowerCase(); },
link: function( name, url ) { return url ? link: function( name, url ) { return url ?
'<a href="' + url + '">' + name + '</a>' : name; } '<a href="' + url + '">' + name + '</a>' : name; }
@ -69,24 +71,14 @@ Definition of the TemplateGenerator class.
}, },
invoke: function( rez, themeMarkup, cssInfo, opts ) {
this.opts = EXTEND( true, {}, _defaultOpts, opts );
mk = this.single( rez, themeMarkup, this.format, cssInfo, { } );
this.onBeforeSave && (mk = this.onBeforeSave( mk, themeFile, f ));
return mk;
},
/** /**
Default generation method for template-based generators. String-based template generation method.
@method generate @method invoke
@param rez A FreshResume object. @param rez A FreshResume object.
@param f Full path to the output resume file to generate.
@param opts Generator options. @param opts Generator options.
@returns An array of strings representing generated output files.
*/ */
generate: function( rez, f, opts ) { invoke: function( rez, opts ) {
// Carry over options // Carry over options
this.opts = EXTEND( true, { }, _defaultOpts, opts ); this.opts = EXTEND( true, { }, _defaultOpts, opts );
@ -96,20 +88,81 @@ Definition of the TemplateGenerator class.
var theme = themeInfo.theme; var theme = themeInfo.theme;
var tFolder = themeInfo.folder; var tFolder = themeInfo.folder;
var tplFolder = PATH.join( tFolder, 'src' ); var tplFolder = PATH.join( tFolder, 'src' );
var curFmt = theme.getFormat( this.format );
var that = this;
// "Generate": process individual files within the theme
return {
files: curFmt.files.map( function( tplInfo ) {
return {
info: tplInfo,
data: tplInfo.action === 'transform' ?
transform.call( that, rez, tplInfo, theme ) : undefined
};
}).filter(function(item){ return item !== null; }),
themeInfo: themeInfo
};
},
/**
File-based template generation method.
@method generate
@param rez A FreshResume object.
@param f Full path to the output resume file to generate.
@param opts Generator options.
*/
generate: function( rez, f, opts ) {
// Call the generation method
var genInfo = this.invoke( rez, opts );
// Carry over options
this.opts = EXTEND( true, { }, _defaultOpts, opts );
// Load the theme
var themeInfo = genInfo.themeInfo;
var theme = themeInfo.theme;
var tFolder = themeInfo.folder;
var tplFolder = PATH.join( tFolder, 'src' );
var outFolder = PATH.parse(f).dir; var outFolder = PATH.parse(f).dir;
var curFmt = theme.getFormat( this.format ); var curFmt = theme.getFormat( this.format );
var that = this; var that = this;
// "Generate": process individual files within the theme // "Generate": process individual files within the theme
curFmt.files.forEach(function(tplInfo){ genInfo.files.forEach(function( file ){
if( tplInfo.action === 'transform' ) {
transform.call( that, rez, f, tplInfo, theme, outFolder ); var thisFilePath;
if( file.info.action === 'transform' ) {
thisFilePath = PATH.join( outFolder, file.info.orgPath );
try {
if( that.onBeforeSave ) {
file.data = that.onBeforeSave({
theme: theme,
outputFile: (file.info.major ? f : thisFilePath),
mk: file.data
});
if( !file.data ) return; // PDF etc
} }
else if( tplInfo.action === null && theme.explicit ) { var fileName = file.info.major ? f : thisFilePath;
var thisFilePath = PATH.join(outFolder, tplInfo.orgPath); MKDIRP.sync( PATH.dirname( fileName ) );
FS.writeFileSync( fileName, file.data,
{ encoding: 'utf8', flags: 'w' } );
that.onAfterSave && that.onAfterSave(
{ outputFile: fileName, mk: file.data } );
}
catch(ex) {
console.log(ex);
}
}
else if( file.info.action === null/* && theme.explicit*/ ) {
thisFilePath = PATH.join( outFolder, file.info.orgPath );
try { try {
MKDIRP.sync( PATH.dirname(thisFilePath) ); MKDIRP.sync( PATH.dirname(thisFilePath) );
FS.copySync( tplInfo.path, thisFilePath ); FS.copySync( file.info.path, thisFilePath );
} }
catch(ex) { catch(ex) {
console.log(ex); console.log(ex);
@ -142,8 +195,10 @@ Definition of the TemplateGenerator class.
*/ */
single: function( json, jst, format, cssInfo, opts, theme ) { single: function( json, jst, format, cssInfo, opts, theme ) {
this.opts.freezeBreaks && ( jst = freeze(jst) ); this.opts.freezeBreaks && ( jst = freeze(jst) );
var eng = require( '../eng/' + theme.engine + '-generator' ); var eng = require( '../eng/' + theme.engine + '-generator' );
var result = eng.generate( json, jst, format, cssInfo, opts, theme ); var result = eng.generate( json, jst, format, cssInfo, opts, theme );
this.opts.freezeBreaks && ( result = unfreeze(result) ); this.opts.freezeBreaks && ( result = unfreeze(result) );
return result; return result;
} }
@ -188,18 +243,15 @@ Definition of the TemplateGenerator class.
/** function transform( rez, tplInfo, theme ) {
Transform a single subfile.
*/
function transform( rez, f, tplInfo, theme, outFolder ) {
var cssInfo = { file: tplInfo.css ? tplInfo.cssPath : null, data: tplInfo.css || null };
var mk = this.single( rez, tplInfo.data, this.format, cssInfo, this.opts, theme );
this.onBeforeSave && (mk = this.onBeforeSave( { mk: mk, theme: theme, outputFile: f } ));
var thisFilePath = PATH.join( outFolder, tplInfo.orgPath );
try { try {
MKDIRP.sync( PATH.dirname( tplInfo.major ? f : thisFilePath) ); var cssInfo = {
FS.writeFileSync( tplInfo.major ? f : thisFilePath, mk, { encoding: 'utf8', flags: 'w' } ); file: tplInfo.css ? tplInfo.cssPath : null,
this.onAfterSave && (mk = this.onAfterSave( { outputFile: (tplInfo.major ? f : thisFilePath), mk: mk } )); data: tplInfo.css || null
};
return this.single( rez, tplInfo.data, this.format, cssInfo, this.opts,
theme );
} }
catch(ex) { catch(ex) {
console.log(ex); console.log(ex);