diff --git a/index.js b/index.js index 0d4cccd..6e4986e 100644 --- a/index.js +++ b/index.js @@ -1,6 +1,20 @@ const fs = require('fs') +const path = require('path') const Handlebars = require('handlebars') +const extname = '.hbs' +const partialsDir = path.join(__dirname, 'partials') + +fs.readdirSync(partialsDir) + .filter(filename => path.extname(filename) === extname) + .map(filename => [ + filename, + fs.readFileSync(path.join(partialsDir, filename), 'utf8'), + ]) + .forEach(([filename, template]) => + Handlebars.registerPartial(path.basename(filename, extname), template), + ) + Handlebars.registerHelper('formatDate', dateString => new Date(dateString).toLocaleDateString('en', { month: 'short', @@ -13,8 +27,8 @@ Handlebars.registerHelper('join', (arr, separator) => ) exports.render = resume => { - const template = fs.readFileSync(`${__dirname}/resume.hbs`, 'utf-8') - const css = fs.readFileSync(`${__dirname}/style.css`, 'utf-8') + const template = fs.readFileSync(path.join(__dirname, 'resume.hbs'), 'utf-8') + const css = fs.readFileSync(path.join(__dirname, 'style.css'), 'utf-8') return Handlebars.compile(template)({ css, resume }) } diff --git a/package-lock.json b/package-lock.json index e61c382..014edd9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -124,6 +124,19 @@ "to-fast-properties": "^2.0.0" } }, + "@sidvind/better-ajv-errors": { + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/@sidvind/better-ajv-errors/-/better-ajv-errors-0.6.10.tgz", + "integrity": "sha512-vPv8ks6J1KQW1LPYgxmANxcHniE6LFuekxNpcoUUkotJ2srxP4qXZ+y9qpo5LAXhnLoNP0AH8cninimK68gS6A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "chalk": "^2.4.1", + "json-to-ast": "^2.0.3", + "jsonpointer": "^4.0.1", + "leven": "^3.1.0" + } + }, "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", @@ -148,6 +161,12 @@ "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", "dev": true }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, "aggregate-error": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", @@ -248,6 +267,12 @@ "sprintf-js": "~1.0.2" } }, + "array-filter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", + "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", + "dev": true + }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -284,6 +309,15 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, + "available-typed-arrays": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz", + "integrity": "sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ==", + "dev": true, + "requires": { + "array-filter": "^1.0.0" + } + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -408,6 +442,12 @@ "supports-color": "^5.3.0" } }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, "chokidar": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", @@ -537,6 +577,12 @@ } } }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true + }, "cliui": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", @@ -548,6 +594,12 @@ "wrap-ansi": "^2.0.0" } }, + "code-error-fragment": { + "version": "0.0.230", + "resolved": "https://registry.npmjs.org/code-error-fragment/-/code-error-fragment-0.0.230.tgz", + "integrity": "sha512-cadkfKp6932H8UkhzE/gcUqhRMNf8jHzkAN7+5Myabswaghu4xABTgPHDCjW+dBAJxj/SpkTYokpzDqY4pCzQw==", + "dev": true + }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", @@ -741,12 +793,40 @@ "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", "dev": true }, + "deep-equal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.3.tgz", + "integrity": "sha512-Spqdl4H+ky45I9ByyJtXteOm9CaIrPmnIPmOhrkKGNYWeDgCvJ8jNYVCTjChxW4FqGuZnLHADc8EKRMX6+CgvA==", + "dev": true, + "requires": { + "es-abstract": "^1.17.5", + "es-get-iterator": "^1.1.0", + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.2", + "is-regex": "^1.0.5", + "isarray": "^2.0.5", + "object-is": "^1.1.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "regexp.prototype.flags": "^1.3.0", + "side-channel": "^1.0.2", + "which-boxed-primitive": "^1.0.1", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.2" + } + }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, "default-require-extensions": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", @@ -756,6 +836,15 @@ "strip-bom": "^3.0.0" } }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -826,6 +915,51 @@ "is-arrayish": "^0.2.1" } }, + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "es-get-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.0.tgz", + "integrity": "sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ==", + "dev": true, + "requires": { + "es-abstract": "^1.17.4", + "has-symbols": "^1.0.1", + "is-arguments": "^1.0.4", + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-string": "^1.0.5", + "isarray": "^2.0.5" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, "es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", @@ -1151,6 +1285,17 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -1282,6 +1427,12 @@ "vlq": "^0.2.1" } }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, "foreground-child": { "version": "1.5.6", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", @@ -1328,6 +1479,12 @@ "dev": true, "optional": true }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, "function-loop": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-1.0.2.tgz", @@ -1405,6 +1562,12 @@ "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, "handlebars": { "version": "4.7.6", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", @@ -1433,12 +1596,27 @@ "har-schema": "^2.0.0" } }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, "hasha": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz", @@ -1460,6 +1638,78 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, + "html-validate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-validate/-/html-validate-3.0.0.tgz", + "integrity": "sha512-4yipnAN9O33nW7K5qncSHXuP08mqROIvJVlgjLykgRVdx2/ufTe/t/td/8+48iuQMfiu0sgTd8lHJO5o45QByQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@sidvind/better-ajv-errors": "^0.6.9", + "acorn-walk": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "deepmerge": "^4.0.0", + "eslint": "^7.0.0", + "espree": "^7.0.0", + "glob": "^7.1.3", + "inquirer": "^7.0.0", + "json-merge-patch": "^1.0.0", + "minimist": "^1.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -1590,6 +1840,15 @@ } } }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -1634,12 +1893,141 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "inquirer": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.1.tgz", + "integrity": "sha512-/+vOpHQHhoh90Znev8BXiuw1TDQ7IDxWsQnFafUEoK5+4uN5Eoz1p+3GqOj/NtzEi9VzWKQcV9Bm+i8moxedsA==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.16", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, + "is-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.0.tgz", + "integrity": "sha512-t5mGUXC/xRheCK431ylNiSkGGpBp8bHENBcENTkDT6ppwPzEVxNGZRvgvmOEfbWkFhA7D2GEuE2mmQTr78sl2g==", + "dev": true + }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -1649,6 +2037,24 @@ "binary-extensions": "^2.0.0" } }, + "is-boolean-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.1.tgz", + "integrity": "sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ==", + "dev": true + }, + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "dev": true + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -1670,36 +2076,108 @@ "is-extglob": "^2.1.1" } }, + "is-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz", + "integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==", + "dev": true + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-number-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", + "dev": true + }, "is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, + "is-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", + "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, "is-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", "dev": true }, + "is-set": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz", + "integrity": "sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==", + "dev": true + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typed-array": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.3.tgz", + "integrity": "sha512-BSYUBOK/HJibQ30wWkWold5txYwMUXQct9YHAQJr8fSwvZoiglcqB0pd7vEN23+Tsi9IUEjztdOSzl4qLVYGTQ==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.0", + "es-abstract": "^1.17.4", + "foreach": "^2.0.5", + "has-symbols": "^1.0.1" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, + "is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true + }, + "is-weakset": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.1.tgz", + "integrity": "sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==", + "dev": true + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -1868,6 +2346,15 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, + "json-merge-patch": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-merge-patch/-/json-merge-patch-1.0.0.tgz", + "integrity": "sha512-pG2/EXnf8UvFuST3lNnhBaA0UROQPzrp/5hlK0FHCu7ha8RDKy9AhKlBjTXugY/xgWxeCThRmUHD8QxEKOw1Iw==", + "dev": true, + "requires": { + "deep-equal": "^2.0.3" + } + }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -1898,6 +2385,22 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, + "json-to-ast": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json-to-ast/-/json-to-ast-2.1.0.tgz", + "integrity": "sha512-W9Lq347r8tA1DfMvAGn9QNcgYm4Wm7Yc+k8e6vezpMnRT+NHbtlxgNBXRVjXe9YM6eTn6+p/MKOlV/aABJcSnQ==", + "dev": true, + "requires": { + "code-error-fragment": "0.0.230", + "grapheme-splitter": "^1.0.4" + } + }, + "jsonpointer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.1.0.tgz", + "integrity": "sha512-CXcRvMyTlnR53xMcKnuMzfCA5i/nfblTnnr74CZb6C4vG39eu6w51t7nKmU5MfLfbTgGItliNyjO/ciNPDqClg==", + "dev": true + }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -1916,6 +2419,12 @@ "integrity": "sha1-6w1GtUER68VhrLTECO+TY73I9+A=", "dev": true }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -2422,6 +2931,12 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -2537,6 +3052,40 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, + "object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true + }, + "object-is": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", + "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -2587,6 +3136,12 @@ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, "own-or": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/own-or/-/own-or-1.0.0.tgz", @@ -2862,6 +3417,16 @@ "picomatch": "^2.2.1" } }, + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, "regexpp": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", @@ -2951,6 +3516,12 @@ "glob": "^7.1.3" } }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, "rxjs": { "version": "6.6.0", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.0.tgz", @@ -3011,6 +3582,16 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, + "side-channel": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.2.tgz", + "integrity": "sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==", + "dev": true, + "requires": { + "es-abstract": "^1.17.0-next.1", + "object-inspect": "^1.7.0" + } + }, "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", @@ -3151,6 +3732,26 @@ "strip-ansi": "^4.0.0" } }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "stringify-object": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", @@ -4399,6 +5000,15 @@ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -4588,6 +5198,31 @@ "isexe": "^2.0.0" } }, + "which-boxed-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.1.tgz", + "integrity": "sha512-7BT4TwISdDGBgaemWU0N0OU7FeAEJ9Oo2P1PHRm/FCWoEi2VLWC9b6xvxAA3C/NMpxg3HXVgi0sMmGbNUbNepQ==", + "dev": true, + "requires": { + "is-bigint": "^1.0.0", + "is-boolean-object": "^1.0.0", + "is-number-object": "^1.0.3", + "is-string": "^1.0.4", + "is-symbol": "^1.0.2" + } + }, + "which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "requires": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + } + }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", @@ -4600,6 +5235,20 @@ "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", "dev": true }, + "which-typed-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.2.tgz", + "integrity": "sha512-KT6okrd1tE6JdZAy3o2VhMoYPh3+J6EMZLyrxBQsZflI1QCZIxMrIYLkosd8Twf+YfknVIHmYQPgJt238p8dnQ==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.2", + "es-abstract": "^1.17.5", + "foreach": "^2.0.5", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.1", + "is-typed-array": "^1.1.3" + } + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", diff --git a/package.json b/package.json index 57c55f5..3f0d035 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "files": [ "index.js", "resume.hbs", + "partials/*.hbs", "style.css" ], "scripts": { @@ -28,6 +29,7 @@ }, "devDependencies": { "eslint": "7.4.0", + "html-validate": "3.0.0", "husky": "4.2.5", "lint-staged": "10.2.11", "prettier": "2.0.5", diff --git a/partials/about.hbs b/partials/about.hbs new file mode 100644 index 0000000..ec2f569 --- /dev/null +++ b/partials/about.hbs @@ -0,0 +1,8 @@ +{{#summary}} +
+

About

+
+

{{.}}

+
+
+{{/summary}} diff --git a/partials/awards.hbs b/partials/awards.hbs new file mode 100644 index 0000000..7766aad --- /dev/null +++ b/partials/awards.hbs @@ -0,0 +1,27 @@ +{{#if resume.awards.length}} +
+

Awards

+
+ {{#each resume.awards}} +
+
+

{{title}}

+ {{#date}} + + {{/date}} +
+
+ {{#awarder}} +
+ Awarded by {{.}} +
+ {{/awarder}} +
+ {{#summary}} +

{{.}}

+ {{/summary}} +
+ {{/each}} +
+
+{{/if}} diff --git a/partials/contact.hbs b/partials/contact.hbs new file mode 100644 index 0000000..adc5f97 --- /dev/null +++ b/partials/contact.hbs @@ -0,0 +1,23 @@ +
+

Contact

+
+ {{#email}} +
+
Email
+ {{.}} +
+ {{/email}} + {{#phone}} +
+
Phone
+ {{.}} +
+ {{/phone}} + {{#url}} +
+
Website
+ {{.}} +
+ {{/url}} +
+
diff --git a/partials/education.hbs b/partials/education.hbs new file mode 100644 index 0000000..8123d88 --- /dev/null +++ b/partials/education.hbs @@ -0,0 +1,37 @@ +{{#if resume.education.length}} +
+

Education

+
+ {{#each resume.education}} +
+
+

{{institution}}

+ + – + {{#if endDate}}{{else}}Present{{/if}} + +
+
+ {{#area}} + {{.}} + {{/area}} + {{#url}} + {{.}} + {{/url}} +
+ {{#studyType}} +

{{.}}

+ {{/studyType}} + {{#if courses.length}} +
Courses
+
    + {{#courses}} +
  • {{.}}
  • + {{/courses}} +
+ {{/if}} +
+ {{/each}} +
+
+{{/if}} diff --git a/partials/header.hbs b/partials/header.hbs new file mode 100644 index 0000000..72f6d1c --- /dev/null +++ b/partials/header.hbs @@ -0,0 +1,8 @@ +
+ {{#name}} +

{{.}}

+ {{/name}} + {{#label}} +

{{.}}

+ {{/label}} +
diff --git a/partials/interests.hbs b/partials/interests.hbs new file mode 100644 index 0000000..47a7c53 --- /dev/null +++ b/partials/interests.hbs @@ -0,0 +1,21 @@ +{{#if resume.interests.length}} +
+

Interests

+
+ {{#each resume.interests}} +
+ {{#name}} +
{{.}}
+ {{/name}} + {{#if keywords.length}} +
    + {{#keywords}} +
  • {{.}}
  • + {{/keywords}} +
+ {{/if}} +
+ {{/each}} +
+
+{{/if}} diff --git a/partials/languages.hbs b/partials/languages.hbs new file mode 100644 index 0000000..969348c --- /dev/null +++ b/partials/languages.hbs @@ -0,0 +1,15 @@ +{{#if resume.languages.length}} +
+

Languages

+
+ {{#each resume.languages}} +
+ {{#language}} +
{{.}}
+ {{/language}} + {{fluency}} +
+ {{/each}} +
+
+{{/if}} diff --git a/partials/profiles.hbs b/partials/profiles.hbs new file mode 100644 index 0000000..fd3cd43 --- /dev/null +++ b/partials/profiles.hbs @@ -0,0 +1,25 @@ +{{#if profiles.length}} +
+

Profiles

+
+ {{#profiles}} +
+ {{#network}} +
{{.}}
+ {{/network}} + {{#if username}} + {{#if url}} + {{username}} + {{else}} + {{username}} + {{/if}} + {{else}} + {{#if url}} + {{url}} + {{/if}} + {{/if}} +
+ {{/profiles}} +
+
+{{/if}} diff --git a/partials/projects.hbs b/partials/projects.hbs new file mode 100644 index 0000000..9e695a1 --- /dev/null +++ b/partials/projects.hbs @@ -0,0 +1,40 @@ +{{#if resume.projects.length}} +
+

Projects

+
+ {{#each resume.projects}} +
+
+

{{name}}

+ + – + {{#if endDate}}{{else}}Present{{/if}} + +
+
+ + {{join roles}} + {{#entity}} + at {{.}} + {{/entity}} + + {{#url}} + {{.}} + {{/url}} +
+ {{#description}} +

{{.}}

+ {{/description}} + {{#if highlights.length}} +
Highlights
+
    + {{#highlights}} +
  • {{.}}
  • + {{/highlights}} +
+ {{/if}} +
+ {{/each}} +
+
+{{/if}} diff --git a/partials/publications.hbs b/partials/publications.hbs new file mode 100644 index 0000000..d4fad82 --- /dev/null +++ b/partials/publications.hbs @@ -0,0 +1,30 @@ +{{#if resume.publications.length}} +
+

Publications

+
+ {{#each resume.publications}} +
+
+

{{name}}

+ {{#releaseDate}} + + {{/releaseDate}} +
+
+ {{#publisher}} + + Published by {{.}} + + {{/publisher}} + {{#url}} + {{.}} + {{/url}} +
+ {{#summary}} +

{{.}}

+ {{/summary}} +
+ {{/each}} +
+
+{{/if}} diff --git a/partials/references.hbs b/partials/references.hbs new file mode 100644 index 0000000..eb043a3 --- /dev/null +++ b/partials/references.hbs @@ -0,0 +1,19 @@ +{{#if resume.references.length}} +
+

References

+
+ {{#each resume.references}} + {{#if reference}} +
+

{{reference}}

+ {{#name}} +

+ {{.}} +

+ {{/name}} +
+ {{/if}} + {{/each}} +
+
+{{/if}} diff --git a/partials/skills.hbs b/partials/skills.hbs new file mode 100644 index 0000000..8efab71 --- /dev/null +++ b/partials/skills.hbs @@ -0,0 +1,21 @@ +{{#if resume.skills.length}} +
+

Skills

+
+ {{#each resume.skills}} +
+ {{#name}} +
{{.}}
+ {{/name}} + {{#if keywords.length}} +
    + {{#keywords}} +
  • {{.}}
  • + {{/keywords}} +
+ {{/if}} +
+ {{/each}} +
+
+{{/if}} diff --git a/partials/volunteer.hbs b/partials/volunteer.hbs new file mode 100644 index 0000000..609fb24 --- /dev/null +++ b/partials/volunteer.hbs @@ -0,0 +1,37 @@ +{{#if resume.volunteer.length}} +
+

Volunteer

+
+ {{#each resume.volunteer}} +
+
+

{{organization}}

+ + – + {{#if endDate}}{{else}}Present{{/if}} + +
+
+ {{#position}} + {{.}} + {{/position}} + {{#url}} + {{.}} + {{/url}} +
+ {{#summary}} +

{{.}}

+ {{/summary}} + {{#if highlights.length}} +
Highlights
+
    + {{#highlights}} +
  • {{.}}
  • + {{/highlights}} +
+ {{/if}} +
+ {{/each}} +
+
+{{/if}} diff --git a/partials/work.hbs b/partials/work.hbs new file mode 100644 index 0000000..851dfe3 --- /dev/null +++ b/partials/work.hbs @@ -0,0 +1,37 @@ +{{#if resume.work.length}} +
+

Work

+
+ {{#each resume.work}} +
+
+

{{name}}

+ + – + {{#if endDate}}{{else}}Present{{/if}} + +
+
+ {{#position}} + {{.}} + {{/position}} + {{#url}} + {{.}} + {{/url}} +
+ {{#summary}} +

{{.}}

+ {{/summary}} + {{#if highlights.length}} +
Highlights
+
    + {{#highlights}} +
  • {{.}}
  • + {{/highlights}} +
+ {{/if}} +
+ {{/each}} +
+
+{{/if}} diff --git a/resume.hbs b/resume.hbs index e4fab93..fc76b8f 100644 --- a/resume.hbs +++ b/resume.hbs @@ -2,474 +2,29 @@ - {{#resume.basics}}{{name}}{{/resume.basics}} - + {{resume.basics.name}} + - - + - + {{#resume.basics}} + {{> header}} + {{> contact}} + {{> about}} + {{> profiles}} + {{/resume.basics}} -
- {{#resume.basics}} -
- -
-
- {{#email}} -
- Email - -
- {{/email}} - {{#phone}} -
- Phone -
- {{.}} -
-
- {{/phone}} - {{#url}} -
- Website -
- {{.}} -
-
- {{/url}} -
-
-
- {{#summary}} -
- -
-

{{.}}

-
-
- {{/summary}} - {{#if profiles.length}} -
- -
-
- {{#profiles}} -
- {{#network}} - {{.}} - {{/network}} - {{#if username}} -
- {{#if url}} - - {{else}} - {{username}} - {{/if}} -
- {{else}} - {{#if url}} -
- {{url}} -
- {{/if}} - {{/if}} -
- {{/profiles}} -
-
-
- {{/if}} - {{/resume.basics}} - - {{#if resume.work.length}} -
- -
-
- {{#each resume.work}} -
-

- {{name}} - - {{formatDate startDate}} — {{#if endDate}}{{formatDate endDate}}{{else}}Present{{/if}} - -

- {{#url}} -
- {{.}} -
- {{/url}} - {{#position}} -
- {{.}} -
- {{/position}} - {{#summary}} -
-

{{.}}

-
- {{/summary}} - {{#if highlights.length}} -

Highlights

-
    - {{#highlights}} -
  • {{.}}
  • - {{/highlights}} -
- {{/if}} -
- {{/each}} -
-
-
- {{/if}} - - {{#if resume.volunteer.length}} -
- -
-
- {{#each resume.volunteer}} -
-

- {{organization}} - - {{formatDate startDate}} — {{#if endDate}}{{formatDate endDate}}{{else}}Present{{/if}} - -

- {{#url}} -
- {{.}} -
- {{/url}} - {{#position}} -
- {{.}} -
- {{/position}} - {{#summary}} -
-

{{.}}

-
- {{/summary}} - {{#if highlights.length}} -

Highlights

-
    - {{#highlights}} -
  • {{.}}
  • - {{/highlights}} -
- {{/if}} -
- {{/each}} -
-
-
- {{/if}} - - {{#if resume.education.length}} -
- -
-
- {{#each resume.education}} -
-

- {{institution}} - - {{formatDate startDate}} — {{#if endDate}}{{formatDate endDate}}{{else}}Present{{/if}} - -

- {{#url}} -
- {{.}} -
- {{/url}} - {{#area}} -
- {{.}} -
- {{/area}} - {{#studyType}} -
- {{.}} -
- {{/studyType}} - {{#if courses.length}} -

Courses

-
    - {{#courses}} -
  • {{.}}
  • - {{/courses}} -
- {{/if}} -
- {{/each}} -
-
-
- {{/if}} - - {{#if resume.projects.length}} -
- -
-
- {{#each resume.projects}} -
-

- {{name}} - - {{formatDate startDate}} — {{#if endDate}}{{formatDate endDate}}{{else}}Present{{/if}} - -

- {{#url}} -
- {{.}} -
- {{/url}} -
- {{join roles}} - {{#entity}} - at - {{.}} - {{/entity}} -
- {{#description}} -
-

{{.}}

-
- {{/description}} - {{#if highlights.length}} -

Highlights

-
    - {{#highlights}} -
  • {{.}}
  • - {{/highlights}} -
- {{/if}} -
- {{/each}} -
-
-
- {{/if}} - - {{#if resume.awards.length}} -
- -
-
- {{#each resume.awards}} -
-

- {{title}} -

- {{#date}} -
- Awarded - {{formatDate .}} -
- {{/date}} - {{#awarder}} -
- by - {{.}} -
- {{/awarder}} - {{#summary}} -
- {{.}} -
- {{/summary}} -
- {{/each}} -
-
-
- {{/if}} - - {{#if resume.publications.length}} -
- -
-
- {{#each resume.publications}} -
-

- {{name}} - - {{releaseDate}} - -

- {{#url}} -
- {{.}} -
- {{/url}} - {{#publisher}} -
- Published by - {{.}} -
- {{/publisher}} - {{#summary}} -
-

{{.}}

-
- {{/summary}} -
- {{/each}} -
-
-
- {{/if}} - - {{#if resume.skills.length}} -
- -
-
- {{#each resume.skills}} -
- {{#name}} -
-

{{.}}

-
- {{/name}} - {{#if keywords.length}} -
    - {{#keywords}}
  • {{.}}
  • {{/keywords}} -
- {{/if}} -
- {{/each}} -
-
-
- {{/if}} - - {{#if resume.languages.length}} -
- -
-
- {{#each resume.languages}} -
- {{#language}} -
- {{.}} -
- {{/language}} - {{#fluency}} -
- {{.}} -
- {{/fluency}} -
- {{/each}} -
-
-
- {{/if}} - - {{#if resume.interests.length}} -
- -
-
- {{#each resume.interests}} -
- {{#name}} -
-

{{.}}

-
- {{/name}} - {{#if keywords.length}} -
    - {{#keywords}}
  • {{.}}
  • {{/keywords}} -
- {{/if}} -
- {{/each}} -
-
-
- {{/if}} - - {{#if resume.references.length}} -
- -
-
- {{#each resume.references}} -
- {{#if reference}} -
-

{{reference}}

- {{#name}} -

- — {{.}} -

- {{/name}} -
- {{/if}} -
- {{/each}} -
-
-
- {{/if}} -
+ {{> work}} + {{> volunteer}} + {{> education}} + {{> projects}} + {{> awards}} + {{> publications}} + {{> skills}} + {{> languages}} + {{> interests}} + {{> references}} diff --git a/style.css b/style.css index 4775e5b..62adff0 100644 --- a/style.css +++ b/style.css @@ -1,181 +1,209 @@ -@font-face { - font-family: 'Octicons'; - font-style: normal; - font-weight: normal; - src: url('data:font/woff;base64,d09GRgABAAAAAAWgAAsAAAAABVQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABCAAAAGAAAABgDxIMrGNtYXAAAAFoAAAAXAAAAFzxE/EEZ2FzcAAAAcQAAAAIAAAACAAAABBnbHlmAAABzAAAAXwAAAF8tFkZ3GhlYWQAAANIAAAANgAAADYYMkpraGhlYQAAA4AAAAAkAAAAJAfBA8dobXR4AAADpAAAABgAAAAYDAAAAWxvY2EAAAO8AAAADgAAAA4A5gBgbWF4cAAAA8wAAAAgAAAAIAAKAFBuYW1lAAAD7AAAAZIAAAGSxxxndHBvc3QAAAWAAAAAIAAAACAAAwAAAAMCqwGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAA8NcDwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEAEAAAAAMAAgAAgAEAAEAIPBS8Nf//f//AAAAAAAg8FLw1//9//8AAf/jD7IPLgADAAEAAAAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAwAIAAsAAGwAAEzQ3PgE3NjMyFx4BFxYVFAcOAQcGIyInLgEnJgAUFEYvLjU1Li9GFBQUFEYvLjU1Li9GFBQBwDUuL0YUFBQURi8uNTUuL0YUFBQURi8uAAMAAQCZA/8DDgAzAEEATQAAAQcFHgEVFAYHBQYiJyUVHgEVFAYHHgEdARQiPQE0NjcuATU0Njc1Jy4BNTQ2NyUyNjMyFgEXIxYyPwEVFAYjIiY1ExQWMzI2NTQmIyIGAgcBAekHCQkH/hcDBwP+xw4SBQQEBYAFBAQFEg5vBwkJBwHpAgMCAQT++vUBBgwF9ZZqapbBJhobJSUbGiYDDQGZAgwHCAwCmAEBYl0IHRIJEAcHEAmlGhqlCRAHBxAJER4IcSQCCwgICwKZAQH+s0wCAkygMDAwMAFADRMTDQ0TEwAAAAEAAAABAADtMnsXXw889QALBAAAAAAA2oqDMAAAAADaioMwAAAAAAP/Aw4AAAAIAAIAAAAAAAAAAQAAA8D/wAAABAAAAAAAA/8AAQAAAAAAAAAAAAAAAAAAAAYEAAAAAAAAAAAAAAACAAAAAgAAAAQAAAEAAAAAAAoAFAAeAEwAvgAAAAEAAAAGAE4AAwAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAOAK4AAQAAAAAAAQAIAAAAAQAAAAAAAgAHAGkAAQAAAAAAAwAIADkAAQAAAAAABAAIAH4AAQAAAAAABQALABgAAQAAAAAABgAIAFEAAQAAAAAACgAaAJYAAwABBAkAAQAQAAgAAwABBAkAAgAOAHAAAwABBAkAAwAQAEEAAwABBAkABAAQAIYAAwABBAkABQAWACMAAwABBAkABgAQAFkAAwABBAkACgA0ALBvY3RpY29ucwBvAGMAdABpAGMAbwBuAHNWZXJzaW9uIDEuMABWAGUAcgBzAGkAbwBuACAAMQAuADBvY3RpY29ucwBvAGMAdABpAGMAbwBuAHNvY3RpY29ucwBvAGMAdABpAGMAbwBuAHNSZWd1bGFyAFIAZQBnAHUAbABhAHJvY3RpY29ucwBvAGMAdABpAGMAbwBuAHNGb250IGdlbmVyYXRlZCBieSBJY29Nb29uLgBGAG8AbgB0ACAAZwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABJAGMAbwBNAG8AbwBuAC4AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA') - format('woff'); +:root { + /* Colors */ + --primaryColor: #212529; + --secondaryColor: #95a5a6; + --accentColor: #f1c40f; + --linkColor: #2ecc71; + --mutedColor: #f4f6f6; + + /* Typography */ + --ratio: 1.25; + --scale0: 1rem; + --scale1: calc(var(--scale0) * var(--ratio)); + --scale2: calc(var(--scale1) * var(--ratio)); + --scale3: calc(var(--scale2) * var(--ratio)); + --scale4: calc(var(--scale3) * var(--ratio)); + --scale5: calc(var(--scale4) * var(--ratio)); } + +* { + box-sizing: border-box; + margin: 0; + padding: 0; +} + html { font-size: 14px; } + body { - background: #fff; - font-family: Lato, sans-serif; - margin: 0 0 6rem; -} -a { - color: #2ecc71; -} -a:focus, -a:hover { - color: #f1c40f; - text-decoration: none; -} -section { - margin-top: 2rem; -} -li { - line-height: 1.8; - list-style: none; -} -li:before { - content: '\f052'; - float: left; - font: 13px Octicons; - margin-top: 6px; - margin-left: -20px; - opacity: 0.1; - position: absolute; -} -blockquote { - border-left: 5px solid #e7e9ec; - font-size: 1rem; - padding-left: 1rem; -} -em { - color: #95a5a6; - font-weight: normal; - font-style: normal; -} -h4 span:first-child { - font-weight: bold; -} -.container { - max-width: 750px; - padding: 0 2rem; -} -.col-sm-6 { - margin-bottom: 10px; -} -.col-sm-12 h4 { - margin-top: 1rem; -} -.col-sm-12 + .col-sm-12 { - margin-top: 2rem; -} -.keywords { - padding: 0; -} -.keywords > li { - display: inline-block; - background: #f4f6f6; - margin: 0 4px 4px 0; - padding: 2px 8px; -} -.keywords > li:before { - content: none; -} -#header { - background: #f4f6f6; - padding: 4rem 0; - margin-bottom: 4rem; -} -#header h2 { - color: #95a5a6; -} -#content h3 { - color: #f1c40f; -} -#content aside { - text-align: right; - padding-right: 2rem; -} -#work .position, -#volunteer .position { - font-weight: bold; - margin-bottom: 8px; -} -#education .area { - font-weight: bold; -} -#education .area:before { - content: '\f0d7'; - font: 16px Octicons; - margin-right: 6px; - vertical-align: bottom; -} -#education .studyType { - margin-left: 25px; -} -#awards .summary, -#publications .summary, -#projects .description { - margin-top: 8px; -} -#publications .website a:before { - content: attr(href); -} -#interests .row, -#skills .row { - display: block; -} -#interests .col-sm-6, -#skills .col-sm-6 { - float: left; + color: var(--primaryColor); + display: grid; + font: 1em/1.5 Lato, sans-serif; + gap: 2em; + grid-template-columns: + [full-start] + 1fr + [main-start side-start] + minmax(min-content, 12em) + [side-end content-start] + minmax(min-content, 36em) + [main-end content-end] + 1fr + [full-end]; + grid-template-rows: auto [content] 0; + margin-bottom: 4em; } -@media (min-width: 480px) { - .strike-through { - border-top: 1px solid #f4f6f6; - height: 20px; - margin-top: 12px; - margin-bottom: -2px; - position: relative; +body::before { + content: ''; + grid-column: full; + grid-row: content; +} + +ol, +ul { + padding-left: 1em; +} + +li + li { + margin-top: 0.2em; +} + +li::marker { + color: var(--mutedColor); +} + +a { + color: var(--linkColor); + text-decoration: none; + transition: color 0.2s; +} + +a:focus, +a:hover { + color: var(--accentColor); +} + +h1, +h2, +h3, +h5 { + font-weight: normal; +} + +h1, +h2, +h3 { + line-height: 1.2; +} + +h1 { + font-size: var(--scale5); +} + +h2 { + color: var(--secondaryColor); + font-size: var(--scale4); +} + +h3 { + color: var(--accentColor); + font-size: var(--scale3); + grid-column: side; + margin-bottom: 1rem; +} + +h4 { + font-size: var(--scale2); +} + +h5 { + font-size: var(--scale1); +} + +h6 { + font-size: var(--scale0); +} + +p:not(:first-child) { + margin-top: 1em; +} + +p:not(:last-child) { + margin-bottom: 1em; +} + +blockquote { + border-left: 0.2em solid var(--mutedColor); + padding-left: 1em; +} + +cite { + color: var(--secondaryColor); + font-style: inherit; +} + +cite::before { + content: '— '; +} + +header { + background: var(--mutedColor); + display: inherit; + gap: inherit; + grid-column: full; + grid-template-columns: inherit; + padding: 4em 0; + row-gap: 0; +} + +header > *, +section { + grid-column: main; +} + +.grid-list { + display: grid; + gap: 1em; +} + +.spaced-list { + display: flex; + align-items: center; + justify-content: space-between; +} + +.spaced-list:first-child::before { + border-bottom: 1px solid var(--mutedColor); + content: ''; + flex-grow: 1; + margin: 0 1em; + order: 1; +} + +.spaced-list > :nth-child(2) { + order: 2; +} + +.tag-list { + display: flex; + list-style: none; + padding: 0; +} + +.tag-list > li { + background: var(--mutedColor); + margin: 0 0.2em 0.2em 0; + padding: 0.2em 0.6em; +} + +@media (min-width: 48em) { + h3 { + text-align: right; + margin-bottom: inherit; } - .strike-through span, - .strike-through a { - background: #fff; - position: absolute; + + header > *, + section { + grid-column: content; } - .strike-through span:first-child { - padding-right: 20px; - margin-top: -12px; + + section { + display: contents; } - .strike-through span + span { - font-size: 1rem; - margin-top: -10px; - padding-left: 20px; - right: 0; - } -} -@media (max-width: 768px) { - .col-sm-6:last-child { - margin-bottom: 0; - } - #content aside { - margin-bottom: 20px; - padding-right: 0; - text-align: left; - } - #publications .website a:before { - content: 'View publication'; - } -} -@media (max-width: 480px) { - .date { - font-size: 1rem; - } - .strike-through span:first-child { - margin-bottom: 7px; - } - .strike-through span { - display: block; - } - #header { - margin-bottom: 10px; - padding: 40px 0; - } - #actions { - display: none; + + .grid-list { + grid-template-columns: 1fr 1fr; } } diff --git a/tap-snapshots/test-render.js-TAP.test.js b/tap-snapshots/test-render.js-TAP.test.js index 6141ed2..2d8b9c7 100644 --- a/tap-snapshots/test-render.js-TAP.test.js +++ b/tap-snapshots/test-render.js-TAP.test.js @@ -14,529 +14,447 @@ exports[`test/render.js TAP renders a resume > must match snapshot 1`] = ` - - + header > *, + section { + grid-column: content; + } + + section { + display: contents; + } + + .grid-list { + grid-template-columns: 1fr 1fr; + } +} + - - -
-
- -
-
-
- Email - -
-
- Phone -
- (912) 555-4321 -
-
- +
+

