diff --git a/.eslintrc.js b/.eslintrc.js index c0a1784..91b24a9 100755 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -33,6 +33,7 @@ module.exports = { ], 'no-console': 'off', 'curly': ['error', 'multi-or-nest'], + 'space-before-function-paren': ['error', 'always'], 'no-var': 'error' } } diff --git a/.gitignore b/.gitignore index c612a44..dc17f79 100755 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ test/unit/coverage test/e2e/reports selenium-debug.log firefox_root/ +GeckoChildCrash* diff --git a/GeckoChildCrash6178.extra b/GeckoChildCrash6178.extra deleted file mode 100644 index 6fc2d9d..0000000 --- a/GeckoChildCrash6178.extra +++ /dev/null @@ -1 +0,0 @@ -MozCrashReason=MOZ_CRASH(Aborting on channel error.) diff --git a/GeckoChildCrash7205.extra b/GeckoChildCrash7205.extra deleted file mode 100644 index 6fc2d9d..0000000 --- a/GeckoChildCrash7205.extra +++ /dev/null @@ -1 +0,0 @@ -MozCrashReason=MOZ_CRASH(Aborting on channel error.) diff --git a/GeckoChildCrash8017.extra b/GeckoChildCrash8017.extra deleted file mode 100644 index 6fc2d9d..0000000 --- a/GeckoChildCrash8017.extra +++ /dev/null @@ -1 +0,0 @@ -MozCrashReason=MOZ_CRASH(Aborting on channel error.) diff --git a/GeckoChildCrash9214.extra b/GeckoChildCrash9214.extra deleted file mode 100644 index 6fc2d9d..0000000 --- a/GeckoChildCrash9214.extra +++ /dev/null @@ -1 +0,0 @@ -MozCrashReason=MOZ_CRASH(Aborting on channel error.) diff --git a/electroshot-config.json b/electroshot-config.json new file mode 100644 index 0000000..bb2d337 --- /dev/null +++ b/electroshot-config.json @@ -0,0 +1 @@ +[{"url":"http://localhost:8080/#/resume-material-dark","delay":0,"selector":"","zoom-factor":1,"format":"pdf","quality":75,"user-agent":"","latency":null,"download":null,"upload":null,"css":"","js":"","debug":false,"root":"","pdf":{"pageSize":"A4","marginsType":1,"printBackground":true,"landscape":false},"size":{"width":2481,"height":3508},"out":"/home/s/workspace/pdf/resume-material-dark.pdf"}] \ No newline at end of file diff --git a/node/ResumeToPdf.js b/node/ResumeToPdf.js new file mode 100644 index 0000000..b6b996d --- /dev/null +++ b/node/ResumeToPdf.js @@ -0,0 +1,28 @@ +const path = require('path'); +const Util = require('./Util'); +const ResumeToPdf = { + /** + * generates electroshot command for screenshoting resume + * @param {string} resume resume name in URL + * @return {string} electroshot command + */ + electroshotScript: resume => { + const dir = path.join(__dirname, '../../pdf'); + return 'electroshot localhost:8080/#/' + resume + + ' 2481x3508 --pdf-margin none --format pdf --out ' + dir + + ' --filename "' + resume + '.pdf" --pdf-background; '; + }, + /** + * converts resumes to pdf + * @return {Promise} + */ + convert: async() => { + const directories = Util.getResumesFromDirectories(); + let script = ''; + directories.forEach(resume => (script += ResumeToPdf.electroshotScript(resume.path))); + script = script.substring(0, script.length - 2); + await Util.execBash(script); + } +}; + +module.exports = ResumeToPdf; diff --git a/node/Server.js b/node/Server.js new file mode 100644 index 0000000..387e88a --- /dev/null +++ b/node/Server.js @@ -0,0 +1,15 @@ +const request = require('request-promise'); + +const PORT = 8080; +const Server = { + /** + * kills express app + */ + kill: () => { + request.get('http://localhost:' + PORT + '/kill') + .catch(error => { + if (error) return false; + }); + } +}; +module.exports = Server; diff --git a/node/Util.js b/node/Util.js new file mode 100644 index 0000000..87fe237 --- /dev/null +++ b/node/Util.js @@ -0,0 +1,83 @@ +const path = require('path'); +const writeFile = require('write'); +const fs = require('fs'); +const exec = require('child_process').exec; + +const Util = { + /** + * gets directories starting with 'resume-' + * @return {[]} + */ + getDirectories: () => { + const srcpath = path.join(__dirname, '../src/components'); + return fs.readdirSync(srcpath) + .filter(file => file.includes('resume-')); + }, + /** + * gets resumes names and paths from directories + * @return {Object[]} array with resumes object {path: '', name: ''} + */ + getResumesFromDirectories: () => { + const directories = Util.getDirectories(); + return directories + .filter(dir => dir.includes('resume-') && dir !== 'resume-XX') + .map(dir => { + let name = dir.replace('resume-', ''); + return { + path: dir.replace('.vue', ''), + name: name.replace('-', ' ') + }; + }); + }, + /** + * setTimeout as Promise + * @param {number} time time in ms + * @return {Promise} + */ + setTimeout: time => { + return new Promise(resolve => setTimeout(resolve, time)); + }, + /** + * reads file of content + * @param {string} dir directory + * @return {Promise} + */ + readFileContent: dir => { + return new Promise((resolve, reject) => { + fs.readFile(dir, 'utf8', (err, template) => { + if (err) reject(err); + else resolve(template); + }); + }); + }, + /** + * writes content to given file + * @param {string} dir directory + * @param {string} content content of file + * @return {Promise} + */ + writeFile: async (dir, content) => { + return new Promise((resolve, reject) => { + writeFile(dir, content, (err) => { + if (err) reject(err); + resolve(); + }); + }); + }, + /** + * executes command + * @param {string} script e.g. 'echo "Hello World"' + * @return {Promise} + */ + execBash: script => { + return new Promise((resolve, reject) => { + exec(script, + error => { + if (error) reject(error); + else resolve(); + }); + }); + } +}; + +module.exports = Util; diff --git a/node/app.js b/node/app.js new file mode 100644 index 0000000..36b0c59 --- /dev/null +++ b/node/app.js @@ -0,0 +1,2 @@ +const ResumeToPdf = require('./ResumeToPdf'); +ResumeToPdf.convert(); diff --git a/old/GruntfilePdf.js b/old/GruntfilePdf.js index 2ac1212..0ec089f 100755 --- a/old/GruntfilePdf.js +++ b/old/GruntfilePdf.js @@ -1,23 +1,23 @@ -module.exports = function(grunt) { - grunt.loadNpmTasks('grunt-exec'); - require('load-grunt-tasks')(grunt); - grunt.initConfig({ - babel: { - options: { - sourceMap: true, - presets: ['es2015'] - }, - dist: { - files: { - 'public/js/gen/javascript.js': 'public/js/javascript.js' - } - } - }, - exec: { - less: 'node --harmony-async-await src/app.js less', - pdf: 'node --harmony-async-await src/app.js pdf' +module.exports = function (grunt) { + grunt.loadNpmTasks('grunt-exec'); + require('load-grunt-tasks')(grunt); + grunt.initConfig({ + babel: { + options: { + sourceMap: true, + presets: ['es2015'] + }, + dist: { + files: { + 'public/js/gen/javascript.js': 'public/js/javascript.js' } - }); + } + }, + exec: { + less: 'node --harmony-async-await src/app.js less', + pdf: 'node --harmony-async-await src/app.js pdf' + } + }); - grunt.registerTask('default', ['babel', 'exec:less', 'exec:pdf']); + grunt.registerTask('default', ['babel', 'exec:less', 'exec:pdf']); }; diff --git a/package.json b/package.json index 80b1100..445e003 100755 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "scripts": { "dev": "node build/dev-server.js", "start": "node build/dev-server.js", + "pdf": "node --harmony-async-await node/app.js", "build": "node build/build.js", "unit": "cross-env BABEL_ENV=test karma start test/unit/karma.conf.js --single-run", "e2e": "node test/e2e/runner.js", @@ -26,19 +27,25 @@ "babel-core": "^6.22.1", "babel-eslint": "^7.1.1", "babel-loader": "^6.2.10", + "babel-plugin-istanbul": "^4.1.1", "babel-plugin-transform-runtime": "^6.22.0", "babel-preset-env": "^1.3.2", "babel-preset-stage-2": "^6.22.0", "babel-register": "^6.22.0", + "chai": "^3.5.0", "chalk": "^1.1.3", + "chromedriver": "^2.27.2", "connect-history-api-fallback": "^1.3.0", "copy-webpack-plugin": "^4.0.1", + "cross-env": "^4.0.0", + "cross-spawn": "^5.0.1", "css-loader": "^0.28.0", + "electroshot": "^1.3.0", "eslint": "^3.19.0", + "eslint-config-standard": "^6.2.1", "eslint-friendly-formatter": "^2.0.7", "eslint-loader": "^1.7.1", "eslint-plugin-html": "^2.0.0", - "eslint-config-standard": "^6.2.1", "eslint-plugin-promise": "^3.4.0", "eslint-plugin-standard": "^2.0.1", "eventsource-polyfill": "^0.9.6", @@ -48,8 +55,7 @@ "friendly-errors-webpack-plugin": "^1.1.3", "html-webpack-plugin": "^2.28.0", "http-proxy-middleware": "^0.17.3", - "webpack-bundle-analyzer": "^2.2.1", - "cross-env": "^4.0.0", + "inject-loader": "^3.0.0", "karma": "^1.4.1", "karma-coverage": "^1.1.1", "karma-mocha": "^1.3.0", @@ -61,27 +67,24 @@ "karma-webpack": "^2.0.2", "lolex": "^1.5.2", "mocha": "^3.2.0", - "chai": "^3.5.0", - "sinon": "^2.1.0", - "sinon-chai": "^2.8.0", - "inject-loader": "^3.0.0", - "babel-plugin-istanbul": "^4.1.1", - "phantomjs-prebuilt": "^2.1.14", - "chromedriver": "^2.27.2", - "cross-spawn": "^5.0.1", "nightwatch": "^0.9.12", - "selenium-server": "^3.0.1", - "semver": "^5.3.0", - "shelljs": "^0.7.6", "opn": "^4.0.2", "optimize-css-assets-webpack-plugin": "^1.3.0", "ora": "^1.2.0", + "phantomjs-prebuilt": "^2.1.14", + "request-promise": "^4.2.1", "rimraf": "^2.6.0", + "selenium-server": "^3.0.1", + "semver": "^5.3.0", + "shelljs": "^0.7.6", + "sinon": "^2.1.0", + "sinon-chai": "^2.8.0", "url-loader": "^0.5.8", "vue-loader": "^11.3.4", "vue-style-loader": "^2.0.5", "vue-template-compiler": "^2.2.6", "webpack": "^2.3.3", + "webpack-bundle-analyzer": "^2.2.1", "webpack-dev-middleware": "^1.10.0", "webpack-hot-middleware": "^2.18.0", "webpack-merge": "^4.1.0" diff --git a/src/components/resume-material-dark.vue b/src/components/resume-material-dark.vue index 393abfc..a1dc236 100755 --- a/src/components/resume-material-dark.vue +++ b/src/components/resume-material-dark.vue @@ -79,16 +79,16 @@
- {{experience.description}} -
-- {{education.timeperiod}}, {{education.description}} + {{experience.description}}
+ {{education.timeperiod}}, {{education.description}} +
+