diff --git a/.travis.yml b/.travis.yml old mode 100644 new mode 100755 diff --git a/DEVELOPER.md b/DEVELOPER.md old mode 100644 new mode 100755 index 9aaf081..0114793 --- a/DEVELOPER.md +++ b/DEVELOPER.md @@ -31,7 +31,9 @@ Your new resume will be now reachable at localhost:8080/#/resume/TEMPLATE-NAME.

-4. Generate previews with `npm run preview`. PDF- and PNG-files will be generated. +5. Export resumes as PDF with `npm run export`. Verify export of new template. + +4. Generate previews by converting PDF-files to PNG-files with `npm run preview`. 5. Add preview to `/src/pages/home.vue`: ```javascript @@ -73,7 +75,7 @@ All fonts are installed via npm. To add a new font, search for the associated np ## Export -Resumes are being exported with [Electroshot](https://github.com/mixu/electroshot). +Resumes are being exported with [Puppeteer](https://github.com/GoogleChrome/puppeteer). ### Box Shadows diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md old mode 100644 new mode 100755 diff --git a/LICENCE.md b/LICENCE.md old mode 100644 new mode 100755 diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md old mode 100644 new mode 100755 diff --git a/README.md b/README.md index e5ea50d..0823bab 100755 --- a/README.md +++ b/README.md @@ -68,8 +68,8 @@ Feel free to add your own templates, language supports, fix bugs or improve the This project uses several open source packages: * Vue +* Puppeteer * LESS -* Electroshot
diff --git a/build/webpack.prod.conf.js b/build/webpack.prod.conf.js old mode 100644 new mode 100755 diff --git a/node/app.js b/node/app.js index 9f29df1..d78bcee 100755 --- a/node/app.js +++ b/node/app.js @@ -1,7 +1,8 @@ +const puppeteer = require('puppeteer'); const fs = require('fs'); const path = require('path'); -const exec = require('child_process').exec; const Rx = require('rxjs/Rx'); +const isRoot = require('is-root'); const http = require('http'); const fetchResponse = () => { @@ -36,26 +37,28 @@ const timedOut = timeout => { }; const convert = async() => { + if(isRoot()) { + console.log('ERROR: Please run this without root (admin) permissions.'); + return; + } await waitForServerReachable().first().toPromise(); console.log('Connected to server ...'); console.log('Exporting ...'); try { const directories = getResumesFromDirectories(); - const scripts = directories.map(resume => electroshotScript(resume.path)); - await execBash(scripts.join(' && ')); + directories.forEach(async(dir) => { + const browser = await puppeteer.launch(); + const page = await browser.newPage(); + await page.goto('http://localhost:8080/#/resume/' + dir.name, {waitUntil: 'networkidle'}); + await page.pdf({path: path.join(__dirname, '../pdf/' + dir.name + '.pdf'), format: 'A4'}); + await browser.close(); + }); } catch (err) { throw new Error(err); } console.log('Finished exports.'); }; -const electroshotScript = resume => { - const dir = path.join(__dirname, '../pdf'); - return 'electroshot localhost:8080/#/resume/' + resume + - ' 2481x3508 --pdf-margin none --format pdf --out ' + dir + - ' --filename "' + resume + '.pdf" --pdf-background'; -}; - const getResumesFromDirectories = () => { const directories = getDirectories(); return directories @@ -74,14 +77,4 @@ const getDirectories = () => { .filter(file => file !== 'resumes.js' && file !== 'template.vue'); }; -const execBash = script => { - return new Promise((resolve, reject) => { - exec(script, - error => { - if (error) reject(error); - else resolve(); - }); - }); -}; - convert(); diff --git a/node/preview.js b/node/preview.js old mode 100644 new mode 100755 diff --git a/package.json b/package.json index 85955ea..7b27db5 100755 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "build": "node build/build.js", "start": "node build/dev-server.js", "pdf": "node node/app.js", - "preview": "npm run export && node node/preview.js", + "preview": "node node/preview.js", "template": "node node/template/template.js", "export": "concurrently \"npm run dev\" \"npm run pdf\" --success first --kill-others --raw", "lint": "eslint --ext .js,.vue src test/unit/specs test/e2e/specs" @@ -46,7 +46,6 @@ "copy-webpack-plugin": "^4.0.1", "cpx": "^1.5.0", "css-loader": "^0.28.0", - "electroshot": "^1.4.0", "eslint": "^4.6.1", "eslint-config-standard": "^10.2.1", "eslint-friendly-formatter": "^3.0.0", @@ -64,6 +63,7 @@ "html-webpack-plugin": "^2.30.1", "http": "0.0.0", "http-proxy-middleware": "^0.17.3", + "is-root": "^1.0.0", "less": "^2.7.2", "less-loader": "^4.0.5", "lolex": "^1.5.2", @@ -74,6 +74,7 @@ "pdf-image": "^1.1.0", "postcss": "^6.0.11", "postcss-cssnext": "^2.11.0", + "puppeteer": "^0.12.0", "rename": "^1.0.4", "request": "^2.81.0", "request-promise": "^4.2.1", @@ -94,7 +95,7 @@ "webpack-merge": "^4.1.0" }, "engines": { - "node": ">= 7.4.0", + "node": ">= 8.0.0", "npm": ">= 5.0.0" } } diff --git a/pdf/left-right.pdf b/pdf/left-right.pdf index 1632cdd..d6855e2 100644 Binary files a/pdf/left-right.pdf and b/pdf/left-right.pdf differ diff --git a/pdf/material-dark.pdf b/pdf/material-dark.pdf index d8a6689..27b3db0 100644 Binary files a/pdf/material-dark.pdf and b/pdf/material-dark.pdf differ diff --git a/pdf/oblique.pdf b/pdf/oblique.pdf index 9f3dbe7..4569fdf 100644 Binary files a/pdf/oblique.pdf and b/pdf/oblique.pdf differ diff --git a/pdf/purple.pdf b/pdf/purple.pdf index bf4b824..f98b3a6 100644 Binary files a/pdf/purple.pdf and b/pdf/purple.pdf differ diff --git a/pdf/side-bar-rtl.pdf b/pdf/side-bar-rtl.pdf index ced0b38..df2a4fb 100644 Binary files a/pdf/side-bar-rtl.pdf and b/pdf/side-bar-rtl.pdf differ diff --git a/pdf/side-bar.pdf b/pdf/side-bar.pdf index ed810f3..0a2b5ce 100644 Binary files a/pdf/side-bar.pdf and b/pdf/side-bar.pdf differ diff --git a/src/assets/logo.png b/src/assets/logo.png old mode 100644 new mode 100755 diff --git a/src/assets/preview/resume-left-right.png b/src/assets/preview/resume-left-right.png index fd43f21..940e3fd 100644 Binary files a/src/assets/preview/resume-left-right.png and b/src/assets/preview/resume-left-right.png differ diff --git a/src/assets/preview/resume-material-dark.png b/src/assets/preview/resume-material-dark.png index 09c7300..529829d 100644 Binary files a/src/assets/preview/resume-material-dark.png and b/src/assets/preview/resume-material-dark.png differ diff --git a/src/assets/preview/resume-oblique.png b/src/assets/preview/resume-oblique.png index 06bd610..48aebaa 100644 Binary files a/src/assets/preview/resume-oblique.png and b/src/assets/preview/resume-oblique.png differ diff --git a/src/assets/preview/resume-purple.png b/src/assets/preview/resume-purple.png index af77c18..406ff0a 100644 Binary files a/src/assets/preview/resume-purple.png and b/src/assets/preview/resume-purple.png differ diff --git a/src/assets/preview/resume-side-bar-rtl.png b/src/assets/preview/resume-side-bar-rtl.png index 31088a5..a074b4b 100644 Binary files a/src/assets/preview/resume-side-bar-rtl.png and b/src/assets/preview/resume-side-bar-rtl.png differ diff --git a/src/assets/preview/resume-side-bar.png b/src/assets/preview/resume-side-bar.png index d838249..96376f3 100644 Binary files a/src/assets/preview/resume-side-bar.png and b/src/assets/preview/resume-side-bar.png differ diff --git a/src/assets/profile-images/girl.png b/src/assets/profile-images/girl.png old mode 100644 new mode 100755 diff --git a/src/assets/profile-images/guy.png b/src/assets/profile-images/guy.png old mode 100644 new mode 100755 diff --git a/src/lang/cn.js b/src/lang/cn.js old mode 100644 new mode 100755 diff --git a/src/lang/de.js b/src/lang/de.js old mode 100644 new mode 100755 diff --git a/src/lang/en.js b/src/lang/en.js old mode 100644 new mode 100755 diff --git a/src/lang/es.js b/src/lang/es.js old mode 100644 new mode 100755 diff --git a/src/lang/fr.js b/src/lang/fr.js old mode 100644 new mode 100755 diff --git a/src/lang/he.js b/src/lang/he.js old mode 100644 new mode 100755 diff --git a/src/lang/hu.js b/src/lang/hu.js old mode 100644 new mode 100755 diff --git a/src/lang/id.js b/src/lang/id.js old mode 100644 new mode 100755 diff --git a/src/lang/it.js b/src/lang/it.js old mode 100644 new mode 100755 diff --git a/src/lang/ja.js b/src/lang/ja.js old mode 100644 new mode 100755 diff --git a/src/lang/nl.js b/src/lang/nl.js old mode 100644 new mode 100755 diff --git a/src/lang/pl.js b/src/lang/pl.js old mode 100644 new mode 100755 diff --git a/src/lang/pt-br.js b/src/lang/pt-br.js old mode 100644 new mode 100755 diff --git a/src/lang/pt.js b/src/lang/pt.js old mode 100644 new mode 100755 diff --git a/src/lang/ru.js b/src/lang/ru.js old mode 100644 new mode 100755 diff --git a/src/lang/sv.js b/src/lang/sv.js old mode 100644 new mode 100755 diff --git a/src/lang/th.js b/src/lang/th.js old mode 100644 new mode 100755 diff --git a/src/pages/chromeShadowFixer.js b/src/pages/chromeShadowFixer.js deleted file mode 100644 index ea74e73..0000000 --- a/src/pages/chromeShadowFixer.js +++ /dev/null @@ -1,49 +0,0 @@ - -const getElements = elements => { - if (elements && elements.length > 0) return elements; - elements = document.getElementsByTagName('*'); - let ret = []; - for (const element of elements) { - const style = window.getComputedStyle(element, null).getPropertyValue('box-shadow'); - if (style !== 'none') { - element.style.boxShadow = 'none'; - ret.push({ - shadow: style, - top: element.offsetTop + 'px', - left: element.offsetLeft + 'px', - width: element.getBoundingClientRect().width + 'px', - height: element.getBoundingClientRect().height + 'px' - }); - } - } - return ret; -}; - -const generateElements = elements => { - let ret = '
'; - elements.forEach((el, i) => (ret += '
')); - ret += '
'; - return ret; -}; - -export const fix = elements => { - const elementsWithShadows = getElements(elements); - if (elementsWithShadows.length < 1) { - console.warn('fixShadows(): No elements to fix shadows.'); - return; - } - const generatedElements = generateElements(elementsWithShadows); - document.body.innerHTML += generatedElements; - elementsWithShadows.forEach((el, i) => { - const element = document.querySelector('#chrome-shadow-fixer-' + i); - element.style.height = el.height; - element.style.width = el.width; - element.style.left = el.left; - element.style.top = el.top; - element.style.position = 'absolute'; - element.style.boxShadow = el.shadow; - element.style['-webkit-print-color-adjust'] = 'exact'; - element.style['-webkit-filter'] = 'opacity(1)'; - }); - return elementsWithShadows; -}; diff --git a/src/pages/resume.vue b/src/pages/resume.vue index a9f6414..33d5742 100755 --- a/src/pages/resume.vue +++ b/src/pages/resume.vue @@ -10,18 +10,9 @@ diff --git a/src/resumes/purple.vue b/src/resumes/purple.vue old mode 100644 new mode 100755 diff --git a/src/resumes/resumes.js b/src/resumes/resumes.js old mode 100644 new mode 100755 diff --git a/src/resumes/side-bar-rtl.vue b/src/resumes/side-bar-rtl.vue old mode 100644 new mode 100755 diff --git a/src/resumes/template.vue b/src/resumes/template.vue old mode 100644 new mode 100755