Richard Hendriks

+

Programmer

+
+
+

Contact

+
+ +
+
Phone
+ (912) 555-4321 +
+ +
+
+
+

About

+
+

Richard hails from Tulsa. He has earned degrees from the University of Oklahoma and Stanford. (Go Sooners and Cardinal!) Before starting Pied Piper, he worked for Hooli as a part time software developer. While his work focuses on applied information theory, mostly optimizing lossless compression schema of both the length-limited and adaptive variants, his non-work interests range widely, everything from quantum computing to chaos theory. He could tell you about it, but THAT would NOT be a “length-limited” conversation!

-
- -
-

Richard hails from Tulsa. He has earned degrees from the University of Oklahoma and Stanford. (Go Sooners and Cardinal!) Before starting Pied Piper, he worked for Hooli as a part time software developer. While his work focuses on applied information theory, mostly optimizing lossless compression schema of both the length-limited and adaptive variants, his non-work interests range widely, everything from quantum computing to chaos theory. He could tell you about it, but THAT would NOT be a “length-limited” conversation!

+
+

Profiles

+
+
+
Twitter
+ neutralthoughts +
+
+
SoundCloud
+ dandymusicnl +
+
+
+ +
+

Work

+
+
+
+

Pied Piper

+ + – + + +
+
+ CEO/President + http://piedpiper.example.com +
+

