mirror of
				https://github.com/JuanCanham/HackMyResume.git
				synced 2025-11-03 22:37:27 +00:00 
			
		
		
		
	Compare commits
	
		
			66 Commits
		
	
	
		
			v1.7.2
			...
			juan-canha
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					901659cc4f | ||
| 
						 | 
					3cf850ea0e | ||
| 
						 | 
					1b0bc87b60 | ||
| 
						 | 
					5d3b993737 | ||
| 
						 | 
					917fd8e3f3 | ||
| 
						 | 
					6ac2cd490b | ||
| 
						 | 
					8100190978 | ||
| 
						 | 
					7c36ff8331 | ||
| 
						 | 
					255a518565 | ||
| 
						 | 
					2d595350c6 | ||
| 
						 | 
					ca92d41d9e | ||
| 
						 | 
					3f8e795c61 | ||
| 
						 | 
					9927e79900 | ||
| 
						 | 
					dbef9f0a35 | ||
| 
						 | 
					c889664c31 | ||
| 
						 | 
					7a60cd0bab | ||
| 
						 | 
					964350d3c7 | ||
| 
						 | 
					b57d9f05af | ||
| 
						 | 
					b26799f9fc | ||
| 
						 | 
					daeffd27b5 | ||
| 
						 | 
					f87eb46549 | ||
| 
						 | 
					da7cd28734 | ||
| 
						 | 
					31e0bb69cc | ||
| 
						 | 
					5c248cca2a | ||
| 
						 | 
					f83eb018e8 | ||
| 
						 | 
					317a250917 | ||
| 
						 | 
					aaa5e1fc1f | ||
| 
						 | 
					1bc4263a46 | ||
| 
						 | 
					e191af1fb0 | ||
| 
						 | 
					7c0a9bcc02 | ||
| 
						 | 
					d894f62607 | ||
| 
						 | 
					2758038858 | ||
| 
						 | 
					661fb91861 | ||
| 
						 | 
					3c551eb923 | ||
| 
						 | 
					5bf4bda6de | ||
| 
						 | 
					49ae016f08 | ||
| 
						 | 
					89957aed76 | ||
| 
						 | 
					233025ddcc | ||
| 
						 | 
					11dd8952d8 | ||
| 
						 | 
					d7c83613df | ||
| 
						 | 
					a456093f13 | ||
| 
						 | 
					dd4851498a | ||
| 
						 | 
					f72b02a0f4 | ||
| 
						 | 
					63a0c78fc5 | ||
| 
						 | 
					fd39cc9fd9 | ||
| 
						 | 
					70f45d468d | ||
| 
						 | 
					212b01092c | ||
| 
						 | 
					36d641801b | ||
| 
						 | 
					bd278268f6 | ||
| 
						 | 
					abe31e30e0 | ||
| 
						 | 
					314d8d8763 | ||
| 
						 | 
					ed0792e8f8 | ||
| 
						 | 
					90765bf90b | ||
| 
						 | 
					f1ba7765ee | ||
| 
						 | 
					27c7a0264a | ||
| 
						 | 
					8e806dc04f | ||
| 
						 | 
					8ec6b5ed6a | ||
| 
						 | 
					4ef4ec5d42 | ||
| 
						 | 
					2f523b845b | ||
| 
						 | 
					1c416f39d3 | ||
| 
						 | 
					1de0eff7b3 | ||
| 
						 | 
					f8a39b0908 | ||
| 
						 | 
					d69e4635be | ||
| 
						 | 
					4b7d594502 | ||
| 
						 | 
					896b7055c1 | ||
| 
						 | 
					0f65e4c9f3 | 
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -4,6 +4,7 @@ doc/
 | 
				
			|||||||
docs/
 | 
					docs/
 | 
				
			||||||
local/
 | 
					local/
 | 
				
			||||||
npm-debug.log
 | 
					npm-debug.log
 | 
				
			||||||
 | 
					*.map
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Emacs detritus
 | 
					# Emacs detritus
 | 
				
			||||||
# -*- mode: gitignore; -*-
 | 
					# -*- mode: gitignore; -*-
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							@@ -1,3 +0,0 @@
 | 
				
			|||||||
[submodule "src/hmc"]
 | 
					 | 
				
			||||||
	path = src/hmc
 | 
					 | 
				
			||||||
	url = git://github.com/hacksalot/HackMyCore.git
 | 
					 | 
				
			||||||
							
								
								
									
										58
									
								
								BUILDING.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								BUILDING.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,58 @@
 | 
				
			|||||||
 | 
					Building
 | 
				
			||||||
 | 
					========
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*See [CONTRIBUTING.md][contrib] for more information on contributing to the
 | 
				
			||||||
 | 
					HackMyResume or FluentCV projects.*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					HackMyResume is a standard Node.js command line app implemented in a mix of
 | 
				
			||||||
 | 
					CoffeeScript and JavaScript. Setting up a build environment is easy:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Prerequisites ##
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. OS: Linux, OS X, or Windows
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					2. Install [Node.js][node] and [Grunt][grunt].
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Set up a build environment ###
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. Fork [hacksalot/HackMyResume][hmr] to your GitHub account.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					2. Clone your fork locally.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					3. From within the top-level HackMyResume folder, run `npm install` to install
 | 
				
			||||||
 | 
					project dependencies.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					4. Create a new branch, based on the latest HackMyResume `dev` branch, to
 | 
				
			||||||
 | 
					contain your work.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					5. Run `npm link` in the HackMyResume folder so that the `hackmyresume` command
 | 
				
			||||||
 | 
					will reference your local installation (you may need to
 | 
				
			||||||
 | 
					`npm uninstall -g hackmyresume` first).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Making changes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. HackMyResume sources live in the [`/src`][src] folder. Always make your edits
 | 
				
			||||||
 | 
					there, never in the generated `/dist` folder.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					2. After making your changes, run `grunt build` to package the HackMyResume
 | 
				
			||||||
 | 
					sources to the `/dist` folder. This will transform CoffeeScript files to
 | 
				
			||||||
 | 
					JavaScript and perform other build steps as necessary. In the future, a watch
 | 
				
			||||||
 | 
					task or guardfile will be added to automate this step.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					3. Do local spot testing with `hackmyresume` as normal.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					4. When you're ready to submit your changes, run `grunt test` to run the HMR
 | 
				
			||||||
 | 
					test suite. Fix any errors that occur.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					5. Commit and push your changes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					6. Submit a pull request targeting the HackMyResume `dev` branch.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[node]: https://nodejs.org/en/
 | 
				
			||||||
 | 
					[grunt]: http://gruntjs.com/
 | 
				
			||||||
 | 
					[hmr]: https://github.com/hacksalot/HackMyResume
 | 
				
			||||||
 | 
					[src]: https://github.com/hacksalot/HackMyResume/tree/master/src
 | 
				
			||||||
 | 
					[contrib]: https://github.com/hacksalot/HackMyResume/blob/master/CONTRIBUTING.md
 | 
				
			||||||
							
								
								
									
										105
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										105
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@@ -1,5 +1,108 @@
 | 
				
			|||||||
CHANGELOG
 | 
					CHANGELOG
 | 
				
			||||||
=========
 | 
					=========
 | 
				
			||||||
 | 
					## v1.8.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Added
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Updated `Awesome` theme to latest version of [Awesome-CV][acv].
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Introduced new theme helpers: `pad`, `date`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Fixed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Fixed an issue where the `Awesome` theme wouldn't correctly generate LaTeX
 | 
				
			||||||
 | 
					outputs (#138).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Emit a line number for syntax errors around embedded newlines in JSON strings
 | 
				
			||||||
 | 
					(#137).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Fix several PDF / PNG generation errors (#132, others).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Display a more helpful error message when attempting to generate a PDF or PNG
 | 
				
			||||||
 | 
					on a machine where PhantomJS and/or wkhtmltopdf are either not installed or
 | 
				
			||||||
 | 
					not path-accessible.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Fixed an issue that would cause long-running PDF/PNG generation to fail in
 | 
				
			||||||
 | 
					certain environments.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Fixed an issue involving an unhelpful spawn-related exception (#136).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Internal
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- JSHint will no longer gripe at the use of `== null` and `!= null` in
 | 
				
			||||||
 | 
					CoffeeScript transpilation.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Introduced [template-friendly Awesome-CV fork][awefork] to isolate template
 | 
				
			||||||
 | 
					expansion logic & provide better durability for HackMyResume's `awesome` theme.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Fixed a couple temporary regressions (#139, #140) on the dev branch.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Additional tests.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Minor breaking HackMyResume API changes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## v1.7.4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Added
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- [Build instructions](https://github.com/hacksalot/HackMyResume/blob/master/BUILDING.md).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Changed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- More precise date handling.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Fixed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Issue with incomplete PDF generation (#127).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Issue with building JSON Resume themes (#128).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Issue with generating `.json` output format by itself (#97).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## v1.7.3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Fixed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Issue with generated PDFs being chopped off and displaying a mysterious sequence of numbers of unknown and possibly alien origin (#127).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Unsightly border on Modern:PDF.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Modern|Positive:PDF formats now correctly reference their PDF-specific CSS files.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- `Incorrect helper use` warning in Positive:DOC.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## v1.7.2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Changed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Interim release supporting FluentCV Desktop.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Internal
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Moved [HackMyCore](https://github.com/hacksalot/HackMyCore) dependency to
 | 
				
			||||||
 | 
					submodule.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## v1.7.1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Changed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Caffeinate. CoffeeScript now used throughout
 | 
				
			||||||
 | 
					[HackMyResume](https://github.com/hacksalot/HackMyResume) and
 | 
				
			||||||
 | 
					[HackMyCore](https://github.com/hacksalot/HackMyCore); generated JavaScript
 | 
				
			||||||
 | 
					lives in `/dist`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Fixed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Issue with generating a single PDF with the `.pdf` extension (#99).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## v1.7.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Changed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- [Internal] Relocated HMR processing code to the
 | 
				
			||||||
 | 
					[HackMyCore](https://github.com/hacksalot/HackMyCore) project. Shouldn't affect
 | 
				
			||||||
 | 
					normal use.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## v1.6.0
 | 
					## v1.6.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Major Improvements
 | 
					### Major Improvements
 | 
				
			||||||
@@ -304,3 +407,5 @@ theme.
 | 
				
			|||||||
[i111]: https://github.com/hacksalot/HackMyResume/issues/111
 | 
					[i111]: https://github.com/hacksalot/HackMyResume/issues/111
 | 
				
			||||||
[fresca]: https://github.com/fluentdesk/FRESCA
 | 
					[fresca]: https://github.com/fluentdesk/FRESCA
 | 
				
			||||||
[themes]: https://github.com/fluentdesk/fresh-themes
 | 
					[themes]: https://github.com/fluentdesk/fresh-themes
 | 
				
			||||||
 | 
					[awefork]: https://github.com/fluentdesk/Awesome-CV
 | 
				
			||||||
 | 
					[acv]: https://github.com/posquit0/Awesome-CV
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,17 +4,11 @@ Contributing
 | 
				
			|||||||
*Note: HackMyResume is also available as [FluentCV][fcv]. Contributors are
 | 
					*Note: HackMyResume is also available as [FluentCV][fcv]. Contributors are
 | 
				
			||||||
credited in both.*
 | 
					credited in both.*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
HackMyResume needs your help! Our contribution workflow is based on [GitHub
 | 
					 | 
				
			||||||
Flow][flow] and we respond to all pull requests and issues, usually within 24
 | 
					 | 
				
			||||||
hours. HackMyResume has no corporate affiliation and no commercial basis, which
 | 
					 | 
				
			||||||
allows the project to maintain a strict user-first policy, rapid development
 | 
					 | 
				
			||||||
velocity, and a liberal stance on contributions and exotic functionality in
 | 
					 | 
				
			||||||
keeping with the spirit (and name) of the tool.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
In short, your code is welcome here.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## How To Contribute
 | 
					## How To Contribute
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*See [BUILDING.md][building] for instructions on setting up a HackMyResume
 | 
				
			||||||
 | 
					development environment.*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1. Optional: [**open an issue**][iss] identifying the feature or bug you'd like
 | 
					1. Optional: [**open an issue**][iss] identifying the feature or bug you'd like
 | 
				
			||||||
to implement or fix. This step isn't required — you can start hacking away on
 | 
					to implement or fix. This step isn't required — you can start hacking away on
 | 
				
			||||||
HackMyResume without clearing it with us — but helps avoid duplication of work
 | 
					HackMyResume without clearing it with us — but helps avoid duplication of work
 | 
				
			||||||
@@ -25,7 +19,7 @@ similar; call it whatever you like) to perform your work in.
 | 
				
			|||||||
4. **Install dependencies** by running `npm install` in the top-level
 | 
					4. **Install dependencies** by running `npm install` in the top-level
 | 
				
			||||||
HackMyResume folder.
 | 
					HackMyResume folder.
 | 
				
			||||||
5. Make your **commits** as usual.
 | 
					5. Make your **commits** as usual.
 | 
				
			||||||
6. **Verify** your changes locally with `npm test`.
 | 
					6. **Verify** your changes locally with `grunt test`.
 | 
				
			||||||
7. **Push** your commits.
 | 
					7. **Push** your commits.
 | 
				
			||||||
7. **Submit a pull request** from your feature branch to the HackMyResume `dev`
 | 
					7. **Submit a pull request** from your feature branch to the HackMyResume `dev`
 | 
				
			||||||
branch.
 | 
					branch.
 | 
				
			||||||
@@ -48,7 +42,7 @@ You can reach hacksalot directly at:
 | 
				
			|||||||
hacksalot@indevious.com
 | 
					hacksalot@indevious.com
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Thanks! See you out there in the trenches.
 | 
					Thanks for your interest in the HackMyResume project.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[fcv]: https://github.com/fluentdesk/fluentcv
 | 
					[fcv]: https://github.com/fluentdesk/fluentcv
 | 
				
			||||||
[flow]: https://guides.github.com/introduction/flow/
 | 
					[flow]: https://guides.github.com/introduction/flow/
 | 
				
			||||||
@@ -56,3 +50,4 @@ Thanks! See you out there in the trenches.
 | 
				
			|||||||
[ha]: https://github.com/hacksalot
 | 
					[ha]: https://github.com/hacksalot
 | 
				
			||||||
[th]: https://github.com/tomheon
 | 
					[th]: https://github.com/tomheon
 | 
				
			||||||
[awesome]: https://github.com/hacksalot/HackMyResume/graphs/contributors
 | 
					[awesome]: https://github.com/hacksalot/HackMyResume/graphs/contributors
 | 
				
			||||||
 | 
					[building]: https://github.com/hacksalot/HackMyResume/blob/master/BUILDING.md
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								Gruntfile.js
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								Gruntfile.js
									
									
									
									
									
								
							@@ -10,22 +10,19 @@ module.exports = function (grunt) {
 | 
				
			|||||||
      main: {
 | 
					      main: {
 | 
				
			||||||
        expand: true,
 | 
					        expand: true,
 | 
				
			||||||
        cwd: 'src',
 | 
					        cwd: 'src',
 | 
				
			||||||
        src: ['**/*','!**/*.coffee','!hmc/**'],
 | 
					        src: ['**/*','!**/*.coffee'],
 | 
				
			||||||
        dest: 'dist/',
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      core: {
 | 
					 | 
				
			||||||
        expand: true,
 | 
					 | 
				
			||||||
        cwd: 'src',
 | 
					 | 
				
			||||||
        src: ['hmc/dist/**/*','hmc/package.json'],
 | 
					 | 
				
			||||||
        dest: 'dist/',
 | 
					        dest: 'dist/',
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    coffee: {
 | 
					    coffee: {
 | 
				
			||||||
      main: {
 | 
					      main: {
 | 
				
			||||||
 | 
					        options: {
 | 
				
			||||||
 | 
					          sourceMap: true
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        expand: true,
 | 
					        expand: true,
 | 
				
			||||||
        cwd: 'src',
 | 
					        cwd: 'src',
 | 
				
			||||||
        src: ['cli/**/*.coffee'],
 | 
					        src: ['**/*.coffee'],
 | 
				
			||||||
        dest: 'dist/',
 | 
					        dest: 'dist/',
 | 
				
			||||||
        ext: '.js'
 | 
					        ext: '.js'
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -73,7 +70,8 @@ module.exports = function (grunt) {
 | 
				
			|||||||
    jshint: {
 | 
					    jshint: {
 | 
				
			||||||
      options: {
 | 
					      options: {
 | 
				
			||||||
        laxcomma: true,
 | 
					        laxcomma: true,
 | 
				
			||||||
        expr: true
 | 
					        expr: true,
 | 
				
			||||||
 | 
					        eqnull: true
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      all: ['Gruntfile.js', 'dist/cli/**/*.js', 'test/*.js']
 | 
					      all: ['Gruntfile.js', 'dist/cli/**/*.js', 'test/*.js']
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
The MIT License
 | 
					The MIT License
 | 
				
			||||||
===============
 | 
					===============
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright (c) 2016 hacksalot (https://github.com/hacksalot)
 | 
					Copyright (c) 2015-2016 hacksalot (https://github.com/hacksalot)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
					Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
				
			||||||
of this software and associated documentation files (the "Software"), to deal
 | 
					of this software and associated documentation files (the "Software"), to deal
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,7 @@ HackMyResume
 | 
				
			|||||||
[![Latest release][img-release]][latest-release]
 | 
					[![Latest release][img-release]][latest-release]
 | 
				
			||||||
[![Build status (MASTER)][img-master]][travis-url-master]
 | 
					[![Build status (MASTER)][img-master]][travis-url-master]
 | 
				
			||||||
[![Build status (DEV)][img-dev]][travis-url-dev]
 | 
					[![Build status (DEV)][img-dev]][travis-url-dev]
 | 
				
			||||||
 | 
					[](https://gitter.im/hacksalot/HackMyResume?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
*Create polished résumés and CVs in multiple formats from your command line or
 | 
					*Create polished résumés and CVs in multiple formats from your command line or
 | 
				
			||||||
shell. Author in clean Markdown and JSON, export to Word, HTML, PDF, LaTeX,
 | 
					shell. Author in clean Markdown and JSON, export to Word, HTML, PDF, LaTeX,
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										36
									
								
								dist/cli/error.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										36
									
								
								dist/cli/error.js
									
									
									
									
										vendored
									
									
								
							@@ -8,19 +8,19 @@ Error-handling routines for HackMyResume.
 | 
				
			|||||||
(function() {
 | 
					(function() {
 | 
				
			||||||
  var ErrorHandler, FCMD, FS, HMSTATUS, M2C, PATH, PKG, SyntaxErrorEx, WRAP, YAML, _defaultLog, assembleError, chalk, extend, printf;
 | 
					  var ErrorHandler, FCMD, FS, HMSTATUS, M2C, PATH, PKG, SyntaxErrorEx, WRAP, YAML, _defaultLog, assembleError, chalk, extend, printf;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  HMSTATUS = require('../hmc/dist/core/status-codes');
 | 
					  HMSTATUS = require('../core/status-codes');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  PKG = require('../../package.json');
 | 
					  PKG = require('../../package.json');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  FS = require('fs');
 | 
					  FS = require('fs');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  FCMD = require('../hmc');
 | 
					  FCMD = require('../index');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  PATH = require('path');
 | 
					  PATH = require('path');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  WRAP = require('word-wrap');
 | 
					  WRAP = require('word-wrap');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  M2C = require('../hmc/dist/utils/md2chalk.js');
 | 
					  M2C = require('../utils/md2chalk');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  chalk = require('chalk');
 | 
					  chalk = require('chalk');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -30,13 +30,12 @@ Error-handling routines for HackMyResume.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  printf = require('printf');
 | 
					  printf = require('printf');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SyntaxErrorEx = require('../hmc/dist/utils/syntax-error-ex');
 | 
					  SyntaxErrorEx = require('../utils/syntax-error-ex');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  require('string.prototype.startswith');
 | 
					  require('string.prototype.startswith');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /**
 | 
					  /** Error handler for HackMyResume. All errors are handled here.
 | 
				
			||||||
  Error handler for HackMyResume. All errors are handled here.
 | 
					 | 
				
			||||||
  @class ErrorHandler
 | 
					  @class ErrorHandler
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -62,7 +61,7 @@ Error-handling routines for HackMyResume.
 | 
				
			|||||||
          stack = ex.stack || (ex.inner && ex.inner.stack);
 | 
					          stack = ex.stack || (ex.inner && ex.inner.stack);
 | 
				
			||||||
          stack && o(chalk.gray(stack));
 | 
					          stack && o(chalk.gray(stack));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (ex.quit || objError.quit) {
 | 
					        if (shouldExit) {
 | 
				
			||||||
          if (this.debug) {
 | 
					          if (this.debug) {
 | 
				
			||||||
            o(chalk.cyan('Exiting with error code ' + ex.fluenterror.toString()));
 | 
					            o(chalk.cyan('Exiting with error code ' + ex.fluenterror.toString()));
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
@@ -140,7 +139,6 @@ Error-handling routines for HackMyResume.
 | 
				
			|||||||
        if (ex.inner) {
 | 
					        if (ex.inner) {
 | 
				
			||||||
          msg += chalk.red('\n' + ex.inner);
 | 
					          msg += chalk.red('\n' + ex.inner);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        withStack = true;
 | 
					 | 
				
			||||||
        quit = false;
 | 
					        quit = false;
 | 
				
			||||||
        etype = 'error';
 | 
					        etype = 'error';
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
@@ -215,13 +213,27 @@ Error-handling routines for HackMyResume.
 | 
				
			|||||||
        if (SyntaxErrorEx.is(ex.inner)) {
 | 
					        if (SyntaxErrorEx.is(ex.inner)) {
 | 
				
			||||||
          console.error(printf(M2C(this.msgs.readError.msg, 'red'), ex.file));
 | 
					          console.error(printf(M2C(this.msgs.readError.msg, 'red'), ex.file));
 | 
				
			||||||
          se = new SyntaxErrorEx(ex, ex.raw);
 | 
					          se = new SyntaxErrorEx(ex, ex.raw);
 | 
				
			||||||
          msg = printf(M2C(this.msgs.parseError.msg, 'red'), se.line, se.col);
 | 
					          if ((se.line != null) && (se.col != null)) {
 | 
				
			||||||
        } else if (ex.inner && ex.inner.line !== void 0 && ex.inner.col !== void 0) {
 | 
					            msg = printf(M2C(this.msgs.parseError.msg[0], 'red'), se.line, se.col);
 | 
				
			||||||
          msg = printf(M2C(this.msgs.parseError.msg, 'red'), ex.inner.line, ex.inner.col);
 | 
					          } else if (se.line != null) {
 | 
				
			||||||
 | 
					            msg = printf(M2C(this.msgs.parseError.msg[1], 'red'), se.line);
 | 
				
			||||||
 | 
					          } else {
 | 
				
			||||||
 | 
					            msg = M2C(this.msgs.parseError.msg[2], 'red');
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        } else if (ex.inner && (ex.inner.line != null) && (ex.inner.col != null)) {
 | 
				
			||||||
 | 
					          msg = printf(M2C(this.msgs.parseError.msg[0], 'red'), ex.inner.line, ex.inner.col);
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
          msg = ex;
 | 
					          msg = ex;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        etype = 'error';
 | 
					        etype = 'error';
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      case HMSTATUS.createError:
 | 
				
			||||||
 | 
					        msg = printf(M2C(this.msgs.createError.msg), ex.inner.path);
 | 
				
			||||||
 | 
					        etype = 'error';
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      case HMSTATUS.validateError:
 | 
				
			||||||
 | 
					        msg = printf(M2C(this.msgs.validateError.msg), ex.inner.toString());
 | 
				
			||||||
 | 
					        etype = 'error';
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return {
 | 
					    return {
 | 
				
			||||||
      msg: msg,
 | 
					      msg: msg,
 | 
				
			||||||
@@ -232,3 +244,5 @@ Error-handling routines for HackMyResume.
 | 
				
			|||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}).call(this);
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=error.js.map
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								src/index.js → dist/cli/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								src/index.js → dist/cli/index.js
									
									
									
									
										vendored
									
									
								
							@@ -12,11 +12,11 @@ Command-line interface (CLI) for HackMyResume.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
try {
 | 
					try {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  require('./cli/main')( process.argv );
 | 
					  require('./main')( process.argv );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
catch( ex ) {
 | 
					catch( ex ) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  require('./cli/error').err( ex, true );
 | 
					  require('./error').err( ex, true );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
							
								
								
									
										85
									
								
								dist/cli/main.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										85
									
								
								dist/cli/main.js
									
									
									
									
										vendored
									
									
								
							@@ -6,9 +6,9 @@ Definition of the `main` function.
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(function() {
 | 
					(function() {
 | 
				
			||||||
  var Command, EXTEND, FS, HME, HMR, HMSTATUS, OUTPUT, PAD, PATH, PKG, StringUtils, _, _opts, _out, _title, chalk, execute, initOptions, initialize, loadOptions, logMsg, main, safeLoadJSON, splitSrcDest;
 | 
					  var Command, EXTEND, FS, HME, HMR, HMSTATUS, M2C, OUTPUT, PAD, PATH, PKG, StringUtils, _, _err, _exitCallback, _opts, _out, _title, chalk, execute, executeFail, executeSuccess, initOptions, initialize, loadOptions, logMsg, main, printf, safeLoadJSON, splitSrcDest;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  HMR = require('../hmc');
 | 
					  HMR = require('../index');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  PKG = require('../../package.json');
 | 
					  PKG = require('../../package.json');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -20,13 +20,13 @@ Definition of the `main` function.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  PATH = require('path');
 | 
					  PATH = require('path');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  HMSTATUS = require('../hmc/dist/core/status-codes');
 | 
					  HMSTATUS = require('../core/status-codes');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  HME = require('../hmc/dist/core/event-codes');
 | 
					  HME = require('../core/event-codes');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  safeLoadJSON = require('../hmc/dist/utils/safe-json-loader');
 | 
					  safeLoadJSON = require('../utils/safe-json-loader');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  StringUtils = require('../hmc/dist/utils/string.js');
 | 
					  StringUtils = require('../utils/string.js');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _ = require('underscore');
 | 
					  _ = require('underscore');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -36,12 +36,20 @@ Definition of the `main` function.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  Command = require('commander').Command;
 | 
					  Command = require('commander').Command;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  M2C = require('../utils/md2chalk');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  printf = require('printf');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _opts = {};
 | 
					  _opts = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _title = chalk.white.bold('\n*** HackMyResume v' + PKG.version + ' ***');
 | 
					  _title = chalk.white.bold('\n*** HackMyResume v' + PKG.version + ' ***');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _out = new OUTPUT(_opts);
 | 
					  _out = new OUTPUT(_opts);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  _err = require('./error');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  _exitCallback = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /*
 | 
					  /*
 | 
				
			||||||
  A callable implementation of the HackMyResume CLI. Encapsulates the command
 | 
					  A callable implementation of the HackMyResume CLI. Encapsulates the command
 | 
				
			||||||
@@ -51,9 +59,9 @@ Definition of the `main` function.
 | 
				
			|||||||
  process.argv (in production) or custom parameters (in test).
 | 
					  process.argv (in production) or custom parameters (in test).
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  main = module.exports = function(rawArgs) {
 | 
					  main = module.exports = function(rawArgs, exitCallback) {
 | 
				
			||||||
    var args, initInfo, program;
 | 
					    var args, initInfo, program;
 | 
				
			||||||
    initInfo = initialize(rawArgs);
 | 
					    initInfo = initialize(rawArgs, exitCallback);
 | 
				
			||||||
    args = initInfo.args;
 | 
					    args = initInfo.args;
 | 
				
			||||||
    program = new Command('hackmyresume').version(PKG.version).description(chalk.yellow.bold('*** HackMyResume ***')).option('-s --silent', 'Run in silent mode').option('--no-color', 'Disable colors').option('--color', 'Enable colors').option('-d --debug', 'Enable diagnostics', false).option('-a --assert', 'Treat warnings as errors', false).option('-v --version', 'Show the version').allowUnknownOption();
 | 
					    program = new Command('hackmyresume').version(PKG.version).description(chalk.yellow.bold('*** HackMyResume ***')).option('-s --silent', 'Run in silent mode').option('--no-color', 'Disable colors').option('--color', 'Enable colors').option('-d --debug', 'Enable diagnostics', false).option('-a --assert', 'Treat warnings as errors', false).option('-v --version', 'Show the version').allowUnknownOption();
 | 
				
			||||||
    program.jsonArgs = initInfo.options;
 | 
					    program.jsonArgs = initInfo.options;
 | 
				
			||||||
@@ -92,8 +100,9 @@ Definition of the `main` function.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  /* Massage command-line args and setup Commander.js. */
 | 
					  /* Massage command-line args and setup Commander.js. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  initialize = function(ar) {
 | 
					  initialize = function(ar, exitCallback) {
 | 
				
			||||||
    var o;
 | 
					    var o;
 | 
				
			||||||
 | 
					    _exitCallback = exitCallback || process.exit;
 | 
				
			||||||
    o = initOptions(ar);
 | 
					    o = initOptions(ar);
 | 
				
			||||||
    o.silent || logMsg(_title);
 | 
					    o.silent || logMsg(_title);
 | 
				
			||||||
    if (o.debug) {
 | 
					    if (o.debug) {
 | 
				
			||||||
@@ -105,20 +114,18 @@ Definition of the `main` function.
 | 
				
			|||||||
      _out.log(chalk.cyan(PAD('  FRESCA:', 25, null, PAD.RIGHT)) + chalk.cyan.bold(PKG.dependencies.fresca));
 | 
					      _out.log(chalk.cyan(PAD('  FRESCA:', 25, null, PAD.RIGHT)) + chalk.cyan.bold(PKG.dependencies.fresca));
 | 
				
			||||||
      _out.log('');
 | 
					      _out.log('');
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    _err.init(o.debug, o.assert, o.silent);
 | 
				
			||||||
    if (o.verb && !HMR.verbs[o.verb] && !HMR.alias[o.verb]) {
 | 
					    if (o.verb && !HMR.verbs[o.verb] && !HMR.alias[o.verb]) {
 | 
				
			||||||
      throw {
 | 
					      _err.err({
 | 
				
			||||||
        fluenterror: HMSTATUS.invalidCommand,
 | 
					        fluenterror: HMSTATUS.invalidCommand,
 | 
				
			||||||
        quit: true,
 | 
					        quit: true,
 | 
				
			||||||
        attempted: o.orgVerb
 | 
					        attempted: o.orgVerb
 | 
				
			||||||
      };
 | 
					      }, true);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    Command.prototype.missingArgument = function(name) {
 | 
					    Command.prototype.missingArgument = function(name) {
 | 
				
			||||||
      if (this.name() !== 'new') {
 | 
					      _err.err({
 | 
				
			||||||
        throw {
 | 
					        fluenterror: this.name() !== 'new' ? HMSTATUS.resumeNotFound : HMSTATUS.createNameMissing
 | 
				
			||||||
          fluenterror: HMSTATUS.resumeNotFound,
 | 
					      }, true);
 | 
				
			||||||
          quit: true
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    Command.prototype.helpInformation = function() {
 | 
					    Command.prototype.helpInformation = function() {
 | 
				
			||||||
      var manPage;
 | 
					      var manPage;
 | 
				
			||||||
@@ -136,7 +143,7 @@ Definition of the `main` function.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  initOptions = function(ar) {
 | 
					  initOptions = function(ar) {
 | 
				
			||||||
    oVerb;
 | 
					    oVerb;
 | 
				
			||||||
    var args, cleanArgs, inf, isDebug, isMono, isSilent, oJSON, oVerb, optStr, optsIdx, verb, vidx;
 | 
					    var args, cleanArgs, inf, isAssert, isDebug, isMono, isSilent, oJSON, oVerb, optStr, optsIdx, verb, vidx;
 | 
				
			||||||
    verb = '';
 | 
					    verb = '';
 | 
				
			||||||
    args = ar.slice();
 | 
					    args = ar.slice();
 | 
				
			||||||
    cleanArgs = args.slice(2);
 | 
					    cleanArgs = args.slice(2);
 | 
				
			||||||
@@ -177,6 +184,9 @@ Definition of the `main` function.
 | 
				
			|||||||
    isSilent = _.some(args, function(v) {
 | 
					    isSilent = _.some(args, function(v) {
 | 
				
			||||||
      return v === '-s' || v === '--silent';
 | 
					      return v === '-s' || v === '--silent';
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					    isAssert = _.some(args, function(v) {
 | 
				
			||||||
 | 
					      return v === '-a' || v === '--assert';
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
    isMono = _.some(args, function(v) {
 | 
					    isMono = _.some(args, function(v) {
 | 
				
			||||||
      return v === '--no-color';
 | 
					      return v === '--no-color';
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
@@ -184,6 +194,7 @@ Definition of the `main` function.
 | 
				
			|||||||
      color: !isMono,
 | 
					      color: !isMono,
 | 
				
			||||||
      debug: isDebug,
 | 
					      debug: isDebug,
 | 
				
			||||||
      silent: isSilent,
 | 
					      silent: isSilent,
 | 
				
			||||||
 | 
					      assert: isAssert,
 | 
				
			||||||
      orgVerb: oVerb,
 | 
					      orgVerb: oVerb,
 | 
				
			||||||
      verb: verb,
 | 
					      verb: verb,
 | 
				
			||||||
      json: oJSON,
 | 
					      json: oJSON,
 | 
				
			||||||
@@ -195,23 +206,43 @@ Definition of the `main` function.
 | 
				
			|||||||
  /* Invoke a HackMyResume verb. */
 | 
					  /* Invoke a HackMyResume verb. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  execute = function(src, dst, opts, log) {
 | 
					  execute = function(src, dst, opts, log) {
 | 
				
			||||||
    var hand, v;
 | 
					    var prom, v;
 | 
				
			||||||
    loadOptions.call(this, opts, this.parent.jsonArgs);
 | 
					 | 
				
			||||||
    hand = require('./error');
 | 
					 | 
				
			||||||
    hand.init(_opts.debug, _opts.assert, _opts.silent);
 | 
					 | 
				
			||||||
    v = new HMR.verbs[this.name()]();
 | 
					    v = new HMR.verbs[this.name()]();
 | 
				
			||||||
 | 
					    loadOptions.call(this, opts, this.parent.jsonArgs);
 | 
				
			||||||
    _opts.errHandler = v;
 | 
					    _opts.errHandler = v;
 | 
				
			||||||
    _out.init(_opts);
 | 
					    _out.init(_opts);
 | 
				
			||||||
    v.on('hmr:status', function() {
 | 
					    v.on('hmr:status', function() {
 | 
				
			||||||
      return _out["do"].apply(_out, arguments);
 | 
					      return _out["do"].apply(_out, arguments);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    v.on('hmr:error', function() {
 | 
					    v.on('hmr:error', function() {
 | 
				
			||||||
      return hand.err.apply(hand, arguments);
 | 
					      return _err.err.apply(_err, arguments);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    v.invoke.call(v, src, dst, _opts, log);
 | 
					    prom = v.invoke.call(v, src, dst, _opts, log);
 | 
				
			||||||
    if (v.errorCode) {
 | 
					    prom.then(executeSuccess, executeFail);
 | 
				
			||||||
      return process.exit(v.errorCode);
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* Success handler for verb invocations. Calls process.exit by default */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  executeSuccess = function(obj) {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* Failure handler for verb invocations. Calls process.exit by default */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  executeFail = function(err) {
 | 
				
			||||||
 | 
					    var finalErrorCode, msgs;
 | 
				
			||||||
 | 
					    finalErrorCode = -1;
 | 
				
			||||||
 | 
					    if (err) {
 | 
				
			||||||
 | 
					      finalErrorCode = err.fluenterror ? err.fluenterror : err;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    if (_opts.debug) {
 | 
				
			||||||
 | 
					      msgs = require('./msg').errors;
 | 
				
			||||||
 | 
					      logMsg(printf(M2C(msgs.exiting.msg, 'cyan'), finalErrorCode));
 | 
				
			||||||
 | 
					      if (err.stack) {
 | 
				
			||||||
 | 
					        logMsg(err.stack);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    _exitCallback(finalErrorCode);
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -281,3 +312,5 @@ Definition of the `main` function.
 | 
				
			|||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}).call(this);
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=main.js.map
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								dist/cli/msg.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								dist/cli/msg.js
									
									
									
									
										vendored
									
									
								
							@@ -15,3 +15,5 @@ Message-handling routines for HackMyResume.
 | 
				
			|||||||
  module.exports = YAML.load(PATH.join(__dirname, 'msg.yml'));
 | 
					  module.exports = YAML.load(PATH.join(__dirname, 'msg.yml'));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}).call(this);
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=msg.js.map
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										15
									
								
								dist/cli/msg.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										15
									
								
								dist/cli/msg.yml
									
									
									
									
										vendored
									
									
								
							@@ -3,6 +3,8 @@ events:
 | 
				
			|||||||
    msg: Invoking **%s** command.
 | 
					    msg: Invoking **%s** command.
 | 
				
			||||||
  beforeCreate:
 | 
					  beforeCreate:
 | 
				
			||||||
    msg: Creating new **%s** resume: **%s**
 | 
					    msg: Creating new **%s** resume: **%s**
 | 
				
			||||||
 | 
					  afterCreate:
 | 
				
			||||||
 | 
					    msg: Creating new **%s** resume: **%s**
 | 
				
			||||||
  afterRead:
 | 
					  afterRead:
 | 
				
			||||||
    msg: Reading **%s** resume: **%s**
 | 
					    msg: Reading **%s** resume: **%s**
 | 
				
			||||||
  beforeTheme:
 | 
					  beforeTheme:
 | 
				
			||||||
@@ -41,6 +43,8 @@ events:
 | 
				
			|||||||
      - "VALID!"
 | 
					      - "VALID!"
 | 
				
			||||||
      - "INVALID"
 | 
					      - "INVALID"
 | 
				
			||||||
      - "BROKEN"
 | 
					      - "BROKEN"
 | 
				
			||||||
 | 
					      - "MISSING"
 | 
				
			||||||
 | 
					      - "ERROR"
 | 
				
			||||||
  beforePeek:
 | 
					  beforePeek:
 | 
				
			||||||
    msg:
 | 
					    msg:
 | 
				
			||||||
      - Peeking at **%s** in **%s**
 | 
					      - Peeking at **%s** in **%s**
 | 
				
			||||||
@@ -79,7 +83,10 @@ errors:
 | 
				
			|||||||
  readError:
 | 
					  readError:
 | 
				
			||||||
    msg: Reading **???** resume: **%s**
 | 
					    msg: Reading **???** resume: **%s**
 | 
				
			||||||
  parseError:
 | 
					  parseError:
 | 
				
			||||||
    msg: Invalid or corrupt JSON on line %s column %s.
 | 
					    msg:
 | 
				
			||||||
 | 
					      - Invalid or corrupt JSON on line %s column %s.
 | 
				
			||||||
 | 
					      - Invalid or corrupt JSON on line %s.
 | 
				
			||||||
 | 
					      - Invalid or corrupt JSON.
 | 
				
			||||||
  invalidHelperUse:
 | 
					  invalidHelperUse:
 | 
				
			||||||
    msg: "**Warning**: Incorrect use of the **%s** theme helper."
 | 
					    msg: "**Warning**: Incorrect use of the **%s** theme helper."
 | 
				
			||||||
  fileSaveError:
 | 
					  fileSaveError:
 | 
				
			||||||
@@ -96,3 +103,9 @@ errors:
 | 
				
			|||||||
    msg: "Invalid number of parameters. Expected: **%s**."
 | 
					    msg: "Invalid number of parameters. Expected: **%s**."
 | 
				
			||||||
  missingParam:
 | 
					  missingParam:
 | 
				
			||||||
    msg: The '**%s**' parameter was needed but not supplied.
 | 
					    msg: The '**%s**' parameter was needed but not supplied.
 | 
				
			||||||
 | 
					  createError:
 | 
				
			||||||
 | 
					    msg: Failed to create **'%s'**.
 | 
				
			||||||
 | 
					  exiting:
 | 
				
			||||||
 | 
					    msg: Exiting with status code **%s**.
 | 
				
			||||||
 | 
					  validateError:
 | 
				
			||||||
 | 
					    msg: "An error occurred during validation:\n%s"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										82
									
								
								dist/cli/out.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										82
									
								
								dist/cli/out.js
									
									
									
									
										vendored
									
									
								
							@@ -6,17 +6,15 @@ Output routines for HackMyResume.
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(function() {
 | 
					(function() {
 | 
				
			||||||
  var Class, EXTEND, FS, HANDLEBARS, HME, LO, M2C, OutputHandler, PATH, YAML, _, chalk, dbgStyle, pad, printf;
 | 
					  var EXTEND, FS, HANDLEBARS, HME, LO, M2C, OutputHandler, PATH, YAML, _, chalk, dbgStyle, pad, printf;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  chalk = require('chalk');
 | 
					  chalk = require('chalk');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  HME = require('../hmc/dist/core/event-codes');
 | 
					  HME = require('../core/event-codes');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _ = require('underscore');
 | 
					  _ = require('underscore');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Class = require('../hmc/dist/utils/class.js');
 | 
					  M2C = require('../utils/md2chalk.js');
 | 
				
			||||||
 | 
					 | 
				
			||||||
  M2C = require('../hmc/dist/utils/md2chalk.js');
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  PATH = require('path');
 | 
					  PATH = require('path');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -39,20 +37,27 @@ Output routines for HackMyResume.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  /** A stateful output module. All HMR console output handled here. */
 | 
					  /** A stateful output module. All HMR console output handled here. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  OutputHandler = module.exports = Class.extend({
 | 
					  module.exports = OutputHandler = (function() {
 | 
				
			||||||
    init: function(opts) {
 | 
					    function OutputHandler(opts) {
 | 
				
			||||||
 | 
					      this.init(opts);
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    OutputHandler.prototype.init = function(opts) {
 | 
				
			||||||
      this.opts = EXTEND(true, this.opts || {}, opts);
 | 
					      this.opts = EXTEND(true, this.opts || {}, opts);
 | 
				
			||||||
      this.msgs = YAML.load(PATH.join(__dirname, 'msg.yml')).events;
 | 
					      this.msgs = YAML.load(PATH.join(__dirname, 'msg.yml')).events;
 | 
				
			||||||
    },
 | 
					    };
 | 
				
			||||||
    log: function(msg) {
 | 
					
 | 
				
			||||||
 | 
					    OutputHandler.prototype.log = function(msg) {
 | 
				
			||||||
      var finished;
 | 
					      var finished;
 | 
				
			||||||
      msg = msg || '';
 | 
					      msg = msg || '';
 | 
				
			||||||
      printf = require('printf');
 | 
					      printf = require('printf');
 | 
				
			||||||
      finished = printf.apply(printf, arguments);
 | 
					      finished = printf.apply(printf, arguments);
 | 
				
			||||||
      return this.opts.silent || console.log(finished);
 | 
					      return this.opts.silent || console.log(finished);
 | 
				
			||||||
    },
 | 
					    };
 | 
				
			||||||
    "do": function(evt) {
 | 
					
 | 
				
			||||||
      var L, WRAP, info, msg, numFormats, output, rawTpl, sty, style, suffix, template, that, themeName, tot;
 | 
					    OutputHandler.prototype["do"] = function(evt) {
 | 
				
			||||||
 | 
					      var L, WRAP, adj, info, msg, msgs, numFormats, output, rawTpl, sty, style, suffix, template, that, themeName, tot;
 | 
				
			||||||
      that = this;
 | 
					      that = this;
 | 
				
			||||||
      L = function() {
 | 
					      L = function() {
 | 
				
			||||||
        return that.log.apply(that, arguments);
 | 
					        return that.log.apply(that, arguments);
 | 
				
			||||||
@@ -60,8 +65,8 @@ Output routines for HackMyResume.
 | 
				
			|||||||
      switch (evt.sub) {
 | 
					      switch (evt.sub) {
 | 
				
			||||||
        case HME.begin:
 | 
					        case HME.begin:
 | 
				
			||||||
          return this.opts.debug && L(M2C(this.msgs.begin.msg, dbgStyle), evt.cmd.toUpperCase());
 | 
					          return this.opts.debug && L(M2C(this.msgs.begin.msg, dbgStyle), evt.cmd.toUpperCase());
 | 
				
			||||||
        case HME.beforeCreate:
 | 
					        case HME.afterCreate:
 | 
				
			||||||
          L(M2C(this.msgs.beforeCreate.msg, 'green'), evt.fmt, evt.file);
 | 
					          L(M2C(this.msgs.beforeCreate.msg, evt.isError ? 'red' : 'green'), evt.fmt, evt.file);
 | 
				
			||||||
          break;
 | 
					          break;
 | 
				
			||||||
        case HME.beforeTheme:
 | 
					        case HME.beforeTheme:
 | 
				
			||||||
          return this.opts.debug && L(M2C(this.msgs.beforeTheme.msg, dbgStyle), evt.theme.toUpperCase());
 | 
					          return this.opts.debug && L(M2C(this.msgs.beforeTheme.msg, dbgStyle), evt.theme.toUpperCase());
 | 
				
			||||||
@@ -110,7 +115,7 @@ Output routines for HackMyResume.
 | 
				
			|||||||
        case HME.afterAnalyze:
 | 
					        case HME.afterAnalyze:
 | 
				
			||||||
          info = evt.info;
 | 
					          info = evt.info;
 | 
				
			||||||
          rawTpl = FS.readFileSync(PATH.join(__dirname, 'analyze.hbs'), 'utf8');
 | 
					          rawTpl = FS.readFileSync(PATH.join(__dirname, 'analyze.hbs'), 'utf8');
 | 
				
			||||||
          HANDLEBARS.registerHelper(require('../hmc/dist/helpers/console-helpers'));
 | 
					          HANDLEBARS.registerHelper(require('../helpers/console-helpers'));
 | 
				
			||||||
          template = HANDLEBARS.compile(rawTpl, {
 | 
					          template = HANDLEBARS.compile(rawTpl, {
 | 
				
			||||||
            strict: false,
 | 
					            strict: false,
 | 
				
			||||||
            assumeObjects: false
 | 
					            assumeObjects: false
 | 
				
			||||||
@@ -127,11 +132,35 @@ Output routines for HackMyResume.
 | 
				
			|||||||
        case HME.afterInlineConvert:
 | 
					        case HME.afterInlineConvert:
 | 
				
			||||||
          return L(M2C(this.msgs.afterInlineConvert.msg, 'gray', 'white.dim'), evt.file, evt.fmt);
 | 
					          return L(M2C(this.msgs.afterInlineConvert.msg, 'gray', 'white.dim'), evt.file, evt.fmt);
 | 
				
			||||||
        case HME.afterValidate:
 | 
					        case HME.afterValidate:
 | 
				
			||||||
          style = evt.isValid ? 'green' : 'yellow';
 | 
					          style = 'red';
 | 
				
			||||||
          L(M2C(this.msgs.afterValidate.msg[0], 'white') + chalk[style].bold(evt.isValid ? this.msgs.afterValidate.msg[1] : this.msgs.afterValidate.msg[2]), evt.file, evt.fmt);
 | 
					          adj = '';
 | 
				
			||||||
          if (evt.errors) {
 | 
					          msgs = this.msgs.afterValidate.msg;
 | 
				
			||||||
            return _.each(evt.errors, function(err, idx) {
 | 
					          switch (evt.status) {
 | 
				
			||||||
              return L(chalk.yellow.bold('--> ') + chalk.yellow(err.field.replace('data.', 'resume.').toUpperCase() + ' ' + err.message));
 | 
					            case 'valid':
 | 
				
			||||||
 | 
					              style = 'green';
 | 
				
			||||||
 | 
					              adj = msgs[1];
 | 
				
			||||||
 | 
					              break;
 | 
				
			||||||
 | 
					            case 'invalid':
 | 
				
			||||||
 | 
					              style = 'yellow';
 | 
				
			||||||
 | 
					              adj = msgs[2];
 | 
				
			||||||
 | 
					              break;
 | 
				
			||||||
 | 
					            case 'broken':
 | 
				
			||||||
 | 
					              style = 'red';
 | 
				
			||||||
 | 
					              adj = msgs[3];
 | 
				
			||||||
 | 
					              break;
 | 
				
			||||||
 | 
					            case 'missing':
 | 
				
			||||||
 | 
					              style = 'red';
 | 
				
			||||||
 | 
					              adj = msgs[4];
 | 
				
			||||||
 | 
					              break;
 | 
				
			||||||
 | 
					            case 'unknown':
 | 
				
			||||||
 | 
					              style = 'red';
 | 
				
			||||||
 | 
					              adj = msgs[5];
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          evt.schema = evt.schema.replace('jars', 'JSON Resume').toUpperCase();
 | 
				
			||||||
 | 
					          L(M2C(msgs[0], 'white') + chalk[style].bold(adj), evt.file, evt.schema);
 | 
				
			||||||
 | 
					          if (evt.violations) {
 | 
				
			||||||
 | 
					            _.each(evt.violations, function(err, idx) {
 | 
				
			||||||
 | 
					              L(chalk.yellow.bold('--> ') + chalk.yellow(err.field.replace('data.', 'resume.').toUpperCase() + ' ' + err.message));
 | 
				
			||||||
            }, this);
 | 
					            }, this);
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
          break;
 | 
					          break;
 | 
				
			||||||
@@ -142,16 +171,23 @@ Output routines for HackMyResume.
 | 
				
			|||||||
          } else {
 | 
					          } else {
 | 
				
			||||||
            L(M2C(this.msgs.beforePeek.msg[1], sty), evt.file);
 | 
					            L(M2C(this.msgs.beforePeek.msg[1], sty), evt.file);
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
          if (evt.target !== void 0) {
 | 
					          if (evt.target !== void 0 && !evt.error) {
 | 
				
			||||||
            return console.dir(evt.target, {
 | 
					            return console.dir(evt.target, {
 | 
				
			||||||
              depth: null,
 | 
					              depth: null,
 | 
				
			||||||
              colors: true
 | 
					              colors: true
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
          } else if (!evt.error) {
 | 
					          } else if (!evt.error) {
 | 
				
			||||||
            return L(M2C(this.msgs.afterPeek.msg, 'yellow'), evt.requested, evt.file);
 | 
					            return L(M2C(this.msgs.afterPeek.msg, 'yellow'), evt.requested, evt.file);
 | 
				
			||||||
 | 
					          } else if (evt.error) {
 | 
				
			||||||
 | 
					            return L(chalk.red(evt.error.inner.inner));
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    };
 | 
				
			||||||
  });
 | 
					
 | 
				
			||||||
 | 
					    return OutputHandler;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  })();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}).call(this);
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=out.js.map
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										73
									
								
								dist/core/abstract-resume.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								dist/core/abstract-resume.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,73 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					Definition of the AbstractResume class.
 | 
				
			||||||
 | 
					@license MIT. See LICENSE.md for details.
 | 
				
			||||||
 | 
					@module core/abstract-resume
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(function() {
 | 
				
			||||||
 | 
					  var AbstractResume, FluentDate, _, __;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  _ = require('underscore');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  __ = require('lodash');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  FluentDate = require('./fluent-date');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  AbstractResume = (function() {
 | 
				
			||||||
 | 
					    function AbstractResume() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    Compute the total duration of the work history.
 | 
				
			||||||
 | 
					    @returns The total duration of the sheet's work history, that is, the number
 | 
				
			||||||
 | 
					    of years between the start date of the earliest job on the resume and the
 | 
				
			||||||
 | 
					    *latest end date of all jobs in the work history*. This last condition is for
 | 
				
			||||||
 | 
					    sheets that have overlapping jobs.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    AbstractResume.prototype.duration = function(collKey, startKey, endKey, unit) {
 | 
				
			||||||
 | 
					      var firstDate, hist, lastDate, new_e;
 | 
				
			||||||
 | 
					      unit = unit || 'years';
 | 
				
			||||||
 | 
					      hist = __.get(this, collKey);
 | 
				
			||||||
 | 
					      if (!hist || !hist.length) {
 | 
				
			||||||
 | 
					        return 0;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      new_e = hist.map(function(job) {
 | 
				
			||||||
 | 
					        var obj;
 | 
				
			||||||
 | 
					        obj = _.pick(job, [startKey, endKey]);
 | 
				
			||||||
 | 
					        if (!_.has(obj, endKey)) {
 | 
				
			||||||
 | 
					          obj[endKey] = 'current';
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (obj && (obj[startKey] || obj[endKey])) {
 | 
				
			||||||
 | 
					          obj = _.pairs(obj);
 | 
				
			||||||
 | 
					          obj[0][1] = FluentDate.fmt(obj[0][1]);
 | 
				
			||||||
 | 
					          if (obj.length > 1) {
 | 
				
			||||||
 | 
					            obj[1][1] = FluentDate.fmt(obj[1][1]);
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return obj;
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					      new_e = _.filter(_.flatten(new_e, true), function(v) {
 | 
				
			||||||
 | 
					        return v && v.length && v[0] && v[0].length;
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					      if (!new_e || !new_e.length) {
 | 
				
			||||||
 | 
					        return 0;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      new_e = _.sortBy(new_e, function(elem) {
 | 
				
			||||||
 | 
					        return elem[1].unix();
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					      firstDate = _.first(new_e)[1];
 | 
				
			||||||
 | 
					      lastDate = _.last(new_e)[1];
 | 
				
			||||||
 | 
					      return lastDate.diff(firstDate, unit);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return AbstractResume;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  })();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  module.exports = AbstractResume;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=abstract-resume.js.map
 | 
				
			||||||
@@ -58,3 +58,5 @@ Event code definitions.
 | 
				
			|||||||
  ];
 | 
					  ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}).call(this);
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=default-formats.js.map
 | 
				
			||||||
@@ -16,3 +16,5 @@ Event code definitions.
 | 
				
			|||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}).call(this);
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=default-options.js.map
 | 
				
			||||||
@@ -33,7 +33,12 @@ Event code definitions.
 | 
				
			|||||||
    beforeInlineConvert: 22,
 | 
					    beforeInlineConvert: 22,
 | 
				
			||||||
    afterInlineConvert: 23,
 | 
					    afterInlineConvert: 23,
 | 
				
			||||||
    beforeValidate: 24,
 | 
					    beforeValidate: 24,
 | 
				
			||||||
    afterValidate: 25
 | 
					    afterValidate: 25,
 | 
				
			||||||
 | 
					    beforeWrite: 26,
 | 
				
			||||||
 | 
					    afterWrite: 27,
 | 
				
			||||||
 | 
					    applyTheme: 28
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}).call(this);
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=event-codes.js.map
 | 
				
			||||||
@@ -10,6 +10,8 @@ The HackMyResume date representation.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  moment = require('moment');
 | 
					  moment = require('moment');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  require('../utils/string');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /**
 | 
					  /**
 | 
				
			||||||
  Create a FluentDate from a string or Moment date object. There are a few date
 | 
					  Create a FluentDate from a string or Moment date object. There are a few date
 | 
				
			||||||
@@ -33,6 +35,10 @@ The HackMyResume date representation.
 | 
				
			|||||||
      this.rep = this.fmt(dt);
 | 
					      this.rep = this.fmt(dt);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    FluentDate.isCurrent = function(dt) {
 | 
				
			||||||
 | 
					      return !dt || (String.is(dt) && /^(present|now|current)$/.test(dt));
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return FluentDate;
 | 
					    return FluentDate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  })();
 | 
					  })();
 | 
				
			||||||
@@ -54,7 +60,7 @@ The HackMyResume date representation.
 | 
				
			|||||||
  module.exports = FluentDate;
 | 
					  module.exports = FluentDate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  FluentDate.fmt = function(dt, throws) {
 | 
					  FluentDate.fmt = function(dt, throws) {
 | 
				
			||||||
    var defTime, month, mt, parts, ref, temp;
 | 
					    var month, mt, parts, ref, temp;
 | 
				
			||||||
    throws = (throws === void 0 || throws === null) || throws;
 | 
					    throws = (throws === void 0 || throws === null) || throws;
 | 
				
			||||||
    if (typeof dt === 'string' || dt instanceof String) {
 | 
					    if (typeof dt === 'string' || dt instanceof String) {
 | 
				
			||||||
      dt = dt.toLowerCase().trim();
 | 
					      dt = dt.toLowerCase().trim();
 | 
				
			||||||
@@ -72,33 +78,7 @@ The HackMyResume date representation.
 | 
				
			|||||||
      } else if (/^\s*\d{4}\s*$/.test(dt)) {
 | 
					      } else if (/^\s*\d{4}\s*$/.test(dt)) {
 | 
				
			||||||
        return moment(dt, 'YYYY');
 | 
					        return moment(dt, 'YYYY');
 | 
				
			||||||
      } else if (/^\s*$/.test(dt)) {
 | 
					      } else if (/^\s*$/.test(dt)) {
 | 
				
			||||||
        defTime = {
 | 
					        return moment();
 | 
				
			||||||
          isNull: true,
 | 
					 | 
				
			||||||
          isBefore: function(other) {
 | 
					 | 
				
			||||||
            if (other && !other.isNull) {
 | 
					 | 
				
			||||||
              return true;
 | 
					 | 
				
			||||||
            } else {
 | 
					 | 
				
			||||||
              return false;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          isAfter: function(other) {
 | 
					 | 
				
			||||||
            if (other && !other.isNull) {
 | 
					 | 
				
			||||||
              return false;
 | 
					 | 
				
			||||||
            } else {
 | 
					 | 
				
			||||||
              return false;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          unix: function() {
 | 
					 | 
				
			||||||
            return 0;
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          format: function() {
 | 
					 | 
				
			||||||
            return '';
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          diff: function() {
 | 
					 | 
				
			||||||
            return 0;
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
        return defTime;
 | 
					 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
        mt = moment(dt);
 | 
					        mt = moment(dt);
 | 
				
			||||||
        if (mt.isValid()) {
 | 
					        if (mt.isValid()) {
 | 
				
			||||||
@@ -123,3 +103,5 @@ The HackMyResume date representation.
 | 
				
			|||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}).call(this);
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=fluent-date.js.map
 | 
				
			||||||
@@ -6,7 +6,9 @@ Definition of the FRESHResume class.
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(function() {
 | 
					(function() {
 | 
				
			||||||
  var CONVERTER, FS, FreshResume, JRSResume, MD, PATH, XML, _, __, _parseDates, extend, moment, validator;
 | 
					  var AbstractResume, CONVERTER, FS, FluentDate, FreshResume, JRSResume, MD, PATH, XML, _, __, _parseDates, extend, moment, validator,
 | 
				
			||||||
 | 
					    extend1 = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
 | 
				
			||||||
 | 
					    hasProp = {}.hasOwnProperty;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  FS = require('fs');
 | 
					  FS = require('fs');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -30,6 +32,10 @@ Definition of the FRESHResume class.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  JRSResume = require('./jrs-resume');
 | 
					  JRSResume = require('./jrs-resume');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  FluentDate = require('./fluent-date');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  AbstractResume = require('./abstract-resume');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /**
 | 
					  /**
 | 
				
			||||||
  A FRESH resume or CV. FRESH resumes are backed by JSON, and each FreshResume
 | 
					  A FRESH resume or CV. FRESH resumes are backed by JSON, and each FreshResume
 | 
				
			||||||
@@ -37,24 +43,21 @@ Definition of the FRESHResume class.
 | 
				
			|||||||
  @constructor
 | 
					  @constructor
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  FreshResume = (function() {
 | 
					  FreshResume = (function(superClass) {
 | 
				
			||||||
    function FreshResume() {}
 | 
					    extend1(FreshResume, superClass);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function FreshResume() {
 | 
				
			||||||
    /** Initialize the FreshResume from file. */
 | 
					      return FreshResume.__super__.constructor.apply(this, arguments);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    FreshResume.prototype.open = function(file, opts) {
 | 
					 | 
				
			||||||
      var raw, ret;
 | 
					 | 
				
			||||||
      raw = FS.readFileSync(file, 'utf8');
 | 
					 | 
				
			||||||
      ret = this.parse(raw, opts);
 | 
					 | 
				
			||||||
      this.imp.file = file;
 | 
					 | 
				
			||||||
      return ret;
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /** Initialize the the FreshResume from JSON string data. */
 | 
					    /** Initialize the the FreshResume from JSON string data. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    FreshResume.prototype.parse = function(stringData, opts) {
 | 
					    FreshResume.prototype.parse = function(stringData, opts) {
 | 
				
			||||||
 | 
					      var ref;
 | 
				
			||||||
 | 
					      this.imp = (ref = this.imp) != null ? ref : {
 | 
				
			||||||
 | 
					        raw: stringData
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
      return this.parseJSON(JSON.parse(stringData), opts);
 | 
					      return this.parseJSON(JSON.parse(stringData), opts);
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -74,7 +77,7 @@ Definition of the FRESHResume class.
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    FreshResume.prototype.parseJSON = function(rep, opts) {
 | 
					    FreshResume.prototype.parseJSON = function(rep, opts) {
 | 
				
			||||||
      var ignoreList, scrubbed, that, traverse;
 | 
					      var ignoreList, ref, scrubbed, that, traverse;
 | 
				
			||||||
      that = this;
 | 
					      that = this;
 | 
				
			||||||
      traverse = require('traverse');
 | 
					      traverse = require('traverse');
 | 
				
			||||||
      ignoreList = [];
 | 
					      ignoreList = [];
 | 
				
			||||||
@@ -87,12 +90,16 @@ Definition of the FRESHResume class.
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
      extend(true, this, scrubbed);
 | 
					      extend(true, this, scrubbed);
 | 
				
			||||||
      if (!this.imp) {
 | 
					      if (!((ref = this.imp) != null ? ref.processed : void 0)) {
 | 
				
			||||||
        opts = opts || {};
 | 
					        opts = opts || {};
 | 
				
			||||||
        if (opts.imp === void 0 || opts.imp) {
 | 
					        if (opts.imp === void 0 || opts.imp) {
 | 
				
			||||||
          this.imp = this.imp || {};
 | 
					          this.imp = this.imp || {};
 | 
				
			||||||
          this.imp.title = (opts.title || this.imp.title) || this.name;
 | 
					          this.imp.title = (opts.title || this.imp.title) || this.name;
 | 
				
			||||||
 | 
					          if (!this.imp.raw) {
 | 
				
			||||||
 | 
					            this.imp.raw = JSON.stringify(rep);
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        this.imp.processed = true;
 | 
				
			||||||
        (opts.date === void 0 || opts.date) && _parseDates.call(this);
 | 
					        (opts.date === void 0 || opts.date) && _parseDates.call(this);
 | 
				
			||||||
        (opts.sort === void 0 || opts.sort) && this.sort();
 | 
					        (opts.sort === void 0 || opts.sort) && this.sort();
 | 
				
			||||||
        (opts.compute === void 0 || opts.compute) && (this.computed = {
 | 
					        (opts.compute === void 0 || opts.compute) && (this.computed = {
 | 
				
			||||||
@@ -368,36 +375,8 @@ Definition of the FRESHResume class.
 | 
				
			|||||||
      return ret;
 | 
					      return ret;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
    Calculate the total duration of the sheet. Assumes this.work has been sorted
 | 
					 | 
				
			||||||
    by start date descending, perhaps via a call to Sheet.sort().
 | 
					 | 
				
			||||||
    @returns The total duration of the sheet's work history, that is, the number
 | 
					 | 
				
			||||||
    of years between the start date of the earliest job on the resume and the
 | 
					 | 
				
			||||||
    *latest end date of all jobs in the work history*. This last condition is for
 | 
					 | 
				
			||||||
    sheets that have overlapping jobs.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    FreshResume.prototype.duration = function(unit) {
 | 
					    FreshResume.prototype.duration = function(unit) {
 | 
				
			||||||
      var careerLast, careerStart, empHist, firstJob;
 | 
					      return FreshResume.__super__.duration.call(this, 'employment.history', 'start', 'end', unit);
 | 
				
			||||||
      unit = unit || 'years';
 | 
					 | 
				
			||||||
      empHist = __.get(this, 'employment.history');
 | 
					 | 
				
			||||||
      if (empHist && empHist.length) {
 | 
					 | 
				
			||||||
        firstJob = _.last(empHist);
 | 
					 | 
				
			||||||
        careerStart = firstJob.start ? firstJob.safe.start : '';
 | 
					 | 
				
			||||||
        if ((typeof careerStart === 'string' || careerStart instanceof String) && !careerStart.trim()) {
 | 
					 | 
				
			||||||
          return 0;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        careerLast = _.max(empHist, function(w) {
 | 
					 | 
				
			||||||
          if (w.safe && w.safe.end) {
 | 
					 | 
				
			||||||
            return w.safe.end.unix();
 | 
					 | 
				
			||||||
          } else {
 | 
					 | 
				
			||||||
            return moment().unix();
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
        return careerLast.safe.end.diff(careerStart, unit);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      return 0;
 | 
					 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -412,7 +391,11 @@ Definition of the FRESHResume class.
 | 
				
			|||||||
        if (a.safe.start.isBefore(b.safe.start)) {
 | 
					        if (a.safe.start.isBefore(b.safe.start)) {
 | 
				
			||||||
          return 1;
 | 
					          return 1;
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
          return (a.safe.start.isAfter(b.safe.start) && -1) || 0;
 | 
					          if (a.safe.start.isAfter(b.safe.start)) {
 | 
				
			||||||
 | 
					            return -1;
 | 
				
			||||||
 | 
					          } else {
 | 
				
			||||||
 | 
					            return 0;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
      sortSection = function(key) {
 | 
					      sortSection = function(key) {
 | 
				
			||||||
@@ -440,7 +423,7 @@ Definition of the FRESHResume class.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    return FreshResume;
 | 
					    return FreshResume;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  })();
 | 
					  })(AbstractResume);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /**
 | 
					  /**
 | 
				
			||||||
@@ -448,7 +431,7 @@ Definition of the FRESHResume class.
 | 
				
			|||||||
   */
 | 
					   */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  FreshResume["default"] = function() {
 | 
					  FreshResume["default"] = function() {
 | 
				
			||||||
    return new FreshResume().parseJSON(require('fresh-resume-starter'));
 | 
					    return new FreshResume().parseJSON(require('fresh-resume-starter').fresh);
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -491,7 +474,7 @@ Definition of the FRESHResume class.
 | 
				
			|||||||
        return;
 | 
					        return;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      if (Object.prototype.toString.call(obj) === '[object Array]') {
 | 
					      if (Object.prototype.toString.call(obj) === '[object Array]') {
 | 
				
			||||||
        return obj.forEach(function(elem) {
 | 
					        obj.forEach(function(elem) {
 | 
				
			||||||
          return replaceDatesInObject(elem);
 | 
					          return replaceDatesInObject(elem);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
      } else if (typeof obj === 'object') {
 | 
					      } else if (typeof obj === 'object') {
 | 
				
			||||||
@@ -501,19 +484,19 @@ Definition of the FRESHResume class.
 | 
				
			|||||||
        Object.keys(obj).forEach(function(key) {
 | 
					        Object.keys(obj).forEach(function(key) {
 | 
				
			||||||
          return replaceDatesInObject(obj[key]);
 | 
					          return replaceDatesInObject(obj[key]);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
        return ['start', 'end', 'date'].forEach(function(val) {
 | 
					        ['start', 'end', 'date'].forEach(function(val) {
 | 
				
			||||||
          if ((obj[val] !== void 0) && (!obj.safe || !obj.safe[val])) {
 | 
					          if ((obj[val] !== void 0) && (!obj.safe || !obj.safe[val])) {
 | 
				
			||||||
            obj.safe = obj.safe || {};
 | 
					            obj.safe = obj.safe || {};
 | 
				
			||||||
            obj.safe[val] = _fmt(obj[val]);
 | 
					            obj.safe[val] = _fmt(obj[val]);
 | 
				
			||||||
            if (obj[val] && (val === 'start') && !obj.end) {
 | 
					            if (obj[val] && (val === 'start') && !obj.end) {
 | 
				
			||||||
              return obj.safe.end = _fmt('current');
 | 
					              obj.safe.end = _fmt('current');
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    return Object.keys(this).forEach(function(member) {
 | 
					    Object.keys(this).forEach(function(member) {
 | 
				
			||||||
      return replaceDatesInObject(that[member]);
 | 
					      replaceDatesInObject(that[member]);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -523,3 +506,5 @@ Definition of the FRESHResume class.
 | 
				
			|||||||
  module.exports = FreshResume;
 | 
					  module.exports = FreshResume;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}).call(this);
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=fresh-resume.js.map
 | 
				
			||||||
@@ -6,7 +6,7 @@ Definition of the FRESHTheme class.
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(function() {
 | 
					(function() {
 | 
				
			||||||
  var EXTEND, FRESHTheme, FS, HMSTATUS, PATH, READFILES, _, friendlyName, loadExplicit, loadImplicit, loadSafeJson, moment, parsePath, pathExists, validator;
 | 
					  var EXTEND, FRESHTheme, FS, HMSTATUS, PATH, READFILES, _, _load, _loadOne, friendlyName, loadSafeJson, moment, parsePath, pathExists, validator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  FS = require('fs');
 | 
					  FS = require('fs');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -31,9 +31,7 @@ Definition of the FRESHTheme class.
 | 
				
			|||||||
  READFILES = require('recursive-readdir-sync');
 | 
					  READFILES = require('recursive-readdir-sync');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /*
 | 
					  /* A representation of a FRESH theme asset.
 | 
				
			||||||
  The FRESHTheme class is a representation of a FRESH theme
 | 
					 | 
				
			||||||
  asset. See also: JRSTheme.
 | 
					 | 
				
			||||||
  @class FRESHTheme
 | 
					  @class FRESHTheme
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -41,9 +39,7 @@ Definition of the FRESHTheme class.
 | 
				
			|||||||
    function FRESHTheme() {}
 | 
					    function FRESHTheme() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /*
 | 
					    /* Open and parse the specified theme. */
 | 
				
			||||||
    Open and parse the specified theme.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    FRESHTheme.prototype.open = function(themeFolder) {
 | 
					    FRESHTheme.prototype.open = function(themeFolder) {
 | 
				
			||||||
      var cached, formatsHash, pathInfo, that, themeFile, themeInfo;
 | 
					      var cached, formatsHash, pathInfo, that, themeFile, themeInfo;
 | 
				
			||||||
@@ -71,12 +67,7 @@ Definition of the FRESHTheme class.
 | 
				
			|||||||
          return formatsHash[key] = cached[th].getFormat(key);
 | 
					          return formatsHash[key] = cached[th].getFormat(key);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      if (!!this.formats) {
 | 
					      formatsHash = _load.call(this, formatsHash);
 | 
				
			||||||
        formatsHash = loadExplicit.call(this, formatsHash);
 | 
					 | 
				
			||||||
        this.explicit = true;
 | 
					 | 
				
			||||||
      } else {
 | 
					 | 
				
			||||||
        formatsHash = loadImplicit.call(this, formatsHash);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      this.formats = formatsHash;
 | 
					      this.formats = formatsHash;
 | 
				
			||||||
      this.name = parsePath(this.folder).name;
 | 
					      this.name = parsePath(this.folder).name;
 | 
				
			||||||
      return this;
 | 
					      return this;
 | 
				
			||||||
@@ -101,63 +92,17 @@ Definition of the FRESHTheme class.
 | 
				
			|||||||
  })();
 | 
					  })();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* Load the theme implicitly, by scanning the theme folder for files. TODO:
 | 
					  /* Load and parse theme source files. */
 | 
				
			||||||
  Refactor duplicated code with loadExplicit.
 | 
					 | 
				
			||||||
   */
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  loadImplicit = function(formatsHash) {
 | 
					  _load = function(formatsHash) {
 | 
				
			||||||
    var fmts, major, that, tplFolder;
 | 
					    var copyOnly, fmts, major, that, tplFolder;
 | 
				
			||||||
    that = this;
 | 
					    that = this;
 | 
				
			||||||
    major = false;
 | 
					    major = false;
 | 
				
			||||||
    tplFolder = PATH.join(this.folder, 'src');
 | 
					    tplFolder = PATH.join(this.folder, 'src');
 | 
				
			||||||
 | 
					    copyOnly = ['.ttf', '.otf', '.png', '.jpg', '.jpeg', '.pdf'];
 | 
				
			||||||
    fmts = READFILES(tplFolder).map(function(absPath) {
 | 
					    fmts = READFILES(tplFolder).map(function(absPath) {
 | 
				
			||||||
      var idx, isMajor, obj, outFmt, pathInfo, portion, reg, res;
 | 
					      return _loadOne.call(this, absPath, formatsHash, tplFolder);
 | 
				
			||||||
      pathInfo = parsePath(absPath);
 | 
					    }, this);
 | 
				
			||||||
      outFmt = '';
 | 
					 | 
				
			||||||
      isMajor = false;
 | 
					 | 
				
			||||||
      portion = pathInfo.dirname.replace(tplFolder, '');
 | 
					 | 
				
			||||||
      if (portion && portion.trim()) {
 | 
					 | 
				
			||||||
        if (portion[1] === '_') {
 | 
					 | 
				
			||||||
          return;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        reg = /^(?:\/|\\)(html|latex|doc|pdf|png|partials)(?:\/|\\)?/ig;
 | 
					 | 
				
			||||||
        res = reg.exec(portion);
 | 
					 | 
				
			||||||
        if (res) {
 | 
					 | 
				
			||||||
          if (res[1] !== 'partials') {
 | 
					 | 
				
			||||||
            outFmt = res[1];
 | 
					 | 
				
			||||||
          } else {
 | 
					 | 
				
			||||||
            that.partials = that.partials || [];
 | 
					 | 
				
			||||||
            that.partials.push({
 | 
					 | 
				
			||||||
              name: pathInfo.name,
 | 
					 | 
				
			||||||
              path: absPath
 | 
					 | 
				
			||||||
            });
 | 
					 | 
				
			||||||
            return null;
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      if (!outFmt) {
 | 
					 | 
				
			||||||
        idx = pathInfo.name.lastIndexOf('-');
 | 
					 | 
				
			||||||
        outFmt = idx === -1 ? pathInfo.name : pathInfo.name.substr(idx + 1);
 | 
					 | 
				
			||||||
        isMajor = true;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      formatsHash[outFmt] = formatsHash[outFmt] || {
 | 
					 | 
				
			||||||
        outFormat: outFmt,
 | 
					 | 
				
			||||||
        files: []
 | 
					 | 
				
			||||||
      };
 | 
					 | 
				
			||||||
      obj = {
 | 
					 | 
				
			||||||
        action: 'transform',
 | 
					 | 
				
			||||||
        path: absPath,
 | 
					 | 
				
			||||||
        major: isMajor,
 | 
					 | 
				
			||||||
        orgPath: PATH.relative(tplFolder, absPath),
 | 
					 | 
				
			||||||
        ext: pathInfo.extname.slice(1),
 | 
					 | 
				
			||||||
        title: friendlyName(outFmt),
 | 
					 | 
				
			||||||
        pre: outFmt,
 | 
					 | 
				
			||||||
        data: FS.readFileSync(absPath, 'utf8'),
 | 
					 | 
				
			||||||
        css: null
 | 
					 | 
				
			||||||
      };
 | 
					 | 
				
			||||||
      formatsHash[outFmt].files.push(obj);
 | 
					 | 
				
			||||||
      return obj;
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
    this.cssFiles = fmts.filter(function(fmt) {
 | 
					    this.cssFiles = fmts.filter(function(fmt) {
 | 
				
			||||||
      return fmt && (fmt.ext === 'css');
 | 
					      return fmt && (fmt.ext === 'css');
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
@@ -183,54 +128,77 @@ Definition of the FRESHTheme class.
 | 
				
			|||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /*
 | 
					  /* Load a single theme file. */
 | 
				
			||||||
  Load the theme explicitly, by following the 'formats' hash
 | 
					 | 
				
			||||||
  in the theme's JSON settings file.
 | 
					 | 
				
			||||||
   */
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  loadExplicit = function(formatsHash) {
 | 
					  _loadOne = function(absPath, formatsHash, tplFolder) {
 | 
				
			||||||
    var act, fmts, that, tplFolder;
 | 
					    var absPathSafe, act, defFormats, idx, isPrimary, obj, outFmt, pathInfo, portion, ref, ref1, reg, res;
 | 
				
			||||||
    tplFolder = PATH.join(this.folder, 'src');
 | 
					 | 
				
			||||||
    act = null;
 | 
					 | 
				
			||||||
    that = this;
 | 
					 | 
				
			||||||
    fmts = READFILES(tplFolder).map(function(absPath) {
 | 
					 | 
				
			||||||
      var absPathSafe, idx, obj, outFmt, pathInfo, portion, reg, res;
 | 
					 | 
				
			||||||
      act = null;
 | 
					 | 
				
			||||||
    pathInfo = parsePath(absPath);
 | 
					    pathInfo = parsePath(absPath);
 | 
				
			||||||
    absPathSafe = absPath.trim().toLowerCase();
 | 
					    absPathSafe = absPath.trim().toLowerCase();
 | 
				
			||||||
      outFmt = _.find(Object.keys(that.formats), function(fmtKey) {
 | 
					    outFmt = '';
 | 
				
			||||||
 | 
					    act = 'copy';
 | 
				
			||||||
 | 
					    isPrimary = false;
 | 
				
			||||||
 | 
					    if (this.explicit) {
 | 
				
			||||||
 | 
					      outFmt = _.find(Object.keys(this.formats), function(fmtKey) {
 | 
				
			||||||
        var fmtVal;
 | 
					        var fmtVal;
 | 
				
			||||||
        fmtVal = that.formats[fmtKey];
 | 
					        fmtVal = this.formats[fmtKey];
 | 
				
			||||||
        return _.some(fmtVal.transform, function(fpath) {
 | 
					        return _.some(fmtVal.transform, function(fpath) {
 | 
				
			||||||
          var absPathB;
 | 
					          var absPathB;
 | 
				
			||||||
          absPathB = PATH.join(that.folder, fpath).trim().toLowerCase();
 | 
					          absPathB = PATH.join(this.folder, fpath).trim().toLowerCase();
 | 
				
			||||||
          return absPathB === absPathSafe;
 | 
					          return absPathB === absPathSafe;
 | 
				
			||||||
        });
 | 
					        }, this);
 | 
				
			||||||
      });
 | 
					      }, this);
 | 
				
			||||||
      if (outFmt) {
 | 
					      if (outFmt) {
 | 
				
			||||||
        act = 'transform';
 | 
					        act = 'transform';
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    if (!outFmt) {
 | 
					    if (!outFmt) {
 | 
				
			||||||
      portion = pathInfo.dirname.replace(tplFolder, '');
 | 
					      portion = pathInfo.dirname.replace(tplFolder, '');
 | 
				
			||||||
      if (portion && portion.trim()) {
 | 
					      if (portion && portion.trim()) {
 | 
				
			||||||
          reg = /^(?:\/|\\)(html|latex|doc|pdf)(?:\/|\\)?/ig;
 | 
					        if (portion[1] === '_') {
 | 
				
			||||||
 | 
					          return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        reg = /^(?:\/|\\)(html|latex|doc|pdf|png|partials)(?:\/|\\)?/ig;
 | 
				
			||||||
        res = reg.exec(portion);
 | 
					        res = reg.exec(portion);
 | 
				
			||||||
          res && (outFmt = res[1]);
 | 
					        if (res) {
 | 
				
			||||||
 | 
					          if (res[1] !== 'partials') {
 | 
				
			||||||
 | 
					            outFmt = res[1];
 | 
				
			||||||
 | 
					            if (!this.explicit) {
 | 
				
			||||||
 | 
					              act = 'transform';
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          } else {
 | 
				
			||||||
 | 
					            this.partials = this.partials || [];
 | 
				
			||||||
 | 
					            this.partials.push({
 | 
				
			||||||
 | 
					              name: pathInfo.name,
 | 
				
			||||||
 | 
					              path: absPath
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            return null;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (!outFmt) {
 | 
					    if (!outFmt) {
 | 
				
			||||||
      idx = pathInfo.name.lastIndexOf('-');
 | 
					      idx = pathInfo.name.lastIndexOf('-');
 | 
				
			||||||
      outFmt = idx === -1 ? pathInfo.name : pathInfo.name.substr(idx + 1);
 | 
					      outFmt = idx === -1 ? pathInfo.name : pathInfo.name.substr(idx + 1);
 | 
				
			||||||
 | 
					      if (!this.explicit) {
 | 
				
			||||||
 | 
					        act = 'transform';
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      defFormats = require('./default-formats');
 | 
				
			||||||
 | 
					      isPrimary = _.some(defFormats, function(form) {
 | 
				
			||||||
 | 
					        return form.name === outFmt && pathInfo.extname !== '.css';
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    formatsHash[outFmt] = formatsHash[outFmt] || {
 | 
					    formatsHash[outFmt] = formatsHash[outFmt] || {
 | 
				
			||||||
      outFormat: outFmt,
 | 
					      outFormat: outFmt,
 | 
				
			||||||
        files: [],
 | 
					      files: []
 | 
				
			||||||
        symLinks: that.formats[outFmt].symLinks
 | 
					 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					    if ((ref = this.formats) != null ? (ref1 = ref[outFmt]) != null ? ref1.symLinks : void 0 : void 0) {
 | 
				
			||||||
 | 
					      formatsHash[outFmt].symLinks = this.formats[outFmt].symLinks;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    obj = {
 | 
					    obj = {
 | 
				
			||||||
      action: act,
 | 
					      action: act,
 | 
				
			||||||
        orgPath: PATH.relative(that.folder, absPath),
 | 
					      primary: isPrimary,
 | 
				
			||||||
      path: absPath,
 | 
					      path: absPath,
 | 
				
			||||||
 | 
					      orgPath: PATH.relative(tplFolder, absPath),
 | 
				
			||||||
      ext: pathInfo.extname.slice(1),
 | 
					      ext: pathInfo.extname.slice(1),
 | 
				
			||||||
      title: friendlyName(outFmt),
 | 
					      title: friendlyName(outFmt),
 | 
				
			||||||
      pre: outFmt,
 | 
					      pre: outFmt,
 | 
				
			||||||
@@ -239,33 +207,14 @@ Definition of the FRESHTheme class.
 | 
				
			|||||||
    };
 | 
					    };
 | 
				
			||||||
    formatsHash[outFmt].files.push(obj);
 | 
					    formatsHash[outFmt].files.push(obj);
 | 
				
			||||||
    return obj;
 | 
					    return obj;
 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
    this.cssFiles = fmts.filter(function(fmt) {
 | 
					 | 
				
			||||||
      return fmt.ext === 'css';
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
    this.cssFiles.forEach(function(cssf) {
 | 
					 | 
				
			||||||
      var idx;
 | 
					 | 
				
			||||||
      idx = _.findIndex(fmts, function(fmt) {
 | 
					 | 
				
			||||||
        return fmt.pre === cssf.pre && fmt.ext === 'html';
 | 
					 | 
				
			||||||
      });
 | 
					 | 
				
			||||||
      fmts[idx].css = cssf.data;
 | 
					 | 
				
			||||||
      return fmts[idx].cssPath = cssf.path;
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
    fmts = fmts.filter(function(fmt) {
 | 
					 | 
				
			||||||
      return fmt.ext !== 'css';
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
    return formatsHash;
 | 
					 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /*
 | 
					  /* Return a more friendly name for certain formats. */
 | 
				
			||||||
  Return a more friendly name for certain formats.
 | 
					 | 
				
			||||||
  TODO: Refactor
 | 
					 | 
				
			||||||
   */
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  friendlyName = function(val) {
 | 
					  friendlyName = function(val) {
 | 
				
			||||||
    var friendly;
 | 
					    var friendly;
 | 
				
			||||||
    val = val.trim().toLowerCase();
 | 
					    val = (val && val.trim().toLowerCase()) || '';
 | 
				
			||||||
    friendly = {
 | 
					    friendly = {
 | 
				
			||||||
      yml: 'yaml',
 | 
					      yml: 'yaml',
 | 
				
			||||||
      md: 'markdown',
 | 
					      md: 'markdown',
 | 
				
			||||||
@@ -277,3 +226,5 @@ Definition of the FRESHTheme class.
 | 
				
			|||||||
  module.exports = FRESHTheme;
 | 
					  module.exports = FRESHTheme;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}).call(this);
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=fresh-theme.js.map
 | 
				
			||||||
@@ -6,7 +6,9 @@ Definition of the JRSResume class.
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(function() {
 | 
					(function() {
 | 
				
			||||||
  var CONVERTER, FS, JRSResume, MD, PATH, _, _parseDates, extend, moment, validator;
 | 
					  var AbstractResume, CONVERTER, FS, JRSResume, MD, PATH, _, _parseDates, extend, moment, validator,
 | 
				
			||||||
 | 
					    extend1 = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
 | 
				
			||||||
 | 
					    hasProp = {}.hasOwnProperty;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  FS = require('fs');
 | 
					  FS = require('fs');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -24,6 +26,8 @@ Definition of the JRSResume class.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  moment = require('moment');
 | 
					  moment = require('moment');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  AbstractResume = require('./abstract-resume');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /**
 | 
					  /**
 | 
				
			||||||
  A JRS resume or CV. JRS resumes are backed by JSON, and each JRSResume object
 | 
					  A JRS resume or CV. JRS resumes are backed by JSON, and each JRSResume object
 | 
				
			||||||
@@ -31,32 +35,24 @@ Definition of the JRSResume class.
 | 
				
			|||||||
  @class JRSResume
 | 
					  @class JRSResume
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  JRSResume = (function() {
 | 
					  JRSResume = (function(superClass) {
 | 
				
			||||||
    var clear, format;
 | 
					    var clear;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function JRSResume() {}
 | 
					    extend1(JRSResume, superClass);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function JRSResume() {
 | 
				
			||||||
    /** Initialize the JSResume from file. */
 | 
					      return JRSResume.__super__.constructor.apply(this, arguments);
 | 
				
			||||||
 | 
					 | 
				
			||||||
    JRSResume.prototype.open = function(file, title) {
 | 
					 | 
				
			||||||
      this.basics = {
 | 
					 | 
				
			||||||
        imp: {
 | 
					 | 
				
			||||||
          file: file,
 | 
					 | 
				
			||||||
          raw: FS.readFileSync(file, 'utf8')
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
      };
 | 
					 | 
				
			||||||
      return this.parse(this.basics.imp.raw, title);
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /** Initialize the the JSResume from string. */
 | 
					    /** Initialize the the JSResume from string. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    JRSResume.prototype.parse = function(stringData, opts) {
 | 
					    JRSResume.prototype.parse = function(stringData, opts) {
 | 
				
			||||||
      var rep;
 | 
					      var ref;
 | 
				
			||||||
      opts = opts || {};
 | 
					      this.imp = (ref = this.imp) != null ? ref : {
 | 
				
			||||||
      rep = JSON.parse(stringData);
 | 
					        raw: stringData
 | 
				
			||||||
      return this.parseJSON(rep, opts);
 | 
					      };
 | 
				
			||||||
 | 
					      return this.parseJSON(JSON.parse(stringData), opts);
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -75,7 +71,7 @@ Definition of the JRSResume class.
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    JRSResume.prototype.parseJSON = function(rep, opts) {
 | 
					    JRSResume.prototype.parseJSON = function(rep, opts) {
 | 
				
			||||||
      var ignoreList, scrubbed, that, traverse;
 | 
					      var ignoreList, ref, scrubbed, that, traverse;
 | 
				
			||||||
      opts = opts || {};
 | 
					      opts = opts || {};
 | 
				
			||||||
      that = this;
 | 
					      that = this;
 | 
				
			||||||
      traverse = require('traverse');
 | 
					      traverse = require('traverse');
 | 
				
			||||||
@@ -89,10 +85,16 @@ Definition of the JRSResume class.
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
      extend(true, this, scrubbed);
 | 
					      extend(true, this, scrubbed);
 | 
				
			||||||
 | 
					      if (!((ref = this.imp) != null ? ref.processed : void 0)) {
 | 
				
			||||||
 | 
					        opts = opts || {};
 | 
				
			||||||
        if (opts.imp === void 0 || opts.imp) {
 | 
					        if (opts.imp === void 0 || opts.imp) {
 | 
				
			||||||
        this.basics.imp = this.basics.imp || {};
 | 
					          this.imp = this.imp || {};
 | 
				
			||||||
        this.basics.imp.title = (opts.title || this.basics.imp.title) || this.basics.name;
 | 
					          this.imp.title = (opts.title || this.imp.title) || this.basics.name;
 | 
				
			||||||
        this.basics.imp.orgFormat = 'JRS';
 | 
					          if (!this.imp.raw) {
 | 
				
			||||||
 | 
					            this.imp.raw = JSON.stringify(rep);
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        this.imp.processed = true;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      (opts.date === void 0 || opts.date) && _parseDates.call(this);
 | 
					      (opts.date === void 0 || opts.date) && _parseDates.call(this);
 | 
				
			||||||
      (opts.sort === void 0 || opts.sort) && this.sort();
 | 
					      (opts.sort === void 0 || opts.sort) && this.sort();
 | 
				
			||||||
@@ -109,8 +111,8 @@ Definition of the JRSResume class.
 | 
				
			|||||||
    /** Save the sheet to disk (for environments that have disk access). */
 | 
					    /** Save the sheet to disk (for environments that have disk access). */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    JRSResume.prototype.save = function(filename) {
 | 
					    JRSResume.prototype.save = function(filename) {
 | 
				
			||||||
      this.basics.imp.file = filename || this.basics.imp.file;
 | 
					      this.imp.file = filename || this.imp.file;
 | 
				
			||||||
      FS.writeFileSync(this.basics.imp.file, this.stringify(this), 'utf8');
 | 
					      FS.writeFileSync(this.imp.file, this.stringify(this), 'utf8');
 | 
				
			||||||
      return this;
 | 
					      return this;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -120,8 +122,8 @@ Definition of the JRSResume class.
 | 
				
			|||||||
    JRSResume.prototype.saveAs = function(filename, format) {
 | 
					    JRSResume.prototype.saveAs = function(filename, format) {
 | 
				
			||||||
      var newRep, stringRep;
 | 
					      var newRep, stringRep;
 | 
				
			||||||
      if (format === 'JRS') {
 | 
					      if (format === 'JRS') {
 | 
				
			||||||
        this.basics.imp.file = filename || this.basics.imp.file;
 | 
					        this.imp.file = filename || this.imp.file;
 | 
				
			||||||
        FS.writeFileSync(this.basics.imp.file, this.stringify(), 'utf8');
 | 
					        FS.writeFileSync(this.imp.file, this.stringify(), 'utf8');
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
        newRep = CONVERTER.toFRESH(this);
 | 
					        newRep = CONVERTER.toFRESH(this);
 | 
				
			||||||
        stringRep = CONVERTER.toSTRING(newRep);
 | 
					        stringRep = CONVERTER.toSTRING(newRep);
 | 
				
			||||||
@@ -133,7 +135,7 @@ Definition of the JRSResume class.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    /** Return the resume format. */
 | 
					    /** Return the resume format. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    format = function() {
 | 
					    JRSResume.prototype.format = function() {
 | 
				
			||||||
      return 'JRS';
 | 
					      return 'JRS';
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -163,9 +165,8 @@ Definition of the JRSResume class.
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    JRSResume.prototype.i = function() {
 | 
					    JRSResume.prototype.i = function() {
 | 
				
			||||||
      this.basics = this.basics || {};
 | 
					      var ref;
 | 
				
			||||||
      this.basics.imp = this.basics.imp || {};
 | 
					      return this.imp = (ref = this.imp) != null ? ref : {};
 | 
				
			||||||
      return this.basics.imp;
 | 
					 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -225,7 +226,7 @@ Definition of the JRSResume class.
 | 
				
			|||||||
    /** Validate the sheet against the JSON Resume schema. */
 | 
					    /** Validate the sheet against the JSON Resume schema. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    JRSResume.prototype.isValid = function() {
 | 
					    JRSResume.prototype.isValid = function() {
 | 
				
			||||||
      var ret, schema, schemaObj, validate;
 | 
					      var ret, schema, schemaObj, temp, validate;
 | 
				
			||||||
      schema = FS.readFileSync(PATH.join(__dirname, 'resume.json'), 'utf8');
 | 
					      schema = FS.readFileSync(PATH.join(__dirname, 'resume.json'), 'utf8');
 | 
				
			||||||
      schemaObj = JSON.parse(schema);
 | 
					      schemaObj = JSON.parse(schema);
 | 
				
			||||||
      validator = require('is-my-json-valid');
 | 
					      validator = require('is-my-json-valid');
 | 
				
			||||||
@@ -234,38 +235,19 @@ Definition of the JRSResume class.
 | 
				
			|||||||
          date: /^\d{4}(?:-(?:0[0-9]{1}|1[0-2]{1})(?:-[0-9]{2})?)?$/
 | 
					          date: /^\d{4}(?:-(?:0[0-9]{1}|1[0-2]{1})(?:-[0-9]{2})?)?$/
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
 | 
					      temp = this.imp;
 | 
				
			||||||
 | 
					      delete this.imp;
 | 
				
			||||||
      ret = validate(this);
 | 
					      ret = validate(this);
 | 
				
			||||||
 | 
					      this.imp = temp;
 | 
				
			||||||
      if (!ret) {
 | 
					      if (!ret) {
 | 
				
			||||||
        this.basics.imp = this.basics.imp || {};
 | 
					        this.imp = this.imp || {};
 | 
				
			||||||
        this.basics.imp.validationErrors = validate.errors;
 | 
					        this.imp.validationErrors = validate.errors;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      return ret;
 | 
					      return ret;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
    Calculate the total duration of the sheet. Assumes this.work has been sorted
 | 
					 | 
				
			||||||
    by start date descending, perhaps via a call to Sheet.sort().
 | 
					 | 
				
			||||||
    @returns The total duration of the sheet's work history, that is, the number
 | 
					 | 
				
			||||||
    of years between the start date of the earliest job on the resume and the
 | 
					 | 
				
			||||||
    *latest end date of all jobs in the work history*. This last condition is for
 | 
					 | 
				
			||||||
    sheets that have overlapping jobs.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    JRSResume.prototype.duration = function(unit) {
 | 
					    JRSResume.prototype.duration = function(unit) {
 | 
				
			||||||
      var careerLast, careerStart;
 | 
					      return JRSResume.__super__.duration.call(this, 'work', 'startDate', 'endDate', unit);
 | 
				
			||||||
      unit = unit || 'years';
 | 
					 | 
				
			||||||
      if (this.work && this.work.length) {
 | 
					 | 
				
			||||||
        careerStart = this.work[this.work.length - 1].safeStartDate;
 | 
					 | 
				
			||||||
        if ((typeof careerStart === 'string' || careerStart instanceof String) && !careerStart.trim()) {
 | 
					 | 
				
			||||||
          return 0;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        careerLast = _.max(this.work, function(w) {
 | 
					 | 
				
			||||||
          return w.safeEndDate.unix();
 | 
					 | 
				
			||||||
        }).safeEndDate;
 | 
					 | 
				
			||||||
        return careerLast.diff(careerStart, unit);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      return 0;
 | 
					 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -365,13 +347,13 @@ Definition of the JRSResume class.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    return JRSResume;
 | 
					    return JRSResume;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  })();
 | 
					  })(AbstractResume);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /** Get the default (empty) sheet. */
 | 
					  /** Get the default (empty) sheet. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  JRSResume["default"] = function() {
 | 
					  JRSResume["default"] = function() {
 | 
				
			||||||
    return new JRSResume().open(PATH.join(__dirname, 'empty-jrs.json'), 'Empty');
 | 
					    return new JRSResume().parseJSON(require('fresh-resume-starter').jrs);
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -436,3 +418,5 @@ Definition of the JRSResume class.
 | 
				
			|||||||
  module.exports = JRSResume;
 | 
					  module.exports = JRSResume;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}).call(this);
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=jrs-resume.js.map
 | 
				
			||||||
@@ -6,7 +6,7 @@ Definition of the JRSTheme class.
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(function() {
 | 
					(function() {
 | 
				
			||||||
  var JRSTheme, PATH, _, getFormat, parsePath, pathExists;
 | 
					  var JRSTheme, PATH, _, parsePath, pathExists;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _ = require('underscore');
 | 
					  _ = require('underscore');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -25,17 +25,13 @@ Definition of the JRSTheme class.
 | 
				
			|||||||
  JRSTheme = (function() {
 | 
					  JRSTheme = (function() {
 | 
				
			||||||
    function JRSTheme() {}
 | 
					    function JRSTheme() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return JRSTheme;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  })();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  ({
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
    Open and parse the specified theme.
 | 
					    Open and parse the specified theme.
 | 
				
			||||||
    @method open
 | 
					    @method open
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    open: function(thFolder) {
 | 
					
 | 
				
			||||||
 | 
					    JRSTheme.prototype.open = function(thFolder) {
 | 
				
			||||||
      var pathInfo, pkgJsonPath, thApi, thPkg;
 | 
					      var pathInfo, pkgJsonPath, thApi, thPkg;
 | 
				
			||||||
      this.folder = thFolder;
 | 
					      this.folder = thFolder;
 | 
				
			||||||
      pathInfo = parsePath(thFolder);
 | 
					      pathInfo = parsePath(thFolder);
 | 
				
			||||||
@@ -53,7 +49,7 @@ Definition of the JRSTheme class.
 | 
				
			|||||||
              {
 | 
					              {
 | 
				
			||||||
                action: 'transform',
 | 
					                action: 'transform',
 | 
				
			||||||
                render: this.render,
 | 
					                render: this.render,
 | 
				
			||||||
                major: true,
 | 
					                primary: true,
 | 
				
			||||||
                ext: 'html',
 | 
					                ext: 'html',
 | 
				
			||||||
                css: null
 | 
					                css: null
 | 
				
			||||||
              }
 | 
					              }
 | 
				
			||||||
@@ -65,7 +61,7 @@ Definition of the JRSTheme class.
 | 
				
			|||||||
              {
 | 
					              {
 | 
				
			||||||
                action: 'transform',
 | 
					                action: 'transform',
 | 
				
			||||||
                render: this.render,
 | 
					                render: this.render,
 | 
				
			||||||
                major: true,
 | 
					                primary: true,
 | 
				
			||||||
                ext: 'pdf',
 | 
					                ext: 'pdf',
 | 
				
			||||||
                css: null
 | 
					                css: null
 | 
				
			||||||
              }
 | 
					              }
 | 
				
			||||||
@@ -78,26 +74,34 @@ Definition of the JRSTheme class.
 | 
				
			|||||||
        };
 | 
					        };
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      return this;
 | 
					      return this;
 | 
				
			||||||
    },
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
    Determine if the theme supports the output format.
 | 
					    Determine if the theme supports the output format.
 | 
				
			||||||
    @method hasFormat
 | 
					    @method hasFormat
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    hasFormat: function(fmt) {
 | 
					
 | 
				
			||||||
 | 
					    JRSTheme.prototype.hasFormat = function(fmt) {
 | 
				
			||||||
      return _.has(this.formats, fmt);
 | 
					      return _.has(this.formats, fmt);
 | 
				
			||||||
    }
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
    Return the requested output format.
 | 
					    Return the requested output format.
 | 
				
			||||||
    @method getFormat
 | 
					    @method getFormat
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
  });
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  getFormat = function(fmt) {
 | 
					    JRSTheme.prototype.getFormat = function(fmt) {
 | 
				
			||||||
      return this.formats[fmt];
 | 
					      return this.formats[fmt];
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return JRSTheme;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  })();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  module.exports = JRSTheme;
 | 
					  module.exports = JRSTheme;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}).call(this);
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=jrs-theme.js.map
 | 
				
			||||||
@@ -83,7 +83,7 @@ Definition of the ResumeFactory class.
 | 
				
			|||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _parse = function(fileName, opts, eve) {
 | 
					  _parse = function(fileName, opts, eve) {
 | 
				
			||||||
    var ex, orgFormat, rawData, ret;
 | 
					    var orgFormat, rawData, ret;
 | 
				
			||||||
    rawData = null;
 | 
					    rawData = null;
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
      eve && eve.stat(HME.beforeRead, {
 | 
					      eve && eve.stat(HME.beforeRead, {
 | 
				
			||||||
@@ -108,20 +108,15 @@ Definition of the ResumeFactory class.
 | 
				
			|||||||
      });
 | 
					      });
 | 
				
			||||||
      return ret;
 | 
					      return ret;
 | 
				
			||||||
    } catch (_error) {
 | 
					    } catch (_error) {
 | 
				
			||||||
      ex = {
 | 
					      return {
 | 
				
			||||||
        fluenterror: rawData ? HACKMYSTATUS.parseError : HACKMYSTATUS.readError,
 | 
					        fluenterror: rawData ? HACKMYSTATUS.parseError : HACKMYSTATUS.readError,
 | 
				
			||||||
        inner: _error,
 | 
					        inner: _error,
 | 
				
			||||||
        raw: rawData,
 | 
					        raw: rawData,
 | 
				
			||||||
        file: fileName,
 | 
					        file: fileName
 | 
				
			||||||
        shouldExit: false
 | 
					 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
      opts.quit && (ex.quit = true);
 | 
					 | 
				
			||||||
      eve && eve.err(ex.fluenterror, ex);
 | 
					 | 
				
			||||||
      if (opts["throw"]) {
 | 
					 | 
				
			||||||
        throw ex;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      return ex;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}).call(this);
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=resume-factory.js.map
 | 
				
			||||||
@@ -16,7 +16,7 @@ Status codes for HackMyResume.
 | 
				
			|||||||
    resumeNotFoundAlt: 6,
 | 
					    resumeNotFoundAlt: 6,
 | 
				
			||||||
    inputOutputParity: 7,
 | 
					    inputOutputParity: 7,
 | 
				
			||||||
    createNameMissing: 8,
 | 
					    createNameMissing: 8,
 | 
				
			||||||
    pdfgeneration: 9,
 | 
					    pdfGeneration: 9,
 | 
				
			||||||
    missingPackageJSON: 10,
 | 
					    missingPackageJSON: 10,
 | 
				
			||||||
    invalid: 11,
 | 
					    invalid: 11,
 | 
				
			||||||
    invalidFormat: 12,
 | 
					    invalidFormat: 12,
 | 
				
			||||||
@@ -31,7 +31,11 @@ Status codes for HackMyResume.
 | 
				
			|||||||
    compileTemplate: 21,
 | 
					    compileTemplate: 21,
 | 
				
			||||||
    themeLoad: 22,
 | 
					    themeLoad: 22,
 | 
				
			||||||
    invalidParamCount: 23,
 | 
					    invalidParamCount: 23,
 | 
				
			||||||
    missingParam: 24
 | 
					    missingParam: 24,
 | 
				
			||||||
 | 
					    createError: 25,
 | 
				
			||||||
 | 
					    validateError: 26
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}).call(this);
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=status-codes.js.map
 | 
				
			||||||
							
								
								
									
										40
									
								
								dist/generators/base-generator.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								dist/generators/base-generator.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,40 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					Definition of the BaseGenerator class.
 | 
				
			||||||
 | 
					@module generators/base-generator
 | 
				
			||||||
 | 
					@license MIT. See LICENSE.md for details.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					The BaseGenerator class is the root of the generator hierarchy. Functionality
 | 
				
			||||||
 | 
					common to ALL generators lives here.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(function() {
 | 
				
			||||||
 | 
					  var BaseGenerator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  module.exports = BaseGenerator = (function() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** Base-class initialize. */
 | 
				
			||||||
 | 
					    function BaseGenerator(format) {
 | 
				
			||||||
 | 
					      this.format = format;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** Status codes. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    BaseGenerator.prototype.codes = require('../core/status-codes');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** Generator options. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    BaseGenerator.prototype.opts = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return BaseGenerator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  })();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=base-generator.js.map
 | 
				
			||||||
							
								
								
									
										53
									
								
								dist/generators/html-generator.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								dist/generators/html-generator.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,53 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					Definition of the HTMLGenerator class.
 | 
				
			||||||
 | 
					@module generators/html-generator
 | 
				
			||||||
 | 
					@license MIT. See LICENSE.md for details.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(function() {
 | 
				
			||||||
 | 
					  var FS, HTML, HtmlGenerator, PATH, TemplateGenerator,
 | 
				
			||||||
 | 
					    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
 | 
				
			||||||
 | 
					    hasProp = {}.hasOwnProperty;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  TemplateGenerator = require('./template-generator');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  FS = require('fs-extra');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  HTML = require('html');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  PATH = require('path');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  require('string.prototype.endswith');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  module.exports = HtmlGenerator = (function(superClass) {
 | 
				
			||||||
 | 
					    extend(HtmlGenerator, superClass);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function HtmlGenerator() {
 | 
				
			||||||
 | 
					      HtmlGenerator.__super__.constructor.call(this, 'html');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    Copy satellite CSS files to the destination and optionally pretty-print
 | 
				
			||||||
 | 
					    the HTML resume prior to saving.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    HtmlGenerator.prototype.onBeforeSave = function(info) {
 | 
				
			||||||
 | 
					      if (info.outputFile.endsWith('.css')) {
 | 
				
			||||||
 | 
					        return info.mk;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      if (this.opts.prettify) {
 | 
				
			||||||
 | 
					        return HTML.prettyPrint(info.mk, this.opts.prettify);
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        return info.mk;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return HtmlGenerator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  })(TemplateGenerator);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=html-generator.js.map
 | 
				
			||||||
							
								
								
									
										117
									
								
								dist/generators/html-pdf-cli-generator.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								dist/generators/html-pdf-cli-generator.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,117 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					Definition of the HtmlPdfCLIGenerator class.
 | 
				
			||||||
 | 
					@module generators/html-pdf-generator.js
 | 
				
			||||||
 | 
					@license MIT. See LICENSE.md for details.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(function() {
 | 
				
			||||||
 | 
					  var FS, HMSTATUS, HtmlPdfCLIGenerator, PATH, SLASH, SPAWN, TemplateGenerator, _, engines,
 | 
				
			||||||
 | 
					    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
 | 
				
			||||||
 | 
					    hasProp = {}.hasOwnProperty;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  TemplateGenerator = require('./template-generator');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  FS = require('fs-extra');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  PATH = require('path');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  SLASH = require('slash');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  _ = require('underscore');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  HMSTATUS = require('../core/status-codes');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  SPAWN = require('../utils/safe-spawn');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					  An HTML-driven PDF resume generator for HackMyResume. Talks to Phantom,
 | 
				
			||||||
 | 
					  wkhtmltopdf, and other PDF engines over a CLI (command-line interface).
 | 
				
			||||||
 | 
					  If an engine isn't installed for a particular platform, error out gracefully.
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  module.exports = HtmlPdfCLIGenerator = (function(superClass) {
 | 
				
			||||||
 | 
					    extend(HtmlPdfCLIGenerator, superClass);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function HtmlPdfCLIGenerator() {
 | 
				
			||||||
 | 
					      HtmlPdfCLIGenerator.__super__.constructor.call(this, 'pdf', 'html');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** Generate the binary PDF. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    HtmlPdfCLIGenerator.prototype.onBeforeSave = function(info) {
 | 
				
			||||||
 | 
					      var safe_eng;
 | 
				
			||||||
 | 
					      if (info.ext !== 'html' && info.ext !== 'pdf') {
 | 
				
			||||||
 | 
					        return info.mk;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      safe_eng = info.opts.pdf || 'wkhtmltopdf';
 | 
				
			||||||
 | 
					      if (safe_eng === 'phantom') {
 | 
				
			||||||
 | 
					        safe_eng = 'phantomjs';
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      if (_.has(engines, safe_eng)) {
 | 
				
			||||||
 | 
					        this.errHandler = info.opts.errHandler;
 | 
				
			||||||
 | 
					        engines[safe_eng].call(this, info.mk, info.outputFile, this.onError);
 | 
				
			||||||
 | 
					        return null;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Low-level error callback for spawn(). May be called after HMR process
 | 
				
			||||||
 | 
					    termination, so object references may not be valid here. That's okay; if
 | 
				
			||||||
 | 
					    the references are invalid, the error was already logged. We could use
 | 
				
			||||||
 | 
					    spawn-watch here but that causes issues on legacy Node.js.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    HtmlPdfCLIGenerator.prototype.onError = function(ex, param) {
 | 
				
			||||||
 | 
					      var ref;
 | 
				
			||||||
 | 
					      if ((ref = param.errHandler) != null) {
 | 
				
			||||||
 | 
					        if (typeof ref.err === "function") {
 | 
				
			||||||
 | 
					          ref.err(HMSTATUS.pdfGeneration, ex);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return HtmlPdfCLIGenerator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  })(TemplateGenerator);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  engines = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    Generate a PDF from HTML using wkhtmltopdf's CLI interface.
 | 
				
			||||||
 | 
					    Spawns a child process with `wkhtmltopdf <source> <target>`. wkhtmltopdf
 | 
				
			||||||
 | 
					    must be installed and path-accessible.
 | 
				
			||||||
 | 
					    TODO: If HTML generation has run, reuse that output
 | 
				
			||||||
 | 
					    TODO: Local web server to ease wkhtmltopdf rendering
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    wkhtmltopdf: function(markup, fOut, on_error) {
 | 
				
			||||||
 | 
					      var tempFile;
 | 
				
			||||||
 | 
					      tempFile = fOut.replace(/\.pdf$/i, '.pdf.html');
 | 
				
			||||||
 | 
					      FS.writeFileSync(tempFile, markup, 'utf8');
 | 
				
			||||||
 | 
					      SPAWN('wkhtmltopdf', [tempFile, fOut], false, on_error, this);
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    Generate a PDF from HTML using Phantom's CLI interface.
 | 
				
			||||||
 | 
					    Spawns a child process with `phantomjs <script> <source> <target>`. Phantom
 | 
				
			||||||
 | 
					    must be installed and path-accessible.
 | 
				
			||||||
 | 
					    TODO: If HTML generation has run, reuse that output
 | 
				
			||||||
 | 
					    TODO: Local web server to ease Phantom rendering
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    phantomjs: function(markup, fOut, on_error) {
 | 
				
			||||||
 | 
					      var destPath, scriptPath, sourcePath, tempFile;
 | 
				
			||||||
 | 
					      tempFile = fOut.replace(/\.pdf$/i, '.pdf.html');
 | 
				
			||||||
 | 
					      FS.writeFileSync(tempFile, markup, 'utf8');
 | 
				
			||||||
 | 
					      scriptPath = PATH.relative(process.cwd(), PATH.resolve(__dirname, '../utils/rasterize.js'));
 | 
				
			||||||
 | 
					      scriptPath = SLASH(scriptPath);
 | 
				
			||||||
 | 
					      sourcePath = SLASH(PATH.relative(process.cwd(), tempFile));
 | 
				
			||||||
 | 
					      destPath = SLASH(PATH.relative(process.cwd(), fOut));
 | 
				
			||||||
 | 
					      SPAWN('phantomjs', [scriptPath, sourcePath, destPath], false, on_error, this);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=html-pdf-cli-generator.js.map
 | 
				
			||||||
@@ -1,12 +1,14 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
Definition of the HtmlPngGenerator class.
 | 
					Definition of the HtmlPngGenerator class.
 | 
				
			||||||
 | 
					@module generators/html-png-generator
 | 
				
			||||||
@license MIT. See LICENSE.MD for details.
 | 
					@license MIT. See LICENSE.MD for details.
 | 
				
			||||||
@module html-png-generator.js
 | 
					 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(function() {
 | 
					(function() {
 | 
				
			||||||
  var FS, HTML, HtmlPngGenerator, PATH, SLASH, SPAWN, TemplateGenerator, phantom;
 | 
					  var FS, HTML, HtmlPngGenerator, PATH, SLASH, SPAWN, TemplateGenerator, phantom,
 | 
				
			||||||
 | 
					    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
 | 
				
			||||||
 | 
					    hasProp = {}.hasOwnProperty;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  TemplateGenerator = require('./template-generator');
 | 
					  TemplateGenerator = require('./template-generator');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -25,12 +27,16 @@ Definition of the HtmlPngGenerator class.
 | 
				
			|||||||
  An HTML-based PNG resume generator for HackMyResume.
 | 
					  An HTML-based PNG resume generator for HackMyResume.
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  HtmlPngGenerator = module.exports = TemplateGenerator.extend({
 | 
					  module.exports = HtmlPngGenerator = (function(superClass) {
 | 
				
			||||||
    init: function() {
 | 
					    extend(HtmlPngGenerator, superClass);
 | 
				
			||||||
      return this._super('png', 'html');
 | 
					
 | 
				
			||||||
    },
 | 
					    function HtmlPngGenerator() {
 | 
				
			||||||
    invoke: function(rez, themeMarkup, cssInfo, opts) {},
 | 
					      HtmlPngGenerator.__super__.constructor.call(this, 'png', 'html');
 | 
				
			||||||
    generate: function(rez, f, opts) {
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    HtmlPngGenerator.prototype.invoke = function(rez, themeMarkup, cssInfo, opts) {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    HtmlPngGenerator.prototype.generate = function(rez, f, opts) {
 | 
				
			||||||
      var htmlFile, htmlResults;
 | 
					      var htmlFile, htmlResults;
 | 
				
			||||||
      htmlResults = opts.targets.filter(function(t) {
 | 
					      htmlResults = opts.targets.filter(function(t) {
 | 
				
			||||||
        return t.fmt.outFormat === 'html';
 | 
					        return t.fmt.outFormat === 'html';
 | 
				
			||||||
@@ -39,8 +45,11 @@ Definition of the HtmlPngGenerator class.
 | 
				
			|||||||
        return fl.info.ext === 'html';
 | 
					        return fl.info.ext === 'html';
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
      phantom(htmlFile[0].data, f);
 | 
					      phantom(htmlFile[0].data, f);
 | 
				
			||||||
    }
 | 
					    };
 | 
				
			||||||
  });
 | 
					
 | 
				
			||||||
 | 
					    return HtmlPngGenerator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  })(TemplateGenerator);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /**
 | 
					  /**
 | 
				
			||||||
@@ -62,3 +71,5 @@ Definition of the HtmlPngGenerator class.
 | 
				
			|||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}).call(this);
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=html-png-generator.js.map
 | 
				
			||||||
							
								
								
									
										47
									
								
								dist/generators/json-generator.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								dist/generators/json-generator.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,47 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					Definition of the JsonGenerator class.
 | 
				
			||||||
 | 
					@module generators/json-generator
 | 
				
			||||||
 | 
					@license MIT. See LICENSE.md for details.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(function() {
 | 
				
			||||||
 | 
					  var BaseGenerator, FJCV, FS, JsonGenerator, _,
 | 
				
			||||||
 | 
					    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
 | 
				
			||||||
 | 
					    hasProp = {}.hasOwnProperty;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  BaseGenerator = require('./base-generator');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  FS = require('fs');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  _ = require('underscore');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  FJCV = require('fresh-jrs-converter');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /** The JsonGenerator generates a FRESH or JRS resume as an output. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  module.exports = JsonGenerator = (function(superClass) {
 | 
				
			||||||
 | 
					    extend(JsonGenerator, superClass);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function JsonGenerator() {
 | 
				
			||||||
 | 
					      JsonGenerator.__super__.constructor.call(this, 'json');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    JsonGenerator.prototype.invoke = function(rez) {
 | 
				
			||||||
 | 
					      var altRez;
 | 
				
			||||||
 | 
					      altRez = FJCV['to' + (rez.format() === 'FRESH' ? 'JRS' : 'FRESH')](rez);
 | 
				
			||||||
 | 
					      return altRez = FJCV.toSTRING(altRez);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    JsonGenerator.prototype.generate = function(rez, f) {
 | 
				
			||||||
 | 
					      FS.writeFileSync(f, this.invoke(rez), 'utf8');
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return JsonGenerator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  })(BaseGenerator);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=json-generator.js.map
 | 
				
			||||||
							
								
								
									
										50
									
								
								dist/generators/json-yaml-generator.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								dist/generators/json-yaml-generator.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,50 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					Definition of the JsonYamlGenerator class.
 | 
				
			||||||
 | 
					@module generators/json-yaml-generator
 | 
				
			||||||
 | 
					@license MIT. See LICENSE.md for details.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(function() {
 | 
				
			||||||
 | 
					  var BaseGenerator, FS, JsonYamlGenerator, YAML,
 | 
				
			||||||
 | 
					    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
 | 
				
			||||||
 | 
					    hasProp = {}.hasOwnProperty;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  BaseGenerator = require('./base-generator');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  FS = require('fs');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  YAML = require('yamljs');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					  JsonYamlGenerator takes a JSON resume object and translates it directly to
 | 
				
			||||||
 | 
					  JSON without a template, producing an equivalent YAML-formatted resume. See
 | 
				
			||||||
 | 
					  also YamlGenerator (yaml-generator.js).
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  module.exports = JsonYamlGenerator = (function(superClass) {
 | 
				
			||||||
 | 
					    extend(JsonYamlGenerator, superClass);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function JsonYamlGenerator() {
 | 
				
			||||||
 | 
					      JsonYamlGenerator.__super__.constructor.call(this, 'yml');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    JsonYamlGenerator.prototype.invoke = function(rez, themeMarkup, cssInfo, opts) {
 | 
				
			||||||
 | 
					      return YAML.stringify(JSON.parse(rez.stringify()), Infinity, 2);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    JsonYamlGenerator.prototype.generate = function(rez, f, opts) {
 | 
				
			||||||
 | 
					      var data;
 | 
				
			||||||
 | 
					      data = YAML.stringify(JSON.parse(rez.stringify()), Infinity, 2);
 | 
				
			||||||
 | 
					      FS.writeFileSync(f, data, 'utf8');
 | 
				
			||||||
 | 
					      return data;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return JsonYamlGenerator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  })(BaseGenerator);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=json-yaml-generator.js.map
 | 
				
			||||||
							
								
								
									
										33
									
								
								dist/generators/latex-generator.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								dist/generators/latex-generator.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,33 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					Definition of the LaTeXGenerator class.
 | 
				
			||||||
 | 
					@module generators/latex-generator
 | 
				
			||||||
 | 
					@license MIT. See LICENSE.md for details.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(function() {
 | 
				
			||||||
 | 
					  var LaTeXGenerator, TemplateGenerator,
 | 
				
			||||||
 | 
					    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
 | 
				
			||||||
 | 
					    hasProp = {}.hasOwnProperty;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  TemplateGenerator = require('./template-generator');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					  LaTeXGenerator generates a LaTeX resume via TemplateGenerator.
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  module.exports = LaTeXGenerator = (function(superClass) {
 | 
				
			||||||
 | 
					    extend(LaTeXGenerator, superClass);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function LaTeXGenerator() {
 | 
				
			||||||
 | 
					      LaTeXGenerator.__super__.constructor.call(this, 'latex', 'tex');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return LaTeXGenerator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  })(TemplateGenerator);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=latex-generator.js.map
 | 
				
			||||||
							
								
								
									
										33
									
								
								dist/generators/markdown-generator.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								dist/generators/markdown-generator.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,33 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					Definition of the MarkdownGenerator class.
 | 
				
			||||||
 | 
					@module generators/markdown-generator
 | 
				
			||||||
 | 
					@license MIT. See LICENSE.md for details.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(function() {
 | 
				
			||||||
 | 
					  var MarkdownGenerator, TemplateGenerator,
 | 
				
			||||||
 | 
					    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
 | 
				
			||||||
 | 
					    hasProp = {}.hasOwnProperty;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  TemplateGenerator = require('./template-generator');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					  MarkdownGenerator generates a Markdown-formatted resume via TemplateGenerator.
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  module.exports = MarkdownGenerator = (function(superClass) {
 | 
				
			||||||
 | 
					    extend(MarkdownGenerator, superClass);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function MarkdownGenerator() {
 | 
				
			||||||
 | 
					      MarkdownGenerator.__super__.constructor.call(this, 'md', 'txt');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return MarkdownGenerator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  })(TemplateGenerator);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=markdown-generator.js.map
 | 
				
			||||||
@@ -1,12 +1,14 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
Definition of the TemplateGenerator class. TODO: Refactor
 | 
					Definition of the TemplateGenerator class. TODO: Refactor
 | 
				
			||||||
 | 
					@module generators/template-generator
 | 
				
			||||||
@license MIT. See LICENSE.md for details.
 | 
					@license MIT. See LICENSE.md for details.
 | 
				
			||||||
@module template-generator.js
 | 
					 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(function() {
 | 
					(function() {
 | 
				
			||||||
  var BaseGenerator, EXTEND, FRESHTheme, FS, JRSTheme, MD, MKDIRP, PATH, TemplateGenerator, XML, _, _defaultOpts, _reg, freeze, parsePath, unfreeze;
 | 
					  var BaseGenerator, EXTEND, FRESHTheme, FS, JRSTheme, MD, MKDIRP, PATH, TemplateGenerator, XML, _, _defaultOpts, _reg, createSymLinks, freeze, parsePath, unfreeze,
 | 
				
			||||||
 | 
					    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
 | 
				
			||||||
 | 
					    hasProp = {}.hasOwnProperty;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  FS = require('fs-extra');
 | 
					  FS = require('fs-extra');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -38,16 +40,21 @@ Definition of the TemplateGenerator class. TODO: Refactor
 | 
				
			|||||||
  @class TemplateGenerator
 | 
					  @class TemplateGenerator
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  TemplateGenerator = module.exports = BaseGenerator.extend({
 | 
					  module.exports = TemplateGenerator = (function(superClass) {
 | 
				
			||||||
 | 
					    extend(TemplateGenerator, superClass);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /** Constructor. Set the output format and template format for this
 | 
					    /** Constructor. Set the output format and template format for this
 | 
				
			||||||
    generator. Will usually be called by a derived generator such as
 | 
					    generator. Will usually be called by a derived generator such as
 | 
				
			||||||
    HTMLGenerator or MarkdownGenerator.
 | 
					    HTMLGenerator or MarkdownGenerator.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    init: function(outputFormat, templateFormat, cssFile) {
 | 
					
 | 
				
			||||||
      this._super(outputFormat);
 | 
					    function TemplateGenerator(outputFormat, templateFormat, cssFile) {
 | 
				
			||||||
 | 
					      TemplateGenerator.__super__.constructor.call(this, outputFormat);
 | 
				
			||||||
      this.tplFormat = templateFormat || outputFormat;
 | 
					      this.tplFormat = templateFormat || outputFormat;
 | 
				
			||||||
    },
 | 
					      return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /** Generate a resume using string-based inputs and outputs without touching
 | 
					    /** Generate a resume using string-based inputs and outputs without touching
 | 
				
			||||||
    the filesystem.
 | 
					    the filesystem.
 | 
				
			||||||
@@ -57,7 +64,8 @@ Definition of the TemplateGenerator class. TODO: Refactor
 | 
				
			|||||||
    @returns {Array} An array of objects representing the generated output
 | 
					    @returns {Array} An array of objects representing the generated output
 | 
				
			||||||
    files.
 | 
					    files.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    invoke: function(rez, opts) {
 | 
					
 | 
				
			||||||
 | 
					    TemplateGenerator.prototype.invoke = function(rez, opts) {
 | 
				
			||||||
      var curFmt, results;
 | 
					      var curFmt, results;
 | 
				
			||||||
      opts = opts ? (this.opts = EXTEND(true, {}, _defaultOpts, opts)) : this.opts;
 | 
					      opts = opts ? (this.opts = EXTEND(true, {}, _defaultOpts, opts)) : this.opts;
 | 
				
			||||||
      curFmt = opts.themeObj.getFormat(this.format);
 | 
					      curFmt = opts.themeObj.getFormat(this.format);
 | 
				
			||||||
@@ -66,12 +74,19 @@ Definition of the TemplateGenerator class. TODO: Refactor
 | 
				
			|||||||
      });
 | 
					      });
 | 
				
			||||||
      results = curFmt.files.map(function(tplInfo, idx) {
 | 
					      results = curFmt.files.map(function(tplInfo, idx) {
 | 
				
			||||||
        var trx;
 | 
					        var trx;
 | 
				
			||||||
        trx = this.single(rez, tplInfo.data, this.format, opts, opts.themeObj, curFmt);
 | 
					        if (tplInfo.action === 'transform') {
 | 
				
			||||||
 | 
					          trx = this.transform(rez, tplInfo.data, this.format, opts, opts.themeObj, curFmt);
 | 
				
			||||||
          if (tplInfo.ext === 'css') {
 | 
					          if (tplInfo.ext === 'css') {
 | 
				
			||||||
            curFmt.files[idx].data = trx;
 | 
					            curFmt.files[idx].data = trx;
 | 
				
			||||||
          } else {
 | 
					          } else {
 | 
				
			||||||
            tplInfo.ext === 'html';
 | 
					            tplInfo.ext === 'html';
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (typeof opts.onTransform === "function") {
 | 
				
			||||||
 | 
					          opts.onTransform(tplInfo);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
          info: tplInfo,
 | 
					          info: tplInfo,
 | 
				
			||||||
          data: trx
 | 
					          data: trx
 | 
				
			||||||
@@ -80,7 +95,8 @@ Definition of the TemplateGenerator class. TODO: Refactor
 | 
				
			|||||||
      return {
 | 
					      return {
 | 
				
			||||||
        files: results
 | 
					        files: results
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    },
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /** Generate a resume using file-based inputs and outputs. Requires access
 | 
					    /** Generate a resume using file-based inputs and outputs. Requires access
 | 
				
			||||||
    to the local filesystem.
 | 
					    to the local filesystem.
 | 
				
			||||||
@@ -89,33 +105,44 @@ Definition of the TemplateGenerator class. TODO: Refactor
 | 
				
			|||||||
    @param f Full path to the output resume file to generate.
 | 
					    @param f Full path to the output resume file to generate.
 | 
				
			||||||
    @param opts Generator options.
 | 
					    @param opts Generator options.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    generate: function(rez, f, opts) {
 | 
					
 | 
				
			||||||
 | 
					    TemplateGenerator.prototype.generate = function(rez, f, opts) {
 | 
				
			||||||
      var curFmt, genInfo, outFolder;
 | 
					      var curFmt, genInfo, outFolder;
 | 
				
			||||||
      this.opts = EXTEND(true, {}, _defaultOpts, opts);
 | 
					      this.opts = EXTEND(true, {}, _defaultOpts, opts);
 | 
				
			||||||
      genInfo = this.invoke(rez, null);
 | 
					      genInfo = this.invoke(rez, null);
 | 
				
			||||||
      outFolder = parsePath(f).dirname;
 | 
					      outFolder = parsePath(f).dirname;
 | 
				
			||||||
      curFmt = opts.themeObj.getFormat(this.format);
 | 
					      curFmt = opts.themeObj.getFormat(this.format);
 | 
				
			||||||
      genInfo.files.forEach(function(file) {
 | 
					      genInfo.files.forEach(function(file) {
 | 
				
			||||||
        var fileName, thisFilePath;
 | 
					        var thisFilePath;
 | 
				
			||||||
        file.info.orgPath = file.info.orgPath || '';
 | 
					        file.info.orgPath = file.info.orgPath || '';
 | 
				
			||||||
        thisFilePath = PATH.join(outFolder, file.info.orgPath);
 | 
					        thisFilePath = file.info.primary ? f : PATH.join(outFolder, file.info.orgPath);
 | 
				
			||||||
        if (this.onBeforeSave) {
 | 
					        if (file.info.action !== 'copy' && this.onBeforeSave) {
 | 
				
			||||||
          file.data = this.onBeforeSave({
 | 
					          file.data = this.onBeforeSave({
 | 
				
			||||||
            theme: opts.themeObj,
 | 
					            theme: opts.themeObj,
 | 
				
			||||||
            outputFile: file.info.major ? f : thisFilePath,
 | 
					            outputFile: thisFilePath,
 | 
				
			||||||
            mk: file.data,
 | 
					            mk: file.data,
 | 
				
			||||||
            opts: this.opts
 | 
					            opts: this.opts,
 | 
				
			||||||
 | 
					            ext: file.info.ext
 | 
				
			||||||
          });
 | 
					          });
 | 
				
			||||||
          if (!file.data) {
 | 
					          if (!file.data) {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        fileName = file.info.major ? f : thisFilePath;
 | 
					        if (typeof opts.beforeWrite === "function") {
 | 
				
			||||||
        MKDIRP.sync(PATH.dirname(fileName));
 | 
					          opts.beforeWrite(thisFilePath);
 | 
				
			||||||
        FS.writeFileSync(fileName, file.data, {
 | 
					        }
 | 
				
			||||||
 | 
					        MKDIRP.sync(PATH.dirname(thisFilePath));
 | 
				
			||||||
 | 
					        if (file.info.action !== 'copy') {
 | 
				
			||||||
 | 
					          FS.writeFileSync(thisFilePath, file.data, {
 | 
				
			||||||
            encoding: 'utf8',
 | 
					            encoding: 'utf8',
 | 
				
			||||||
            flags: 'w'
 | 
					            flags: 'w'
 | 
				
			||||||
          });
 | 
					          });
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          FS.copySync(file.info.path, thisFilePath);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (typeof opts.afterWrite === "function") {
 | 
				
			||||||
 | 
					          opts.afterWrite(thisFilePath);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        if (this.onAfterSave) {
 | 
					        if (this.onAfterSave) {
 | 
				
			||||||
          return this.onAfterSave({
 | 
					          return this.onAfterSave({
 | 
				
			||||||
            outputFile: fileName,
 | 
					            outputFile: fileName,
 | 
				
			||||||
@@ -124,19 +151,10 @@ Definition of the TemplateGenerator class. TODO: Refactor
 | 
				
			|||||||
          });
 | 
					          });
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      }, this);
 | 
					      }, this);
 | 
				
			||||||
      if (curFmt.symLinks) {
 | 
					      createSymLinks(curFmt, outFolder);
 | 
				
			||||||
        Object.keys(curFmt.symLinks).forEach(function(loc) {
 | 
					 | 
				
			||||||
          var absLoc, absTarg, ref, type;
 | 
					 | 
				
			||||||
          absLoc = PATH.join(outFolder, loc);
 | 
					 | 
				
			||||||
          absTarg = PATH.join(PATH.dirname(absLoc), curFmt.symLinks[loc]);
 | 
					 | 
				
			||||||
          type = (ref = parsePath(absLoc).extname) != null ? ref : {
 | 
					 | 
				
			||||||
            'file': 'junction'
 | 
					 | 
				
			||||||
          };
 | 
					 | 
				
			||||||
          return FS.symlinkSync(absTarg, absLoc, type);
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      return genInfo;
 | 
					      return genInfo;
 | 
				
			||||||
    },
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /** Perform a single resume resume transformation using string-based inputs
 | 
					    /** Perform a single resume resume transformation using string-based inputs
 | 
				
			||||||
    and outputs without touching the local file system.
 | 
					    and outputs without touching the local file system.
 | 
				
			||||||
@@ -146,7 +164,8 @@ Definition of the TemplateGenerator class. TODO: Refactor
 | 
				
			|||||||
    @param cssInfo Needs to be refactored.
 | 
					    @param cssInfo Needs to be refactored.
 | 
				
			||||||
    @param opts Options and passthrough data.
 | 
					    @param opts Options and passthrough data.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    single: function(json, jst, format, opts, theme, curFmt) {
 | 
					
 | 
				
			||||||
 | 
					    TemplateGenerator.prototype.transform = function(json, jst, format, opts, theme, curFmt) {
 | 
				
			||||||
      var eng, result;
 | 
					      var eng, result;
 | 
				
			||||||
      if (this.opts.freezeBreaks) {
 | 
					      if (this.opts.freezeBreaks) {
 | 
				
			||||||
        jst = freeze(jst);
 | 
					        jst = freeze(jst);
 | 
				
			||||||
@@ -157,13 +176,37 @@ Definition of the TemplateGenerator class. TODO: Refactor
 | 
				
			|||||||
        result = unfreeze(result);
 | 
					        result = unfreeze(result);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      return result;
 | 
					      return result;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return TemplateGenerator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  })(BaseGenerator);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  createSymLinks = function(curFmt, outFolder) {
 | 
				
			||||||
 | 
					    if (curFmt.symLinks) {
 | 
				
			||||||
 | 
					      Object.keys(curFmt.symLinks).forEach(function(loc) {
 | 
				
			||||||
 | 
					        var absLoc, absTarg, succeeded, type;
 | 
				
			||||||
 | 
					        absLoc = PATH.join(outFolder, loc);
 | 
				
			||||||
 | 
					        absTarg = PATH.join(PATH.dirname(absLoc), curFmt.symLinks[loc]);
 | 
				
			||||||
 | 
					        type = parsePath(absLoc).extname ? 'file' : 'junction';
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					          return FS.symlinkSync(absTarg, absLoc, type);
 | 
				
			||||||
 | 
					        } catch (_error) {
 | 
				
			||||||
 | 
					          succeeded = false;
 | 
				
			||||||
 | 
					          if (_error.code === 'EEXIST') {
 | 
				
			||||||
 | 
					            FS.unlinkSync(absLoc);
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					              FS.symlinkSync(absTarg, absLoc, type);
 | 
				
			||||||
 | 
					              succeeded = true;
 | 
				
			||||||
 | 
					            } catch (_error) {}
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          if (!succeeded) {
 | 
				
			||||||
 | 
					            throw ex;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
  /** Export the TemplateGenerator function/ctor. */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  module.exports = TemplateGenerator;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /** Freeze newlines for protection against errant JST parsers. */
 | 
					  /** Freeze newlines for protection against errant JST parsers. */
 | 
				
			||||||
@@ -241,3 +284,5 @@ Definition of the TemplateGenerator class. TODO: Refactor
 | 
				
			|||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}).call(this);
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=template-generator.js.map
 | 
				
			||||||
							
								
								
									
										33
									
								
								dist/generators/text-generator.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								dist/generators/text-generator.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,33 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					Definition of the TextGenerator class.
 | 
				
			||||||
 | 
					@module generators/text-generator
 | 
				
			||||||
 | 
					@license MIT. See LICENSE.md for details.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(function() {
 | 
				
			||||||
 | 
					  var TemplateGenerator, TextGenerator,
 | 
				
			||||||
 | 
					    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
 | 
				
			||||||
 | 
					    hasProp = {}.hasOwnProperty;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  TemplateGenerator = require('./template-generator');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					  The TextGenerator generates a plain-text resume via the TemplateGenerator.
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  module.exports = TextGenerator = (function(superClass) {
 | 
				
			||||||
 | 
					    extend(TextGenerator, superClass);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function TextGenerator() {
 | 
				
			||||||
 | 
					      TextGenerator.__super__.constructor.call(this, 'txt');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return TextGenerator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  })(TemplateGenerator);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=text-generator.js.map
 | 
				
			||||||
							
								
								
									
										28
									
								
								dist/generators/word-generator.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								dist/generators/word-generator.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,28 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					Definition of the WordGenerator class.
 | 
				
			||||||
 | 
					@module generators/word-generator
 | 
				
			||||||
 | 
					@license MIT. See LICENSE.md for details.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(function() {
 | 
				
			||||||
 | 
					  var TemplateGenerator, WordGenerator,
 | 
				
			||||||
 | 
					    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
 | 
				
			||||||
 | 
					    hasProp = {}.hasOwnProperty;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  TemplateGenerator = require('./template-generator');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  module.exports = WordGenerator = (function(superClass) {
 | 
				
			||||||
 | 
					    extend(WordGenerator, superClass);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function WordGenerator() {
 | 
				
			||||||
 | 
					      WordGenerator.__super__.constructor.call(this, 'doc', 'xml');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return WordGenerator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  })(TemplateGenerator);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=word-generator.js.map
 | 
				
			||||||
							
								
								
									
										31
									
								
								dist/generators/xml-generator.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								dist/generators/xml-generator.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					Definition of the XMLGenerator class.
 | 
				
			||||||
 | 
					@license MIT. See LICENSE.md for details.
 | 
				
			||||||
 | 
					@module generatprs/xml-generator
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(function() {
 | 
				
			||||||
 | 
					  var BaseGenerator, XMLGenerator,
 | 
				
			||||||
 | 
					    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
 | 
				
			||||||
 | 
					    hasProp = {}.hasOwnProperty;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  BaseGenerator = require('./base-generator');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /** The XmlGenerator generates an XML resume via the TemplateGenerator. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  module.exports = XMLGenerator = (function(superClass) {
 | 
				
			||||||
 | 
					    extend(XMLGenerator, superClass);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function XMLGenerator() {
 | 
				
			||||||
 | 
					      XMLGenerator.__super__.constructor.call(this, 'xml');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return XMLGenerator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  })(BaseGenerator);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=xml-generator.js.map
 | 
				
			||||||
							
								
								
									
										33
									
								
								dist/generators/yaml-generator.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								dist/generators/yaml-generator.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,33 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					Definition of the YAMLGenerator class.
 | 
				
			||||||
 | 
					@module yaml-generator.js
 | 
				
			||||||
 | 
					@license MIT. See LICENSE.md for details.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(function() {
 | 
				
			||||||
 | 
					  var TemplateGenerator, YAMLGenerator,
 | 
				
			||||||
 | 
					    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
 | 
				
			||||||
 | 
					    hasProp = {}.hasOwnProperty;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  TemplateGenerator = require('./template-generator');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					  YamlGenerator generates a YAML-formatted resume via TemplateGenerator.
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  module.exports = YAMLGenerator = (function(superClass) {
 | 
				
			||||||
 | 
					    extend(YAMLGenerator, superClass);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function YAMLGenerator() {
 | 
				
			||||||
 | 
					      YAMLGenerator.__super__.constructor.call(this, 'yml', 'yml');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return YAMLGenerator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  })(TemplateGenerator);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=yaml-generator.js.map
 | 
				
			||||||
							
								
								
									
										71
									
								
								dist/helpers/block-helpers.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								dist/helpers/block-helpers.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,71 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					Block helper definitions for HackMyResume / FluentCV.
 | 
				
			||||||
 | 
					@license MIT. See LICENSE.md for details.
 | 
				
			||||||
 | 
					@module helpers/generic-helpers
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(function() {
 | 
				
			||||||
 | 
					  var BlockHelpers, HMSTATUS, LO, _, unused;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  HMSTATUS = require('../core/status-codes');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  LO = require('lodash');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  _ = require('underscore');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  unused = require('../utils/string');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /** Block helper function definitions. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  BlockHelpers = module.exports = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    Emit the enclosed content if the resume has a section with
 | 
				
			||||||
 | 
					    the specified name. Otherwise, emit an empty string ''.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    section: function(title, options) {
 | 
				
			||||||
 | 
					      var obj, ret;
 | 
				
			||||||
 | 
					      title = title.trim().toLowerCase();
 | 
				
			||||||
 | 
					      obj = LO.get(this.r, title);
 | 
				
			||||||
 | 
					      ret = '';
 | 
				
			||||||
 | 
					      if (obj) {
 | 
				
			||||||
 | 
					        if (_.isArray(obj)) {
 | 
				
			||||||
 | 
					          if (obj.length) {
 | 
				
			||||||
 | 
					            ret = options.fn(this);
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        } else if (_.isObject(obj)) {
 | 
				
			||||||
 | 
					          if ((obj.history && obj.history.length) || (obj.sets && obj.sets.length)) {
 | 
				
			||||||
 | 
					            ret = options.fn(this);
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return ret;
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    Emit the enclosed content if the resume has the named
 | 
				
			||||||
 | 
					    property or subproperty.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    has: function(title, options) {
 | 
				
			||||||
 | 
					      title = title && title.trim().toLowerCase();
 | 
				
			||||||
 | 
					      if (LO.get(this.r, title)) {
 | 
				
			||||||
 | 
					        return options.fn(this);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    Return true if either value is truthy.
 | 
				
			||||||
 | 
					    @method either
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    either: function(lhs, rhs, options) {
 | 
				
			||||||
 | 
					      if (lhs || rhs) {
 | 
				
			||||||
 | 
					        return options.fn(this);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=block-helpers.js.map
 | 
				
			||||||
@@ -62,3 +62,5 @@ Generic template helper definitions for command-line output.
 | 
				
			|||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}).call(this);
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=console-helpers.js.map
 | 
				
			||||||
@@ -38,36 +38,85 @@ Generic template helper definitions for HackMyResume / FluentCV.
 | 
				
			|||||||
  GenericHelpers = module.exports = {
 | 
					  GenericHelpers = module.exports = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
    Convert the input date to a specified format through Moment.js.
 | 
					    Emit a formatted string representing the specified datetime.
 | 
				
			||||||
    If date is invalid, will return the time provided by the user,
 | 
					    Convert the input date to the specified format through Moment.js. If date is
 | 
				
			||||||
    or default to the fallback param or 'Present' if that is set to true
 | 
					    valid, return the formatted date string. If date is null, undefined, or other
 | 
				
			||||||
    @method formatDate
 | 
					    falsy value, return the value of the 'fallback' parameter, if specified, or
 | 
				
			||||||
 | 
					    null if no fallback was specified. If date is invalid, but not null/undefined/
 | 
				
			||||||
 | 
					    falsy, return it as-is.
 | 
				
			||||||
 | 
					    @param {string|Moment} datetime A date value.
 | 
				
			||||||
 | 
					    @param {string} [dtFormat='YYYY-MM'] The desired datetime format. Must be a
 | 
				
			||||||
 | 
					    Moment.js-compatible datetime format.
 | 
				
			||||||
 | 
					    @param {string|Moment} fallback A fallback value to use if the specified date
 | 
				
			||||||
 | 
					    is null, undefined, or falsy.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    formatDate: function(datetime, format, fallback) {
 | 
					    formatDate: function(datetime, dtFormat, fallback) {
 | 
				
			||||||
      var momentDate, ref, ref1;
 | 
					      var momentDate;
 | 
				
			||||||
      if (moment) {
 | 
					      if (datetime == null) {
 | 
				
			||||||
 | 
					        datetime = void 0;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      if (dtFormat == null) {
 | 
				
			||||||
 | 
					        dtFormat = 'YYYY-MM';
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      if (datetime && moment.isMoment(datetime)) {
 | 
				
			||||||
 | 
					        return datetime.format(dtFormat);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      if (String.is(datetime)) {
 | 
				
			||||||
 | 
					        momentDate = moment(datetime, dtFormat);
 | 
				
			||||||
 | 
					        if (momentDate.isValid()) {
 | 
				
			||||||
 | 
					          return momentDate.format(dtFormat);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        momentDate = moment(datetime);
 | 
					        momentDate = moment(datetime);
 | 
				
			||||||
        if (momentDate.isValid()) {
 | 
					        if (momentDate.isValid()) {
 | 
				
			||||||
          return momentDate.format(format);
 | 
					          return momentDate.format(dtFormat);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      return datetime || ((ref = typeof fallback === 'string') != null ? ref : {
 | 
					      return datetime || (typeof fallback === 'string' ? fallback : (fallback === true ? 'Present' : ''));
 | 
				
			||||||
        fallback: (ref1 = fallback === true) != null ? ref1 : {
 | 
					    },
 | 
				
			||||||
          'Present': null
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    Emit a formatted string representing the specified datetime.
 | 
				
			||||||
 | 
					    @param {string} dateValue A raw date value from the FRESH or JRS resume.
 | 
				
			||||||
 | 
					    @param {string} [dateFormat='YYYY-MM'] The desired datetime format. Must be
 | 
				
			||||||
 | 
					    compatible with Moment.js datetime formats.
 | 
				
			||||||
 | 
					    @param {string} [dateDefault=null] The default date value to use if the dateValue
 | 
				
			||||||
 | 
					    parameter is null, undefined, or falsy.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    date: function(dateValue, dateFormat, dateDefault) {
 | 
				
			||||||
 | 
					      var dateValueMoment, dateValueSafe, reserved;
 | 
				
			||||||
 | 
					      if (!dateDefault || !String.is(dateDefault)) {
 | 
				
			||||||
 | 
					        dateDefault = 'Current';
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      });
 | 
					      if (!dateFormat || !String.is(dateFormat)) {
 | 
				
			||||||
 | 
					        dateFormat = 'YYYY-MM';
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      if (!dateValue || !String.is(dateValue)) {
 | 
				
			||||||
 | 
					        dateValue = null;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      if (!dateValue) {
 | 
				
			||||||
 | 
					        return dateDefault;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      reserved = ['current', 'present', 'now'];
 | 
				
			||||||
 | 
					      dateValueSafe = dateValue.trim().toLowerCase();
 | 
				
			||||||
 | 
					      if (_.contains(reserved, dateValueSafe)) {
 | 
				
			||||||
 | 
					        return dateValue;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      dateValueMoment = moment(dateValue, dateFormat);
 | 
				
			||||||
 | 
					      if (dateValueMoment.isValid()) {
 | 
				
			||||||
 | 
					        return dateValueMoment.format(dateFormat);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return dateValue;
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
    Given a resume sub-object with a start/end date, format a representation of
 | 
					    Given a resume sub-object with a start/end date, format a representation of
 | 
				
			||||||
    the date range.
 | 
					    the date range.
 | 
				
			||||||
    @method dateRange
 | 
					 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    dateRange: function(obj, fmt, sep, fallback, options) {
 | 
					    dateRange: function(obj, fmt, sep, fallback) {
 | 
				
			||||||
      if (!obj) {
 | 
					      if (!obj) {
 | 
				
			||||||
        return '';
 | 
					        return '';
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      return _fromTo(obj.start, obj.end, fmt, sep, fallback, options);
 | 
					      return _fromTo(obj.start, obj.end, fmt, sep, fallback);
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
@@ -102,26 +151,6 @@ Generic template helper definitions for HackMyResume / FluentCV.
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
    Return true if the section is present on the resume and has at least one
 | 
					 | 
				
			||||||
    element.
 | 
					 | 
				
			||||||
    @method section
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    section: function(title, options) {
 | 
					 | 
				
			||||||
      var obj;
 | 
					 | 
				
			||||||
      title = title.trim().toLowerCase();
 | 
					 | 
				
			||||||
      obj = LO.get(this.r, title);
 | 
					 | 
				
			||||||
      if (_.isArray(obj)) {
 | 
					 | 
				
			||||||
        if (obj.length) {
 | 
					 | 
				
			||||||
          return options.fn(this);
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
          return void 0;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      } else if (_.isObject(obj)) {
 | 
					 | 
				
			||||||
        return (obj.history && obj.history.length) || (obj.sets && obj.sets.length ? options.fn(this) : void 0);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
    Emit the size of the specified named font.
 | 
					    Emit the size of the specified named font.
 | 
				
			||||||
    @param key {String} A named style from the "fonts" section of the theme's
 | 
					    @param key {String} A named style from the "fonts" section of the theme's
 | 
				
			||||||
@@ -279,7 +308,7 @@ Generic template helper definitions for HackMyResume / FluentCV.
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
    Capitalize the first letter of the word.
 | 
					    Capitalize the first letter of the word. TODO: Rename
 | 
				
			||||||
    @method section
 | 
					    @method section
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    camelCase: function(val) {
 | 
					    camelCase: function(val) {
 | 
				
			||||||
@@ -292,20 +321,8 @@ Generic template helper definitions for HackMyResume / FluentCV.
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
    Return true if the context has the property or subpropery.
 | 
					    Display a user-overridable section title for a FRESH resume theme. Use this in
 | 
				
			||||||
    @method has
 | 
					    lieue of hard-coding section titles.
 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    has: function(title, options) {
 | 
					 | 
				
			||||||
      title = title && title.trim().toLowerCase();
 | 
					 | 
				
			||||||
      if (LO.get(this.r, title)) {
 | 
					 | 
				
			||||||
        return options.fn(this);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
    Generic template helper function to display a user-overridable section
 | 
					 | 
				
			||||||
    title for a FRESH resume theme. Use this in lieue of hard-coding section
 | 
					 | 
				
			||||||
    titles.
 | 
					 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    Usage:
 | 
					    Usage:
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
@@ -328,10 +345,7 @@ Generic template helper definitions for HackMyResume / FluentCV.
 | 
				
			|||||||
      return (this.opts.stitles && this.opts.stitles[sname.toLowerCase().trim()]) || stitle;
 | 
					      return (this.opts.stitles && this.opts.stitles[sname.toLowerCase().trim()]) || stitle;
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /** Convert inline Markdown to inline WordProcessingML. */
 | 
				
			||||||
    Convert inline Markdown to inline WordProcessingML.
 | 
					 | 
				
			||||||
    @method wpml
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    wpml: function(txt, inline) {
 | 
					    wpml: function(txt, inline) {
 | 
				
			||||||
      if (!txt) {
 | 
					      if (!txt) {
 | 
				
			||||||
        return '';
 | 
					        return '';
 | 
				
			||||||
@@ -440,16 +454,6 @@ Generic template helper definitions for HackMyResume / FluentCV.
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
    Return true if either value is truthy.
 | 
					 | 
				
			||||||
    @method either
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    either: function(lhs, rhs, options) {
 | 
					 | 
				
			||||||
      if (lhs || rhs) {
 | 
					 | 
				
			||||||
        return options.fn(this);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
    Conditional stylesheet link. Creates a link to the specified stylesheet with
 | 
					    Conditional stylesheet link. Creates a link to the specified stylesheet with
 | 
				
			||||||
    <link> or embeds the styles inline with <style></style>, depending on the
 | 
					    <link> or embeds the styles inline with <style></style>, depending on the
 | 
				
			||||||
@@ -484,7 +488,7 @@ Generic template helper definitions for HackMyResume / FluentCV.
 | 
				
			|||||||
    compare: function(lvalue, rvalue, options) {
 | 
					    compare: function(lvalue, rvalue, options) {
 | 
				
			||||||
      var operator, operators, result;
 | 
					      var operator, operators, result;
 | 
				
			||||||
      if (arguments.length < 3) {
 | 
					      if (arguments.length < 3) {
 | 
				
			||||||
        throw new Error("Handlerbars Helper 'compare' needs 2 parameters");
 | 
					        throw new Error("Template helper 'compare' needs 2 parameters");
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      operator = options.hash.operator || "==";
 | 
					      operator = options.hash.operator || "==";
 | 
				
			||||||
      operators = {
 | 
					      operators = {
 | 
				
			||||||
@@ -514,7 +518,7 @@ Generic template helper definitions for HackMyResume / FluentCV.
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
      if (!operators[operator]) {
 | 
					      if (!operators[operator]) {
 | 
				
			||||||
        throw new Error("Handlerbars Helper 'compare' doesn't know the operator " + operator);
 | 
					        throw new Error("Helper 'compare' doesn't know the operator " + operator);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      result = operators[operator](lvalue, rvalue);
 | 
					      result = operators[operator](lvalue, rvalue);
 | 
				
			||||||
      if (result) {
 | 
					      if (result) {
 | 
				
			||||||
@@ -522,6 +526,21 @@ Generic template helper definitions for HackMyResume / FluentCV.
 | 
				
			|||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
        return options.inverse(this);
 | 
					        return options.inverse(this);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    pad: function(stringOrArray, padAmount, unused) {
 | 
				
			||||||
 | 
					      var PAD, ret;
 | 
				
			||||||
 | 
					      stringOrArray = stringOrArray || '';
 | 
				
			||||||
 | 
					      padAmount = padAmount || 0;
 | 
				
			||||||
 | 
					      ret = '';
 | 
				
			||||||
 | 
					      PAD = require('string-padding');
 | 
				
			||||||
 | 
					      if (!String.is(stringOrArray)) {
 | 
				
			||||||
 | 
					        ret = stringOrArray.map(function(line) {
 | 
				
			||||||
 | 
					          return PAD(line, line.length + Math.abs(padAmount), null, padAmount < 0 ? PAD.LEFT : PAD.RIGHT);
 | 
				
			||||||
 | 
					        }).join('\n');
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        ret = PAD(stringOrArray, stringOrArray.length + Math.abs(padAmount), null, padAmount < 0 ? PAD.LEFT : PAD.RIGHT);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return ret;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -565,7 +584,7 @@ Generic template helper definitions for HackMyResume / FluentCV.
 | 
				
			|||||||
      dateFrom = dateTemp.format(fmt);
 | 
					      dateFrom = dateTemp.format(fmt);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (_.contains(reserved, dateBTrim)) {
 | 
					    if (_.contains(reserved, dateBTrim)) {
 | 
				
			||||||
      dateTo = fallback || 'Current';
 | 
					      dateTo = fallback || 'Present';
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      dateTemp = FluentDate.fmt(dateB);
 | 
					      dateTemp = FluentDate.fmt(dateB);
 | 
				
			||||||
      dateTo = dateTemp.format(fmt);
 | 
					      dateTo = dateTemp.format(fmt);
 | 
				
			||||||
@@ -610,3 +629,5 @@ Generic template helper definitions for HackMyResume / FluentCV.
 | 
				
			|||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}).call(this);
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=generic-helpers.js.map
 | 
				
			||||||
							
								
								
									
										48
									
								
								dist/helpers/handlebars-helpers.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								dist/helpers/handlebars-helpers.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,48 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					Template helper definitions for Handlebars.
 | 
				
			||||||
 | 
					@license MIT. See LICENSE.md for details.
 | 
				
			||||||
 | 
					@module handlebars-helpers.js
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(function() {
 | 
				
			||||||
 | 
					  var HANDLEBARS, _, blockHelpers, helpers;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  HANDLEBARS = require('handlebars');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  _ = require('underscore');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  helpers = require('./generic-helpers');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  blockHelpers = require('./block-helpers');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					  Register useful Handlebars helpers.
 | 
				
			||||||
 | 
					  @method registerHelpers
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  module.exports = function(theme, opts) {
 | 
				
			||||||
 | 
					    var wrappedHelpers;
 | 
				
			||||||
 | 
					    helpers.theme = theme;
 | 
				
			||||||
 | 
					    helpers.opts = opts;
 | 
				
			||||||
 | 
					    helpers.type = 'handlebars';
 | 
				
			||||||
 | 
					    wrappedHelpers = _.mapObject(helpers, function(hVal, hKey) {
 | 
				
			||||||
 | 
					      if (_.isFunction(hVal)) {
 | 
				
			||||||
 | 
					        _.wrap(hVal, function(func) {
 | 
				
			||||||
 | 
					          var args;
 | 
				
			||||||
 | 
					          args = Array.prototype.slice.call(arguments);
 | 
				
			||||||
 | 
					          args.shift();
 | 
				
			||||||
 | 
					          args.pop();
 | 
				
			||||||
 | 
					          return func.apply(this, args);
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return hVal;
 | 
				
			||||||
 | 
					    }, this);
 | 
				
			||||||
 | 
					    HANDLEBARS.registerHelper(wrappedHelpers);
 | 
				
			||||||
 | 
					    HANDLEBARS.registerHelper(blockHelpers);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=handlebars-helpers.js.map
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
Template helper definitions for Underscore.
 | 
					Template helper definitions for Underscore.
 | 
				
			||||||
@license MIT. Copyright (c) 2016 hacksalot (https://github.com/hacksalot)
 | 
					@license MIT. See LICENSE.md for details.
 | 
				
			||||||
@module handlebars-helpers.js
 | 
					@module handlebars-helpers.js
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -26,7 +26,7 @@ Template helper definitions for Underscore.
 | 
				
			|||||||
    helpers.cssInfo = cssInfo;
 | 
					    helpers.cssInfo = cssInfo;
 | 
				
			||||||
    helpers.engine = eng;
 | 
					    helpers.engine = eng;
 | 
				
			||||||
    ctx.h = helpers;
 | 
					    ctx.h = helpers;
 | 
				
			||||||
    return _.each(helpers, function(hVal, hKey) {
 | 
					    _.each(helpers, function(hVal, hKey) {
 | 
				
			||||||
      if (_.isFunction(hVal)) {
 | 
					      if (_.isFunction(hVal)) {
 | 
				
			||||||
        return _.bind(hVal, ctx);
 | 
					        return _.bind(hVal, ctx);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -34,3 +34,5 @@ Template helper definitions for Underscore.
 | 
				
			|||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}).call(this);
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=underscore-helpers.js.map
 | 
				
			||||||
							
								
								
									
										33
									
								
								dist/hmc/dist/generators/base-generator.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										33
									
								
								dist/hmc/dist/generators/base-generator.js
									
									
									
									
										vendored
									
									
								
							@@ -1,33 +0,0 @@
 | 
				
			|||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
Definition of the BaseGenerator class.
 | 
					 | 
				
			||||||
@module base-generator.js
 | 
					 | 
				
			||||||
@license MIT. See LICENSE.md for details.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
(function() {
 | 
					 | 
				
			||||||
  var BaseGenerator, Class;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Class = require('../utils/class');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /**
 | 
					 | 
				
			||||||
  The BaseGenerator class is the root of the generator hierarchy. Functionality
 | 
					 | 
				
			||||||
  common to ALL generators lives here.
 | 
					 | 
				
			||||||
   */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  BaseGenerator = module.exports = Class.extend({
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /** Base-class initialize. */
 | 
					 | 
				
			||||||
    init: function(outputFormat) {
 | 
					 | 
				
			||||||
      return this.format = outputFormat;
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /** Status codes. */
 | 
					 | 
				
			||||||
    codes: require('../core/status-codes'),
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /** Generator options. */
 | 
					 | 
				
			||||||
    opts: {}
 | 
					 | 
				
			||||||
  });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}).call(this);
 | 
					 | 
				
			||||||
							
								
								
									
										42
									
								
								dist/hmc/dist/generators/html-generator.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										42
									
								
								dist/hmc/dist/generators/html-generator.js
									
									
									
									
										vendored
									
									
								
							@@ -1,42 +0,0 @@
 | 
				
			|||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
Definition of the HTMLGenerator class.
 | 
					 | 
				
			||||||
@license MIT. See LICENSE.md for details.
 | 
					 | 
				
			||||||
@module html-generator.js
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
(function() {
 | 
					 | 
				
			||||||
  var FS, HTML, HtmlGenerator, PATH, TemplateGenerator;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  TemplateGenerator = require('./template-generator');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  FS = require('fs-extra');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  HTML = require('html');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  PATH = require('path');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  require('string.prototype.endswith');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  HtmlGenerator = module.exports = TemplateGenerator.extend({
 | 
					 | 
				
			||||||
    init: function() {
 | 
					 | 
				
			||||||
      return this._super('html');
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
    Copy satellite CSS files to the destination and optionally pretty-print
 | 
					 | 
				
			||||||
    the HTML resume prior to saving.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    onBeforeSave: function(info) {
 | 
					 | 
				
			||||||
      if (info.outputFile.endsWith('.css')) {
 | 
					 | 
				
			||||||
        return info.mk;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      if (this.opts.prettify) {
 | 
					 | 
				
			||||||
        return HTML.prettyPrint(info.mk, this.opts.prettify);
 | 
					 | 
				
			||||||
      } else {
 | 
					 | 
				
			||||||
        return info.mk;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}).call(this);
 | 
					 | 
				
			||||||
@@ -1,98 +0,0 @@
 | 
				
			|||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
Definition of the HtmlPdfCLIGenerator class.
 | 
					 | 
				
			||||||
@module html-pdf-generator.js
 | 
					 | 
				
			||||||
@license MIT. See LICENSE.md for details.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
(function() {
 | 
					 | 
				
			||||||
  var FS, HTML, HtmlPdfCLIGenerator, PATH, SLASH, SPAWN, TemplateGenerator, engines;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  TemplateGenerator = require('./template-generator');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  FS = require('fs-extra');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  HTML = require('html');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  PATH = require('path');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  SPAWN = require('../utils/safe-spawn');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  SLASH = require('slash');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /**
 | 
					 | 
				
			||||||
  An HTML-driven PDF resume generator for HackMyResume. Talks to Phantom,
 | 
					 | 
				
			||||||
  wkhtmltopdf, and other PDF engines over a CLI (command-line interface).
 | 
					 | 
				
			||||||
  If an engine isn't installed for a particular platform, error out gracefully.
 | 
					 | 
				
			||||||
   */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  HtmlPdfCLIGenerator = module.exports = TemplateGenerator.extend({
 | 
					 | 
				
			||||||
    init: function() {
 | 
					 | 
				
			||||||
      return this._super('pdf', 'html');
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /** Generate the binary PDF. */
 | 
					 | 
				
			||||||
    onBeforeSave: function(info) {
 | 
					 | 
				
			||||||
      var ex, safe_eng;
 | 
					 | 
				
			||||||
      try {
 | 
					 | 
				
			||||||
        safe_eng = info.opts.pdf || 'wkhtmltopdf';
 | 
					 | 
				
			||||||
        if (safe_eng !== 'none') {
 | 
					 | 
				
			||||||
          engines[safe_eng].call(this, info.mk, info.outputFile);
 | 
					 | 
				
			||||||
          return null;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      } catch (_error) {
 | 
					 | 
				
			||||||
        ex = _error;
 | 
					 | 
				
			||||||
        if (ex.inner && ex.inner.code === 'ENOENT') {
 | 
					 | 
				
			||||||
          throw {
 | 
					 | 
				
			||||||
            fluenterror: this.codes.notOnPath,
 | 
					 | 
				
			||||||
            inner: ex.inner,
 | 
					 | 
				
			||||||
            engine: ex.cmd,
 | 
					 | 
				
			||||||
            stack: ex.inner && ex.inner.stack
 | 
					 | 
				
			||||||
          };
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
          throw {
 | 
					 | 
				
			||||||
            fluenterror: this.codes.pdfGeneration,
 | 
					 | 
				
			||||||
            inner: ex,
 | 
					 | 
				
			||||||
            stack: ex.stack
 | 
					 | 
				
			||||||
          };
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  engines = {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
    Generate a PDF from HTML using wkhtmltopdf's CLI interface.
 | 
					 | 
				
			||||||
    Spawns a child process with `wkhtmltopdf <source> <target>`. wkhtmltopdf
 | 
					 | 
				
			||||||
    must be installed and path-accessible.
 | 
					 | 
				
			||||||
    TODO: If HTML generation has run, reuse that output
 | 
					 | 
				
			||||||
    TODO: Local web server to ease wkhtmltopdf rendering
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    wkhtmltopdf: function(markup, fOut) {
 | 
					 | 
				
			||||||
      var info, tempFile;
 | 
					 | 
				
			||||||
      tempFile = fOut.replace(/\.pdf$/i, '.pdf.html');
 | 
					 | 
				
			||||||
      FS.writeFileSync(tempFile, markup, 'utf8');
 | 
					 | 
				
			||||||
      return info = SPAWN('wkhtmltopdf', [tempFile, fOut]);
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
    Generate a PDF from HTML using Phantom's CLI interface.
 | 
					 | 
				
			||||||
    Spawns a child process with `phantomjs <script> <source> <target>`. Phantom
 | 
					 | 
				
			||||||
    must be installed and path-accessible.
 | 
					 | 
				
			||||||
    TODO: If HTML generation has run, reuse that output
 | 
					 | 
				
			||||||
    TODO: Local web server to ease Phantom rendering
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    phantom: function(markup, fOut) {
 | 
					 | 
				
			||||||
      var destPath, info, scriptPath, sourcePath, tempFile;
 | 
					 | 
				
			||||||
      tempFile = fOut.replace(/\.pdf$/i, '.pdf.html');
 | 
					 | 
				
			||||||
      FS.writeFileSync(tempFile, markup, 'utf8');
 | 
					 | 
				
			||||||
      scriptPath = SLASH(PATH.relative(process.cwd(), PATH.resolve(__dirname, '../utils/rasterize.js')));
 | 
					 | 
				
			||||||
      sourcePath = SLASH(PATH.relative(process.cwd(), tempFile));
 | 
					 | 
				
			||||||
      destPath = SLASH(PATH.relative(process.cwd(), fOut));
 | 
					 | 
				
			||||||
      return info = SPAWN('phantomjs', [scriptPath, sourcePath, destPath]);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}).call(this);
 | 
					 | 
				
			||||||
							
								
								
									
										45
									
								
								dist/hmc/dist/generators/json-generator.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										45
									
								
								dist/hmc/dist/generators/json-generator.js
									
									
									
									
										vendored
									
									
								
							@@ -1,45 +0,0 @@
 | 
				
			|||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
Definition of the JsonGenerator class.
 | 
					 | 
				
			||||||
@license MIT. See LICENSE.md for details.
 | 
					 | 
				
			||||||
@module generators/json-generator
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
(function() {
 | 
					 | 
				
			||||||
  var BaseGenerator, FS, JsonGenerator, _;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  BaseGenerator = require('./base-generator');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  FS = require('fs');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  _ = require('underscore');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /**
 | 
					 | 
				
			||||||
  The JsonGenerator generates a JSON resume directly.
 | 
					 | 
				
			||||||
   */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  JsonGenerator = module.exports = BaseGenerator.extend({
 | 
					 | 
				
			||||||
    init: function() {
 | 
					 | 
				
			||||||
      return this._super('json');
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    keys: ['imp', 'warnings', 'computed', 'filt', 'ctrl', 'index', 'safeStartDate', 'safeEndDate', 'safeDate', 'safeReleaseDate', 'result', 'isModified', 'htmlPreview', 'safe'],
 | 
					 | 
				
			||||||
    invoke: function(rez) {
 | 
					 | 
				
			||||||
      var replacer;
 | 
					 | 
				
			||||||
      replacer = function(key, value) {
 | 
					 | 
				
			||||||
        if (_.some(this.keys, function(val) {
 | 
					 | 
				
			||||||
          return key.trim() === val;
 | 
					 | 
				
			||||||
        })) {
 | 
					 | 
				
			||||||
          return void 0;
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
          return value;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      };
 | 
					 | 
				
			||||||
      return JSON.stringify(rez, replacer, 2);
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    generate: function(rez, f) {
 | 
					 | 
				
			||||||
      FS.writeFileSync(f, this.invoke(rez), 'utf8');
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}).call(this);
 | 
					 | 
				
			||||||
							
								
								
									
										38
									
								
								dist/hmc/dist/generators/json-yaml-generator.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										38
									
								
								dist/hmc/dist/generators/json-yaml-generator.js
									
									
									
									
										vendored
									
									
								
							@@ -1,38 +0,0 @@
 | 
				
			|||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
Definition of the JsonYamlGenerator class.
 | 
					 | 
				
			||||||
@module json-yaml-generator.js
 | 
					 | 
				
			||||||
@license MIT. See LICENSE.md for details.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
(function() {
 | 
					 | 
				
			||||||
  var BaseGenerator, FS, JsonYamlGenerator, YAML;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  BaseGenerator = require('./base-generator');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  FS = require('fs');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  YAML = require('yamljs');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /**
 | 
					 | 
				
			||||||
  JsonYamlGenerator takes a JSON resume object and translates it directly to
 | 
					 | 
				
			||||||
  JSON without a template, producing an equivalent YAML-formatted resume. See
 | 
					 | 
				
			||||||
  also YamlGenerator (yaml-generator.js).
 | 
					 | 
				
			||||||
   */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  JsonYamlGenerator = module.exports = BaseGenerator.extend({
 | 
					 | 
				
			||||||
    init: function() {
 | 
					 | 
				
			||||||
      return this._super('yml');
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    invoke: function(rez, themeMarkup, cssInfo, opts) {
 | 
					 | 
				
			||||||
      return YAML.stringify(JSON.parse(rez.stringify()), Infinity, 2);
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    generate: function(rez, f, opts) {
 | 
					 | 
				
			||||||
      var data;
 | 
					 | 
				
			||||||
      data = YAML.stringify(JSON.parse(rez.stringify()), Infinity, 2);
 | 
					 | 
				
			||||||
      return FS.writeFileSync(f, data, 'utf8');
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}).call(this);
 | 
					 | 
				
			||||||
							
								
								
									
										24
									
								
								dist/hmc/dist/generators/latex-generator.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										24
									
								
								dist/hmc/dist/generators/latex-generator.js
									
									
									
									
										vendored
									
									
								
							@@ -1,24 +0,0 @@
 | 
				
			|||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
Definition of the LaTeXGenerator class.
 | 
					 | 
				
			||||||
@license MIT. See LICENSE.md for details.
 | 
					 | 
				
			||||||
@module generators/latex-generator
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
(function() {
 | 
					 | 
				
			||||||
  var LaTeXGenerator, TemplateGenerator;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  TemplateGenerator = require('./template-generator');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /**
 | 
					 | 
				
			||||||
  LaTeXGenerator generates a LaTeX resume via TemplateGenerator.
 | 
					 | 
				
			||||||
   */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  LaTeXGenerator = module.exports = TemplateGenerator.extend({
 | 
					 | 
				
			||||||
    init: function() {
 | 
					 | 
				
			||||||
      return this._super('latex', 'tex');
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}).call(this);
 | 
					 | 
				
			||||||
							
								
								
									
										24
									
								
								dist/hmc/dist/generators/markdown-generator.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										24
									
								
								dist/hmc/dist/generators/markdown-generator.js
									
									
									
									
										vendored
									
									
								
							@@ -1,24 +0,0 @@
 | 
				
			|||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
Definition of the MarkdownGenerator class.
 | 
					 | 
				
			||||||
@license MIT. Copyright (c) 2015 James Devlin / FluentDesk.
 | 
					 | 
				
			||||||
@module markdown-generator.js
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
(function() {
 | 
					 | 
				
			||||||
  var MarkdownGenerator, TemplateGenerator;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  TemplateGenerator = require('./template-generator');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /**
 | 
					 | 
				
			||||||
  MarkdownGenerator generates a Markdown-formatted resume via TemplateGenerator.
 | 
					 | 
				
			||||||
   */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  MarkdownGenerator = module.exports = TemplateGenerator.extend({
 | 
					 | 
				
			||||||
    init: function() {
 | 
					 | 
				
			||||||
      return this._super('md', 'txt');
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}).call(this);
 | 
					 | 
				
			||||||
							
								
								
									
										24
									
								
								dist/hmc/dist/generators/text-generator.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										24
									
								
								dist/hmc/dist/generators/text-generator.js
									
									
									
									
										vendored
									
									
								
							@@ -1,24 +0,0 @@
 | 
				
			|||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
Definition of the TextGenerator class.
 | 
					 | 
				
			||||||
@license MIT. See LICENSE.md for details.
 | 
					 | 
				
			||||||
@module text-generator.js
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
(function() {
 | 
					 | 
				
			||||||
  var TemplateGenerator, TextGenerator;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  TemplateGenerator = require('./template-generator');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /**
 | 
					 | 
				
			||||||
  The TextGenerator generates a plain-text resume via the TemplateGenerator.
 | 
					 | 
				
			||||||
   */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  TextGenerator = module.exports = TemplateGenerator.extend({
 | 
					 | 
				
			||||||
    init: function() {
 | 
					 | 
				
			||||||
      return this._super('txt');
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}).call(this);
 | 
					 | 
				
			||||||
							
								
								
									
										19
									
								
								dist/hmc/dist/generators/word-generator.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										19
									
								
								dist/hmc/dist/generators/word-generator.js
									
									
									
									
										vendored
									
									
								
							@@ -1,19 +0,0 @@
 | 
				
			|||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
Definition of the WordGenerator class.
 | 
					 | 
				
			||||||
@license MIT. See LICENSE.md for details.
 | 
					 | 
				
			||||||
@module generators/word-generator
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
(function() {
 | 
					 | 
				
			||||||
  var TemplateGenerator, WordGenerator;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  TemplateGenerator = require('./template-generator');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  WordGenerator = module.exports = TemplateGenerator.extend({
 | 
					 | 
				
			||||||
    init: function() {
 | 
					 | 
				
			||||||
      return this._super('doc', 'xml');
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}).call(this);
 | 
					 | 
				
			||||||
							
								
								
									
										24
									
								
								dist/hmc/dist/generators/xml-generator.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										24
									
								
								dist/hmc/dist/generators/xml-generator.js
									
									
									
									
										vendored
									
									
								
							@@ -1,24 +0,0 @@
 | 
				
			|||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
Definition of the XMLGenerator class.
 | 
					 | 
				
			||||||
@license MIT. See LICENSE.md for details.
 | 
					 | 
				
			||||||
@module generatprs/xml-generator
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
(function() {
 | 
					 | 
				
			||||||
  var BaseGenerator, XMLGenerator;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  BaseGenerator = require('./base-generator');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /**
 | 
					 | 
				
			||||||
  The XmlGenerator generates an XML resume via the TemplateGenerator.
 | 
					 | 
				
			||||||
   */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  XMLGenerator = module.exports = BaseGenerator.extend({
 | 
					 | 
				
			||||||
    init: function() {
 | 
					 | 
				
			||||||
      return this._super('xml');
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}).call(this);
 | 
					 | 
				
			||||||
							
								
								
									
										24
									
								
								dist/hmc/dist/generators/yaml-generator.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										24
									
								
								dist/hmc/dist/generators/yaml-generator.js
									
									
									
									
										vendored
									
									
								
							@@ -1,24 +0,0 @@
 | 
				
			|||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
Definition of the YAMLGenerator class.
 | 
					 | 
				
			||||||
@module yaml-generator.js
 | 
					 | 
				
			||||||
@license MIT. See LICENSE.md for details.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
(function() {
 | 
					 | 
				
			||||||
  var TemplateGenerator, YAMLGenerator;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  TemplateGenerator = require('./template-generator');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /**
 | 
					 | 
				
			||||||
  YamlGenerator generates a YAML-formatted resume via TemplateGenerator.
 | 
					 | 
				
			||||||
   */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  YAMLGenerator = module.exports = TemplateGenerator.extend({
 | 
					 | 
				
			||||||
    init: function() {
 | 
					 | 
				
			||||||
      return this._super('yml', 'yml');
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}).call(this);
 | 
					 | 
				
			||||||
							
								
								
									
										29
									
								
								dist/hmc/dist/helpers/handlebars-helpers.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										29
									
								
								dist/hmc/dist/helpers/handlebars-helpers.js
									
									
									
									
										vendored
									
									
								
							@@ -1,29 +0,0 @@
 | 
				
			|||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
Template helper definitions for Handlebars.
 | 
					 | 
				
			||||||
@license MIT. Copyright (c) 2015 James Devlin / FluentDesk.
 | 
					 | 
				
			||||||
@module handlebars-helpers.js
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
(function() {
 | 
					 | 
				
			||||||
  var HANDLEBARS, _, helpers;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  HANDLEBARS = require('handlebars');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  _ = require('underscore');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  helpers = require('./generic-helpers');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /**
 | 
					 | 
				
			||||||
  Register useful Handlebars helpers.
 | 
					 | 
				
			||||||
  @method registerHelpers
 | 
					 | 
				
			||||||
   */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  module.exports = function(theme, opts) {
 | 
					 | 
				
			||||||
    helpers.theme = theme;
 | 
					 | 
				
			||||||
    helpers.opts = opts;
 | 
					 | 
				
			||||||
    return HANDLEBARS.registerHelper(helpers);
 | 
					 | 
				
			||||||
  };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}).call(this);
 | 
					 | 
				
			||||||
							
								
								
									
										49
									
								
								dist/hmc/dist/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										49
									
								
								dist/hmc/dist/index.js
									
									
									
									
										vendored
									
									
								
							@@ -1,49 +0,0 @@
 | 
				
			|||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
External API surface for HackMyResume.
 | 
					 | 
				
			||||||
@license MIT. See LICENSE.md for details.
 | 
					 | 
				
			||||||
@module hackmycore/index
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
API facade for HackMyCore.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
(function() {
 | 
					 | 
				
			||||||
  var HackMyCore;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  HackMyCore = module.exports = {
 | 
					 | 
				
			||||||
    verbs: {
 | 
					 | 
				
			||||||
      build: require('./verbs/build'),
 | 
					 | 
				
			||||||
      analyze: require('./verbs/analyze'),
 | 
					 | 
				
			||||||
      validate: require('./verbs/validate'),
 | 
					 | 
				
			||||||
      convert: require('./verbs/convert'),
 | 
					 | 
				
			||||||
      "new": require('./verbs/create'),
 | 
					 | 
				
			||||||
      peek: require('./verbs/peek')
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    alias: {
 | 
					 | 
				
			||||||
      generate: require('./verbs/build'),
 | 
					 | 
				
			||||||
      create: require('./verbs/create')
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    options: require('./core/default-options'),
 | 
					 | 
				
			||||||
    formats: require('./core/default-formats'),
 | 
					 | 
				
			||||||
    Sheet: require('./core/fresh-resume'),
 | 
					 | 
				
			||||||
    FRESHResume: require('./core/fresh-resume'),
 | 
					 | 
				
			||||||
    JRSResume: require('./core/jrs-resume'),
 | 
					 | 
				
			||||||
    FRESHTheme: require('./core/fresh-theme'),
 | 
					 | 
				
			||||||
    JRSTheme: require('./core/jrs-theme'),
 | 
					 | 
				
			||||||
    FluentDate: require('./core/fluent-date'),
 | 
					 | 
				
			||||||
    HtmlGenerator: require('./generators/html-generator'),
 | 
					 | 
				
			||||||
    TextGenerator: require('./generators/text-generator'),
 | 
					 | 
				
			||||||
    HtmlPdfCliGenerator: require('./generators/html-pdf-cli-generator'),
 | 
					 | 
				
			||||||
    WordGenerator: require('./generators/word-generator'),
 | 
					 | 
				
			||||||
    MarkdownGenerator: require('./generators/markdown-generator'),
 | 
					 | 
				
			||||||
    JsonGenerator: require('./generators/json-generator'),
 | 
					 | 
				
			||||||
    YamlGenerator: require('./generators/yaml-generator'),
 | 
					 | 
				
			||||||
    JsonYamlGenerator: require('./generators/json-yaml-generator'),
 | 
					 | 
				
			||||||
    LaTeXGenerator: require('./generators/latex-generator'),
 | 
					 | 
				
			||||||
    HtmlPngGenerator: require('./generators/html-png-generator')
 | 
					 | 
				
			||||||
  };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}).call(this);
 | 
					 | 
				
			||||||
							
								
								
									
										72
									
								
								dist/hmc/dist/utils/class.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										72
									
								
								dist/hmc/dist/utils/class.js
									
									
									
									
										vendored
									
									
								
							@@ -1,72 +0,0 @@
 | 
				
			|||||||
/**
 | 
					 | 
				
			||||||
Definition of John Resig's `Class` class.
 | 
					 | 
				
			||||||
@module class.js
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Simple JavaScript Inheritance
 | 
					 | 
				
			||||||
 * By John Resig http://ejohn.org/
 | 
					 | 
				
			||||||
 * MIT Licensed.
 | 
					 | 
				
			||||||
 * http://ejohn.org/blog/simple-javascript-inheritance/
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
// Inspired by base2 and Prototype
 | 
					 | 
				
			||||||
(function(){
 | 
					 | 
				
			||||||
  var initializing = false, fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // The base Class implementation (does nothing)
 | 
					 | 
				
			||||||
  this.Class = function(){};
 | 
					 | 
				
			||||||
  module.exports = Class;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Create a new Class that inherits from this class
 | 
					 | 
				
			||||||
  Class.extend = function(prop) {
 | 
					 | 
				
			||||||
    var _super = this.prototype;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Instantiate a base class (but only create the instance,
 | 
					 | 
				
			||||||
    // don't run the init constructor)
 | 
					 | 
				
			||||||
    initializing = true;
 | 
					 | 
				
			||||||
    var prototype = new this();
 | 
					 | 
				
			||||||
    initializing = false;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Copy the properties over onto the new prototype
 | 
					 | 
				
			||||||
    for (var name in prop) {
 | 
					 | 
				
			||||||
      // Check if we're overwriting an existing function
 | 
					 | 
				
			||||||
      prototype[name] = typeof prop[name] == "function" &&
 | 
					 | 
				
			||||||
        typeof _super[name] == "function" && fnTest.test(prop[name]) ?
 | 
					 | 
				
			||||||
        (function(name, fn){
 | 
					 | 
				
			||||||
          return function() {
 | 
					 | 
				
			||||||
            var tmp = this._super;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // Add a new ._super() method that is the same method
 | 
					 | 
				
			||||||
            // but on the super-class
 | 
					 | 
				
			||||||
            this._super = _super[name];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // The method only need to be bound temporarily, so we
 | 
					 | 
				
			||||||
            // remove it when we're done executing
 | 
					 | 
				
			||||||
            var ret = fn.apply(this, arguments);
 | 
					 | 
				
			||||||
            this._super = tmp;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            return ret;
 | 
					 | 
				
			||||||
          };
 | 
					 | 
				
			||||||
        })(name, prop[name]) : // jshint ignore:line
 | 
					 | 
				
			||||||
        prop[name];
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // The dummy class constructor
 | 
					 | 
				
			||||||
    function Class() {
 | 
					 | 
				
			||||||
      // All construction is actually done in the init method
 | 
					 | 
				
			||||||
      if ( !initializing && this.init )
 | 
					 | 
				
			||||||
        this.init.apply(this, arguments);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Populate our constructed prototype object
 | 
					 | 
				
			||||||
    Class.prototype = prototype;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Enforce the constructor to be what we expect
 | 
					 | 
				
			||||||
    Class.prototype.constructor = Class;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // And make this class extendable
 | 
					 | 
				
			||||||
    Class.extend = arguments.callee;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return Class;
 | 
					 | 
				
			||||||
  };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
})();
 | 
					 | 
				
			||||||
							
								
								
									
										34
									
								
								dist/hmc/dist/utils/safe-spawn.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										34
									
								
								dist/hmc/dist/utils/safe-spawn.js
									
									
									
									
										vendored
									
									
								
							@@ -1,34 +0,0 @@
 | 
				
			|||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
Safe spawn utility for HackMyResume / FluentCV.
 | 
					 | 
				
			||||||
@module utils/safe-spawn
 | 
					 | 
				
			||||||
@license MIT. See LICENSE.md for details.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
(function() {
 | 
					 | 
				
			||||||
  module.exports = function(cmd, args, isSync) {
 | 
					 | 
				
			||||||
    var info, spawn;
 | 
					 | 
				
			||||||
    try {
 | 
					 | 
				
			||||||
      spawn = require('child_process')[isSync ? 'spawnSync' : 'spawn'];
 | 
					 | 
				
			||||||
      info = spawn(cmd, args);
 | 
					 | 
				
			||||||
      if (!isSync) {
 | 
					 | 
				
			||||||
        return info.on('error', function(err) {
 | 
					 | 
				
			||||||
          throw {
 | 
					 | 
				
			||||||
            cmd: 'wkhtmltopdf',
 | 
					 | 
				
			||||||
            inner: err
 | 
					 | 
				
			||||||
          };
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
      } else {
 | 
					 | 
				
			||||||
        if (info.error) {
 | 
					 | 
				
			||||||
          throw {
 | 
					 | 
				
			||||||
            cmd: 'wkhtmltopdf',
 | 
					 | 
				
			||||||
            inner: info.error
 | 
					 | 
				
			||||||
          };
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    } catch (_error) {
 | 
					 | 
				
			||||||
      throw _error;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}).call(this);
 | 
					 | 
				
			||||||
							
								
								
									
										39
									
								
								dist/hmc/dist/utils/syntax-error-ex.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										39
									
								
								dist/hmc/dist/utils/syntax-error-ex.js
									
									
									
									
										vendored
									
									
								
							@@ -1,39 +0,0 @@
 | 
				
			|||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
Definition of the SyntaxErrorEx class.
 | 
					 | 
				
			||||||
@module utils/syntax-error-ex
 | 
					 | 
				
			||||||
@license MIT. See LICENSE.md for details.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
Represents a SyntaxError exception with line and column info.
 | 
					 | 
				
			||||||
Collect syntax error information from the provided exception object. The
 | 
					 | 
				
			||||||
JavaScript `SyntaxError` exception isn't interpreted uniformly across environ-
 | 
					 | 
				
			||||||
ments, so we reparse on error to grab the line and column.
 | 
					 | 
				
			||||||
See: http://stackoverflow.com/q/13323356
 | 
					 | 
				
			||||||
@class SyntaxErrorEx
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
(function() {
 | 
					 | 
				
			||||||
  var SyntaxErrorEx;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  SyntaxErrorEx = function(ex, rawData) {
 | 
					 | 
				
			||||||
    var JSONLint, colNum, lineNum, lint;
 | 
					 | 
				
			||||||
    lineNum = null;
 | 
					 | 
				
			||||||
    colNum = null;
 | 
					 | 
				
			||||||
    JSONLint = require('json-lint');
 | 
					 | 
				
			||||||
    lint = JSONLint(rawData, {
 | 
					 | 
				
			||||||
      comments: false
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
    this.line = lint.error ? lint.line : '???';
 | 
					 | 
				
			||||||
    return this.col = lint.error ? lint.character : '???';
 | 
					 | 
				
			||||||
  };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  SyntaxErrorEx.is = function(ex) {
 | 
					 | 
				
			||||||
    return ex instanceof SyntaxError;
 | 
					 | 
				
			||||||
  };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  module.exports = SyntaxErrorEx;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}).call(this);
 | 
					 | 
				
			||||||
							
								
								
									
										102
									
								
								dist/hmc/dist/verbs/analyze.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										102
									
								
								dist/hmc/dist/verbs/analyze.js
									
									
									
									
										vendored
									
									
								
							@@ -1,102 +0,0 @@
 | 
				
			|||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
Implementation of the 'analyze' verb for HackMyResume.
 | 
					 | 
				
			||||||
@module verbs/analyze
 | 
					 | 
				
			||||||
@license MIT. See LICENSE.md for details.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
(function() {
 | 
					 | 
				
			||||||
  var AnalyzeVerb, HMEVENT, HMSTATUS, MKDIRP, PATH, ResumeFactory, Verb, _, _analyze, _loadInspectors, analyze, chalk;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  MKDIRP = require('mkdirp');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  PATH = require('path');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  HMEVENT = require('../core/event-codes');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  HMSTATUS = require('../core/status-codes');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  _ = require('underscore');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  ResumeFactory = require('../core/resume-factory');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Verb = require('../verbs/verb');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  chalk = require('chalk');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  AnalyzeVerb = module.exports = Verb.extend({
 | 
					 | 
				
			||||||
    init: function() {
 | 
					 | 
				
			||||||
      return this._super('analyze');
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    invoke: function() {
 | 
					 | 
				
			||||||
      this.stat(HMEVENT.begin, {
 | 
					 | 
				
			||||||
        cmd: 'analyze'
 | 
					 | 
				
			||||||
      });
 | 
					 | 
				
			||||||
      analyze.apply(this, arguments);
 | 
					 | 
				
			||||||
      return this.stat(HMEVENT.end);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /**
 | 
					 | 
				
			||||||
  Run the 'analyze' command.
 | 
					 | 
				
			||||||
   */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  analyze = function(sources, dst, opts) {
 | 
					 | 
				
			||||||
    var nlzrs;
 | 
					 | 
				
			||||||
    if (!sources || !sources.length) {
 | 
					 | 
				
			||||||
      throw {
 | 
					 | 
				
			||||||
        fluenterror: HMSTATUS.resumeNotFound,
 | 
					 | 
				
			||||||
        quit: true
 | 
					 | 
				
			||||||
      };
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    nlzrs = _loadInspectors();
 | 
					 | 
				
			||||||
    return _.each(sources, function(src) {
 | 
					 | 
				
			||||||
      var result;
 | 
					 | 
				
			||||||
      result = ResumeFactory.loadOne(src, {
 | 
					 | 
				
			||||||
        format: 'FRESH',
 | 
					 | 
				
			||||||
        objectify: true
 | 
					 | 
				
			||||||
      }, this);
 | 
					 | 
				
			||||||
      if (result.fluenterror) {
 | 
					 | 
				
			||||||
        return this.setError(result.fluenterror, result);
 | 
					 | 
				
			||||||
      } else {
 | 
					 | 
				
			||||||
        return _analyze.call(this, result, nlzrs, opts);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }, this);
 | 
					 | 
				
			||||||
  };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /**
 | 
					 | 
				
			||||||
  Analyze a single resume.
 | 
					 | 
				
			||||||
   */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  _analyze = function(resumeObject, nlzrs, opts) {
 | 
					 | 
				
			||||||
    var info, rez, safeFormat;
 | 
					 | 
				
			||||||
    rez = resumeObject.rez;
 | 
					 | 
				
			||||||
    safeFormat = rez.meta && rez.meta.format && rez.meta.format.startsWith('FRESH') ? 'FRESH' : 'JRS';
 | 
					 | 
				
			||||||
    this.stat(HMEVENT.beforeAnalyze, {
 | 
					 | 
				
			||||||
      fmt: safeFormat,
 | 
					 | 
				
			||||||
      file: resumeObject.file
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
    info = _.mapObject(nlzrs, function(val, key) {
 | 
					 | 
				
			||||||
      return val.run(rez);
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
    return this.stat(HMEVENT.afterAnalyze, {
 | 
					 | 
				
			||||||
      info: info
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
  };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /**
 | 
					 | 
				
			||||||
  Load inspectors.
 | 
					 | 
				
			||||||
   */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  _loadInspectors = function() {
 | 
					 | 
				
			||||||
    return {
 | 
					 | 
				
			||||||
      totals: require('../inspectors/totals-inspector'),
 | 
					 | 
				
			||||||
      coverage: require('../inspectors/gap-inspector'),
 | 
					 | 
				
			||||||
      keywords: require('../inspectors/keyword-inspector')
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
  };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}).call(this);
 | 
					 | 
				
			||||||
							
								
								
									
										95
									
								
								dist/hmc/dist/verbs/convert.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										95
									
								
								dist/hmc/dist/verbs/convert.js
									
									
									
									
										vendored
									
									
								
							@@ -1,95 +0,0 @@
 | 
				
			|||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
Implementation of the 'convert' verb for HackMyResume.
 | 
					 | 
				
			||||||
@module verbs/convert
 | 
					 | 
				
			||||||
@license MIT. See LICENSE.md for details.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
(function() {
 | 
					 | 
				
			||||||
  var ConvertVerb, HMEVENT, HMSTATUS, ResumeFactory, Verb, _, chalk, convert;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  ResumeFactory = require('../core/resume-factory');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  chalk = require('chalk');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Verb = require('../verbs/verb');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  HMSTATUS = require('../core/status-codes');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  _ = require('underscore');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  HMEVENT = require('../core/event-codes');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  ConvertVerb = module.exports = Verb.extend({
 | 
					 | 
				
			||||||
    init: function() {
 | 
					 | 
				
			||||||
      return this._super('convert');
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    invoke: function() {
 | 
					 | 
				
			||||||
      this.stat(HMEVENT.begin, {
 | 
					 | 
				
			||||||
        cmd: 'convert'
 | 
					 | 
				
			||||||
      });
 | 
					 | 
				
			||||||
      convert.apply(this, arguments);
 | 
					 | 
				
			||||||
      return this.stat(HMEVENT.end);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /**
 | 
					 | 
				
			||||||
  Convert between FRESH and JRS formats.
 | 
					 | 
				
			||||||
   */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  convert = function(srcs, dst, opts) {
 | 
					 | 
				
			||||||
    if (!srcs || !srcs.length) {
 | 
					 | 
				
			||||||
      throw {
 | 
					 | 
				
			||||||
        fluenterror: 6,
 | 
					 | 
				
			||||||
        quit: true
 | 
					 | 
				
			||||||
      };
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if (!dst || !dst.length) {
 | 
					 | 
				
			||||||
      if (srcs.length === 1) {
 | 
					 | 
				
			||||||
        throw {
 | 
					 | 
				
			||||||
          fluenterror: HMSTATUS.inputOutputParity,
 | 
					 | 
				
			||||||
          quit: true
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
      } else if (srcs.length === 2) {
 | 
					 | 
				
			||||||
        dst = dst || [];
 | 
					 | 
				
			||||||
        dst.push(srcs.pop());
 | 
					 | 
				
			||||||
      } else {
 | 
					 | 
				
			||||||
        throw {
 | 
					 | 
				
			||||||
          fluenterror: HMSTATUS.inputOutputParity,
 | 
					 | 
				
			||||||
          quit: true
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if (srcs && dst && srcs.length && dst.length && srcs.length !== dst.length) {
 | 
					 | 
				
			||||||
      throw {
 | 
					 | 
				
			||||||
        fluenterror: HMSTATUS.inputOutputParity({
 | 
					 | 
				
			||||||
          quit: true
 | 
					 | 
				
			||||||
        })
 | 
					 | 
				
			||||||
      };
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    _.each(srcs, function(src, idx) {
 | 
					 | 
				
			||||||
      var rinfo, s, srcFmt, targetFormat;
 | 
					 | 
				
			||||||
      rinfo = ResumeFactory.loadOne(src, {
 | 
					 | 
				
			||||||
        format: null,
 | 
					 | 
				
			||||||
        objectify: true,
 | 
					 | 
				
			||||||
        "throw": false
 | 
					 | 
				
			||||||
      });
 | 
					 | 
				
			||||||
      if (rinfo.fluenterror) {
 | 
					 | 
				
			||||||
        this.err(rinfo.fluenterror, rinfo);
 | 
					 | 
				
			||||||
        return;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      s = rinfo.rez;
 | 
					 | 
				
			||||||
      srcFmt = ((s.basics && s.basics.imp) || s.imp).orgFormat === 'JRS' ? 'JRS' : 'FRESH';
 | 
					 | 
				
			||||||
      targetFormat = srcFmt === 'JRS' ? 'FRESH' : 'JRS';
 | 
					 | 
				
			||||||
      this.stat(HMEVENT.beforeConvert, {
 | 
					 | 
				
			||||||
        srcFile: rinfo.file,
 | 
					 | 
				
			||||||
        srcFmt: srcFmt,
 | 
					 | 
				
			||||||
        dstFile: dst[idx],
 | 
					 | 
				
			||||||
        dstFmt: targetFormat
 | 
					 | 
				
			||||||
      });
 | 
					 | 
				
			||||||
      s.saveAs(dst[idx], targetFormat);
 | 
					 | 
				
			||||||
    }, this);
 | 
					 | 
				
			||||||
  };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}).call(this);
 | 
					 | 
				
			||||||
							
								
								
									
										69
									
								
								dist/hmc/dist/verbs/create.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										69
									
								
								dist/hmc/dist/verbs/create.js
									
									
									
									
										vendored
									
									
								
							@@ -1,69 +0,0 @@
 | 
				
			|||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
Implementation of the 'create' verb for HackMyResume.
 | 
					 | 
				
			||||||
@module verbs/create
 | 
					 | 
				
			||||||
@license MIT. See LICENSE.md for details.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
(function() {
 | 
					 | 
				
			||||||
  var CreateVerb, HMEVENT, HMSTATUS, MKDIRP, PATH, Verb, _, chalk, create;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  MKDIRP = require('mkdirp');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  PATH = require('path');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  chalk = require('chalk');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Verb = require('../verbs/verb');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  _ = require('underscore');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  HMSTATUS = require('../core/status-codes');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  HMEVENT = require('../core/event-codes');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  CreateVerb = module.exports = Verb.extend({
 | 
					 | 
				
			||||||
    init: function() {
 | 
					 | 
				
			||||||
      return this._super('new');
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    invoke: function() {
 | 
					 | 
				
			||||||
      this.stat(HMEVENT.begin, {
 | 
					 | 
				
			||||||
        cmd: 'create'
 | 
					 | 
				
			||||||
      });
 | 
					 | 
				
			||||||
      create.apply(this, arguments);
 | 
					 | 
				
			||||||
      this.stat(HMEVENT.begin, {
 | 
					 | 
				
			||||||
        cmd: 'convert'
 | 
					 | 
				
			||||||
      });
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /**
 | 
					 | 
				
			||||||
  Create a new empty resume in either FRESH or JRS format.
 | 
					 | 
				
			||||||
   */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  create = function(src, dst, opts) {
 | 
					 | 
				
			||||||
    if (!src || !src.length) {
 | 
					 | 
				
			||||||
      throw {
 | 
					 | 
				
			||||||
        fluenterror: HMSTATUS.createNameMissing,
 | 
					 | 
				
			||||||
        quit: true
 | 
					 | 
				
			||||||
      };
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    _.each(src, function(t) {
 | 
					 | 
				
			||||||
      var RezClass, safeFmt;
 | 
					 | 
				
			||||||
      safeFmt = opts.format.toUpperCase();
 | 
					 | 
				
			||||||
      this.stat(HMEVENT.beforeCreate, {
 | 
					 | 
				
			||||||
        fmt: safeFmt,
 | 
					 | 
				
			||||||
        file: t
 | 
					 | 
				
			||||||
      });
 | 
					 | 
				
			||||||
      MKDIRP.sync(PATH.dirname(t));
 | 
					 | 
				
			||||||
      RezClass = require('../core/' + safeFmt.toLowerCase() + '-resume');
 | 
					 | 
				
			||||||
      RezClass["default"]().save(t);
 | 
					 | 
				
			||||||
      return this.stat(HMEVENT.afterCreate, {
 | 
					 | 
				
			||||||
        fmt: safeFmt,
 | 
					 | 
				
			||||||
        file: t
 | 
					 | 
				
			||||||
      });
 | 
					 | 
				
			||||||
    }, this);
 | 
					 | 
				
			||||||
  };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}).call(this);
 | 
					 | 
				
			||||||
							
								
								
									
										79
									
								
								dist/hmc/dist/verbs/peek.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										79
									
								
								dist/hmc/dist/verbs/peek.js
									
									
									
									
										vendored
									
									
								
							@@ -1,79 +0,0 @@
 | 
				
			|||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
Implementation of the 'peek' verb for HackMyResume.
 | 
					 | 
				
			||||||
@module verbs/peek
 | 
					 | 
				
			||||||
@license MIT. See LICENSE.md for details.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
(function() {
 | 
					 | 
				
			||||||
  var HMEVENT, HMSTATUS, PeekVerb, Verb, _, __, peek, safeLoadJSON;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Verb = require('../verbs/verb');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  _ = require('underscore');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  __ = require('lodash');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  safeLoadJSON = require('../utils/safe-json-loader');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  HMSTATUS = require('../core/status-codes');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  HMEVENT = require('../core/event-codes');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  PeekVerb = module.exports = Verb.extend({
 | 
					 | 
				
			||||||
    init: function() {
 | 
					 | 
				
			||||||
      return this._super('peek');
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    invoke: function() {
 | 
					 | 
				
			||||||
      this.stat(HMEVENT.begin, {
 | 
					 | 
				
			||||||
        cmd: 'peek'
 | 
					 | 
				
			||||||
      });
 | 
					 | 
				
			||||||
      peek.apply(this, arguments);
 | 
					 | 
				
			||||||
      return this.stat(HMEVENT.end);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /**
 | 
					 | 
				
			||||||
  Peek at a resume, resume section, or resume field.
 | 
					 | 
				
			||||||
   */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  peek = function(src, dst, opts) {
 | 
					 | 
				
			||||||
    var objPath;
 | 
					 | 
				
			||||||
    if (!src || !src.length) {
 | 
					 | 
				
			||||||
      ({
 | 
					 | 
				
			||||||
        "throw": {
 | 
					 | 
				
			||||||
          fluenterror: HMSTATUS.resumeNotFound
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      });
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    objPath = (dst && dst[0]) || '';
 | 
					 | 
				
			||||||
    _.each(src, function(t) {
 | 
					 | 
				
			||||||
      var errCode, obj, tgt;
 | 
					 | 
				
			||||||
      this.stat(HMEVENT.beforePeek, {
 | 
					 | 
				
			||||||
        file: t,
 | 
					 | 
				
			||||||
        target: objPath
 | 
					 | 
				
			||||||
      });
 | 
					 | 
				
			||||||
      obj = safeLoadJSON(t);
 | 
					 | 
				
			||||||
      tgt = null;
 | 
					 | 
				
			||||||
      if (!obj.ex) {
 | 
					 | 
				
			||||||
        tgt = objPath ? __.get(obj.json, objPath) : obj.json;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      this.stat(HMEVENT.afterPeek, {
 | 
					 | 
				
			||||||
        file: t,
 | 
					 | 
				
			||||||
        requested: objPath,
 | 
					 | 
				
			||||||
        target: tgt,
 | 
					 | 
				
			||||||
        error: obj.ex
 | 
					 | 
				
			||||||
      });
 | 
					 | 
				
			||||||
      if (obj.ex) {
 | 
					 | 
				
			||||||
        errCode = obj.ex.operation === 'parse' ? HMSTATUS.parseError : HMSTATUS.readError;
 | 
					 | 
				
			||||||
        if (errCode === HMSTATUS.readError) {
 | 
					 | 
				
			||||||
          obj.ex.quiet = true;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        this.setError(errCode, obj.ex);
 | 
					 | 
				
			||||||
        return this.err(errCode, obj.ex);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }, this);
 | 
					 | 
				
			||||||
  };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}).call(this);
 | 
					 | 
				
			||||||
							
								
								
									
										110
									
								
								dist/hmc/dist/verbs/validate.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										110
									
								
								dist/hmc/dist/verbs/validate.js
									
									
									
									
										vendored
									
									
								
							@@ -1,110 +0,0 @@
 | 
				
			|||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
Implementation of the 'validate' verb for HackMyResume.
 | 
					 | 
				
			||||||
@module verbs/validate
 | 
					 | 
				
			||||||
@license MIT. See LICENSE.md for details.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
(function() {
 | 
					 | 
				
			||||||
  var FS, HMEVENT, HMSTATUS, ResumeFactory, SyntaxErrorEx, ValidateVerb, Verb, _, chalk, validate;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  FS = require('fs');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  ResumeFactory = require('../core/resume-factory');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  SyntaxErrorEx = require('../utils/syntax-error-ex');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  chalk = require('chalk');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Verb = require('../verbs/verb');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  HMSTATUS = require('../core/status-codes');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  HMEVENT = require('../core/event-codes');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  _ = require('underscore');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /** An invokable resume validation command. */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  ValidateVerb = module.exports = Verb.extend({
 | 
					 | 
				
			||||||
    init: function() {
 | 
					 | 
				
			||||||
      return this._super('validate');
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    invoke: function() {
 | 
					 | 
				
			||||||
      this.stat(HMEVENT.begin, {
 | 
					 | 
				
			||||||
        cmd: 'validate'
 | 
					 | 
				
			||||||
      });
 | 
					 | 
				
			||||||
      validate.apply(this, arguments);
 | 
					 | 
				
			||||||
      this.stat(HMEVENT.end);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /** Validate 1 to N resumes in FRESH or JSON Resume format. */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  validate = function(sources, unused, opts) {
 | 
					 | 
				
			||||||
    var resumes, schemas, validator;
 | 
					 | 
				
			||||||
    if (!sources || !sources.length) {
 | 
					 | 
				
			||||||
      throw {
 | 
					 | 
				
			||||||
        fluenterror: HMSTATUS.resumeNotFoundAlt,
 | 
					 | 
				
			||||||
        quit: true
 | 
					 | 
				
			||||||
      };
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    validator = require('is-my-json-valid');
 | 
					 | 
				
			||||||
    schemas = {
 | 
					 | 
				
			||||||
      fresh: require('fresca'),
 | 
					 | 
				
			||||||
      jars: require('../core/resume.json')
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
    resumes = ResumeFactory.load(sources, {
 | 
					 | 
				
			||||||
      format: null,
 | 
					 | 
				
			||||||
      objectify: false
 | 
					 | 
				
			||||||
    }, this);
 | 
					 | 
				
			||||||
    return resumes.map(function(src) {
 | 
					 | 
				
			||||||
      var errors, exc, fmt, json, ret;
 | 
					 | 
				
			||||||
      ret = {
 | 
					 | 
				
			||||||
        file: src,
 | 
					 | 
				
			||||||
        isValid: false
 | 
					 | 
				
			||||||
      };
 | 
					 | 
				
			||||||
      if (src.fluenterror) {
 | 
					 | 
				
			||||||
        if (opts.assert) {
 | 
					 | 
				
			||||||
          throw src;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        this.setError(src.fluenterror, src);
 | 
					 | 
				
			||||||
        return ret;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      json = src.json;
 | 
					 | 
				
			||||||
      fmt = json.basics ? 'jrs' : 'fresh';
 | 
					 | 
				
			||||||
      errors = [];
 | 
					 | 
				
			||||||
      try {
 | 
					 | 
				
			||||||
        validate = validator(schemas[fmt], {
 | 
					 | 
				
			||||||
          formats: {
 | 
					 | 
				
			||||||
            date: /^\d{4}(?:-(?:0[0-9]{1}|1[0-2]{1})(?:-[0-9]{2})?)?$/
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
        ret.isValid = validate(json);
 | 
					 | 
				
			||||||
        if (!ret.isValid) {
 | 
					 | 
				
			||||||
          errors = validate.errors;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      } catch (_error) {
 | 
					 | 
				
			||||||
        exc = _error;
 | 
					 | 
				
			||||||
        return ret;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      this.stat(HMEVENT.afterValidate, {
 | 
					 | 
				
			||||||
        file: src.file,
 | 
					 | 
				
			||||||
        isValid: ret.isValid,
 | 
					 | 
				
			||||||
        fmt: fmt.replace('jars', 'JSON Resume'),
 | 
					 | 
				
			||||||
        errors: errors
 | 
					 | 
				
			||||||
      });
 | 
					 | 
				
			||||||
      if (opts.assert && !ret.isValid) {
 | 
					 | 
				
			||||||
        throw {
 | 
					 | 
				
			||||||
          fluenterror: HMSTATUS.invalid({
 | 
					 | 
				
			||||||
            shouldExit: true
 | 
					 | 
				
			||||||
          })
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      return ret;
 | 
					 | 
				
			||||||
    }, this);
 | 
					 | 
				
			||||||
  };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}).call(this);
 | 
					 | 
				
			||||||
							
								
								
									
										69
									
								
								dist/hmc/dist/verbs/verb.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										69
									
								
								dist/hmc/dist/verbs/verb.js
									
									
									
									
										vendored
									
									
								
							@@ -1,69 +0,0 @@
 | 
				
			|||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
Definition of the Verb class.
 | 
					 | 
				
			||||||
@module verbs/verb
 | 
					 | 
				
			||||||
@license MIT. See LICENSE.md for details.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
(function() {
 | 
					 | 
				
			||||||
  var Class, EVENTS, Verb;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Class = require('../utils/class');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  EVENTS = require('events');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /**
 | 
					 | 
				
			||||||
  An instantiation of a HackMyResume command.
 | 
					 | 
				
			||||||
  @class Verb
 | 
					 | 
				
			||||||
   */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Verb = module.exports = Class.extend({
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /** Constructor. Automatically called at creation. */
 | 
					 | 
				
			||||||
    init: function(moniker) {
 | 
					 | 
				
			||||||
      this.moniker = moniker;
 | 
					 | 
				
			||||||
      this.emitter = new EVENTS.EventEmitter();
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /** Forward subscriptions to the event emitter. */
 | 
					 | 
				
			||||||
    on: function() {
 | 
					 | 
				
			||||||
      return this.emitter.on.apply(this.emitter, arguments);
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /** Fire an arbitrary event, scoped to "hmr:". */
 | 
					 | 
				
			||||||
    fire: function(evtName, payload) {
 | 
					 | 
				
			||||||
      payload = payload || {};
 | 
					 | 
				
			||||||
      payload.cmd = this.moniker;
 | 
					 | 
				
			||||||
      this.emitter.emit('hmr:' + evtName, payload);
 | 
					 | 
				
			||||||
      return true;
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /** Handle an error condition. */
 | 
					 | 
				
			||||||
    err: function(errorCode, payload, hot) {
 | 
					 | 
				
			||||||
      payload = payload || {};
 | 
					 | 
				
			||||||
      payload.sub = payload.fluenterror = errorCode;
 | 
					 | 
				
			||||||
      payload["throw"] = hot;
 | 
					 | 
				
			||||||
      this.fire('error', payload);
 | 
					 | 
				
			||||||
      if (hot) {
 | 
					 | 
				
			||||||
        throw payload;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      return true;
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /** Fire the 'hmr:status' error event. */
 | 
					 | 
				
			||||||
    stat: function(subEvent, payload) {
 | 
					 | 
				
			||||||
      payload = payload || {};
 | 
					 | 
				
			||||||
      payload.sub = subEvent;
 | 
					 | 
				
			||||||
      this.fire('status', payload);
 | 
					 | 
				
			||||||
      return true;
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /** Associate error info with the invocation. */
 | 
					 | 
				
			||||||
    setError: function(code, obj) {
 | 
					 | 
				
			||||||
      this.errorCode = code;
 | 
					 | 
				
			||||||
      this.errorObj = obj;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}).call(this);
 | 
					 | 
				
			||||||
							
								
								
									
										92
									
								
								dist/hmc/package.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										92
									
								
								dist/hmc/package.json
									
									
									
									
										vendored
									
									
								
							@@ -1,92 +0,0 @@
 | 
				
			|||||||
{
 | 
					 | 
				
			||||||
  "name": "hackmycore",
 | 
					 | 
				
			||||||
  "version": "0.4.0",
 | 
					 | 
				
			||||||
  "description": "The open core library for HackMyResume and FluentCV.",
 | 
					 | 
				
			||||||
  "repository": {
 | 
					 | 
				
			||||||
    "type": "git",
 | 
					 | 
				
			||||||
    "url": "https://github.com/hacksalot/HackMyCore.git"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  "scripts": {
 | 
					 | 
				
			||||||
    "test": "grunt clean:test && mocha",
 | 
					 | 
				
			||||||
    "grunt": "grunt"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  "author": "hacksalot <hacksalot@indevious.com> (https://github.com/hacksalot)",
 | 
					 | 
				
			||||||
  "contributors": [],
 | 
					 | 
				
			||||||
  "license": "MIT",
 | 
					 | 
				
			||||||
  "bugs": {
 | 
					 | 
				
			||||||
    "url": "https://github.com/hacksalot/HackMyCore/issues"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  "main": "dist/index.js",
 | 
					 | 
				
			||||||
  "homepage": "https://github.com/hacksalot/HackMyCore",
 | 
					 | 
				
			||||||
  "dependencies": {
 | 
					 | 
				
			||||||
    "copy": "^0.1.3",
 | 
					 | 
				
			||||||
    "extend": "^3.0.0",
 | 
					 | 
				
			||||||
    "fresca": "~0.6.0",
 | 
					 | 
				
			||||||
    "fresh-jrs-converter": "^0.2.0",
 | 
					 | 
				
			||||||
    "fresh-resume-starter": "^0.2.2",
 | 
					 | 
				
			||||||
    "fresh-themes": "~0.14.0-beta",
 | 
					 | 
				
			||||||
    "fs-extra": "^0.24.0",
 | 
					 | 
				
			||||||
    "handlebars": "^4.0.5",
 | 
					 | 
				
			||||||
    "html": "0.0.10",
 | 
					 | 
				
			||||||
    "is-my-json-valid": "^2.12.2",
 | 
					 | 
				
			||||||
    "json-lint": "^0.1.0",
 | 
					 | 
				
			||||||
    "jst": "0.0.13",
 | 
					 | 
				
			||||||
    "lodash": "^3.10.1",
 | 
					 | 
				
			||||||
    "marked": "^0.3.5",
 | 
					 | 
				
			||||||
    "mkdirp": "^0.5.1",
 | 
					 | 
				
			||||||
    "moment": "^2.10.6",
 | 
					 | 
				
			||||||
    "parse-filepath": "^0.6.3",
 | 
					 | 
				
			||||||
    "path-exists": "^2.1.0",
 | 
					 | 
				
			||||||
    "printf": "^0.2.3",
 | 
					 | 
				
			||||||
    "recursive-readdir-sync": "^1.0.6",
 | 
					 | 
				
			||||||
    "simple-html-tokenizer": "^0.2.0",
 | 
					 | 
				
			||||||
    "slash": "^1.0.0",
 | 
					 | 
				
			||||||
    "string-padding": "^1.0.2",
 | 
					 | 
				
			||||||
    "string.prototype.endswith": "^0.2.0",
 | 
					 | 
				
			||||||
    "string.prototype.startswith": "^0.2.0",
 | 
					 | 
				
			||||||
    "traverse": "^0.6.6",
 | 
					 | 
				
			||||||
    "underscore": "^1.8.3",
 | 
					 | 
				
			||||||
    "word-wrap": "^1.1.0",
 | 
					 | 
				
			||||||
    "xml-escape": "^1.0.0",
 | 
					 | 
				
			||||||
    "yamljs": "^0.2.4"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  "devDependencies": {
 | 
					 | 
				
			||||||
    "chai": "*",
 | 
					 | 
				
			||||||
    "chalk": "^1.1.1",
 | 
					 | 
				
			||||||
    "fresh-test-resumes": "^0.6.0",
 | 
					 | 
				
			||||||
    "grunt": "*",
 | 
					 | 
				
			||||||
    "grunt-cli": "^0.1.13",
 | 
					 | 
				
			||||||
    "grunt-contrib-clean": "^0.7.0",
 | 
					 | 
				
			||||||
    "grunt-contrib-coffee": "^0.13.0",
 | 
					 | 
				
			||||||
    "grunt-contrib-copy": "^0.8.2",
 | 
					 | 
				
			||||||
    "grunt-contrib-jshint": "^0.11.3",
 | 
					 | 
				
			||||||
    "grunt-contrib-yuidoc": "^0.10.0",
 | 
					 | 
				
			||||||
    "grunt-jsdoc": "^1.1.0",
 | 
					 | 
				
			||||||
    "grunt-simple-mocha": "*",
 | 
					 | 
				
			||||||
    "jsonresume-theme-boilerplate": "^0.1.2",
 | 
					 | 
				
			||||||
    "jsonresume-theme-classy": "^1.0.9",
 | 
					 | 
				
			||||||
    "jsonresume-theme-modern": "0.0.18",
 | 
					 | 
				
			||||||
    "jsonresume-theme-sceptile": "^1.0.5",
 | 
					 | 
				
			||||||
    "mocha": "*",
 | 
					 | 
				
			||||||
    "resample": "fluentdesk/resample"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  "keywords": [
 | 
					 | 
				
			||||||
    "resume",
 | 
					 | 
				
			||||||
    "CV",
 | 
					 | 
				
			||||||
    "portfolio",
 | 
					 | 
				
			||||||
    "employment",
 | 
					 | 
				
			||||||
    "career",
 | 
					 | 
				
			||||||
    "HackMyResume",
 | 
					 | 
				
			||||||
    "Markdown",
 | 
					 | 
				
			||||||
    "JSON",
 | 
					 | 
				
			||||||
    "Word",
 | 
					 | 
				
			||||||
    "PDF",
 | 
					 | 
				
			||||||
    "YAML",
 | 
					 | 
				
			||||||
    "HTML",
 | 
					 | 
				
			||||||
    "LaTeX",
 | 
					 | 
				
			||||||
    "CLI",
 | 
					 | 
				
			||||||
    "Handlebars",
 | 
					 | 
				
			||||||
    "Underscore",
 | 
					 | 
				
			||||||
    "template"
 | 
					 | 
				
			||||||
  ]
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										52
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										52
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							@@ -1,22 +1,48 @@
 | 
				
			|||||||
#! /usr/bin/env node
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
Command-line interface (CLI) for HackMyResume.
 | 
					External API surface for HackMyResume.
 | 
				
			||||||
@license MIT. See LICENSE.md for details.
 | 
					@license MIT. See LICENSE.md for details.
 | 
				
			||||||
@module index.js
 | 
					@module hackmycore/index
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** API facade for HackMyResume. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
try {
 | 
					(function() {
 | 
				
			||||||
 | 
					  module.exports = {
 | 
				
			||||||
 | 
					    verbs: {
 | 
				
			||||||
 | 
					      build: require('./verbs/build'),
 | 
				
			||||||
 | 
					      analyze: require('./verbs/analyze'),
 | 
				
			||||||
 | 
					      validate: require('./verbs/validate'),
 | 
				
			||||||
 | 
					      convert: require('./verbs/convert'),
 | 
				
			||||||
 | 
					      "new": require('./verbs/create'),
 | 
				
			||||||
 | 
					      peek: require('./verbs/peek')
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    alias: {
 | 
				
			||||||
 | 
					      generate: require('./verbs/build'),
 | 
				
			||||||
 | 
					      create: require('./verbs/create')
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    options: require('./core/default-options'),
 | 
				
			||||||
 | 
					    formats: require('./core/default-formats'),
 | 
				
			||||||
 | 
					    Sheet: require('./core/fresh-resume'),
 | 
				
			||||||
 | 
					    FRESHResume: require('./core/fresh-resume'),
 | 
				
			||||||
 | 
					    JRSResume: require('./core/jrs-resume'),
 | 
				
			||||||
 | 
					    FRESHTheme: require('./core/fresh-theme'),
 | 
				
			||||||
 | 
					    JRSTheme: require('./core/jrs-theme'),
 | 
				
			||||||
 | 
					    ResumeFactory: require('./core/resume-factory'),
 | 
				
			||||||
 | 
					    FluentDate: require('./core/fluent-date'),
 | 
				
			||||||
 | 
					    HtmlGenerator: require('./generators/html-generator'),
 | 
				
			||||||
 | 
					    TextGenerator: require('./generators/text-generator'),
 | 
				
			||||||
 | 
					    HtmlPdfCliGenerator: require('./generators/html-pdf-cli-generator'),
 | 
				
			||||||
 | 
					    WordGenerator: require('./generators/word-generator'),
 | 
				
			||||||
 | 
					    MarkdownGenerator: require('./generators/markdown-generator'),
 | 
				
			||||||
 | 
					    JsonGenerator: require('./generators/json-generator'),
 | 
				
			||||||
 | 
					    YamlGenerator: require('./generators/yaml-generator'),
 | 
				
			||||||
 | 
					    JsonYamlGenerator: require('./generators/json-yaml-generator'),
 | 
				
			||||||
 | 
					    LaTeXGenerator: require('./generators/latex-generator'),
 | 
				
			||||||
 | 
					    HtmlPngGenerator: require('./generators/html-png-generator')
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  require('./cli/main')( process.argv );
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					//# sourceMappingURL=index.js.map
 | 
				
			||||||
catch( ex ) {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  require('./cli/error').err( ex, true );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -136,3 +136,5 @@ Employment gap analysis for HackMyResume.
 | 
				
			|||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}).call(this);
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=gap-inspector.js.map
 | 
				
			||||||
@@ -59,3 +59,5 @@ Keyword analysis for HackMyResume.
 | 
				
			|||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}).call(this);
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=keyword-inspector.js.map
 | 
				
			||||||
@@ -47,3 +47,5 @@ Section analysis for HackMyResume.
 | 
				
			|||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}).call(this);
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=totals-inspector.js.map
 | 
				
			||||||
@@ -43,7 +43,7 @@ Definition of the HandlebarsGenerator class.
 | 
				
			|||||||
        return template(data);
 | 
					        return template(data);
 | 
				
			||||||
      } catch (_error) {
 | 
					      } catch (_error) {
 | 
				
			||||||
        throw {
 | 
					        throw {
 | 
				
			||||||
          fluenterror: template ? HMSTATUS.invokeTemplate : HMSTATUS.compileTemplate,
 | 
					          fluenterror: HMSTATUS[template ? 'invokeTemplate' : 'compileTemplate'],
 | 
				
			||||||
          inner: _error
 | 
					          inner: _error
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -98,3 +98,5 @@ Definition of the HandlebarsGenerator class.
 | 
				
			|||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}).call(this);
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=handlebars-generator.js.map
 | 
				
			||||||
@@ -36,10 +36,11 @@ Definition of the JRSGenerator class.
 | 
				
			|||||||
    generate: function(json, jst, format, cssInfo, opts, theme) {
 | 
					    generate: function(json, jst, format, cssInfo, opts, theme) {
 | 
				
			||||||
      var org, rezHtml, turnoff;
 | 
					      var org, rezHtml, turnoff;
 | 
				
			||||||
      turnoff = ['log', 'error', 'dir'];
 | 
					      turnoff = ['log', 'error', 'dir'];
 | 
				
			||||||
      org = turnoff.map(c)(function() {
 | 
					      org = turnoff.map(function(c) {
 | 
				
			||||||
        var ret;
 | 
					        var ret;
 | 
				
			||||||
        ret = console[c];
 | 
					        ret = console[c];
 | 
				
			||||||
        return console[c] = function() {};
 | 
					        console[c] = function() {};
 | 
				
			||||||
 | 
					        return ret;
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
      rezHtml = theme.render(json.harden());
 | 
					      rezHtml = theme.render(json.harden());
 | 
				
			||||||
      turnoff.forEach(function(c, idx) {
 | 
					      turnoff.forEach(function(c, idx) {
 | 
				
			||||||
@@ -56,3 +57,5 @@ Definition of the JRSGenerator class.
 | 
				
			|||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}).call(this);
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=jrs-generator.js.map
 | 
				
			||||||
@@ -6,13 +6,15 @@ Definition of the UnderscoreGenerator class.
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(function() {
 | 
					(function() {
 | 
				
			||||||
  var HMSTATUS, UnderscoreGenerator, _, registerHelpers;
 | 
					  var UnderscoreGenerator, _, escapeLaTeX, registerHelpers;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _ = require('underscore');
 | 
					  _ = require('underscore');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  registerHelpers = require('../helpers/underscore-helpers');
 | 
					  registerHelpers = require('../helpers/underscore-helpers');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  HMSTATUS = require('../core/status-codes');
 | 
					  require('../utils/string');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  escapeLaTeX = require('escape-latex');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /**
 | 
					  /**
 | 
				
			||||||
@@ -22,19 +24,20 @@ Definition of the UnderscoreGenerator class.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  UnderscoreGenerator = module.exports = {
 | 
					  UnderscoreGenerator = module.exports = {
 | 
				
			||||||
    generateSimple: function(data, tpl) {
 | 
					    generateSimple: function(data, tpl) {
 | 
				
			||||||
      var template;
 | 
					      var HMS, t;
 | 
				
			||||||
      try {
 | 
					      try {
 | 
				
			||||||
        template = _.template(tpl);
 | 
					        t = _.template(tpl);
 | 
				
			||||||
        return template(data);
 | 
					        return t(data);
 | 
				
			||||||
      } catch (_error) {
 | 
					      } catch (_error) {
 | 
				
			||||||
 | 
					        HMS = require('../core/status-codes');
 | 
				
			||||||
        throw {
 | 
					        throw {
 | 
				
			||||||
          fluenterror: template ? HMSTATUS.invokeTemplate : HMSTATUS.compileTemplate,
 | 
					          fluenterror: HMS[t ? 'invokeTemplate' : 'compileTemplate'],
 | 
				
			||||||
          inner: _error
 | 
					          inner: _error
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    generate: function(json, jst, format, cssInfo, opts, theme) {
 | 
					    generate: function(json, jst, format, cssInfo, opts, theme) {
 | 
				
			||||||
      var ctx, delims;
 | 
					      var ctx, delims, r, traverse;
 | 
				
			||||||
      delims = (opts.themeObj && opts.themeObj.delimeters) || opts.template;
 | 
					      delims = (opts.themeObj && opts.themeObj.delimeters) || opts.template;
 | 
				
			||||||
      if (opts.themeObj && opts.themeObj.delimeters) {
 | 
					      if (opts.themeObj && opts.themeObj.delimeters) {
 | 
				
			||||||
        delims = _.mapObject(delims, function(val, key) {
 | 
					        delims = _.mapObject(delims, function(val, key) {
 | 
				
			||||||
@@ -42,9 +45,31 @@ Definition of the UnderscoreGenerator class.
 | 
				
			|||||||
        });
 | 
					        });
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      _.templateSettings = delims;
 | 
					      _.templateSettings = delims;
 | 
				
			||||||
      jst = jst.replace(delims.comment, '');
 | 
					      r = null;
 | 
				
			||||||
 | 
					      switch (format) {
 | 
				
			||||||
 | 
					        case 'html':
 | 
				
			||||||
 | 
					          r = json.markdownify();
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					        case 'pdf':
 | 
				
			||||||
 | 
					          r = json.markdownify();
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					        case 'png':
 | 
				
			||||||
 | 
					          r = json.markdownify();
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					        case 'latex':
 | 
				
			||||||
 | 
					          traverse = require('traverse');
 | 
				
			||||||
 | 
					          r = traverse(json).map(function(x) {
 | 
				
			||||||
 | 
					            if (this.isLeaf && String.is(this.node)) {
 | 
				
			||||||
 | 
					              return escapeLaTeX(this.node);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return this.node;
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					        default:
 | 
				
			||||||
 | 
					          r = json;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
      ctx = {
 | 
					      ctx = {
 | 
				
			||||||
        r: format === 'html' || format === 'pdf' || format === 'png' ? json.markdownify() : json,
 | 
					        r: r,
 | 
				
			||||||
        filt: opts.filters,
 | 
					        filt: opts.filters,
 | 
				
			||||||
        XML: require('xml-escape'),
 | 
					        XML: require('xml-escape'),
 | 
				
			||||||
        RAW: json,
 | 
					        RAW: json,
 | 
				
			||||||
@@ -58,3 +83,5 @@ Definition of the UnderscoreGenerator class.
 | 
				
			|||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}).call(this);
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=underscore-generator.js.map
 | 
				
			||||||
@@ -10,3 +10,5 @@ Definition of the SyntaxErrorEx class.
 | 
				
			|||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}).call(this);
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=file-contains.js.map
 | 
				
			||||||
@@ -59,3 +59,5 @@ Definition of the Markdown to WordProcessingML conversion routine.
 | 
				
			|||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}).call(this);
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=html-to-wpml.js.map
 | 
				
			||||||
@@ -26,3 +26,5 @@ Inline Markdown-to-Chalk conversion routines.
 | 
				
			|||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}).call(this);
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=md2chalk.js.map
 | 
				
			||||||
@@ -75,3 +75,5 @@
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}).call(this);
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=rasterize.js.map
 | 
				
			||||||
@@ -30,3 +30,5 @@ Definition of the SafeJsonLoader class.
 | 
				
			|||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}).call(this);
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=safe-json-loader.js.map
 | 
				
			||||||
							
								
								
									
										46
									
								
								dist/utils/safe-spawn.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								dist/utils/safe-spawn.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,46 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					Safe spawn utility for HackMyResume / FluentCV.
 | 
				
			||||||
 | 
					@module utils/safe-spawn
 | 
				
			||||||
 | 
					@license MIT. See LICENSE.md for details.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Safely spawn a process synchronously or asynchronously without throwing an
 | 
				
			||||||
 | 
					exception
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(function() {
 | 
				
			||||||
 | 
					  module.exports = function(cmd, args, isSync, callback, param) {
 | 
				
			||||||
 | 
					    var info, spawn;
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					      spawn = require('child_process')[isSync ? 'spawnSync' : 'spawn'];
 | 
				
			||||||
 | 
					      info = spawn(cmd, args);
 | 
				
			||||||
 | 
					      if (!isSync) {
 | 
				
			||||||
 | 
					        info.on('error', function(err) {
 | 
				
			||||||
 | 
					          if (typeof callback === "function") {
 | 
				
			||||||
 | 
					            callback(err, param);
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        if (info.error) {
 | 
				
			||||||
 | 
					          if (typeof callback === "function") {
 | 
				
			||||||
 | 
					            callback(info.error, param);
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          return {
 | 
				
			||||||
 | 
					            cmd: cmd,
 | 
				
			||||||
 | 
					            inner: info.error
 | 
				
			||||||
 | 
					          };
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    } catch (_error) {
 | 
				
			||||||
 | 
					      if (typeof callback === "function") {
 | 
				
			||||||
 | 
					        callback(_error, param);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return _error;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=safe-spawn.js.map
 | 
				
			||||||
@@ -60,3 +60,5 @@ Object string transformation.
 | 
				
			|||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}).call(this);
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=string-transformer.js.map
 | 
				
			||||||
@@ -25,3 +25,5 @@ See: http://stackoverflow.com/a/32800728/4942583
 | 
				
			|||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}).call(this);
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=string.js.map
 | 
				
			||||||
							
								
								
									
										55
									
								
								dist/utils/syntax-error-ex.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								dist/utils/syntax-error-ex.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,55 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					Definition of the SyntaxErrorEx class.
 | 
				
			||||||
 | 
					@module utils/syntax-error-ex
 | 
				
			||||||
 | 
					@license MIT. See LICENSE.md for details.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					Represents a SyntaxError exception with line and column info.
 | 
				
			||||||
 | 
					Collect syntax error information from the provided exception object. The
 | 
				
			||||||
 | 
					JavaScript `SyntaxError` exception isn't interpreted uniformly across environ-
 | 
				
			||||||
 | 
					ments, so we reparse on error to grab the line and column.
 | 
				
			||||||
 | 
					See: http://stackoverflow.com/q/13323356
 | 
				
			||||||
 | 
					@class SyntaxErrorEx
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(function() {
 | 
				
			||||||
 | 
					  var SyntaxErrorEx;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  SyntaxErrorEx = (function() {
 | 
				
			||||||
 | 
					    function SyntaxErrorEx(ex, rawData) {
 | 
				
			||||||
 | 
					      var JSONLint, colNum, lineNum, lint, ref;
 | 
				
			||||||
 | 
					      lineNum = null;
 | 
				
			||||||
 | 
					      colNum = null;
 | 
				
			||||||
 | 
					      JSONLint = require('json-lint');
 | 
				
			||||||
 | 
					      lint = JSONLint(rawData, {
 | 
				
			||||||
 | 
					        comments: false
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					      if (lint.error) {
 | 
				
			||||||
 | 
					        ref = [lint.line, lint.character], this.line = ref[0], this.col = ref[1];
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      if (!lint.error) {
 | 
				
			||||||
 | 
					        JSONLint = require('jsonlint');
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					          JSONLint.parse(rawData);
 | 
				
			||||||
 | 
					        } catch (_error) {
 | 
				
			||||||
 | 
					          this.line = (/on line (\d+)/.exec(_error))[1];
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return SyntaxErrorEx;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  })();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  SyntaxErrorEx.is = function(ex) {
 | 
				
			||||||
 | 
					    return ex instanceof SyntaxError;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  module.exports = SyntaxErrorEx;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=syntax-error-ex.js.map
 | 
				
			||||||
							
								
								
									
										110
									
								
								dist/verbs/analyze.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								dist/verbs/analyze.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,110 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					Implementation of the 'analyze' verb for HackMyResume.
 | 
				
			||||||
 | 
					@module verbs/analyze
 | 
				
			||||||
 | 
					@license MIT. See LICENSE.md for details.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(function() {
 | 
				
			||||||
 | 
					  var AnalyzeVerb, HMEVENT, HMSTATUS, MKDIRP, PATH, ResumeFactory, Verb, _, _analyze, _analyzeOne, _loadInspectors, chalk,
 | 
				
			||||||
 | 
					    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
 | 
				
			||||||
 | 
					    hasProp = {}.hasOwnProperty;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  MKDIRP = require('mkdirp');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  PATH = require('path');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  HMEVENT = require('../core/event-codes');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  HMSTATUS = require('../core/status-codes');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  _ = require('underscore');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ResumeFactory = require('../core/resume-factory');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Verb = require('../verbs/verb');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  chalk = require('chalk');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /** An invokable resume analysis command. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  module.exports = AnalyzeVerb = (function(superClass) {
 | 
				
			||||||
 | 
					    extend(AnalyzeVerb, superClass);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function AnalyzeVerb() {
 | 
				
			||||||
 | 
					      AnalyzeVerb.__super__.constructor.call(this, 'analyze', _analyze);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return AnalyzeVerb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  })(Verb);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /** Private workhorse for the 'analyze' command. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  _analyze = function(sources, dst, opts) {
 | 
				
			||||||
 | 
					    var nlzrs, results;
 | 
				
			||||||
 | 
					    if (!sources || !sources.length) {
 | 
				
			||||||
 | 
					      this.err(HMSTATUS.resumeNotFound, {
 | 
				
			||||||
 | 
					        quit: true
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					      return null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    nlzrs = _loadInspectors();
 | 
				
			||||||
 | 
					    results = _.map(sources, function(src) {
 | 
				
			||||||
 | 
					      var r;
 | 
				
			||||||
 | 
					      r = ResumeFactory.loadOne(src, {
 | 
				
			||||||
 | 
					        format: 'FRESH',
 | 
				
			||||||
 | 
					        objectify: true
 | 
				
			||||||
 | 
					      }, this);
 | 
				
			||||||
 | 
					      if (opts.assert && this.hasError()) {
 | 
				
			||||||
 | 
					        return {};
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      if (r.fluenterror) {
 | 
				
			||||||
 | 
					        r.quit = opts.assert;
 | 
				
			||||||
 | 
					        this.err(r.fluenterror, r);
 | 
				
			||||||
 | 
					        return r;
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        return _analyzeOne.call(this, r, nlzrs, opts);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }, this);
 | 
				
			||||||
 | 
					    if (this.hasError() && !opts.assert) {
 | 
				
			||||||
 | 
					      this.reject(this.errorCode);
 | 
				
			||||||
 | 
					    } else if (!this.hasError()) {
 | 
				
			||||||
 | 
					      this.resolve(results);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return results;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /** Analyze a single resume. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  _analyzeOne = function(resumeObject, nlzrs, opts) {
 | 
				
			||||||
 | 
					    var info, rez, safeFormat;
 | 
				
			||||||
 | 
					    rez = resumeObject.rez;
 | 
				
			||||||
 | 
					    safeFormat = rez.meta && rez.meta.format && rez.meta.format.startsWith('FRESH') ? 'FRESH' : 'JRS';
 | 
				
			||||||
 | 
					    this.stat(HMEVENT.beforeAnalyze, {
 | 
				
			||||||
 | 
					      fmt: safeFormat,
 | 
				
			||||||
 | 
					      file: resumeObject.file
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    info = _.mapObject(nlzrs, function(val, key) {
 | 
				
			||||||
 | 
					      return val.run(rez);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    this.stat(HMEVENT.afterAnalyze, {
 | 
				
			||||||
 | 
					      info: info
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    return info;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  _loadInspectors = function() {
 | 
				
			||||||
 | 
					    return {
 | 
				
			||||||
 | 
					      totals: require('../inspectors/totals-inspector'),
 | 
				
			||||||
 | 
					      coverage: require('../inspectors/gap-inspector'),
 | 
				
			||||||
 | 
					      keywords: require('../inspectors/keyword-inspector')
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=analyze.js.map
 | 
				
			||||||
							
								
								
									
										134
									
								
								dist/hmc/dist/verbs/build.js → dist/verbs/build.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										134
									
								
								dist/hmc/dist/verbs/build.js → dist/verbs/build.js
									
									
									
									
										vendored
									
									
								
							@@ -6,7 +6,9 @@ Implementation of the 'build' verb for HackMyResume.
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(function() {
 | 
					(function() {
 | 
				
			||||||
  var BuildVerb, FRESHTheme, FS, HMEVENT, HMSTATUS, JRSTheme, MD, MKDIRP, PATH, RConverter, RTYPES, ResumeFactory, Verb, _, _err, _fmts, _log, _opts, _rezObj, addFreebieFormats, build, expand, extend, loadTheme, parsePath, prep, single, verifyOutputs, verifyTheme;
 | 
					  var BuildVerb, FRESHTheme, FS, HMEVENT, HMSTATUS, JRSTheme, MD, MKDIRP, PATH, RConverter, RTYPES, ResumeFactory, Verb, _, _addFreebieFormats, _build, _err, _expand, _fmts, _loadTheme, _log, _opts, _prep, _rezObj, _single, _verifyOutputs, _verifyTheme, addFreebieFormats, build, expand, extend, loadTheme, parsePath, prep, single, verifyOutputs, verifyTheme,
 | 
				
			||||||
 | 
					    extend1 = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
 | 
				
			||||||
 | 
					    hasProp = {}.hasOwnProperty;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _ = require('underscore');
 | 
					  _ = require('underscore');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -70,24 +72,19 @@ Implementation of the 'build' verb for HackMyResume.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  /** An invokable resume generation command. */
 | 
					  /** An invokable resume generation command. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  BuildVerb = module.exports = Verb.extend({
 | 
					  module.exports = BuildVerb = (function(superClass) {
 | 
				
			||||||
 | 
					    extend1(BuildVerb, superClass);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /** Create a new build verb. */
 | 
					    /** Create a new build verb. */
 | 
				
			||||||
    init: function() {
 | 
					 | 
				
			||||||
      return this._super('build');
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /** Invoke the Build command. */
 | 
					    function BuildVerb() {
 | 
				
			||||||
    invoke: function() {
 | 
					      BuildVerb.__super__.constructor.call(this, 'build', _build);
 | 
				
			||||||
      var ret;
 | 
					 | 
				
			||||||
      this.stat(HMEVENT.begin, {
 | 
					 | 
				
			||||||
        cmd: 'build'
 | 
					 | 
				
			||||||
      });
 | 
					 | 
				
			||||||
      ret = build.apply(this, arguments);
 | 
					 | 
				
			||||||
      this.stat(HMEVENT.end);
 | 
					 | 
				
			||||||
      return ret;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  });
 | 
					
 | 
				
			||||||
 | 
					    return BuildVerb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  })(Verb);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /**
 | 
					  /**
 | 
				
			||||||
@@ -95,18 +92,18 @@ Implementation of the 'build' verb for HackMyResume.
 | 
				
			|||||||
  theme file, generate 0..N resumes in the desired formats.
 | 
					  theme file, generate 0..N resumes in the desired formats.
 | 
				
			||||||
  @param src Path to the source JSON resume file: "rez/resume.json".
 | 
					  @param src Path to the source JSON resume file: "rez/resume.json".
 | 
				
			||||||
  @param dst An array of paths to the target resume file(s).
 | 
					  @param dst An array of paths to the target resume file(s).
 | 
				
			||||||
  @param theme Friendly name of the resume theme. Defaults to "modern".
 | 
					  @param opts Generation options.
 | 
				
			||||||
  @param logger Optional logging override.
 | 
					 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  build = function(src, dst, opts) {
 | 
					  _build = function(src, dst, opts) {
 | 
				
			||||||
    var ex, inv, isFRESH, mixed, newEx, orgFormat, rez, sheetObjects, sheets, tFolder, targets, theme, toFormat;
 | 
					    var inv, isFRESH, mixed, newEx, orgFormat, problemSheets, results, rez, sheetObjects, sheets, tFolder, targets, theme, toFormat;
 | 
				
			||||||
    if (!src || !src.length) {
 | 
					    if (!src || !src.length) {
 | 
				
			||||||
      this.err(HMSTATUS.resumeNotFound, {
 | 
					      this.err(HMSTATUS.resumeNotFound, {
 | 
				
			||||||
        quit: true
 | 
					        quit: true
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
 | 
					      return null;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    prep(src, dst, opts);
 | 
					    _prep.call(this, src, dst, opts);
 | 
				
			||||||
    sheetObjects = ResumeFactory.load(src, {
 | 
					    sheetObjects = ResumeFactory.load(src, {
 | 
				
			||||||
      format: null,
 | 
					      format: null,
 | 
				
			||||||
      objectify: false,
 | 
					      objectify: false,
 | 
				
			||||||
@@ -115,9 +112,12 @@ Implementation of the 'build' verb for HackMyResume.
 | 
				
			|||||||
        sort: _opts.sort
 | 
					        sort: _opts.sort
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }, this);
 | 
					    }, this);
 | 
				
			||||||
    if (!sheetObjects || _.some(sheetObjects, function(so) {
 | 
					    problemSheets = _.filter(sheetObjects, function(so) {
 | 
				
			||||||
      return so.fluenterror;
 | 
					      return so.fluenterror;
 | 
				
			||||||
    })) {
 | 
					    });
 | 
				
			||||||
 | 
					    if (problemSheets && problemSheets.length) {
 | 
				
			||||||
 | 
					      problemSheets[0].quit = true;
 | 
				
			||||||
 | 
					      this.err(problemSheets[0].fluenterror, problemSheets[0]);
 | 
				
			||||||
      return null;
 | 
					      return null;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    sheets = sheetObjects.map(function(r) {
 | 
					    sheets = sheetObjects.map(function(r) {
 | 
				
			||||||
@@ -128,14 +128,20 @@ Implementation of the 'build' verb for HackMyResume.
 | 
				
			|||||||
      theme: _opts.theme
 | 
					      theme: _opts.theme
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
      tFolder = verifyTheme.call(this, _opts.theme);
 | 
					      tFolder = _verifyTheme.call(this, _opts.theme);
 | 
				
			||||||
      theme = _opts.themeObj = loadTheme(tFolder);
 | 
					      if (tFolder.fluenterror) {
 | 
				
			||||||
 | 
					        tFolder.quit = true;
 | 
				
			||||||
 | 
					        this.err(tFolder.fluenterror, tFolder);
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      theme = _opts.themeObj = _loadTheme(tFolder);
 | 
				
			||||||
 | 
					      _addFreebieFormats(theme);
 | 
				
			||||||
    } catch (_error) {
 | 
					    } catch (_error) {
 | 
				
			||||||
      ex = _error;
 | 
					 | 
				
			||||||
      newEx = {
 | 
					      newEx = {
 | 
				
			||||||
        fluenterror: HMSTATUS.themeLoad,
 | 
					        fluenterror: HMSTATUS.themeLoad,
 | 
				
			||||||
        inner: ex,
 | 
					        inner: _error,
 | 
				
			||||||
        attempted: _opts.theme
 | 
					        attempted: _opts.theme,
 | 
				
			||||||
 | 
					        quit: true
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
      this.err(HMSTATUS.themeLoad, newEx);
 | 
					      this.err(HMSTATUS.themeLoad, newEx);
 | 
				
			||||||
      return null;
 | 
					      return null;
 | 
				
			||||||
@@ -143,12 +149,14 @@ Implementation of the 'build' verb for HackMyResume.
 | 
				
			|||||||
    this.stat(HMEVENT.afterTheme, {
 | 
					    this.stat(HMEVENT.afterTheme, {
 | 
				
			||||||
      theme: theme
 | 
					      theme: theme
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    inv = verifyOutputs.call(this, dst, theme);
 | 
					    inv = _verifyOutputs.call(this, dst, theme);
 | 
				
			||||||
    if (inv && inv.length) {
 | 
					    if (inv && inv.length) {
 | 
				
			||||||
      this.err(HMSTATUS.invalidFormat, {
 | 
					      this.err(HMSTATUS.invalidFormat, {
 | 
				
			||||||
        data: inv,
 | 
					        data: inv,
 | 
				
			||||||
        theme: theme
 | 
					        theme: theme,
 | 
				
			||||||
 | 
					        quit: true
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
 | 
					      return null;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    rez = null;
 | 
					    rez = null;
 | 
				
			||||||
    if (sheets.length > 1) {
 | 
					    if (sheets.length > 1) {
 | 
				
			||||||
@@ -186,21 +194,34 @@ Implementation of the 'build' verb for HackMyResume.
 | 
				
			|||||||
        fmt: toFormat
 | 
					        fmt: toFormat
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    addFreebieFormats(theme);
 | 
					 | 
				
			||||||
    this.stat(HMEVENT.applyTheme, {
 | 
					    this.stat(HMEVENT.applyTheme, {
 | 
				
			||||||
      r: rez,
 | 
					      r: rez,
 | 
				
			||||||
      theme: theme
 | 
					      theme: theme
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    _rezObj = new RTYPES[toFormat]().parseJSON(rez);
 | 
					    _rezObj = new RTYPES[toFormat]().parseJSON(rez);
 | 
				
			||||||
    targets = expand(dst, theme);
 | 
					    targets = _expand(dst, theme);
 | 
				
			||||||
    _.each(targets, function(t) {
 | 
					    _.each(targets, function(t) {
 | 
				
			||||||
      return t.final = single.call(this, t, theme, targets);
 | 
					      var ref;
 | 
				
			||||||
 | 
					      if (this.hasError() && opts.assert) {
 | 
				
			||||||
 | 
					        return {};
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      t.final = _single.call(this, t, theme, targets);
 | 
				
			||||||
 | 
					      if ((ref = t.final) != null ? ref.fluenterror : void 0) {
 | 
				
			||||||
 | 
					        t.final.quit = opts.assert;
 | 
				
			||||||
 | 
					        this.err(t.final.fluenterror, t.final);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
    }, this);
 | 
					    }, this);
 | 
				
			||||||
    return {
 | 
					    results = {
 | 
				
			||||||
      sheet: _rezObj,
 | 
					      sheet: _rezObj,
 | 
				
			||||||
      targets: targets,
 | 
					      targets: targets,
 | 
				
			||||||
      processed: targets
 | 
					      processed: targets
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					    if (this.hasError() && !opts.assert) {
 | 
				
			||||||
 | 
					      this.reject(results);
 | 
				
			||||||
 | 
					    } else if (!this.hasError()) {
 | 
				
			||||||
 | 
					      this.resolve(results);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return results;
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -208,7 +229,8 @@ Implementation of the 'build' verb for HackMyResume.
 | 
				
			|||||||
  Prepare for a BUILD run.
 | 
					  Prepare for a BUILD run.
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  prep = function(src, dst, opts) {
 | 
					  _prep = function(src, dst, opts) {
 | 
				
			||||||
 | 
					    var that;
 | 
				
			||||||
    _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 = opts.prettify === true;
 | 
				
			||||||
    _opts.css = opts.css;
 | 
					    _opts.css = opts.css;
 | 
				
			||||||
@@ -220,6 +242,16 @@ Implementation of the 'build' verb for HackMyResume.
 | 
				
			|||||||
    _opts.noTips = opts.noTips;
 | 
					    _opts.noTips = opts.noTips;
 | 
				
			||||||
    _opts.debug = opts.debug;
 | 
					    _opts.debug = opts.debug;
 | 
				
			||||||
    _opts.sort = opts.sort;
 | 
					    _opts.sort = opts.sort;
 | 
				
			||||||
 | 
					    that = this;
 | 
				
			||||||
 | 
					    _opts.onTransform = function(info) {
 | 
				
			||||||
 | 
					      that.stat(HMEVENT.afterTransform, info);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    _opts.beforeWrite = function(info) {
 | 
				
			||||||
 | 
					      that.stat(HMEVENT.beforeWrite, info);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    _opts.afterWrite = function(info) {
 | 
				
			||||||
 | 
					      that.stat(HMEVENT.afterWrite, info);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
    (src.length > 1 && (!dst || !dst.length)) && dst.push(src.pop());
 | 
					    (src.length > 1 && (!dst || !dst.length)) && dst.push(src.pop());
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -231,14 +263,14 @@ Implementation of the 'build' verb for HackMyResume.
 | 
				
			|||||||
  @param theme A FRESHTheme or JRSTheme object.
 | 
					  @param theme A FRESHTheme or JRSTheme object.
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  single = function(targInfo, theme, finished) {
 | 
					  _single = function(targInfo, theme, finished) {
 | 
				
			||||||
    var e, ex, f, fName, fType, outFolder, ret, theFormat;
 | 
					    var e, ex, f, fName, fType, outFolder, ret, theFormat;
 | 
				
			||||||
    ret = null;
 | 
					    ret = null;
 | 
				
			||||||
    ex = null;
 | 
					    ex = null;
 | 
				
			||||||
    f = targInfo.file;
 | 
					    f = targInfo.file;
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
      if (!targInfo.fmt) {
 | 
					      if (!targInfo.fmt) {
 | 
				
			||||||
        return;
 | 
					        return {};
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      fType = targInfo.fmt.outFormat;
 | 
					      fType = targInfo.fmt.outFormat;
 | 
				
			||||||
      fName = PATH.basename(f, '.' + fType);
 | 
					      fName = PATH.basename(f, '.' + fType);
 | 
				
			||||||
@@ -247,12 +279,12 @@ Implementation of the 'build' verb for HackMyResume.
 | 
				
			|||||||
        fmt: targInfo.fmt.outFormat,
 | 
					        fmt: targInfo.fmt.outFormat,
 | 
				
			||||||
        file: PATH.relative(process.cwd(), f)
 | 
					        file: PATH.relative(process.cwd(), f)
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
 | 
					      _opts.targets = finished;
 | 
				
			||||||
      if (targInfo.fmt.files && targInfo.fmt.files.length) {
 | 
					      if (targInfo.fmt.files && targInfo.fmt.files.length) {
 | 
				
			||||||
        theFormat = _fmts.filter(function(fmt) {
 | 
					        theFormat = _fmts.filter(function(fmt) {
 | 
				
			||||||
          return fmt.name === targInfo.fmt.outFormat;
 | 
					          return fmt.name === targInfo.fmt.outFormat;
 | 
				
			||||||
        })[0];
 | 
					        })[0];
 | 
				
			||||||
        MKDIRP.sync(PATH.dirname(f));
 | 
					        MKDIRP.sync(PATH.dirname(f));
 | 
				
			||||||
        _opts.targets = finished;
 | 
					 | 
				
			||||||
        ret = theFormat.gen.generate(_rezObj, f, _opts);
 | 
					        ret = theFormat.gen.generate(_rezObj, f, _opts);
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
        theFormat = _fmts.filter(function(fmt) {
 | 
					        theFormat = _fmts.filter(function(fmt) {
 | 
				
			||||||
@@ -273,22 +305,21 @@ Implementation of the 'build' verb for HackMyResume.
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
    if (ex) {
 | 
					    if (ex) {
 | 
				
			||||||
      if (ex.fluenterror) {
 | 
					      if (ex.fluenterror) {
 | 
				
			||||||
        this.err(ex.fluenterror, ex);
 | 
					        ret = ex;
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
        this.err(HMSTATUS.generateError, {
 | 
					        ret = {
 | 
				
			||||||
 | 
					          fluenterror: HMSTATUS.generateError,
 | 
				
			||||||
          inner: ex
 | 
					          inner: ex
 | 
				
			||||||
        });
 | 
					        };
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return ret;
 | 
					    return ret;
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /**
 | 
					  /** Ensure that user-specified outputs/targets are valid. */
 | 
				
			||||||
  Ensure that user-specified outputs/targets are valid.
 | 
					 | 
				
			||||||
   */
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  verifyOutputs = function(targets, theme) {
 | 
					  _verifyOutputs = function(targets, theme) {
 | 
				
			||||||
    this.stat(HMEVENT.verifyOutputs, {
 | 
					    this.stat(HMEVENT.verifyOutputs, {
 | 
				
			||||||
      targets: targets,
 | 
					      targets: targets,
 | 
				
			||||||
      theme: theme
 | 
					      theme: theme
 | 
				
			||||||
@@ -315,7 +346,7 @@ Implementation of the 'build' verb for HackMyResume.
 | 
				
			|||||||
  @param theTheme A FRESHTheme or JRSTheme object.
 | 
					  @param theTheme A FRESHTheme or JRSTheme object.
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  addFreebieFormats = function(theTheme) {
 | 
					  _addFreebieFormats = function(theTheme) {
 | 
				
			||||||
    theTheme.formats.json = theTheme.formats.json || {
 | 
					    theTheme.formats.json = theTheme.formats.json || {
 | 
				
			||||||
      freebie: true,
 | 
					      freebie: true,
 | 
				
			||||||
      title: 'json',
 | 
					      title: 'json',
 | 
				
			||||||
@@ -354,7 +385,7 @@ Implementation of the 'build' verb for HackMyResume.
 | 
				
			|||||||
  @param theTheme A FRESHTheme or JRSTheme object.
 | 
					  @param theTheme A FRESHTheme or JRSTheme object.
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  expand = function(dst, theTheme) {
 | 
					  _expand = function(dst, theTheme) {
 | 
				
			||||||
    var destColl, targets;
 | 
					    var destColl, targets;
 | 
				
			||||||
    destColl = (dst && dst.length && dst) || [PATH.normalize('out/resume.all')];
 | 
					    destColl = (dst && dst.length && dst) || [PATH.normalize('out/resume.all')];
 | 
				
			||||||
    targets = [];
 | 
					    targets = [];
 | 
				
			||||||
@@ -385,16 +416,17 @@ Implementation of the 'build' verb for HackMyResume.
 | 
				
			|||||||
  Verify the specified theme name/path.
 | 
					  Verify the specified theme name/path.
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  verifyTheme = function(themeNameOrPath) {
 | 
					  _verifyTheme = function(themeNameOrPath) {
 | 
				
			||||||
    var exists, tFolder;
 | 
					    var exists, tFolder;
 | 
				
			||||||
    tFolder = PATH.join(parsePath(require.resolve('fresh-themes')).dirname, '/themes/', themeNameOrPath);
 | 
					    tFolder = PATH.join(parsePath(require.resolve('fresh-themes')).dirname, '/themes/', themeNameOrPath);
 | 
				
			||||||
    exists = require('path-exists').sync;
 | 
					    exists = require('path-exists').sync;
 | 
				
			||||||
    if (!exists(tFolder)) {
 | 
					    if (!exists(tFolder)) {
 | 
				
			||||||
      tFolder = PATH.resolve(themeNameOrPath);
 | 
					      tFolder = PATH.resolve(themeNameOrPath);
 | 
				
			||||||
      if (!exists(tFolder)) {
 | 
					      if (!exists(tFolder)) {
 | 
				
			||||||
        this.err(HMSTATUS.themeNotFound, {
 | 
					        return {
 | 
				
			||||||
 | 
					          fluenterror: HMSTATUS.themeNotFound,
 | 
				
			||||||
          data: _opts.theme
 | 
					          data: _opts.theme
 | 
				
			||||||
        });
 | 
					        };
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return tFolder;
 | 
					    return tFolder;
 | 
				
			||||||
@@ -406,7 +438,7 @@ Implementation of the 'build' verb for HackMyResume.
 | 
				
			|||||||
  theme.
 | 
					  theme.
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  loadTheme = function(tFolder) {
 | 
					  _loadTheme = function(tFolder) {
 | 
				
			||||||
    var theTheme;
 | 
					    var theTheme;
 | 
				
			||||||
    theTheme = _opts.theme.indexOf('jsonresume-theme-') > -1 ? new JRSTheme().open(tFolder) : new FRESHTheme().open(tFolder);
 | 
					    theTheme = _opts.theme.indexOf('jsonresume-theme-') > -1 ? new JRSTheme().open(tFolder) : new FRESHTheme().open(tFolder);
 | 
				
			||||||
    _opts.themeObj = theTheme;
 | 
					    _opts.themeObj = theTheme;
 | 
				
			||||||
@@ -414,3 +446,5 @@ Implementation of the 'build' verb for HackMyResume.
 | 
				
			|||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}).call(this);
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=build.js.map
 | 
				
			||||||
							
								
								
									
										115
									
								
								dist/verbs/convert.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								dist/verbs/convert.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,115 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					Implementation of the 'convert' verb for HackMyResume.
 | 
				
			||||||
 | 
					@module verbs/convert
 | 
				
			||||||
 | 
					@license MIT. See LICENSE.md for details.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(function() {
 | 
				
			||||||
 | 
					  var ConvertVerb, HMEVENT, HMSTATUS, ResumeFactory, Verb, _, _convert, _convertOne, chalk,
 | 
				
			||||||
 | 
					    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
 | 
				
			||||||
 | 
					    hasProp = {}.hasOwnProperty;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ResumeFactory = require('../core/resume-factory');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  chalk = require('chalk');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Verb = require('../verbs/verb');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  HMSTATUS = require('../core/status-codes');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  _ = require('underscore');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  HMEVENT = require('../core/event-codes');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  module.exports = ConvertVerb = (function(superClass) {
 | 
				
			||||||
 | 
					    extend(ConvertVerb, superClass);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function ConvertVerb() {
 | 
				
			||||||
 | 
					      ConvertVerb.__super__.constructor.call(this, 'convert', _convert);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ConvertVerb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  })(Verb);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /** Private workhorse method. Convert 0..N resumes between FRESH and JRS
 | 
				
			||||||
 | 
					  formats.
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  _convert = function(srcs, dst, opts) {
 | 
				
			||||||
 | 
					    var results;
 | 
				
			||||||
 | 
					    if (!srcs || !srcs.length) {
 | 
				
			||||||
 | 
					      this.err(HMSTATUS.resumeNotFound, {
 | 
				
			||||||
 | 
					        quit: true
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					      return null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (!dst || !dst.length) {
 | 
				
			||||||
 | 
					      if (srcs.length === 1) {
 | 
				
			||||||
 | 
					        this.err(HMSTATUS.inputOutputParity, {
 | 
				
			||||||
 | 
					          quit: true
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					      } else if (srcs.length === 2) {
 | 
				
			||||||
 | 
					        dst = dst || [];
 | 
				
			||||||
 | 
					        dst.push(srcs.pop());
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        this.err(HMSTATUS.inputOutputParity, {
 | 
				
			||||||
 | 
					          quit: true
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (srcs && dst && srcs.length && dst.length && srcs.length !== dst.length) {
 | 
				
			||||||
 | 
					      this.err(HMSTATUS.inputOutputParity, {
 | 
				
			||||||
 | 
					        quit: true
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    results = _.map(srcs, function(src, idx) {
 | 
				
			||||||
 | 
					      var r;
 | 
				
			||||||
 | 
					      if (opts.assert && this.hasError()) {
 | 
				
			||||||
 | 
					        return {};
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      r = _convertOne.call(this, src, dst, idx);
 | 
				
			||||||
 | 
					      if (r.fluenterror) {
 | 
				
			||||||
 | 
					        r.quit = opts.assert;
 | 
				
			||||||
 | 
					        this.err(r.fluenterror, r);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return r;
 | 
				
			||||||
 | 
					    }, this);
 | 
				
			||||||
 | 
					    if (this.hasError() && !opts.assert) {
 | 
				
			||||||
 | 
					      this.reject(results);
 | 
				
			||||||
 | 
					    } else if (!this.hasError()) {
 | 
				
			||||||
 | 
					      this.resolve(results);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return results;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /** Private workhorse method. Convert a single resume. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  _convertOne = function(src, dst, idx) {
 | 
				
			||||||
 | 
					    var rinfo, s, srcFmt, targetFormat;
 | 
				
			||||||
 | 
					    rinfo = ResumeFactory.loadOne(src, {
 | 
				
			||||||
 | 
					      format: null,
 | 
				
			||||||
 | 
					      objectify: true
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    if (rinfo.fluenterror) {
 | 
				
			||||||
 | 
					      return rinfo;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    s = rinfo.rez;
 | 
				
			||||||
 | 
					    srcFmt = ((s.basics && s.basics.imp) || s.imp).orgFormat === 'JRS' ? 'JRS' : 'FRESH';
 | 
				
			||||||
 | 
					    targetFormat = srcFmt === 'JRS' ? 'FRESH' : 'JRS';
 | 
				
			||||||
 | 
					    this.stat(HMEVENT.beforeConvert, {
 | 
				
			||||||
 | 
					      srcFile: rinfo.file,
 | 
				
			||||||
 | 
					      srcFmt: srcFmt,
 | 
				
			||||||
 | 
					      dstFile: dst[idx],
 | 
				
			||||||
 | 
					      dstFmt: targetFormat
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    s.saveAs(dst[idx], targetFormat);
 | 
				
			||||||
 | 
					    return s;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=convert.js.map
 | 
				
			||||||
							
								
								
									
										103
									
								
								dist/verbs/create.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								dist/verbs/create.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,103 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					Implementation of the 'create' verb for HackMyResume.
 | 
				
			||||||
 | 
					@module verbs/create
 | 
				
			||||||
 | 
					@license MIT. See LICENSE.md for details.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(function() {
 | 
				
			||||||
 | 
					  var CreateVerb, HMEVENT, HMSTATUS, MKDIRP, PATH, Verb, _, _create, _createOne, chalk,
 | 
				
			||||||
 | 
					    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
 | 
				
			||||||
 | 
					    hasProp = {}.hasOwnProperty;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  MKDIRP = require('mkdirp');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  PATH = require('path');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  chalk = require('chalk');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Verb = require('../verbs/verb');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  _ = require('underscore');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  HMSTATUS = require('../core/status-codes');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  HMEVENT = require('../core/event-codes');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  module.exports = CreateVerb = (function(superClass) {
 | 
				
			||||||
 | 
					    extend(CreateVerb, superClass);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function CreateVerb() {
 | 
				
			||||||
 | 
					      CreateVerb.__super__.constructor.call(this, 'new', _create);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return CreateVerb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  })(Verb);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /** Create a new empty resume in either FRESH or JRS format. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  _create = function(src, dst, opts) {
 | 
				
			||||||
 | 
					    var results;
 | 
				
			||||||
 | 
					    if (!src || !src.length) {
 | 
				
			||||||
 | 
					      this.err(HMSTATUS.createNameMissing, {
 | 
				
			||||||
 | 
					        quit: true
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					      return null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    results = _.map(src, function(t) {
 | 
				
			||||||
 | 
					      var r;
 | 
				
			||||||
 | 
					      if (opts.assert && this.hasError()) {
 | 
				
			||||||
 | 
					        return {};
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      r = _createOne.call(this, t, opts);
 | 
				
			||||||
 | 
					      if (r.fluenterror) {
 | 
				
			||||||
 | 
					        r.quit = opts.assert;
 | 
				
			||||||
 | 
					        this.err(r.fluenterror, r);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return r;
 | 
				
			||||||
 | 
					    }, this);
 | 
				
			||||||
 | 
					    if (this.hasError() && !opts.assert) {
 | 
				
			||||||
 | 
					      this.reject(this.errorCode);
 | 
				
			||||||
 | 
					    } else if (!this.hasError()) {
 | 
				
			||||||
 | 
					      this.resolve(results);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return results;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /** Create a single new resume */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  _createOne = function(t, opts) {
 | 
				
			||||||
 | 
					    var RezClass, newRez, ret, safeFmt;
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					      ret = null;
 | 
				
			||||||
 | 
					      safeFmt = opts.format.toUpperCase();
 | 
				
			||||||
 | 
					      this.stat(HMEVENT.beforeCreate, {
 | 
				
			||||||
 | 
					        fmt: safeFmt,
 | 
				
			||||||
 | 
					        file: t
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					      MKDIRP.sync(PATH.dirname(t));
 | 
				
			||||||
 | 
					      RezClass = require('../core/' + safeFmt.toLowerCase() + '-resume');
 | 
				
			||||||
 | 
					      newRez = RezClass["default"]();
 | 
				
			||||||
 | 
					      newRez.save(t);
 | 
				
			||||||
 | 
					      ret = newRez;
 | 
				
			||||||
 | 
					    } catch (_error) {
 | 
				
			||||||
 | 
					      ret = {
 | 
				
			||||||
 | 
					        fluenterror: HMSTATUS.createError,
 | 
				
			||||||
 | 
					        inner: _error
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					    } finally {
 | 
				
			||||||
 | 
					      this.stat(HMEVENT.afterCreate, {
 | 
				
			||||||
 | 
					        fmt: safeFmt,
 | 
				
			||||||
 | 
					        file: t,
 | 
				
			||||||
 | 
					        isError: ret.fluenterror
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					      return ret;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=create.js.map
 | 
				
			||||||
							
								
								
									
										106
									
								
								dist/verbs/peek.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								dist/verbs/peek.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,106 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					Implementation of the 'peek' verb for HackMyResume.
 | 
				
			||||||
 | 
					@module verbs/peek
 | 
				
			||||||
 | 
					@license MIT. See LICENSE.md for details.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(function() {
 | 
				
			||||||
 | 
					  var HMEVENT, HMSTATUS, PeekVerb, Verb, _, __, _peek, _peekOne, safeLoadJSON,
 | 
				
			||||||
 | 
					    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
 | 
				
			||||||
 | 
					    hasProp = {}.hasOwnProperty;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Verb = require('../verbs/verb');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  _ = require('underscore');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  __ = require('lodash');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  safeLoadJSON = require('../utils/safe-json-loader');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  HMSTATUS = require('../core/status-codes');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  HMEVENT = require('../core/event-codes');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  module.exports = PeekVerb = (function(superClass) {
 | 
				
			||||||
 | 
					    extend(PeekVerb, superClass);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function PeekVerb() {
 | 
				
			||||||
 | 
					      PeekVerb.__super__.constructor.call(this, 'peek', _peek);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return PeekVerb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  })(Verb);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /** Peek at a resume, resume section, or resume field. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  _peek = function(src, dst, opts) {
 | 
				
			||||||
 | 
					    var objPath, results;
 | 
				
			||||||
 | 
					    if (!src || !src.length) {
 | 
				
			||||||
 | 
					      this.err(HMSTATUS.resumeNotFound, {
 | 
				
			||||||
 | 
					        quit: true
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					      return null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    objPath = (dst && dst[0]) || '';
 | 
				
			||||||
 | 
					    results = _.map(src, function(t) {
 | 
				
			||||||
 | 
					      var tgt;
 | 
				
			||||||
 | 
					      if (opts.assert && this.hasError()) {
 | 
				
			||||||
 | 
					        return {};
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      tgt = _peekOne.call(this, t, objPath);
 | 
				
			||||||
 | 
					      if (tgt.error) {
 | 
				
			||||||
 | 
					        this.setError(tgt.error.fluenterror, tgt.error);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return tgt;
 | 
				
			||||||
 | 
					    }, this);
 | 
				
			||||||
 | 
					    if (this.hasError() && !opts.assert) {
 | 
				
			||||||
 | 
					      this.reject(this.errorCode);
 | 
				
			||||||
 | 
					    } else if (!this.hasError()) {
 | 
				
			||||||
 | 
					      this.resolve(results);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return results;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /** Peek at a single resume, resume section, or resume field. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  _peekOne = function(t, objPath) {
 | 
				
			||||||
 | 
					    var errCode, obj, pkgError, tgt;
 | 
				
			||||||
 | 
					    this.stat(HMEVENT.beforePeek, {
 | 
				
			||||||
 | 
					      file: t,
 | 
				
			||||||
 | 
					      target: objPath
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    obj = safeLoadJSON(t);
 | 
				
			||||||
 | 
					    tgt = null;
 | 
				
			||||||
 | 
					    if (!obj.ex) {
 | 
				
			||||||
 | 
					      tgt = objPath ? __.get(obj.json, objPath) : obj.json;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    pkgError = null;
 | 
				
			||||||
 | 
					    if (obj.ex) {
 | 
				
			||||||
 | 
					      errCode = obj.ex.operation === 'parse' ? HMSTATUS.parseError : HMSTATUS.readError;
 | 
				
			||||||
 | 
					      if (errCode === HMSTATUS.readError) {
 | 
				
			||||||
 | 
					        obj.ex.quiet = true;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      pkgError = {
 | 
				
			||||||
 | 
					        fluenterror: errCode,
 | 
				
			||||||
 | 
					        inner: obj.ex
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    this.stat(HMEVENT.afterPeek, {
 | 
				
			||||||
 | 
					      file: t,
 | 
				
			||||||
 | 
					      requested: objPath,
 | 
				
			||||||
 | 
					      target: obj.ex ? void 0 : tgt,
 | 
				
			||||||
 | 
					      error: pkgError
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    return {
 | 
				
			||||||
 | 
					      val: obj.ex ? void 0 : tgt,
 | 
				
			||||||
 | 
					      error: pkgError
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=peek.js.map
 | 
				
			||||||
							
								
								
									
										139
									
								
								dist/verbs/validate.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										139
									
								
								dist/verbs/validate.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,139 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					Implementation of the 'validate' verb for HackMyResume.
 | 
				
			||||||
 | 
					@module verbs/validate
 | 
				
			||||||
 | 
					@license MIT. See LICENSE.md for details.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(function() {
 | 
				
			||||||
 | 
					  var FS, HMEVENT, HMSTATUS, ResumeFactory, SyntaxErrorEx, ValidateVerb, Verb, _, _validate, _validateOne, chalk, safeLoadJSON,
 | 
				
			||||||
 | 
					    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
 | 
				
			||||||
 | 
					    hasProp = {}.hasOwnProperty;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  FS = require('fs');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ResumeFactory = require('../core/resume-factory');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  SyntaxErrorEx = require('../utils/syntax-error-ex');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  chalk = require('chalk');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Verb = require('../verbs/verb');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  HMSTATUS = require('../core/status-codes');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  HMEVENT = require('../core/event-codes');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  _ = require('underscore');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  safeLoadJSON = require('../utils/safe-json-loader');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /** An invokable resume validation command. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  module.exports = ValidateVerb = (function(superClass) {
 | 
				
			||||||
 | 
					    extend(ValidateVerb, superClass);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function ValidateVerb() {
 | 
				
			||||||
 | 
					      ValidateVerb.__super__.constructor.call(this, 'validate', _validate);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ValidateVerb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  })(Verb);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  _validate = function(sources, unused, opts) {
 | 
				
			||||||
 | 
					    var results, schemas, validator;
 | 
				
			||||||
 | 
					    if (!sources || !sources.length) {
 | 
				
			||||||
 | 
					      this.err(HMSTATUS.resumeNotFoundAlt, {
 | 
				
			||||||
 | 
					        quit: true
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					      return null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    validator = require('is-my-json-valid');
 | 
				
			||||||
 | 
					    schemas = {
 | 
				
			||||||
 | 
					      fresh: require('fresca'),
 | 
				
			||||||
 | 
					      jars: require('../core/resume.json')
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    results = _.map(sources, function(t) {
 | 
				
			||||||
 | 
					      var r;
 | 
				
			||||||
 | 
					      r = _validateOne.call(this, t, validator, schemas, opts);
 | 
				
			||||||
 | 
					      if (r.error) {
 | 
				
			||||||
 | 
					        this.err(r.error.fluenterror, r.error);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return r;
 | 
				
			||||||
 | 
					    }, this);
 | 
				
			||||||
 | 
					    if (this.hasError() && !opts.assert) {
 | 
				
			||||||
 | 
					      this.reject(this.errorCode);
 | 
				
			||||||
 | 
					    } else if (!this.hasError()) {
 | 
				
			||||||
 | 
					      this.resolve(results);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return results;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					  Validate a single resume.
 | 
				
			||||||
 | 
					  @returns {
 | 
				
			||||||
 | 
					    file: <fileName>,
 | 
				
			||||||
 | 
					    isValid: <validFlag>,
 | 
				
			||||||
 | 
					    status: <validationStatus>,
 | 
				
			||||||
 | 
					    violations: <validationErrors>,
 | 
				
			||||||
 | 
					    schema: <schemaType>,
 | 
				
			||||||
 | 
					    error: <errorObject>
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  _validateOne = function(t, validator, schemas, opts) {
 | 
				
			||||||
 | 
					    var errCode, obj, ret, validate;
 | 
				
			||||||
 | 
					    ret = {
 | 
				
			||||||
 | 
					      file: t,
 | 
				
			||||||
 | 
					      isValid: false,
 | 
				
			||||||
 | 
					      status: 'unknown',
 | 
				
			||||||
 | 
					      schema: '-----'
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					      obj = safeLoadJSON(t);
 | 
				
			||||||
 | 
					      if (!obj.ex) {
 | 
				
			||||||
 | 
					        if (obj.json.basics) {
 | 
				
			||||||
 | 
					          ret.schema = 'jars';
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          ret.schema = 'fresh';
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        validate = validator(schemas[ret.schema], {
 | 
				
			||||||
 | 
					          formats: {
 | 
				
			||||||
 | 
					            date: /^\d{4}(?:-(?:0[0-9]{1}|1[0-2]{1})(?:-[0-9]{2})?)?$/
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        ret.isValid = validate(obj.json);
 | 
				
			||||||
 | 
					        ret.status = ret.isValid ? 'valid' : 'invalid';
 | 
				
			||||||
 | 
					        if (!ret.isValid) {
 | 
				
			||||||
 | 
					          ret.violations = validate.errors;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        if (obj.ex.operation === 'parse') {
 | 
				
			||||||
 | 
					          errCode = HMSTATUS.parseError;
 | 
				
			||||||
 | 
					          ret.status = 'broken';
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          errCode = HMSTATUS.readError;
 | 
				
			||||||
 | 
					          ret.status = 'missing';
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        ret.error = {
 | 
				
			||||||
 | 
					          fluenterror: errCode,
 | 
				
			||||||
 | 
					          inner: obj.ex.inner,
 | 
				
			||||||
 | 
					          quiet: errCode === HMSTATUS.readError
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    } catch (_error) {
 | 
				
			||||||
 | 
					      ret.error = {
 | 
				
			||||||
 | 
					        fluenterror: HMSTATUS.validateError,
 | 
				
			||||||
 | 
					        inner: _error
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    this.stat(HMEVENT.afterValidate, ret);
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=validate.js.map
 | 
				
			||||||
							
								
								
									
										118
									
								
								dist/verbs/verb.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										118
									
								
								dist/verbs/verb.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,118 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					Definition of the Verb class.
 | 
				
			||||||
 | 
					@module verbs/verb
 | 
				
			||||||
 | 
					@license MIT. See LICENSE.md for details.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(function() {
 | 
				
			||||||
 | 
					  var EVENTS, HMEVENT, Promise, Verb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  EVENTS = require('events');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  HMEVENT = require('../core/event-codes');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Promise = require('pinkie-promise');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					  An abstract invokable verb.
 | 
				
			||||||
 | 
					  Provides base class functionality for verbs. Provide common services such as
 | 
				
			||||||
 | 
					  error handling, event management, and promise support.
 | 
				
			||||||
 | 
					  @class Verb
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  module.exports = Verb = (function() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** Constructor. Automatically called at creation. */
 | 
				
			||||||
 | 
					    function Verb(moniker, workhorse) {
 | 
				
			||||||
 | 
					      this.moniker = moniker;
 | 
				
			||||||
 | 
					      this.workhorse = workhorse;
 | 
				
			||||||
 | 
					      this.emitter = new EVENTS.EventEmitter();
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** Invoke the command. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Verb.prototype.invoke = function() {
 | 
				
			||||||
 | 
					      var argsArray, that;
 | 
				
			||||||
 | 
					      this.stat(HMEVENT.begin, {
 | 
				
			||||||
 | 
					        cmd: this.moniker
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					      argsArray = Array.prototype.slice.call(arguments);
 | 
				
			||||||
 | 
					      that = this;
 | 
				
			||||||
 | 
					      return this.promise = new Promise(function(res, rej) {
 | 
				
			||||||
 | 
					        that.resolve = res;
 | 
				
			||||||
 | 
					        that.reject = rej;
 | 
				
			||||||
 | 
					        that.workhorse.apply(that, argsArray);
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** Forward subscriptions to the event emitter. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Verb.prototype.on = function() {
 | 
				
			||||||
 | 
					      return this.emitter.on.apply(this.emitter, arguments);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** Fire an arbitrary event, scoped to "hmr:". */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Verb.prototype.fire = function(evtName, payload) {
 | 
				
			||||||
 | 
					      payload = payload || {};
 | 
				
			||||||
 | 
					      payload.cmd = this.moniker;
 | 
				
			||||||
 | 
					      this.emitter.emit('hmr:' + evtName, payload);
 | 
				
			||||||
 | 
					      return true;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** Handle an error condition. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Verb.prototype.err = function(errorCode, payload, hot) {
 | 
				
			||||||
 | 
					      payload = payload || {};
 | 
				
			||||||
 | 
					      payload.sub = payload.fluenterror = errorCode;
 | 
				
			||||||
 | 
					      payload["throw"] = hot;
 | 
				
			||||||
 | 
					      this.setError(errorCode, payload);
 | 
				
			||||||
 | 
					      if (payload.quit) {
 | 
				
			||||||
 | 
					        this.reject(errorCode);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      this.fire('error', payload);
 | 
				
			||||||
 | 
					      if (hot) {
 | 
				
			||||||
 | 
					        throw payload;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return true;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** Fire the 'hmr:status' error event. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Verb.prototype.stat = function(subEvent, payload) {
 | 
				
			||||||
 | 
					      payload = payload || {};
 | 
				
			||||||
 | 
					      payload.sub = subEvent;
 | 
				
			||||||
 | 
					      this.fire('status', payload);
 | 
				
			||||||
 | 
					      return true;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** Has an error occurred during this verb invocation? */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Verb.prototype.hasError = function() {
 | 
				
			||||||
 | 
					      return this.errorCode || this.errorObj;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** Associate error info with the invocation. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Verb.prototype.setError = function(code, obj) {
 | 
				
			||||||
 | 
					      this.errorCode = code;
 | 
				
			||||||
 | 
					      this.errorObj = obj;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return Verb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  })();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//# sourceMappingURL=verb.js.map
 | 
				
			||||||
							
								
								
									
										19
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								package.json
									
									
									
									
									
								
							@@ -1,6 +1,6 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  "name": "hackmyresume",
 | 
					  "name": "hackmyresume",
 | 
				
			||||||
  "version": "1.7.2",
 | 
					  "version": "1.8.0",
 | 
				
			||||||
  "description": "Generate polished résumés and CVs in HTML, Markdown, LaTeX, MS Word, PDF, plain text, JSON, XML, YAML, smoke signal, and carrier pigeon.",
 | 
					  "description": "Generate polished résumés and CVs in HTML, Markdown, LaTeX, MS Word, PDF, plain text, JSON, XML, YAML, smoke signal, and carrier pigeon.",
 | 
				
			||||||
  "repository": {
 | 
					  "repository": {
 | 
				
			||||||
    "type": "git",
 | 
					    "type": "git",
 | 
				
			||||||
@@ -40,32 +40,36 @@
 | 
				
			|||||||
  "license": "MIT",
 | 
					  "license": "MIT",
 | 
				
			||||||
  "preferGlobal": "true",
 | 
					  "preferGlobal": "true",
 | 
				
			||||||
  "bugs": {
 | 
					  "bugs": {
 | 
				
			||||||
    "url": "https://github.com/hacksalot/HackMyResume/issues"
 | 
					    "url": "https://github.com/JuanCanham/HackMyResume/issues"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "bin": {
 | 
					  "bin": {
 | 
				
			||||||
    "hackmyresume": "dist/index.js"
 | 
					    "hackmyresume": "dist/cli/index.js"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "homepage": "https://github.com/hacksalot/HackMyResume",
 | 
					  "main": "dist/index.js",
 | 
				
			||||||
 | 
					  "homepage": "https://github.com/JuanCanham/HackMyResume",
 | 
				
			||||||
  "dependencies": {
 | 
					  "dependencies": {
 | 
				
			||||||
    "chalk": "^1.1.1",
 | 
					    "chalk": "^1.1.1",
 | 
				
			||||||
    "commander": "^2.9.0",
 | 
					    "commander": "^2.9.0",
 | 
				
			||||||
    "copy": "^0.1.3",
 | 
					    "copy": "^0.1.3",
 | 
				
			||||||
 | 
					    "escape-latex": "^0.1.2",
 | 
				
			||||||
    "extend": "^3.0.0",
 | 
					    "extend": "^3.0.0",
 | 
				
			||||||
    "fresca": "~0.6.0",
 | 
					    "fresca": "~0.6.0",
 | 
				
			||||||
    "fresh-jrs-converter": "^0.2.0",
 | 
					    "fresh-jrs-converter": "^0.2.2",
 | 
				
			||||||
    "fresh-resume-starter": "^0.2.2",
 | 
					    "fresh-resume-starter": "^0.2.2",
 | 
				
			||||||
    "fresh-themes": "^0.14.0-beta",
 | 
					    "fresh-themes": "git+https://git.juancanham.com/JuanCanham/fresh-themes.git#feature/certifications",
 | 
				
			||||||
    "fs-extra": "^0.26.4",
 | 
					    "fs-extra": "^0.26.4",
 | 
				
			||||||
    "handlebars": "^4.0.5",
 | 
					    "handlebars": "^4.0.5",
 | 
				
			||||||
    "html": "0.0.10",
 | 
					    "html": "0.0.10",
 | 
				
			||||||
    "is-my-json-valid": "^2.12.4",
 | 
					    "is-my-json-valid": "^2.12.4",
 | 
				
			||||||
    "json-lint": "^0.1.0",
 | 
					    "json-lint": "^0.1.0",
 | 
				
			||||||
 | 
					    "jsonlint": "^1.6.2",
 | 
				
			||||||
    "lodash": "^3.10.1",
 | 
					    "lodash": "^3.10.1",
 | 
				
			||||||
    "marked": "^0.3.5",
 | 
					    "marked": "^0.3.5",
 | 
				
			||||||
    "mkdirp": "^0.5.1",
 | 
					    "mkdirp": "^0.5.1",
 | 
				
			||||||
    "moment": "^2.11.1",
 | 
					    "moment": "^2.11.1",
 | 
				
			||||||
    "parse-filepath": "^0.6.3",
 | 
					    "parse-filepath": "^0.6.3",
 | 
				
			||||||
    "path-exists": "^2.1.0",
 | 
					    "path-exists": "^2.1.0",
 | 
				
			||||||
 | 
					    "pinkie-promise": "^2.0.0",
 | 
				
			||||||
    "printf": "^0.2.3",
 | 
					    "printf": "^0.2.3",
 | 
				
			||||||
    "recursive-readdir-sync": "^1.0.6",
 | 
					    "recursive-readdir-sync": "^1.0.6",
 | 
				
			||||||
    "simple-html-tokenizer": "^0.2.1",
 | 
					    "simple-html-tokenizer": "^0.2.1",
 | 
				
			||||||
@@ -81,7 +85,8 @@
 | 
				
			|||||||
  },
 | 
					  },
 | 
				
			||||||
  "devDependencies": {
 | 
					  "devDependencies": {
 | 
				
			||||||
    "chai": "*",
 | 
					    "chai": "*",
 | 
				
			||||||
    "fresh-test-resumes": "^0.6.0",
 | 
					    "dir-compare": "0.0.2",
 | 
				
			||||||
 | 
					    "fresh-test-resumes": "^0.7.0",
 | 
				
			||||||
    "grunt": "*",
 | 
					    "grunt": "*",
 | 
				
			||||||
    "grunt-cli": "^0.1.13",
 | 
					    "grunt-cli": "^0.1.13",
 | 
				
			||||||
    "grunt-contrib-clean": "^0.7.0",
 | 
					    "grunt-contrib-clean": "^0.7.0",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,26 +6,24 @@ Error-handling routines for HackMyResume.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
HMSTATUS = require('../hmc/dist/core/status-codes')
 | 
					HMSTATUS = require '../core/status-codes'
 | 
				
			||||||
PKG = require('../../package.json')
 | 
					PKG = require '../../package.json'
 | 
				
			||||||
FS = require('fs')
 | 
					FS = require 'fs'
 | 
				
			||||||
FCMD = require('../hmc')
 | 
					FCMD = require '../index'
 | 
				
			||||||
PATH = require('path')
 | 
					PATH = require 'path'
 | 
				
			||||||
WRAP = require('word-wrap')
 | 
					WRAP = require 'word-wrap'
 | 
				
			||||||
M2C = require('../hmc/dist/utils/md2chalk.js')
 | 
					M2C = require '../utils/md2chalk'
 | 
				
			||||||
chalk = require('chalk')
 | 
					chalk = require 'chalk'
 | 
				
			||||||
extend = require('extend')
 | 
					extend = require 'extend'
 | 
				
			||||||
YAML = require('yamljs')
 | 
					YAML = require 'yamljs'
 | 
				
			||||||
printf = require('printf')
 | 
					printf = require 'printf'
 | 
				
			||||||
SyntaxErrorEx = require('../hmc/dist/utils/syntax-error-ex')
 | 
					SyntaxErrorEx = require '../utils/syntax-error-ex'
 | 
				
			||||||
require('string.prototype.startswith')
 | 
					require 'string.prototype.startswith'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###*
 | 
					###* Error handler for HackMyResume. All errors are handled here.
 | 
				
			||||||
Error handler for HackMyResume. All errors are handled here.
 | 
					@class ErrorHandler ###
 | 
				
			||||||
@class ErrorHandler
 | 
					 | 
				
			||||||
###
 | 
					 | 
				
			||||||
ErrorHandler = module.exports =
 | 
					ErrorHandler = module.exports =
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  init: ( debug, assert, silent ) ->
 | 
					  init: ( debug, assert, silent ) ->
 | 
				
			||||||
@@ -38,7 +36,7 @@ ErrorHandler = module.exports =
 | 
				
			|||||||
  err: ( ex, shouldExit ) ->
 | 
					  err: ( ex, shouldExit ) ->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Short-circuit logging output if --silent is on
 | 
					    # Short-circuit logging output if --silent is on
 | 
				
			||||||
    o = if this.silent then () -> else _defaultLog
 | 
					    o = if @silent then () -> else _defaultLog
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Special case; can probably be removed.
 | 
					    # Special case; can probably be removed.
 | 
				
			||||||
    throw ex if ex.pass
 | 
					    throw ex if ex.pass
 | 
				
			||||||
@@ -51,7 +49,7 @@ ErrorHandler = module.exports =
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      # Output the error message
 | 
					      # Output the error message
 | 
				
			||||||
      objError = assembleError.call @, ex
 | 
					      objError = assembleError.call @, ex
 | 
				
			||||||
      o( this[ 'format_' + objError.etype ]( objError.msg ))
 | 
					      o( @[ 'format_' + objError.etype ]( objError.msg ))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      # Output the stack (sometimes)
 | 
					      # Output the stack (sometimes)
 | 
				
			||||||
      if objError.withStack
 | 
					      if objError.withStack
 | 
				
			||||||
@@ -59,20 +57,20 @@ ErrorHandler = module.exports =
 | 
				
			|||||||
        stack && o( chalk.gray( stack ) );
 | 
					        stack && o( chalk.gray( stack ) );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      # Quit if necessary
 | 
					      # Quit if necessary
 | 
				
			||||||
      if ex.quit || objError.quit
 | 
					      if shouldExit
 | 
				
			||||||
        if @debug
 | 
					        if @debug
 | 
				
			||||||
          o chalk.cyan('Exiting with error code ' + ex.fluenterror.toString())
 | 
					          o chalk.cyan('Exiting with error code ' + ex.fluenterror.toString())
 | 
				
			||||||
        if this.assert
 | 
					        if @assert
 | 
				
			||||||
          ex.pass = true
 | 
					          ex.pass = true
 | 
				
			||||||
          throw ex
 | 
					          throw ex
 | 
				
			||||||
        process.exit ex.fluenterror
 | 
					        process.exit ex.fluenterror
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Handle raw exceptions
 | 
					    # Handle raw exceptions
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
      o( ex )
 | 
					      o ex
 | 
				
			||||||
      stackTrace = ex.stack || (ex.inner && ex.inner.stack)
 | 
					      stackTrace = ex.stack || (ex.inner && ex.inner.stack)
 | 
				
			||||||
      if stackTrace && this.debug
 | 
					      if stackTrace && this.debug
 | 
				
			||||||
        o( M2C(ex.stack || ex.inner.stack, 'gray') )
 | 
					        o M2C(ex.stack || ex.inner.stack, 'gray')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -139,7 +137,6 @@ assembleError = ( ex ) ->
 | 
				
			|||||||
    when HMSTATUS.pdfGeneration
 | 
					    when HMSTATUS.pdfGeneration
 | 
				
			||||||
      msg = M2C( this.msgs.pdfGeneration.msg, 'bold' )
 | 
					      msg = M2C( this.msgs.pdfGeneration.msg, 'bold' )
 | 
				
			||||||
      msg += chalk.red('\n' + ex.inner) if ex.inner
 | 
					      msg += chalk.red('\n' + ex.inner) if ex.inner
 | 
				
			||||||
      withStack = true
 | 
					 | 
				
			||||||
      quit = false
 | 
					      quit = false
 | 
				
			||||||
      etype = 'error'
 | 
					      etype = 'error'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -205,16 +202,30 @@ assembleError = ( ex ) ->
 | 
				
			|||||||
      etype = 'custom'
 | 
					      etype = 'custom'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    when HMSTATUS.parseError
 | 
					    when HMSTATUS.parseError
 | 
				
			||||||
      if SyntaxErrorEx.is( ex.inner )
 | 
					      if SyntaxErrorEx.is ex.inner
 | 
				
			||||||
        console.error printf( M2C(this.msgs.readError.msg, 'red'), ex.file )
 | 
					        console.error printf( M2C(this.msgs.readError.msg, 'red'), ex.file )
 | 
				
			||||||
        se = new SyntaxErrorEx ex, ex.raw
 | 
					        se = new SyntaxErrorEx ex, ex.raw
 | 
				
			||||||
        msg = printf M2C( this.msgs.parseError.msg, 'red' ), se.line, se.col
 | 
					        if se.line? and se.col?
 | 
				
			||||||
      else if ex.inner && ex.inner.line != undefined && ex.inner.col != undefined
 | 
					          msg = printf M2C( this.msgs.parseError.msg[0], 'red' ), se.line, se.col
 | 
				
			||||||
        msg = printf( M2C( this.msgs.parseError.msg, 'red' ), ex.inner.line, ex.inner.col)
 | 
					        else if se.line?
 | 
				
			||||||
 | 
					          msg = printf M2C( this.msgs.parseError.msg[1], 'red' ), se.line
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					          msg = M2C @msgs.parseError.msg[2], 'red'
 | 
				
			||||||
 | 
					      else if ex.inner && ex.inner.line? && ex.inner.col?
 | 
				
			||||||
 | 
					        msg = printf( M2C( this.msgs.parseError.msg[0], 'red' ), ex.inner.line, ex.inner.col)
 | 
				
			||||||
      else
 | 
					      else
 | 
				
			||||||
        msg = ex
 | 
					        msg = ex
 | 
				
			||||||
      etype = 'error'
 | 
					      etype = 'error'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    when HMSTATUS.createError
 | 
				
			||||||
 | 
					      # inner.code could be EPERM, EACCES, etc
 | 
				
			||||||
 | 
					      msg = printf M2C( this.msgs.createError.msg ), ex.inner.path
 | 
				
			||||||
 | 
					      etype = 'error'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    when HMSTATUS.validateError
 | 
				
			||||||
 | 
					      msg = printf M2C( @msgs.validateError.msg ), ex.inner.toString()
 | 
				
			||||||
 | 
					      etype = 'error'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  msg: msg              # The error message to display
 | 
					  msg: msg              # The error message to display
 | 
				
			||||||
  withStack: withStack  # Whether to include the stack
 | 
					  withStack: withStack  # Whether to include the stack
 | 
				
			||||||
  quit: quit
 | 
					  quit: quit
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										22
									
								
								src/cli/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								src/cli/index.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
				
			|||||||
 | 
					#! /usr/bin/env node
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					Command-line interface (CLI) for HackMyResume.
 | 
				
			||||||
 | 
					@license MIT. See LICENSE.md for details.
 | 
				
			||||||
 | 
					@module index.js
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					try {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  require('./main')( process.argv );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					catch( ex ) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  require('./error').err( ex, true );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -6,23 +6,27 @@ Definition of the `main` function.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
HMR = require '../hmc'
 | 
					HMR = require '../index'
 | 
				
			||||||
PKG = require '../../package.json'
 | 
					PKG = require '../../package.json'
 | 
				
			||||||
FS = require 'fs'
 | 
					FS = require 'fs'
 | 
				
			||||||
EXTEND = require 'extend'
 | 
					EXTEND = require 'extend'
 | 
				
			||||||
chalk = require 'chalk'
 | 
					chalk = require 'chalk'
 | 
				
			||||||
PATH = require 'path'
 | 
					PATH = require 'path'
 | 
				
			||||||
HMSTATUS = require '../hmc/dist/core/status-codes'
 | 
					HMSTATUS = require '../core/status-codes'
 | 
				
			||||||
HME = require '../hmc/dist/core/event-codes'
 | 
					HME = require '../core/event-codes'
 | 
				
			||||||
safeLoadJSON = require '../hmc/dist/utils/safe-json-loader'
 | 
					safeLoadJSON = require '../utils/safe-json-loader'
 | 
				
			||||||
StringUtils = require '../hmc/dist/utils/string.js'
 | 
					StringUtils = require '../utils/string.js'
 | 
				
			||||||
_ = require 'underscore'
 | 
					_ = require 'underscore'
 | 
				
			||||||
OUTPUT = require './out'
 | 
					OUTPUT = require './out'
 | 
				
			||||||
PAD = require 'string-padding'
 | 
					PAD = require 'string-padding'
 | 
				
			||||||
Command = require('commander').Command
 | 
					Command = require('commander').Command
 | 
				
			||||||
 | 
					M2C = require '../utils/md2chalk'
 | 
				
			||||||
 | 
					printf = require 'printf'
 | 
				
			||||||
_opts = { }
 | 
					_opts = { }
 | 
				
			||||||
_title = chalk.white.bold('\n*** HackMyResume v' +PKG.version+ ' ***')
 | 
					_title = chalk.white.bold('\n*** HackMyResume v' +PKG.version+ ' ***')
 | 
				
			||||||
_out = new OUTPUT( _opts )
 | 
					_out = new OUTPUT( _opts )
 | 
				
			||||||
 | 
					_err = require('./error')
 | 
				
			||||||
 | 
					_exitCallback = null
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -33,9 +37,9 @@ line interface as a single method accepting a parameter array.
 | 
				
			|||||||
@param rawArgs {Array} An array of command-line parameters. Will either be
 | 
					@param rawArgs {Array} An array of command-line parameters. Will either be
 | 
				
			||||||
process.argv (in production) or custom parameters (in test).
 | 
					process.argv (in production) or custom parameters (in test).
 | 
				
			||||||
###
 | 
					###
 | 
				
			||||||
main = module.exports = (rawArgs) ->
 | 
					main = module.exports = ( rawArgs, exitCallback ) ->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  initInfo = initialize( rawArgs )
 | 
					  initInfo = initialize( rawArgs, exitCallback )
 | 
				
			||||||
  args = initInfo.args
 | 
					  args = initInfo.args
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  # Create the top-level (application) command...
 | 
					  # Create the top-level (application) command...
 | 
				
			||||||
@@ -124,15 +128,15 @@ main = module.exports = (rawArgs) ->
 | 
				
			|||||||
  program.parse( args )
 | 
					  program.parse( args )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if !program.args.length
 | 
					  if !program.args.length
 | 
				
			||||||
    throw { fluenterror: 4 }
 | 
					    throw fluenterror: 4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Massage command-line args and setup Commander.js. ###
 | 
					### Massage command-line args and setup Commander.js. ###
 | 
				
			||||||
initialize = ( ar ) ->
 | 
					initialize = ( ar, exitCallback ) ->
 | 
				
			||||||
 | 
					 | 
				
			||||||
  o = initOptions( ar );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  _exitCallback = exitCallback || process.exit
 | 
				
			||||||
 | 
					  o = initOptions ar
 | 
				
			||||||
  o.silent || logMsg( _title )
 | 
					  o.silent || logMsg( _title )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  # Emit debug prelude if --debug was specified
 | 
					  # Emit debug prelude if --debug was specified
 | 
				
			||||||
@@ -147,14 +151,22 @@ initialize = ( ar ) ->
 | 
				
			|||||||
    #_out.log(chalk.cyan(PAD('  fresh-jrs-converter:',25, null, PAD.RIGHT)) + chalk.cyan.bold( PKG.dependencies['fresh-jrs-converter'] ))
 | 
					    #_out.log(chalk.cyan(PAD('  fresh-jrs-converter:',25, null, PAD.RIGHT)) + chalk.cyan.bold( PKG.dependencies['fresh-jrs-converter'] ))
 | 
				
			||||||
    _out.log('')
 | 
					    _out.log('')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  _err.init o.debug, o.assert, o.silent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  # Handle invalid verbs here (a bit easier here than in commander.js)...
 | 
					  # Handle invalid verbs here (a bit easier here than in commander.js)...
 | 
				
			||||||
  if o.verb && !HMR.verbs[ o.verb ] && !HMR.alias[ o.verb ]
 | 
					  if o.verb && !HMR.verbs[ o.verb ] && !HMR.alias[ o.verb ]
 | 
				
			||||||
    throw { fluenterror: HMSTATUS.invalidCommand, quit: true, attempted: o.orgVerb }
 | 
					    _err.err fluenterror: HMSTATUS.invalidCommand, quit: true, attempted: o.orgVerb, true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  # Override the .missingArgument behavior
 | 
					  # Override the .missingArgument behavior
 | 
				
			||||||
  Command.prototype.missingArgument = (name) ->
 | 
					  Command.prototype.missingArgument = (name) ->
 | 
				
			||||||
 | 
					    _err.err
 | 
				
			||||||
 | 
					      fluenterror:
 | 
				
			||||||
        if this.name() != 'new'
 | 
					        if this.name() != 'new'
 | 
				
			||||||
      throw { fluenterror: HMSTATUS.resumeNotFound, quit: true }
 | 
					        then HMSTATUS.resumeNotFound
 | 
				
			||||||
 | 
					        else HMSTATUS.createNameMissing
 | 
				
			||||||
 | 
					      , true
 | 
				
			||||||
 | 
					    return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  # Override the .helpInformation behavior
 | 
					  # Override the .helpInformation behavior
 | 
				
			||||||
  Command.prototype.helpInformation = ->
 | 
					  Command.prototype.helpInformation = ->
 | 
				
			||||||
@@ -205,23 +217,17 @@ initOptions = ( ar ) ->
 | 
				
			|||||||
            oJSON = inf.json
 | 
					            oJSON = inf.json
 | 
				
			||||||
          # TODO: Error handling
 | 
					          # TODO: Error handling
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  # Grab the --debug flag
 | 
					  # Grab the --debug flag, --silent, --assert and --no-color flags
 | 
				
			||||||
  isDebug = _.some( args, (v) ->
 | 
					  isDebug = _.some args, (v) -> v == '-d' || v == '--debug'
 | 
				
			||||||
    return v == '-d' || v == '--debug'
 | 
					  isSilent = _.some args, (v) -> v == '-s' || v == '--silent'
 | 
				
			||||||
  )
 | 
					  isAssert = _.some args, (v) -> v == '-a' || v == '--assert'
 | 
				
			||||||
 | 
					 | 
				
			||||||
  # Grab the --silent flag
 | 
					 | 
				
			||||||
  isSilent = _.some( args, (v) ->
 | 
					 | 
				
			||||||
    return v == '-s' || v == '--silent'
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  # Grab the --no-color flag
 | 
					 | 
				
			||||||
  isMono = _.some args, (v) -> v == '--no-color'
 | 
					  isMono = _.some args, (v) -> v == '--no-color'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return {
 | 
					  return {
 | 
				
			||||||
    color: !isMono,
 | 
					    color: !isMono,
 | 
				
			||||||
    debug: isDebug,
 | 
					    debug: isDebug,
 | 
				
			||||||
    silent: isSilent,
 | 
					    silent: isSilent,
 | 
				
			||||||
 | 
					    assert: isAssert,
 | 
				
			||||||
    orgVerb: oVerb,
 | 
					    orgVerb: oVerb,
 | 
				
			||||||
    verb: verb,
 | 
					    verb: verb,
 | 
				
			||||||
    json: oJSON,
 | 
					    json: oJSON,
 | 
				
			||||||
@@ -233,17 +239,45 @@ initOptions = ( ar ) ->
 | 
				
			|||||||
### Invoke a HackMyResume verb. ###
 | 
					### Invoke a HackMyResume verb. ###
 | 
				
			||||||
execute = ( src, dst, opts, log ) ->
 | 
					execute = ( src, dst, opts, log ) ->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Create the verb
 | 
				
			||||||
 | 
					  v = new HMR.verbs[ @name() ]()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Initialize command-specific options
 | 
				
			||||||
  loadOptions.call( this, opts, this.parent.jsonArgs )
 | 
					  loadOptions.call( this, opts, this.parent.jsonArgs )
 | 
				
			||||||
  hand = require( './error' )
 | 
					
 | 
				
			||||||
  hand.init( _opts.debug, _opts.assert, _opts.silent )
 | 
					  # Set up error/output handling
 | 
				
			||||||
  v = new HMR.verbs[ this.name() ]()
 | 
					 | 
				
			||||||
  _opts.errHandler = v
 | 
					  _opts.errHandler = v
 | 
				
			||||||
  _out.init( _opts )
 | 
					  _out.init _opts
 | 
				
			||||||
  v.on( 'hmr:status', -> _out.do.apply( _out, arguments ) )
 | 
					
 | 
				
			||||||
  v.on( 'hmr:error', ->  hand.err.apply( hand, arguments ) )
 | 
					  # Hook up event notifications
 | 
				
			||||||
  v.invoke.call( v, src, dst, _opts, log )
 | 
					  v.on 'hmr:status', -> _out.do.apply _out, arguments
 | 
				
			||||||
  if v.errorCode
 | 
					  v.on 'hmr:error', ->  _err.err.apply _err, arguments
 | 
				
			||||||
    process.exit(v.errorCode)
 | 
					
 | 
				
			||||||
 | 
					  # Invoke the verb using promise syntax
 | 
				
			||||||
 | 
					  prom = v.invoke.call v, src, dst, _opts, log
 | 
				
			||||||
 | 
					  prom.then executeSuccess, executeFail
 | 
				
			||||||
 | 
					  return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Success handler for verb invocations. Calls process.exit by default ###
 | 
				
			||||||
 | 
					executeSuccess = (obj) ->
 | 
				
			||||||
 | 
					  # Can't call _exitCallback here (process.exit) when PDF is running in BK
 | 
				
			||||||
 | 
					  #_exitCallback 0; return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Failure handler for verb invocations. Calls process.exit by default ###
 | 
				
			||||||
 | 
					executeFail = (err) ->
 | 
				
			||||||
 | 
					  finalErrorCode = -1
 | 
				
			||||||
 | 
					  if err
 | 
				
			||||||
 | 
					    finalErrorCode = if err.fluenterror then err.fluenterror else err
 | 
				
			||||||
 | 
					  if _opts.debug
 | 
				
			||||||
 | 
					    msgs = require('./msg').errors;
 | 
				
			||||||
 | 
					    logMsg printf M2C( msgs.exiting.msg, 'cyan' ), finalErrorCode
 | 
				
			||||||
 | 
					    logMsg err.stack if err.stack
 | 
				
			||||||
 | 
					  _exitCallback finalErrorCode
 | 
				
			||||||
 | 
					  return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,6 +3,8 @@ events:
 | 
				
			|||||||
    msg: Invoking **%s** command.
 | 
					    msg: Invoking **%s** command.
 | 
				
			||||||
  beforeCreate:
 | 
					  beforeCreate:
 | 
				
			||||||
    msg: Creating new **%s** resume: **%s**
 | 
					    msg: Creating new **%s** resume: **%s**
 | 
				
			||||||
 | 
					  afterCreate:
 | 
				
			||||||
 | 
					    msg: Creating new **%s** resume: **%s**
 | 
				
			||||||
  afterRead:
 | 
					  afterRead:
 | 
				
			||||||
    msg: Reading **%s** resume: **%s**
 | 
					    msg: Reading **%s** resume: **%s**
 | 
				
			||||||
  beforeTheme:
 | 
					  beforeTheme:
 | 
				
			||||||
@@ -41,6 +43,8 @@ events:
 | 
				
			|||||||
      - "VALID!"
 | 
					      - "VALID!"
 | 
				
			||||||
      - "INVALID"
 | 
					      - "INVALID"
 | 
				
			||||||
      - "BROKEN"
 | 
					      - "BROKEN"
 | 
				
			||||||
 | 
					      - "MISSING"
 | 
				
			||||||
 | 
					      - "ERROR"
 | 
				
			||||||
  beforePeek:
 | 
					  beforePeek:
 | 
				
			||||||
    msg:
 | 
					    msg:
 | 
				
			||||||
      - Peeking at **%s** in **%s**
 | 
					      - Peeking at **%s** in **%s**
 | 
				
			||||||
@@ -79,7 +83,10 @@ errors:
 | 
				
			|||||||
  readError:
 | 
					  readError:
 | 
				
			||||||
    msg: Reading **???** resume: **%s**
 | 
					    msg: Reading **???** resume: **%s**
 | 
				
			||||||
  parseError:
 | 
					  parseError:
 | 
				
			||||||
    msg: Invalid or corrupt JSON on line %s column %s.
 | 
					    msg:
 | 
				
			||||||
 | 
					      - Invalid or corrupt JSON on line %s column %s.
 | 
				
			||||||
 | 
					      - Invalid or corrupt JSON on line %s.
 | 
				
			||||||
 | 
					      - Invalid or corrupt JSON.
 | 
				
			||||||
  invalidHelperUse:
 | 
					  invalidHelperUse:
 | 
				
			||||||
    msg: "**Warning**: Incorrect use of the **%s** theme helper."
 | 
					    msg: "**Warning**: Incorrect use of the **%s** theme helper."
 | 
				
			||||||
  fileSaveError:
 | 
					  fileSaveError:
 | 
				
			||||||
@@ -96,3 +103,9 @@ errors:
 | 
				
			|||||||
    msg: "Invalid number of parameters. Expected: **%s**."
 | 
					    msg: "Invalid number of parameters. Expected: **%s**."
 | 
				
			||||||
  missingParam:
 | 
					  missingParam:
 | 
				
			||||||
    msg: The '**%s**' parameter was needed but not supplied.
 | 
					    msg: The '**%s**' parameter was needed but not supplied.
 | 
				
			||||||
 | 
					  createError:
 | 
				
			||||||
 | 
					    msg: Failed to create **'%s'**.
 | 
				
			||||||
 | 
					  exiting:
 | 
				
			||||||
 | 
					    msg: Exiting with status code **%s**.
 | 
				
			||||||
 | 
					  validateError:
 | 
				
			||||||
 | 
					    msg: "An error occurred during validation:\n%s"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,10 +7,9 @@ Output routines for HackMyResume.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
chalk = require('chalk')
 | 
					chalk = require('chalk')
 | 
				
			||||||
HME = require('../hmc/dist/core/event-codes')
 | 
					HME = require('../core/event-codes')
 | 
				
			||||||
_ = require('underscore')
 | 
					_ = require('underscore')
 | 
				
			||||||
Class = require('../hmc/dist/utils/class.js')
 | 
					M2C = require('../utils/md2chalk.js')
 | 
				
			||||||
M2C = require('../hmc/dist/utils/md2chalk.js')
 | 
					 | 
				
			||||||
PATH = require('path')
 | 
					PATH = require('path')
 | 
				
			||||||
LO = require('lodash')
 | 
					LO = require('lodash')
 | 
				
			||||||
FS = require('fs')
 | 
					FS = require('fs')
 | 
				
			||||||
@@ -22,11 +21,20 @@ pad = require('string-padding')
 | 
				
			|||||||
dbgStyle = 'cyan';
 | 
					dbgStyle = 'cyan';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###* A stateful output module. All HMR console output handled here. ###
 | 
					###* A stateful output module. All HMR console output handled here. ###
 | 
				
			||||||
OutputHandler = module.exports = Class.extend
 | 
					module.exports = class OutputHandler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  constructor: ( opts ) ->
 | 
				
			||||||
 | 
					    @init opts
 | 
				
			||||||
 | 
					    return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  init: (opts) ->
 | 
					  init: (opts) ->
 | 
				
			||||||
    @opts = EXTEND( true, this.opts || { }, opts )
 | 
					    @opts = EXTEND( true, @opts || { }, opts )
 | 
				
			||||||
    @msgs = YAML.load(PATH.join( __dirname, 'msg.yml' )).events
 | 
					    @msgs = YAML.load(PATH.join( __dirname, 'msg.yml' )).events
 | 
				
			||||||
    return
 | 
					    return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -39,6 +47,7 @@ OutputHandler = module.exports = Class.extend
 | 
				
			|||||||
    @opts.silent || console.log( finished )
 | 
					    @opts.silent || console.log( finished )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  do: ( evt ) ->
 | 
					  do: ( evt ) ->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    that = @
 | 
					    that = @
 | 
				
			||||||
@@ -50,8 +59,12 @@ OutputHandler = module.exports = Class.extend
 | 
				
			|||||||
        this.opts.debug &&
 | 
					        this.opts.debug &&
 | 
				
			||||||
        L( M2C( this.msgs.begin.msg, dbgStyle), evt.cmd.toUpperCase() )
 | 
					        L( M2C( this.msgs.begin.msg, dbgStyle), evt.cmd.toUpperCase() )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      when HME.beforeCreate
 | 
					      #when HME.beforeCreate
 | 
				
			||||||
        L( M2C( this.msgs.beforeCreate.msg, 'green' ), evt.fmt, evt.file )
 | 
					        #L( M2C( this.msgs.beforeCreate.msg, 'green' ), evt.fmt, evt.file )
 | 
				
			||||||
 | 
					        #break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      when HME.afterCreate
 | 
				
			||||||
 | 
					        L( M2C( @msgs.beforeCreate.msg, if evt.isError then 'red' else 'green' ), evt.fmt, evt.file )
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      when HME.beforeTheme
 | 
					      when HME.beforeTheme
 | 
				
			||||||
@@ -109,7 +122,7 @@ OutputHandler = module.exports = Class.extend
 | 
				
			|||||||
      when HME.afterAnalyze
 | 
					      when HME.afterAnalyze
 | 
				
			||||||
        info = evt.info
 | 
					        info = evt.info
 | 
				
			||||||
        rawTpl = FS.readFileSync( PATH.join( __dirname, 'analyze.hbs' ), 'utf8')
 | 
					        rawTpl = FS.readFileSync( PATH.join( __dirname, 'analyze.hbs' ), 'utf8')
 | 
				
			||||||
        HANDLEBARS.registerHelper( require('../hmc/dist/helpers/console-helpers') )
 | 
					        HANDLEBARS.registerHelper( require('../helpers/console-helpers') )
 | 
				
			||||||
        template = HANDLEBARS.compile(rawTpl, { strict: false, assumeObjects: false })
 | 
					        template = HANDLEBARS.compile(rawTpl, { strict: false, assumeObjects: false })
 | 
				
			||||||
        tot = 0
 | 
					        tot = 0
 | 
				
			||||||
        info.keywords.forEach (g) -> tot += g.count
 | 
					        info.keywords.forEach (g) -> tot += g.count
 | 
				
			||||||
@@ -127,29 +140,43 @@ OutputHandler = module.exports = Class.extend
 | 
				
			|||||||
          evt.file, evt.fmt );
 | 
					          evt.file, evt.fmt );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      when HME.afterValidate
 | 
					      when HME.afterValidate
 | 
				
			||||||
        style = if evt.isValid then 'green' else 'yellow'
 | 
					        style = 'red'
 | 
				
			||||||
        L(
 | 
					        adj = ''
 | 
				
			||||||
          M2C( this.msgs.afterValidate.msg[0], 'white' ) +
 | 
					        msgs = @msgs.afterValidate.msg;
 | 
				
			||||||
          chalk[style].bold(
 | 
					        switch evt.status
 | 
				
			||||||
            if evt.isValid
 | 
					          when 'valid' then style = 'green'; adj = msgs[1]
 | 
				
			||||||
            then this.msgs.afterValidate.msg[1]
 | 
					          when 'invalid' then style = 'yellow'; adj = msgs[2]
 | 
				
			||||||
            else this.msgs.afterValidate.msg[2] ),
 | 
					          when 'broken' then style = 'red'; adj = msgs[3]
 | 
				
			||||||
          evt.file, evt.fmt
 | 
					          when 'missing' then style = 'red'; adj = msgs[4]
 | 
				
			||||||
        );
 | 
					          when 'unknown' then style = 'red'; adj = msgs[5]
 | 
				
			||||||
 | 
					        evt.schema = evt.schema.replace('jars','JSON Resume').toUpperCase()
 | 
				
			||||||
 | 
					        L(M2C( msgs[0], 'white' ) + chalk[style].bold(adj), evt.file, evt.schema)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if evt.errors
 | 
					        if evt.violations
 | 
				
			||||||
          _.each( evt.errors, (err,idx) ->
 | 
					          _.each evt.violations, (err,idx) ->
 | 
				
			||||||
            L( chalk.yellow.bold('--> ') + chalk.yellow(err.field.replace('data.','resume.').toUpperCase() + ' ' + err.message))
 | 
					            L( chalk.yellow.bold('--> ') +
 | 
				
			||||||
          , @)
 | 
					               chalk.yellow(err.field.replace('data.','resume.').toUpperCase() +
 | 
				
			||||||
 | 
					               ' ' + err.message))
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					          , @
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      when HME.afterPeek
 | 
					      when HME.afterPeek
 | 
				
			||||||
        sty = if evt.error then 'red' else ( if evt.target != undefined then 'green' else 'yellow' )
 | 
					        sty = if evt.error then 'red' else ( if evt.target != undefined then 'green' else 'yellow' )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # "Peeking at 'someKey' in 'someFile'."
 | 
				
			||||||
        if evt.requested
 | 
					        if evt.requested
 | 
				
			||||||
          L(M2C(this.msgs.beforePeek.msg[0], sty), evt.requested, evt.file)
 | 
					          L(M2C(this.msgs.beforePeek.msg[0], sty), evt.requested, evt.file)
 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
          L(M2C(this.msgs.beforePeek.msg[1], sty), evt.file)
 | 
					          L(M2C(this.msgs.beforePeek.msg[1], sty), evt.file)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if evt.target != undefined
 | 
					        # If the key was present, print it
 | 
				
			||||||
 | 
					        if evt.target != undefined and !evt.error
 | 
				
			||||||
          console.dir( evt.target, { depth: null, colors: true } )
 | 
					          console.dir( evt.target, { depth: null, colors: true } )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # If the key was not present, but no error occurred, print it
 | 
				
			||||||
        else if !evt.error
 | 
					        else if !evt.error
 | 
				
			||||||
          L(M2C( this.msgs.afterPeek.msg, 'yellow'), evt.requested, evt.file);
 | 
					          L M2C( this.msgs.afterPeek.msg, 'yellow'), evt.requested, evt.file
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        else if evt.error
 | 
				
			||||||
 | 
					          L chalk.red( evt.error.inner.inner )
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										53
									
								
								src/core/abstract-resume.coffee
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								src/core/abstract-resume.coffee
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,53 @@
 | 
				
			|||||||
 | 
					###*
 | 
				
			||||||
 | 
					Definition of the AbstractResume class.
 | 
				
			||||||
 | 
					@license MIT. See LICENSE.md for details.
 | 
				
			||||||
 | 
					@module core/abstract-resume
 | 
				
			||||||
 | 
					###
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_ = require 'underscore'
 | 
				
			||||||
 | 
					__ = require 'lodash'
 | 
				
			||||||
 | 
					FluentDate = require('./fluent-date')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class AbstractResume
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ###*
 | 
				
			||||||
 | 
					  Compute the total duration of the work history.
 | 
				
			||||||
 | 
					  @returns The total duration of the sheet's work history, that is, the number
 | 
				
			||||||
 | 
					  of years between the start date of the earliest job on the resume and the
 | 
				
			||||||
 | 
					  *latest end date of all jobs in the work history*. This last condition is for
 | 
				
			||||||
 | 
					  sheets that have overlapping jobs.
 | 
				
			||||||
 | 
					  ###
 | 
				
			||||||
 | 
					  duration: (collKey, startKey, endKey, unit) ->
 | 
				
			||||||
 | 
					    unit = unit || 'years'
 | 
				
			||||||
 | 
					    hist = __.get @, collKey
 | 
				
			||||||
 | 
					    return 0 if !hist or !hist.length
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # BEGIN CODE DUPLICATION --> src/inspectors/gap-inspector.coffee (TODO)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Convert the candidate's employment history to an array of dates,
 | 
				
			||||||
 | 
					    # where each element in the array is a start date or an end date of a
 | 
				
			||||||
 | 
					    # job -- it doesn't matter which.
 | 
				
			||||||
 | 
					    new_e = hist.map ( job ) ->
 | 
				
			||||||
 | 
					      obj = _.pick( job, [startKey, endKey] )
 | 
				
			||||||
 | 
					      # Synthesize an end date if this is a "current" gig
 | 
				
			||||||
 | 
					      obj[endKey] = 'current' if !_.has obj, endKey
 | 
				
			||||||
 | 
					      if obj && (obj[startKey] || obj[endKey])
 | 
				
			||||||
 | 
					        obj = _.pairs obj
 | 
				
			||||||
 | 
					        obj[0][1] = FluentDate.fmt( obj[0][1] )
 | 
				
			||||||
 | 
					        if obj.length > 1
 | 
				
			||||||
 | 
					          obj[1][1] = FluentDate.fmt( obj[1][1] )
 | 
				
			||||||
 | 
					      obj
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Flatten the array, remove empties, and sort
 | 
				
			||||||
 | 
					    new_e = _.filter _.flatten( new_e, true ), (v) ->
 | 
				
			||||||
 | 
					      return v && v.length && v[0] && v[0].length
 | 
				
			||||||
 | 
					    return 0 if !new_e or !new_e.length
 | 
				
			||||||
 | 
					    new_e = _.sortBy new_e, ( elem ) -> return elem[1].unix()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # END CODE DUPLICATION
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    firstDate = _.first( new_e )[1];
 | 
				
			||||||
 | 
					    lastDate = _.last( new_e )[1];
 | 
				
			||||||
 | 
					    lastDate.diff firstDate, unit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					module.exports = AbstractResume
 | 
				
			||||||
							
								
								
									
										18
									
								
								src/core/default-formats.coffee
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								src/core/default-formats.coffee
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
				
			|||||||
 | 
					###
 | 
				
			||||||
 | 
					Event code definitions.
 | 
				
			||||||
 | 
					@module core/default-formats
 | 
				
			||||||
 | 
					@license MIT. See LICENSE.md for details.
 | 
				
			||||||
 | 
					###
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					###* Supported resume formats. ###
 | 
				
			||||||
 | 
					module.exports = [
 | 
				
			||||||
 | 
					  { name: 'html', ext: 'html', gen: new (require('../generators/html-generator'))() },
 | 
				
			||||||
 | 
					  { name: 'txt',  ext: 'txt', gen: new (require('../generators/text-generator'))()  },
 | 
				
			||||||
 | 
					  { name: 'doc',  ext: 'doc',  fmt: 'xml', gen: new (require('../generators/word-generator'))() },
 | 
				
			||||||
 | 
					  { name: 'pdf',  ext: 'pdf', fmt: 'html', is: false, gen: new (require('../generators/html-pdf-cli-generator'))() },
 | 
				
			||||||
 | 
					  { name: 'png',  ext: 'png', fmt: 'html', is: false, gen: new (require('../generators/html-png-generator'))() },
 | 
				
			||||||
 | 
					  { name: 'md', ext: 'md', fmt: 'txt', gen: new (require('../generators/markdown-generator'))() },
 | 
				
			||||||
 | 
					  { name: 'json', ext: 'json', gen: new (require('../generators/json-generator'))() },
 | 
				
			||||||
 | 
					  { name: 'yml', ext: 'yml', fmt: 'yml', gen: new (require('../generators/json-yaml-generator'))() },
 | 
				
			||||||
 | 
					  { name: 'latex', ext: 'tex', fmt: 'latex', gen: new (require('../generators/latex-generator'))() }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										13
									
								
								src/core/default-options.coffee
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								src/core/default-options.coffee
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					###
 | 
				
			||||||
 | 
					Event code definitions.
 | 
				
			||||||
 | 
					@module core/default-options
 | 
				
			||||||
 | 
					@license MIT. See LICENSE.md for details.
 | 
				
			||||||
 | 
					###
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					module.exports =
 | 
				
			||||||
 | 
					  theme: 'modern'
 | 
				
			||||||
 | 
					  prettify: # ← See https://github.com/beautify-web/js-beautify#options
 | 
				
			||||||
 | 
					    indent_size: 2
 | 
				
			||||||
 | 
					    unformatted: ['em','strong']
 | 
				
			||||||
 | 
					    max_char: 80, # ← See lib/html.js in above-linked repo
 | 
				
			||||||
 | 
					    # wrap_line_length: 120, ← Don't use this
 | 
				
			||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user