diff --git a/dist/helpers/block-helpers.js b/dist/helpers/block-helpers.js new file mode 100644 index 0000000..f06a063 --- /dev/null +++ b/dist/helpers/block-helpers.js @@ -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 diff --git a/dist/helpers/generic-helpers.js b/dist/helpers/generic-helpers.js index cd29267..6d65c56 100644 --- a/dist/helpers/generic-helpers.js +++ b/dist/helpers/generic-helpers.js @@ -38,34 +38,61 @@ Generic template helper definitions for HackMyResume / FluentCV. GenericHelpers = module.exports = { /** - Display a formatted date with optional fallback text. + Emit a formatted string representing the specified datetime. Convert the input date to the specified format through Moment.js. If date is valid, return the formatted date string. If date is null, undefined, or other 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, dtFormat, fallback) { var momentDate; + if (datetime == null) { + datetime = void 0; + } if (dtFormat == null) { dtFormat = 'YYYY-MM'; } - momentDate = moment(datetime); - if (momentDate.isValid()) { - return momentDate.format(dtFormat); + if (datetime && moment.isMoment(datetime)) { + return datetime.format(dtFormat); } - return datetime || (typeof fallback === 'string' ? fallback : (fallback === true ? 'Present' : null)); + if (String.is(datetime)) { + momentDate = moment(datetime, dtFormat); + if (momentDate.isValid()) { + return momentDate.format(dtFormat); + } + momentDate = moment(datetime); + if (momentDate.isValid()) { + return momentDate.format(dtFormat); + } + } + return datetime || (typeof fallback === 'string' ? fallback : (fallback === true ? 'Present' : '')); }, - /** Display a formatted date. */ + /** + 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 (arguments.length < 4 || !dateDefault || !String.is(dateDefault)) { + if (!dateDefault || !String.is(dateDefault)) { dateDefault = 'Current'; } - if (arguments.length < 3 || !dateFormat || !String.is(dateFormat)) { + if (!dateFormat || !String.is(dateFormat)) { dateFormat = 'YYYY-MM'; } + if (!dateValue || !String.is(dateValue)) { + dateValue = null; + } if (!dateValue) { return dateDefault; } @@ -84,13 +111,12 @@ Generic template helper definitions for HackMyResume / FluentCV. /** Given a resume sub-object with a start/end date, format a representation of the date range. - @method dateRange */ - dateRange: function(obj, fmt, sep, fallback, options) { + dateRange: function(obj, fmt, sep, fallback) { if (!obj) { return ''; } - return _fromTo(obj.start, obj.end, fmt, sep, fallback, options); + return _fromTo(obj.start, obj.end, fmt, sep, fallback); }, /** @@ -125,30 +151,6 @@ Generic template helper definitions for HackMyResume / FluentCV. } }, - /** - Block-level helper. Emit the enclosed content if the resume has a section with - the specified name. Otherwise, emit an empty string ''. - @method section - */ - 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 size of the specified named font. @param key {String} A named style from the "fonts" section of the theme's @@ -306,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 */ camelCase: function(val) { @@ -319,20 +321,8 @@ Generic template helper definitions for HackMyResume / FluentCV. }, /** - Emit the enclosed content if the resume has the named property or subproperty. - @method has - */ - 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. + Display a user-overridable section title for a FRESH resume theme. Use this in + lieue of hard-coding section titles. Usage: @@ -464,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 or embeds the styles inline with , depending on the diff --git a/dist/helpers/handlebars-helpers.js b/dist/helpers/handlebars-helpers.js index 8b93dca..cda3559 100644 --- a/dist/helpers/handlebars-helpers.js +++ b/dist/helpers/handlebars-helpers.js @@ -1,12 +1,12 @@ /** Template helper definitions for Handlebars. -@license MIT. Copyright (c) 2015 James Devlin / FluentDesk. +@license MIT. See LICENSE.md for details. @module handlebars-helpers.js */ (function() { - var HANDLEBARS, _, helpers; + var HANDLEBARS, _, blockHelpers, helpers; HANDLEBARS = require('handlebars'); @@ -14,6 +14,8 @@ Template helper definitions for Handlebars. helpers = require('./generic-helpers'); + blockHelpers = require('./block-helpers'); + /** Register useful Handlebars helpers. @@ -21,9 +23,24 @@ Template helper definitions for Handlebars. */ module.exports = function(theme, opts) { + var wrappedHelpers; helpers.theme = theme; helpers.opts = opts; - return HANDLEBARS.registerHelper(helpers); + 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); diff --git a/src/helpers/block-helpers.coffee b/src/helpers/block-helpers.coffee new file mode 100644 index 0000000..e3d3045 --- /dev/null +++ b/src/helpers/block-helpers.coffee @@ -0,0 +1,58 @@ +###* +Block helper definitions for HackMyResume / FluentCV. +@license MIT. See LICENSE.md for details. +@module helpers/generic-helpers +### + + + +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: ( title, options ) -> + title = title.trim().toLowerCase() + obj = LO.get this.r, title + ret = '' + if obj + if _.isArray obj + if obj.length + ret = options.fn @ + else if _.isObject obj + if (obj.history && obj.history.length) || (obj.sets && obj.sets.length) + ret = options.fn @ + ret + + + + ###* + Emit the enclosed content if the resume has the named + property or subproperty. + ### + + has: ( title, options ) -> + title = title && title.trim().toLowerCase() + if LO.get this.r, title + return options.fn this + return + + + + ###* + Return true if either value is truthy. + @method either + ### + either: ( lhs, rhs, options ) -> options.fn @ if lhs || rhs diff --git a/src/helpers/generic-helpers.coffee b/src/helpers/generic-helpers.coffee index c31f43f..242c4fc 100644 --- a/src/helpers/generic-helpers.coffee +++ b/src/helpers/generic-helpers.coffee @@ -27,34 +27,70 @@ GenericHelpers = module.exports = ###* - Display a formatted date with optional fallback text. + Emit a formatted string representing the specified datetime. Convert the input date to the specified format through Moment.js. If date is valid, return the formatted date string. If date is null, undefined, or other 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: (datetime, dtFormat, fallback) -> + datetime ?= undefined dtFormat ?= 'YYYY-MM' - momentDate = moment datetime - return momentDate.format(dtFormat) if momentDate.isValid() + # If a Moment.js object was passed in, just call format on it + if datetime and moment.isMoment datetime + return datetime.format dtFormat + + if String.is datetime + # If a string was passed in, convert to Moment using the 2-paramter + # constructor with an explicit format string. + momentDate = moment datetime, dtFormat + return momentDate.format(dtFormat) if momentDate.isValid() + + # If that didn't work, try again with the single-parameter constructor + # but this may throw a deprecation warning + momentDate = moment datetime + return momentDate.format(dtFormat) if momentDate.isValid() + + # We weren't able to format the provided datetime. Now do one of three + # things. + # 1. If datetime is non-null/non-falsy, return it. For this helper, + # string date values that we can't parse are assumed to be display dates. + # 2. If datetime IS null or falsy, use the value from the fallback. + # 3. If the fallback value is specifically 'true', emit 'Present'. datetime || if typeof fallback == 'string' then fallback - else (if fallback == true then 'Present' else null) + else (if fallback == true then 'Present' else '') - ###* Display a formatted date. ### + ###* + 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: (dateValue, dateFormat, dateDefault) -> - dateDefault = 'Current' if arguments.length < 4 or !dateDefault or !String.is dateDefault - dateFormat = 'YYYY-MM' if arguments.length < 3 or !dateFormat or !String.is dateFormat + + dateDefault = 'Current' if !dateDefault or !String.is dateDefault + dateFormat = 'YYYY-MM' if !dateFormat or !String.is dateFormat + dateValue = null if !dateValue or !String.is dateValue return dateDefault if !dateValue - reserved = ['current', 'present', 'now']; + + reserved = ['current', 'present', 'now'] dateValueSafe = dateValue.trim().toLowerCase(); return dateValue if _.contains reserved, dateValueSafe + dateValueMoment = moment dateValue, dateFormat return dateValueMoment.format dateFormat if dateValueMoment.isValid() dateValue @@ -64,11 +100,10 @@ GenericHelpers = module.exports = ###* Given a resume sub-object with a start/end date, format a representation of the date range. - @method dateRange ### - dateRange: ( obj, fmt, sep, fallback, options ) -> + dateRange: ( obj, fmt, sep, fallback ) -> return '' if !obj - _fromTo obj.start, obj.end, fmt, sep, fallback, options + _fromTo obj.start, obj.end, fmt, sep, fallback @@ -98,26 +133,6 @@ GenericHelpers = module.exports = - ###* - Block-level helper. Emit the enclosed content if the resume has a section with - the specified name. Otherwise, emit an empty string ''. - @method section - ### - section: ( title, options ) -> - title = title.trim().toLowerCase() - obj = LO.get this.r, title - ret = '' - if obj - if _.isArray obj - if obj.length - ret = options.fn @ - else if _.isObject obj - if (obj.history && obj.history.length) || (obj.sets && obj.sets.length) - ret = options.fn @ - ret - - - ###* Emit the size of the specified named font. @param key {String} A named style from the "fonts" section of the theme's @@ -280,7 +295,7 @@ GenericHelpers = module.exports = ###* - Capitalize the first letter of the word. + Capitalize the first letter of the word. TODO: Rename @method section ### camelCase: (val) -> @@ -290,21 +305,8 @@ GenericHelpers = module.exports = ###* - Emit the enclosed content if the resume has the named property or subproperty. - @method has - ### - has: ( title, options ) -> - title = title && title.trim().toLowerCase() - if LO.get this.r, title - return options.fn this - return - - - - ###* - 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. + Display a user-overridable section title for a FRESH resume theme. Use this in + lieue of hard-coding section titles. Usage: @@ -414,8 +416,7 @@ GenericHelpers = module.exports = Convert text to lowercase. @method toLower ### - toLower: ( txt ) -> - if txt && txt.trim() then txt.toLowerCase() else '' + toLower: ( txt ) -> if txt && txt.trim() then txt.toLowerCase() else '' @@ -423,18 +424,7 @@ GenericHelpers = module.exports = Convert text to lowercase. @method toLower ### - toUpper: ( txt ) -> - if txt && txt.trim() then txt.toUpperCase() else '' - - - - ###* - Return true if either value is truthy. - @method either - ### - either: ( lhs, rhs, options ) -> - if lhs || rhs - return options.fn this + toUpper: ( txt ) -> if txt && txt.trim() then txt.toUpperCase() else '' diff --git a/src/helpers/handlebars-helpers.coffee b/src/helpers/handlebars-helpers.coffee index 5bb1cca..44fa45b 100644 --- a/src/helpers/handlebars-helpers.coffee +++ b/src/helpers/handlebars-helpers.coffee @@ -1,13 +1,14 @@ ###* Template helper definitions for Handlebars. -@license MIT. Copyright (c) 2015 James Devlin / FluentDesk. +@license MIT. See LICENSE.md for details. @module handlebars-helpers.js ### HANDLEBARS = require 'handlebars' _ = require 'underscore' helpers = require './generic-helpers' +blockHelpers = require './block-helpers' ###* Register useful Handlebars helpers. @@ -15,6 +16,21 @@ Register useful Handlebars helpers. ### module.exports = ( theme, opts ) -> + helpers.theme = theme helpers.opts = opts - HANDLEBARS.registerHelper helpers + helpers.type = 'handlebars' + + wrappedHelpers = _.mapObject helpers, ( hVal, hKey ) -> + if _.isFunction hVal + _.wrap hVal, (func) -> + args = Array.prototype.slice.call arguments + args.shift() # lose the 1st element (func) + args.pop() # lose the last element (the Handlebars options hash) + func.apply @, args + hVal + , @ + + HANDLEBARS.registerHelper wrappedHelpers + HANDLEBARS.registerHelper blockHelpers + return diff --git a/test/expected/modern/resume.doc b/test/expected/modern/resume.doc index 0038936..2b27bf7 100644 --- a/test/expected/modern/resume.doc +++ b/test/expected/modern/resume.doc @@ -869,7 +869,7 @@ - Agile TFS Unified Process MS Project + Agile TFS JIRA GitHub Unified Process MS Project @@ -938,12 +938,12 @@ Head Code Ninja, - + - One Cool Startup + Area 52 @@ -953,7 +953,7 @@ - Sep 2013 — Current + Sep 2013 — Present @@ -962,7 +962,7 @@ - Development team manager for OneCoolApp and OneCoolWebsite, a free social network tiddlywink generator and lifestyle portal with over 200,000 users. + Development team manager for Quantum Diorama, a distributed molecular modeling and analysis suite for Linux and OS X. @@ -1323,7 +1323,7 @@ - 2015-09 — Current + 2015-09 — Present @@ -1407,7 +1407,7 @@ - ??? — Current + ??? — Present @@ -1524,7 +1524,7 @@ - 2015-01 — Current + 2015-01 — Present @@ -1894,7 +1894,7 @@ - Jun 2013 — Current + Jun 2013 — Present @@ -1936,7 +1936,7 @@ - ??? — Current + ??? — Present @@ -1978,7 +1978,7 @@ - Jan 2010 — Current + Jan 2010 — Present @@ -2186,33 +2186,6 @@ - - - - - - - - - - - - Code Complete - - - - - , Steve McConnell - - - - - - @@ -2233,6 +2206,14 @@ --> + + + + + + + Daily reader and longtime lurker. + @@ -2257,6 +2238,14 @@ --> + + + + + + + Daily reader and longtime lurker. + @@ -2284,6 +2273,49 @@ , Jeff Atwood + + + + + + + Reader since 2007; member of the StackOverflow Beta. + + + + + + + + + + + + + + + + + Code Complete + + + + + , Steve McConnell + + + + + + + + + My 'desert-island' software construction manual. + @@ -2584,7 +2616,7 @@ - Feb 2016 — Feb 2016 + ??? — Present diff --git a/test/expected/modern/resume.html b/test/expected/modern/resume.html index a94a3d7..00246f6 100644 --- a/test/expected/modern/resume.html +++ b/test/expected/modern/resume.html @@ -228,9 +228,9 @@

info

Imaginary full-stack software developer with 6+ years industry experience specializing - in scalable cloud architectures for this, that, and the other. A native - of southern CA, Jane enjoys hiking, mystery novels, and the company of - Rufus, her two-year-old beagle. + in cloud-driven web applications and middleware. A native of southern CA, + Jane enjoys hiking, mystery novels, and the company of Rufus, her two year + old beagle.
@@ -319,8 +319,11 @@ TFS Unified Process MS Project + class="label label-keyword">JIRA GitHub + Unified Process + MS Project @@ -334,15 +337,14 @@

Head Code Ninja, - One Cool Startup + Area 52

- 2013-09 — Current -| Agile PM Amazon Web Services AWS + 2013-09 — Present +| Agile PM C C++ R OpenGL Boost MySQL PostgreSQL JIRA

-

Development team manager for OneCoolApp and - OneCoolWebsite, a free social network tiddlywink generator and lifestyle - portal with over 200,000 users.

+

Development team manager for Quantum Diorama, + a distributed molecular modeling and analysis suite for Linux and OS X.

  • Managed a 5-person development team
  • @@ -355,7 +357,7 @@ Veridian Dynamics 2011-07 — 2013-08 -| C++ C Linux +| C++ C Linux R Clojure

    Developer on numerous projects culminating in technical lead role for @@ -414,7 +416,7 @@ HackMyResume -2015-09 — Current +2015-09 — Present | JavaScript Node.js cross-platform JSON

    Exemplar user for HackMyResume and FluentCV!

    @@ -493,7 +495,7 @@ Khronos Group -2015-01 — Current +2015-01 — Present
    • Participated in GORFF standardization process (Draft 2).
    • @@ -547,7 +549,7 @@

      Member, IEEE

      - 2013-06 — Current + 2013-06 — Present

      Member in good standing since 2013-06.

@@ -555,7 +557,7 @@

Member, Apple Developer Network

- ??? — Current + ??? — Present

Member of the Apple Developer program since 2008.

@@ -564,7 +566,7 @@

Subscriber, MSDN

- 2010-01 — Current + 2010-01 — Present

Super-Ultra-gold level Ultimate Access MSDN subscriber package with subscription toaster and XBox ping pong racket.

@@ -635,25 +637,29 @@

reading

-
-

Code Complete, Steve McConnell

- 2016 - -

r/programming

- 2016 + Current +

Daily reader and longtime lurker.

Hacker News / YCombinator

- 2016 + Current +

Daily reader and longtime lurker.

Coding Horror, Jeff Atwood

- 2016 + Current +

Reader since 2007; member of the StackOverflow Beta.

+
+
+

Code Complete, Steve McConnell

+ 2014 + +

My 'desert-island' software construction manual.


@@ -731,21 +737,21 @@

reading

- 2016 + Current

Jane is a fan of mystery novels and courtroom dramas including Agatha Christie and John Grisham.

hiking

- 2016 + Current

Jane enjoys hiking, light mountain climbing, and has four summits under her belt!

yoga

- 2016 + Current
diff --git a/test/expected/modern/resume.json b/test/expected/modern/resume.json index 92df97b..e02f3f1 100644 --- a/test/expected/modern/resume.json +++ b/test/expected/modern/resume.json @@ -2,7 +2,7 @@ "basics": { "name": "Jane Q. Fullstacker", "label": "Senior Developer", - "summary": "**Imaginary full-stack software developer with 6+ years industry experience** specializing in scalable cloud architectures for this, that, and the other. A native of southern CA, Jane enjoys hiking, mystery novels, and the company of Rufus, her two-year-old beagle.", + "summary": "**Imaginary full-stack software developer with 6+ years industry experience** specializing in cloud-driven web applications and middleware. A native of southern CA, Jane enjoys hiking, mystery novels, and the company of Rufus, her two year old beagle.", "website": "http://janef.me/blog", "phone": "1-650-999-7777", "email": "jdoe@onecoolstartup.io", @@ -29,11 +29,11 @@ }, "work": [ { - "company": "One Cool Startup", - "website": "https://onecool.io/does-not-exist", + "company": "Area 52", + "website": "https://area52.io/does-not-exist", "position": "Head Code Ninja", "startDate": "2013-09", - "summary": "Development team manager for [OneCoolApp](https://en.wikipedia.org/wiki/Vaporware) and OneCoolWebsite, a free social network tiddlywink generator and lifestyle portal with over 200,000 users.", + "summary": "Development team manager for [**Quantum Diorama**](https://en.wikipedia.org/wiki/Vaporware), a distributed molecular modeling and analysis suite for Linux and OS X.", "highlights": [ "Managed a 5-person development team", "Accomplishment 2", @@ -156,6 +156,8 @@ "keywords": [ "Agile", "TFS", + "JIRA", + "GitHub", "Unified Process", "MS Project" ] diff --git a/test/expected/modern/resume.md b/test/expected/modern/resume.md index 7a99b55..e12d22d 100644 --- a/test/expected/modern/resume.md +++ b/test/expected/modern/resume.md @@ -4,7 +4,7 @@ Email: jdoe@onecoolstartup.io Tel: 1-650-999-7777 Web: http://janef.me/blog -**Imaginary full-stack software developer with 6+ years industry experience** specializing in scalable cloud architectures for this, that, and the other. A native of southern CA, Jane enjoys hiking, mystery novels, and the company of Rufus, her two-year-old beagle. +**Imaginary full-stack software developer with 6+ years industry experience** specializing in cloud-driven web applications and middleware. A native of southern CA, Jane enjoys hiking, mystery novels, and the company of Rufus, her two year old beagle. ## SKILLS @@ -12,13 +12,13 @@ Web: http://janef.me/blog - JavaScript: Node.js Angular.js jQuery Bootstrap React.js Backbone.js - Database: MySQL PostgreSQL NoSQL ORM Hibernate - Cloud: AWS EC2 RDS S3 Azure Dropbox - - Project: Agile TFS Unified Process MS Project + - Project: Agile TFS JIRA GitHub Unified Process MS Project ## EMPLOYMENT -### *Head Code Ninja*, [One Cool Startup](https://onecool.io/does-not-exist) (2013-09 — 2016-02) +### *Head Code Ninja*, [Area 52](https://area52.io/does-not-exist) (2013-09 — Present) -Development team manager for [OneCoolApp](https://en.wikipedia.org/wiki/Vaporware) and OneCoolWebsite, a free social network tiddlywink generator and lifestyle portal with over 200,000 users. +Development team manager for [**Quantum Diorama**](https://en.wikipedia.org/wiki/Vaporware), a distributed molecular modeling and analysis suite for Linux and OS X. - Managed a 5-person development team - Accomplishment 2 - Etc. @@ -47,7 +47,7 @@ Performed IT administration and deployments for Dunder Mifflin. ## PROJECTS -### *Contributor*, [HackMyResume](http://please.hackmyresume.com) (2015-09 — 2016-02) +### *Contributor*, [HackMyResume](http://please.hackmyresume.com) (2015-09 — Present) A resume authoring and analysis tool for OS X, Linux, and Windows. Exemplar user for HackMyResume and FluentCV! @@ -57,7 +57,7 @@ Exemplar user for HackMyResume and FluentCV! An augmented reality app for Android. Performed flagship product conceptualization and development. -### *Creator*, [Blog](http://myblog.jane.com/blog) (2016-02 — 2016-02) +### *Creator*, [Blog](http://myblog.jane.com/blog) (??? — Present) My programming blog. Powered by Jekyll. Conceptualization, design, development, and deployment. @@ -90,15 +90,15 @@ A multiline summary of the education. ## AFFILIATION -### *Member*, [IEEE](https://www.ieee.org/index.html) (2013-06 — Current) +### *Member*, [IEEE](https://www.ieee.org/index.html) (2013-06 — Present) Member in good standing since 2013-06. -### *Member*, [Apple Developer Network](https://developer.apple.com/) (??? — Current) +### *Member*, [Apple Developer Network](https://developer.apple.com/) (??? — Present) Member of the [Apple Developer program](https://developer.apple.com/) since 2008. -### *Subscriber*, [MSDN](https://msdn.microsoft.com) (2010-01 — Current) +### *Subscriber*, [MSDN](https://msdn.microsoft.com) (2010-01 — Present) Super-Ultra-gold level Ultimate Access MSDN subscriber package with subscription toaster and XBox ping pong racket. @@ -135,13 +135,17 @@ A primer on the programming language of GORFF, whose for loops are coterminous w ## READING -### [*Code Complete*](http://www.cc2e.com/Default.aspx), Steve McConnell - ### [*r/programming*](https://www.reddit.com/r/programming/) +Daily reader and longtime lurker. ### [*Hacker News / YCombinator*](https://news.ycombinator.com/) +Daily reader and longtime lurker. ### [*Coding Horror*](http://www.codinghorror.com), Jeff Atwood +Reader since 2007; member of the StackOverflow Beta. + +### [*Code Complete*](http://www.cc2e.com/Default.aspx), Steve McConnell +My 'desert-island' software construction manual. ## SERVICE @@ -163,9 +167,9 @@ Summary of this military stint. ## RECOGNITION -### Honorable Mention, Google +### Honorable Mention, Google (Jan 2012) -### Summa cum laude, Cornell University +### Summa cum laude, Cornell University (Jan 2012) ## SPEAKING diff --git a/test/expected/modern/resume.pdf b/test/expected/modern/resume.pdf index 270fb04..7e4c640 100644 Binary files a/test/expected/modern/resume.pdf and b/test/expected/modern/resume.pdf differ diff --git a/test/expected/modern/resume.pdf.html b/test/expected/modern/resume.pdf.html index 40aca4b..d8ad277 100644 --- a/test/expected/modern/resume.pdf.html +++ b/test/expected/modern/resume.pdf.html @@ -242,7 +242,7 @@ a:hover {

info

- Imaginary full-stack software developer with 6+ years industry experience specializing in scalable cloud architectures for this, that, and the other. A native of southern CA, Jane enjoys hiking, mystery novels, and the company of Rufus, her two-year-old beagle. + Imaginary full-stack software developer with 6+ years industry experience specializing in cloud-driven web applications and middleware. A native of southern CA, Jane enjoys hiking, mystery novels, and the company of Rufus, her two year old beagle. @@ -327,6 +327,8 @@ a:hover {
Agile TFS + JIRA + GitHub Unified Process MS Project
@@ -352,11 +354,11 @@ a:hover {

Head Code Ninja, - One Cool Startup + Area 52

- 2013-09 — Current - | Agile PM Amazon Web Services AWS -

Development team manager for OneCoolApp and OneCoolWebsite, a free social network tiddlywink generator and lifestyle portal with over 200,000 users.

+ 2013-09 — Present + | Agile PM C C++ R OpenGL Boost MySQL PostgreSQL JIRA +

Development team manager for Quantum Diorama, a distributed molecular modeling and analysis suite for Linux and OS X.

  • Managed a 5-person development team
  • @@ -369,7 +371,7 @@ a:hover { Veridian Dynamics 2011-07 — 2013-08 - | C++ C Linux + | C++ C Linux R Clojure

    Developer on numerous projects culminating in technical lead role for the Jabberwocky project and promotion to principal developer.

      @@ -423,7 +425,7 @@ a:hover {

      Contributor, HackMyResume

      -2015-09 — Current +2015-09 — Present | JavaScript Node.js cross-platform JSON

      Exemplar user for HackMyResume and FluentCV!

      @@ -501,7 +503,7 @@ a:hover {

      Academic Contributor, Khronos Group

      -2015-01 — Current +2015-01 — Present
      • Participated in GORFF standardization process (Draft 2).
      • @@ -565,7 +567,7 @@ a:hover {

        Member, IEEE

        - 2013-06 — Current + 2013-06 — Present

        Member in good standing since 2013-06.

        @@ -574,7 +576,7 @@ a:hover {

        Member, Apple Developer Network

        - ??? — Current + ??? — Present

        Member of the Apple Developer program since 2008.

        @@ -583,7 +585,7 @@ a:hover {

        Subscriber, MSDN

        - 2010-01 — Current + 2010-01 — Present

        Super-Ultra-gold level Ultimate Access MSDN subscriber package with subscription toaster and XBox ping pong racket.

        @@ -651,24 +653,28 @@ a:hover {

        reading

        -

        Code Complete, Steve McConnell

        - 2016 - -
        -

        r/programming

        - 2016 - + Current +

        Daily reader and longtime lurker.

        +

        Hacker News / YCombinator

        - 2016 - + Current +

        Daily reader and longtime lurker.

        +

        Coding Horror, Jeff Atwood

        - 2016 - + Current +

        Reader since 2007; member of the StackOverflow Beta.

        + +
        +
        +

        Code Complete, Steve McConnell

        + 2014 +

        My 'desert-island' software construction manual.

        +

        @@ -736,19 +742,19 @@ a:hover {

        reading

        - 2016 + Current

        Jane is a fan of mystery novels and courtroom dramas including Agatha Christie and John Grisham.

        hiking

        - 2016 + Current

        Jane enjoys hiking, light mountain climbing, and has four summits under her belt!

        yoga

        - 2016 + Current
        diff --git a/test/expected/modern/resume.png b/test/expected/modern/resume.png index f2fd740..c956380 100644 Binary files a/test/expected/modern/resume.png and b/test/expected/modern/resume.png differ diff --git a/test/expected/modern/resume.png.html b/test/expected/modern/resume.png.html index a94a3d7..00246f6 100644 --- a/test/expected/modern/resume.png.html +++ b/test/expected/modern/resume.png.html @@ -228,9 +228,9 @@

        info

        Imaginary full-stack software developer with 6+ years industry experience specializing - in scalable cloud architectures for this, that, and the other. A native - of southern CA, Jane enjoys hiking, mystery novels, and the company of - Rufus, her two-year-old beagle. + in cloud-driven web applications and middleware. A native of southern CA, + Jane enjoys hiking, mystery novels, and the company of Rufus, her two year + old beagle.
        @@ -319,8 +319,11 @@ TFS Unified Process MS Project + class="label label-keyword">JIRA GitHub + Unified Process + MS Project
@@ -334,15 +337,14 @@

Head Code Ninja, - One Cool Startup + Area 52

- 2013-09 — Current -| Agile PM Amazon Web Services AWS + 2013-09 — Present +| Agile PM C C++ R OpenGL Boost MySQL PostgreSQL JIRA

-

Development team manager for OneCoolApp and - OneCoolWebsite, a free social network tiddlywink generator and lifestyle - portal with over 200,000 users.

+

Development team manager for Quantum Diorama, + a distributed molecular modeling and analysis suite for Linux and OS X.

  • Managed a 5-person development team
  • @@ -355,7 +357,7 @@ Veridian Dynamics 2011-07 — 2013-08 -| C++ C Linux +| C++ C Linux R Clojure

    Developer on numerous projects culminating in technical lead role for @@ -414,7 +416,7 @@ HackMyResume -2015-09 — Current +2015-09 — Present | JavaScript Node.js cross-platform JSON

    Exemplar user for HackMyResume and FluentCV!

    @@ -493,7 +495,7 @@ Khronos Group -2015-01 — Current +2015-01 — Present
    • Participated in GORFF standardization process (Draft 2).
    • @@ -547,7 +549,7 @@

      Member, IEEE

      - 2013-06 — Current + 2013-06 — Present

      Member in good standing since 2013-06.

@@ -555,7 +557,7 @@

Member, Apple Developer Network

- ??? — Current + ??? — Present

Member of the Apple Developer program since 2008.

@@ -564,7 +566,7 @@

Subscriber, MSDN

- 2010-01 — Current + 2010-01 — Present

Super-Ultra-gold level Ultimate Access MSDN subscriber package with subscription toaster and XBox ping pong racket.

@@ -635,25 +637,29 @@

reading

-
-

Code Complete, Steve McConnell

- 2016 - -

r/programming

- 2016 + Current +

Daily reader and longtime lurker.

Hacker News / YCombinator

- 2016 + Current +

Daily reader and longtime lurker.

Coding Horror, Jeff Atwood

- 2016 + Current +

Reader since 2007; member of the StackOverflow Beta.

+
+
+

Code Complete, Steve McConnell

+ 2014 + +

My 'desert-island' software construction manual.


@@ -731,21 +737,21 @@

reading

- 2016 + Current

Jane is a fan of mystery novels and courtroom dramas including Agatha Christie and John Grisham.

hiking

- 2016 + Current

Jane enjoys hiking, light mountain climbing, and has four summits under her belt!

yoga

- 2016 + Current
diff --git a/test/expected/modern/resume.txt b/test/expected/modern/resume.txt index ad740f2..69dee57 100644 --- a/test/expected/modern/resume.txt +++ b/test/expected/modern/resume.txt @@ -4,7 +4,7 @@ Tel: 1-650-999-7777 Web: http://janef.me/blog ================================================================================ -**Imaginary full-stack software developer with 6+ years industry experience** specializing in scalable cloud architectures for this, that, and the other. A native of southern CA, Jane enjoys hiking, mystery novels, and the company of Rufus, her two-year-old beagle. +**Imaginary full-stack software developer with 6+ years industry experience** specializing in cloud-driven web applications and middleware. A native of southern CA, Jane enjoys hiking, mystery novels, and the company of Rufus, her two year old beagle. SKILLS ------------------------------------------------------------------------- @@ -12,12 +12,12 @@ SKILLS ------------------------------------------------------------------------- - JavaScript: Node.js Angular.js jQuery Bootstrap React.js Backbone.js - Database: MySQL PostgreSQL NoSQL ORM Hibernate - Cloud: AWS EC2 RDS S3 Azure Dropbox -- Project: Agile TFS Unified Process MS Project +- Project: Agile TFS JIRA GitHub Unified Process MS Project EMPLOYMENT --------------------------------------------------------------------- -Head Code Ninja, One Cool Startup (2013-09 — Current) -Development team manager for [OneCoolApp](https://en.wikipedia.org/wiki/Vaporware) and OneCoolWebsite, a free social network tiddlywink generator and lifestyle portal with over 200,000 users. +Head Code Ninja, Area 52 (2013-09 — Present) +Development team manager for [**Quantum Diorama**](https://en.wikipedia.org/wiki/Vaporware), a distributed molecular modeling and analysis suite for Linux and OS X. - Managed a 5-person development team - Accomplishment 2 - Etc. @@ -43,7 +43,7 @@ Performed IT administration and deployments for Dunder Mifflin. PROJECTS ----------------------------------------------------------------------- -HackMyResume, contributor (2015-09 — Current) +HackMyResume, contributor (2015-09 — Present) A resume authoring and analysis tool for OS X, Linux, and Windows. Exemplar user for HackMyResume and FluentCV! @@ -51,7 +51,7 @@ Augmented Android, co-creator (2012-02 — 2014-01) An augmented reality app for Android. Performed flagship product conceptualization and development. -Blog, creator (??? — Current) +Blog, creator (??? — Present) My programming blog. Powered by Jekyll. Conceptualization, design, development, and deployment. @@ -77,13 +77,13 @@ A multiline summary of the education. AFFILIATION -------------------------------------------------------------------- -Member, IEEE (2013-06 — Current) +Member, IEEE (2013-06 — Present) Member in good standing since 2013-06. -Member, Apple Developer Network (??? — Current) +Member, Apple Developer Network (??? — Present) Member of the [Apple Developer program](https://developer.apple.com/) since 2008. -Subscriber, MSDN (2010-01 — Current) +Subscriber, MSDN (2010-01 — Present) Super-Ultra-gold level Ultimate Access MSDN subscriber package with subscription toaster and XBox ping pong racket. Coordinator, Campus Coder's Meetup (2003-02 — 2004-04) @@ -103,27 +103,32 @@ A website to help you remember things. WRITING ------------------------------------------------------------------------ -Building User Interfaces with Electron and Atom +Building User Interfaces with Electron and Atom (2011-01) -Jane Fullstacker's Blog +Jane Fullstacker's Blog (2011-01) -Teach Yourself GORFF in 21 Days +Teach Yourself GORFF in 21 Days (2008-01) A primer on the programming language of GORFF, whose for loops are coterminous with all of time and space. READING ------------------------------------------------------------------------ -"Code Complete", Steve McConnell -http://www.cc2e.com/Default.aspx - "r/programming" https://www.reddit.com/r/programming/ +Daily reader and longtime lurker. "Hacker News / YCombinator" https://news.ycombinator.com/ +Daily reader and longtime lurker. "Coding Horror", Jeff Atwood http://www.codinghorror.com +Reader since 2007; member of the StackOverflow Beta. + +"Code Complete", Steve McConnell +http://www.cc2e.com/Default.aspx +My 'desert-island' software construction manual. +2014-09 SERVICE ------------------------------------------------------------------------ @@ -143,9 +148,9 @@ Summary of this military stint. RECOGNITION -------------------------------------------------------------------- -Honorable Mention, Google +Honorable Mention, Google (Jan 2012) -Summa cum laude, Cornell University +Summa cum laude, Cornell University (Jan 2012) REFERENCES --------------------------------------------------------------------- diff --git a/test/expected/modern/resume.yml b/test/expected/modern/resume.yml index 08c71c1..962e41c 100644 --- a/test/expected/modern/resume.yml +++ b/test/expected/modern/resume.yml @@ -1,11 +1,11 @@ name: 'Jane Q. Fullstacker' meta: - format: FRESH@0.4.0 - version: 0.3.0 + format: FRESH@0.6.0 + version: 0.4.0 info: label: 'Senior Developer' characterClass: Programmer - brief: '**Imaginary full-stack software developer with 6+ years industry experience** specializing in scalable cloud architectures for this, that, and the other. A native of southern CA, Jane enjoys hiking, mystery novels, and the company of Rufus, her two-year-old beagle.' + brief: '**Imaginary full-stack software developer with 6+ years industry experience** specializing in cloud-driven web applications and middleware. A native of southern CA, Jane enjoys hiking, mystery novels, and the company of Rufus, her two year old beagle.' image: jane_doe.png quote: 'Be the change you want to see in the world.' contact: @@ -93,17 +93,22 @@ employment: summary: '7+ years industry IT and software development experience.' history: - - employer: 'One Cool Startup' - url: 'https://onecool.io/does-not-exist' + employer: 'Area 52' + url: 'https://area52.io/does-not-exist' position: 'Head Code Ninja' - summary: 'Development team manager for [OneCoolApp](https://en.wikipedia.org/wiki/Vaporware) and OneCoolWebsite, a free social network tiddlywink generator and lifestyle portal with over 200,000 users.' + summary: 'Development team manager for [**Quantum Diorama**](https://en.wikipedia.org/wiki/Vaporware), a distributed molecular modeling and analysis suite for Linux and OS X.' start: 2013-09 - current: true keywords: - Agile - PM - - 'Amazon Web Services' - - AWS + - C + - C++ + - R + - OpenGL + - Boost + - MySQL + - PostgreSQL + - JIRA highlights: - 'Managed a 5-person development team' - 'Accomplishment 2' @@ -119,6 +124,8 @@ employment: - C++ - C - Linux + - R + - Clojure highlights: - 'Managed a 5-person development team' - 'Accomplishment 2' @@ -172,6 +179,7 @@ education: - 'Course 2' - institution: 'Medfield College' + title: "" url: 'https://en.wikipedia.org/wiki/Medfield_College' start: 2003-09 end: 2005-06 @@ -281,6 +289,8 @@ skills: skills: - Agile - TFS + - JIRA + - GitHub - 'Unified Process' - 'MS Project' list: @@ -354,24 +364,29 @@ writing: - 'John Smith' summary: 'A primer on the programming language of GORFF, whose for loops are coterminous with all of time and space.' reading: - - - title: 'Code Complete' - flavor: book - url: 'http://www.cc2e.com/Default.aspx' - author: 'Steve McConnell' - title: r/programming flavor: website url: 'https://www.reddit.com/r/programming/' + summary: 'Daily reader and longtime lurker.' - title: 'Hacker News / YCombinator' flavor: website url: 'https://news.ycombinator.com/' + summary: 'Daily reader and longtime lurker.' - title: 'Coding Horror' flavor: blog url: 'http://www.codinghorror.com' author: 'Jeff Atwood' + summary: 'Reader since 2007; member of the StackOverflow Beta.' + - + title: 'Code Complete' + flavor: book + url: 'http://www.cc2e.com/Default.aspx' + author: 'Steve McConnell' + date: 2014-09 + summary: 'My ''desert-island'' software construction manual.' speaking: - title: 'Data Warehousing Evolved: DARMA 2.0'