Pied Piper is a multi-platform technology based on a proprietary universal compression algorithm that has consistently fielded high Weisman Scores™ that are not merely competitive, but approach the theoretical limit of lossless compression.

+
Highlights
+
    +
  • Build an algorithm for artist to detect if their music was violating copy right infringement laws
  • +
  • Successfully won Techcrunch Disrupt
  • +
  • Optimized an algorithm that holds the current world record for Weisman Scores
  • +
-
-
- -
-
-
- Twitter -
- neutralthoughts -
-
-
- SoundCloud -
- -
+
+
+
+

Volunteer

+
+
+
+

CoderDojo

+ + – + + +
+ +

Global movement of free coding clubs for young people.

+
Highlights
+
    +
  • Awarded 'Teacher of the Month'
  • +
+
+
+
+
+

Education

+
+
+
+

University of Oklahoma

+ + – + + +
+
+ Information Technology + https://www.ou.edu/ +
+

Bachelor

+
Courses
+
    +
  • DB1101 - Basic SQL
  • +
  • CS2011 - Java Introduction
  • +
+
+
+
+
+

Projects

+
+
+
+

Miss Direction

+ + – + + +
+
+ + Team lead, Designer + at Smoogle + + missdirection.example.com +
+

A mapping engine that misguides you

+
Highlights
+
    +
  • Won award at AIHacks 2016
  • +
  • Built by all women team of newbie programmers
  • +
  • Using modern technologies such as GoogleMaps, Chrome Extension and Javascript
  • +
+
+
+
+
+

Awards

+
+
+
+

Digital Compression Pioneer Award

+ +
+
+
+ Awarded by Techcrunch
+

There is no spoon.

-
- -
- -
-
-
-

- Pied Piper - - Dec 2013 — Dec 2014 - -

- -
- CEO/President -
-
-

Pied Piper is a multi-platform technology based on a proprietary universal compression algorithm that has consistently fielded high Weisman Scores™ that are not merely competitive, but approach the theoretical limit of lossless compression.

-
-

Highlights

-
    -
  • Build an algorithm for artist to detect if their music was violating copy right infringement laws
  • -
  • Successfully won Techcrunch Disrupt
  • -
  • Optimized an algorithm that holds the current world record for Weisman Scores
  • -
-
+
+
+
+

Publications

+
+
+
+

Video compression for 3d media

+ +
+ +

Innovative middle-out compression algorithm that changes the way we store data.

-
-
- -
- -
-
-
-

- CoderDojo - - Jan 2012 — Jan 2013 - -

- -
- Teacher -
-
-

Global movement of free coding clubs for young people.

-
-

Highlights

-
    -
  • Awarded 'Teacher of the Month'
  • -
-
+
+
+
+

Skills

+
+
+
Web Development
+
    +
  • HTML
  • +
  • CSS
  • +
  • Javascript
  • +
-
-
- -
- -
-
-
-

- University of Oklahoma - - Jun 2011 — Jan 2014 - -

- -
- Information Technology -
-
- Bachelor -
-

Courses

-
    -
  • DB1101 - Basic SQL
  • -
  • CS2011 - Java Introduction
  • -
-
+
+
Compression
+
    +
  • Mpeg
  • +
  • MP4
  • +
  • GIF
  • +
-
-
- -
- -
-
-
-

- Miss Direction - - Aug 2016 — Aug 2016 - -

- -
- Team lead, Designer - at - Smoogle -
-
-

A mapping engine that misguides you

-
-

Highlights

-
    -
  • Won award at AIHacks 2016
  • -
  • Built by all women team of newbie programmers
  • -
  • Using modern technologies such as GoogleMaps, Chrome Extension and Javascript
  • -
-
+
+
+
+

Languages

+
+
+
English
+ Native speaker
-
-
- -
- -
-
-
-

- Digital Compression Pioneer Award -

-
- Awarded - Nov 2014 -
-
- by - Techcrunch -
-
- There is no spoon. -
-
+
+
+
+

Interests

+
+
+
Wildlife
+
    +
  • Ferrets
  • +
  • Unicorns
  • +
-
-
- -
- -
-
-
-

- Video compression for 3d media - - 2014-10-01 - -

- -
- Published by - Hooli -
-
-

Innovative middle-out compression algorithm that changes the way we store data.

-
-
-
-
-
- -
- -
-
-
-
-

Web Development

-
-
    -
  • HTML
  • CSS
  • Javascript
  • -
-
-
-
-

Compression

-
-
    -
  • Mpeg
  • MP4
  • GIF
  • -
-
-
-
-
- -
- -
-
-
-
- English -
-
- Native speaker -
-
-
-
-
- -
- -
-
-
-
-

Wildlife

-
-
    -
  • Ferrets
  • Unicorns
  • -
-
-
-
-
- -
- -
-
-
-
-

It is my pleasure to recommend Richard, his performance working as a consultant for Main St. Company proved that he will be a valuable addition to any company.

-

- — Erlich Bachman -

-
-
-
-
-
-
+
+
+
+

References

+
+
+

It is my pleasure to recommend Richard, his performance working as a consultant for Main St. Company proved that he will be a valuable addition to any company.

+

+ Erlich Bachman +

+
+
+
diff --git a/test/render.js b/test/render.js index 3e369ac..fb2c55d 100644 --- a/test/render.js +++ b/test/render.js @@ -1,4 +1,5 @@ const { test } = require('tap') +const { HtmlValidate } = require('html-validate') const { render } = require('..') const resume = require('../resume.json') @@ -7,3 +8,18 @@ test('renders a resume', t => { t.matchSnapshot(render(resume)) t.end() }) + +test('renders valid HTML', t => { + const htmlvalidate = new HtmlValidate({ + rules: { + 'void-style': ['error', { style: 'selfclosing' }], + }, + }) + + const { + results: [{ messages } = {}], + } = htmlvalidate.validateString(render(resume)) + + t.is(messages, undefined) + t.end() +})