Merge branch 'master' of https://github.com/salomonelli/best-resume-ever into oblique-rtl

This commit is contained in:
Liel Fridman 2017-12-16 15:35:27 +02:00
commit dec5450fc1
38 changed files with 276 additions and 324 deletions

View File

@ -35,6 +35,12 @@
<br> <br>
<br> <br>
## Prerequisite
1. It is required to have NodeJs with version 8.5 or higher
2. If you do not have installed node.js in your machine then go to [this link](https://nodejs.org/en/download/) in order to install node.
## How to use ## How to use
best-resume-ever requires at least node v.8.5.0. best-resume-ever requires at least node v.8.5.0.

View File

@ -12,6 +12,7 @@ var webpackConfig = process.env.NODE_ENV === 'testing'
? require('./webpack.prod.conf') ? require('./webpack.prod.conf')
: require('./webpack.dev.conf') : require('./webpack.dev.conf')
// default port where dev server listens for incoming traffic // default port where dev server listens for incoming traffic
var port = process.env.PORT || config.dev.port var port = process.env.PORT || config.dev.port
// automatically open browser, if not set will be false // automatically open browser, if not set will be false

View File

@ -31,12 +31,6 @@ var webpackConfig = merge(baseWebpackConfig, {
new webpack.DefinePlugin({ new webpack.DefinePlugin({
'process.env': env 'process.env': env
}), }),
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false
},
sourceMap: true
}),
// extract css into its own file // extract css into its own file
new ExtractTextPlugin({ new ExtractTextPlugin({
filename: utils.assetsPath('css/[name].[contenthash].css') filename: utils.assetsPath('css/[name].[contenthash].css')
@ -87,14 +81,6 @@ var webpackConfig = merge(baseWebpackConfig, {
name: 'manifest', name: 'manifest',
chunks: ['vendor'] chunks: ['vendor']
}), }),
// copy custom static assets
new CopyWebpackPlugin([
{
from: path.resolve(__dirname, '../static'),
to: config.build.assetsSubDirectory,
ignore: ['.*']
}
])
] ]
}) })

View File

@ -24,7 +24,7 @@ module.exports = {
dev: { dev: {
env: require('./dev.env'), env: require('./dev.env'),
port: 8080, port: 8080,
autoOpenBrowser: true, autoOpenBrowser: false,
assetsSubDirectory: 'static', assetsSubDirectory: 'static',
assetsPublicPath: '/', assetsPublicPath: '/',
proxyTable: {}, proxyTable: {},

View File

@ -17,10 +17,11 @@
"pdf": "node scripts/export.js", "pdf": "node scripts/export.js",
"preview": "node scripts/preview.js", "preview": "node scripts/preview.js",
"test:deleteFiles": "node test/scripts/deleteFiles.js", "test:deleteFiles": "node test/scripts/deleteFiles.js",
"test:e2e": "concurrently \"npm run dev\" \"testcafe chromium test/\" --success first --kill-others --raw", "test:cafe": "testcafe chromium test/",
"test:e2e": "concurrently \"npm run dev\" \"npm run test:cafe\" --success first --kill-others --raw",
"test:export": "SCRIPT=export npm run test:deleteFiles && npm run export && mocha test/scripts/export.js", "test:export": "SCRIPT=export npm run test:deleteFiles && npm run export && mocha test/scripts/export.js",
"test:preview": "SCRIPT=preview npm run test:deleteFiles && npm run export && npm run preview && mocha test/scripts/preview.js", "test:preview": "SCRIPT=preview npm run test:deleteFiles && npm run export && npm run preview && mocha test/scripts/preview.js",
"test:docs": "npm run docs && concurrently \"npm run docs:serve\" \"testcafe chromium test/\" --success first --kill-others --raw", "test:docs": "npm run docs && concurrently \"npm run docs:serve\" \"npm run test:cafe\" --success first --kill-others --raw",
"test": "npm run test:export && npm run test:preview && npm run test:docs && npm run test:e2e", "test": "npm run test:export && npm run test:preview && npm run test:docs && npm run test:e2e",
"export": "concurrently \"npm run dev\" \"npm run pdf\" --success first --kill-others --raw", "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" "lint": "eslint --ext .js,.vue src test/unit/specs test/e2e/specs"
@ -35,48 +36,48 @@
"raleway-webfont": "3.0.1", "raleway-webfont": "3.0.1",
"roboto-fontface": "0.8.0", "roboto-fontface": "0.8.0",
"source-sans-pro": "2.0.10", "source-sans-pro": "2.0.10",
"vue": "2.5.2", "vue": "2.5.11",
"vue-router": "3.0.1" "vue-router": "3.0.1"
}, },
"devDependencies": { "devDependencies": {
"autoprefixer": "7.1.6", "autoprefixer": "7.2.3",
"babel-cli": "6.26.0", "babel-cli": "6.26.0",
"babel-core": "6.26.0", "babel-core": "6.26.0",
"babel-eslint": "8.0.1", "babel-eslint": "8.0.3",
"babel-loader": "7.1.2", "babel-loader": "7.1.2",
"babel-plugin-transform-runtime": "6.23.0", "babel-plugin-transform-runtime": "6.23.0",
"babel-preset-env": "1.6.1", "babel-preset-env": "1.6.1",
"babel-preset-stage-2": "6.24.1", "babel-preset-stage-2": "6.24.1",
"babel-register": "6.26.0", "babel-register": "6.26.0",
"chalk": "2.2.2", "chalk": "2.3.0",
"check-node-version": "2.1.0", "check-node-version": "3.1.1",
"concurrently": "3.5.0", "concurrently": "3.5.1",
"connect-history-api-fallback": "1.4.0", "connect-history-api-fallback": "1.5.0",
"copy-webpack-plugin": "4.2.0", "copy-webpack-plugin": "4.3.0",
"cpx": "1.5.0", "cpx": "1.5.0",
"css-loader": "0.28.7", "css-loader": "0.28.7",
"escope": "3.6.0", "escope": "3.6.0",
"eslint": "4.11.0", "eslint": "4.13.1",
"eslint-config-standard": "10.2.1", "eslint-config-standard": "10.2.1",
"eslint-friendly-formatter": "3.0.0", "eslint-friendly-formatter": "3.0.0",
"eslint-loader": "1.9.0", "eslint-loader": "1.9.0",
"eslint-plugin-html": "3.2.2", "eslint-plugin-html": "4.0.1",
"eslint-plugin-import": "2.8.0", "eslint-plugin-import": "2.8.0",
"eslint-plugin-node": "5.2.1", "eslint-plugin-node": "5.2.1",
"eslint-plugin-promise": "3.6.0", "eslint-plugin-promise": "3.6.0",
"eslint-plugin-standard": "3.0.1", "eslint-plugin-standard": "3.0.1",
"eventsource-polyfill": "0.9.6", "eventsource-polyfill": "0.9.6",
"express": "4.16.2", "express": "4.16.2",
"extract-text-webpack-plugin": "3.0.1", "extract-text-webpack-plugin": "3.0.2",
"file-loader": "1.1.5", "file-loader": "1.1.5",
"friendly-errors-webpack-plugin": "1.6.1", "friendly-errors-webpack-plugin": "1.6.1",
"html-webpack-plugin": "2.30.1", "html-webpack-plugin": "2.30.1",
"http": "0.0.0", "http": "0.0.0",
"http-proxy-middleware": "0.17.4", "http-proxy-middleware": "0.17.4",
"less": "2.7.2", "less": "2.7.3",
"less-loader": "4.0.5", "less-loader": "4.0.5",
"local-web-server": "2.2.4", "local-web-server": "2.3.0",
"lolex": "2.2.0", "lolex": "2.3.1",
"mocha": "4.0.1", "mocha": "4.0.1",
"mv": "2.1.1", "mv": "2.1.1",
"opn": "5.1.0", "opn": "5.1.0",
@ -85,25 +86,26 @@
"pdf-image": "1.1.0", "pdf-image": "1.1.0",
"postcss": "6.0.14", "postcss": "6.0.14",
"postcss-cssnext": "3.0.2", "postcss-cssnext": "3.0.2",
"puppeteer": "0.12.0", "puppeteer": "0.13.0",
"rename": "1.0.4", "rename": "1.0.4",
"request": "2.83.0", "request": "2.83.0",
"request-promise": "4.2.2", "request-promise": "4.2.2",
"rimraf": "2.6.2", "rimraf": "2.6.2",
"rx": "4.1.0", "rx": "4.1.0",
"rxjs": "5.5.2", "rxjs": "5.5.5",
"semver": "5.4.1", "semver": "5.4.1",
"shelljs": "0.7.8", "shelljs": "0.7.8",
"testcafe": "0.18.1", "testcafe": "0.17.1",
"testcafe-hammerhead": "11.2.1",
"url-exists": "1.0.3", "url-exists": "1.0.3",
"url-loader": "0.6.2", "url-loader": "0.6.2",
"vue-loader": "13.4.0", "vue-loader": "13.6.0",
"vue-style-loader": "3.0.3", "vue-style-loader": "3.0.3",
"vue-template-compiler": "2.5.2", "vue-template-compiler": "2.5.11",
"webpack": "3.8.1", "webpack": "3.10.0",
"webpack-bundle-analyzer": "2.9.0", "webpack-bundle-analyzer": "2.9.1",
"webpack-dev-middleware": "1.12.0", "webpack-dev-middleware": "2.0.1",
"webpack-hot-middleware": "2.20.0", "webpack-hot-middleware": "2.21.0",
"webpack-merge": "4.1.1" "webpack-merge": "4.1.1"
}, },
"engines": { "engines": {

View File

@ -3,11 +3,12 @@ const fs = require('fs');
const path = require('path'); const path = require('path');
const Rx = require('rxjs/Rx'); const Rx = require('rxjs/Rx');
const http = require('http'); const http = require('http');
const config = require('../config');
const fetchResponse = () => { const fetchResponse = () => {
return new Promise((res, rej) => { return new Promise((res, rej) => {
try { try {
const req = http.request('http://localhost:8080/#/', response => res(response.statusCode)); const req = http.request(`http://localhost:${config.dev.port}/#/`, response => res(response.statusCode));
req.on('error', (err) => rej(err)); req.on('error', (err) => rej(err));
req.end(); req.end();
} catch (err) { } catch (err) {
@ -19,7 +20,7 @@ const fetchResponse = () => {
const waitForServerReachable = () => { const waitForServerReachable = () => {
return Rx.Observable return Rx.Observable
.interval(1000) .interval(1000)
.mergeMap(async() => { .mergeMap(async () => {
try { try {
const statusCode = await fetchResponse(); const statusCode = await fetchResponse();
if (statusCode === 200) return true; if (statusCode === 200) return true;
@ -35,17 +36,24 @@ const timedOut = timeout => {
}); });
}; };
const convert = async() => { const convert = async () => {
await waitForServerReachable().first().toPromise(); await waitForServerReachable().first().toPromise();
console.log('Connected to server ...'); console.log('Connected to server ...');
console.log('Exporting ...'); console.log('Exporting ...');
try { try {
const directories = getResumesFromDirectories(); const directories = getResumesFromDirectories();
directories.forEach(async(dir) => { directories.forEach(async (dir) => {
const browser = await puppeteer.launch({args: ['--no-sandbox']}); const browser = await puppeteer.launch({
args: ['--no-sandbox']
});
const page = await browser.newPage(); const page = await browser.newPage();
await page.goto('http://localhost:8080/#/resume/' + dir.name, {waitUntil: 'networkidle', networkIdleTimeout: 5E3}); await page.goto(`http://localhost:${config.dev.port}/#/resume/` + dir.name, {
await page.pdf({path: path.join(__dirname, '../pdf/' + dir.name + '.pdf'), format: 'A4'}); waitUntil: 'networkidle2'
});
await page.pdf({
path: path.join(__dirname, '../pdf/' + dir.name + '.pdf'),
format: 'A4'
});
await browser.close(); await browser.close();
}); });
} catch (err) { } catch (err) {

View File

@ -1,11 +1,8 @@
/* eslint-disable */ const lang = {
const ca = { contact: 'Contacte',
headings: { experience: 'Experiència',
contact: 'Contacte', education: 'Educació',
experience: 'Experiència', skills: 'Habilitats',
education: 'Educació', about: 'Sobre mi'
skills: 'Habilitats',
about: 'Sobre mi'
}
}; };
export default ca; export default lang;

View File

@ -1,11 +1,8 @@
/* eslint-disable */ const lang = {
const cn = { contact: '联系方式',
headings: { experience: '工作经历',
contact: '联系方式', education: '教育经历',
experience: '工作经历', skills: '技能专长',
education: '教育经历', about: '自我介绍'
skills: '技能专长',
about: '自我介绍'
}
}; };
export default cn; export default lang;

View File

@ -1,11 +1,10 @@
/* eslint-disable */ const lang = {
const de = { contact: 'Kontakt',
headings: { born: 'Geboren',
contact: 'Kontakt', bornIn: 'in',
experience: 'Berufserfahrung', experience: 'Berufserfahrung',
education: 'Schulbildung', education: 'Schulbildung',
skills: 'Qualifikationen', skills: 'Qualifikationen',
about: 'Über mich' about: 'Über mich'
}
}; };
export default de; export default lang;

View File

@ -1,11 +1,8 @@
/* eslint-disable */ const lang = {
const el = { contact: 'Επικοινωνία',
headings: { experience: 'Επαγγελματική εμπειρία',
contact: 'Επικοινωνία', education: 'Εκπαίδευση',
experience: 'Επαγγελματική εμπειρία', skills: 'Δεξιότητες',
education: 'Εκπαίδευση', about: 'Σχετικά με εμένα'
skills: 'Δεξιότητες',
about: 'Σχετικά με εμένα'
}
}; };
export default el; export default lang;

View File

@ -1,11 +1,10 @@
/* eslint-disable */ const lang = {
const en = { contact: 'Contact',
headings: { born: 'Born',
contact: 'Contact', bornIn: 'in',
experience: 'Experience', experience: 'Experience',
education: 'Education', education: 'Education',
skills: 'Skills', skills: 'Skills',
about: 'About me' about: 'About me'
}
}; };
export default en; export default lang;

View File

@ -1,11 +1,8 @@
/* eslint-disable */ const lang = {
const es = { contact: 'Contacto',
headings: { experience: 'Experiencia',
contact: 'Contacto', education: 'Educación',
experience: 'Experiencia', skills: 'Habilidades',
education: 'Educación', about: 'Sobre mi'
skills: 'Habilidades',
about: 'Sobre mi'
}
}; };
export default es; export default lang;

View File

@ -1,11 +1,8 @@
/* eslint-disable */ const lang = {
const fr = { contact: 'Contact',
headings: { experience: 'Expérience professionelle',
contact: 'Contact', education: 'Formation',
experience: 'Expérience professionelle', skills: 'Compétences',
education: 'Formation', about: 'À propos de moi'
skills: 'Compétences',
about: 'À propos de moi'
}
}; };
export default fr; export default lang;

View File

@ -1,11 +1,8 @@
/* eslint-disable */ const lang = {
const he = { contact: 'יצירת קשר',
headings: { experience: 'ניסיון',
contact: 'יצירת קשר', education: 'השכלה',
experience: 'ניסיון', skills: 'כישורים',
education: 'השכלה', about: 'תמצית'
skills: 'כישורים',
about: 'תמצית'
}
}; };
export default he; export default lang;

View File

@ -1,11 +1,8 @@
/* eslint-disable */ const lang = {
const hu = { contact: 'Kapcsolat',
headings: { experience: 'Munkatapasztalat',
contact: 'Kapcsolat', education: 'Tanulmány',
experience: 'Munkatapasztalat', skills: 'Készségek',
education: 'Tanulmány', about: 'Rólam'
skills: 'Készségek',
about: 'Rólam'
}
}; };
export default hu; export default lang;

View File

@ -1,11 +1,8 @@
/* eslint-disable */ const lang = {
const id = { contact: 'Kontak',
headings: { experience: 'Pengalaman',
contact: "Kontak", education: 'Pendidikan',
experience: "Pengalaman", skills: 'Keterampilan',
education: "Pendidikan", about: 'Tentang Saya'
skills: "Keterampilan", };
about: "Tentang Saya" export default lang;
}
};
export default id;

View File

@ -1,11 +1,8 @@
/* eslint-disable */ const lang = {
const it = { contact: 'Contatti',
headings: { experience: 'Esperienza professionale',
contact: 'Contatti', education: 'Formazione',
experience: 'Esperienza professionale', skills: 'Competenze',
education: 'Formazione', about: 'Su di me'
skills: 'Competenze',
about: 'Su di me'
}
}; };
export default it; export default lang;

View File

@ -1,11 +1,8 @@
/* eslint-disable */ const lang = {
const jp = { contact: '連絡先',
headings: { experience: '職務経歴',
contact: '連絡先', education: '学歴',
experience: '職務経歴', skills: 'スキル',
education: '学歴', about: '自己紹介'
skills: 'スキル',
about: '自己紹介'
}
}; };
export default jp; export default lang;

View File

@ -1,11 +1,8 @@
/* eslint-disable */ const lang = {
const ka = { contact: 'კონტაქტი',
headings: { experience: 'გამოცდილება',
contact: 'კონტაქტი', education: 'განათლება',
experience: 'გამოცდილება', skills: 'უნარები',
education: 'განათლება', about: 'ჩემ შესახებ'
skills: 'უნარები',
about: 'ჩემ შესახებ'
}
}; };
export default ka; export default lang;

View File

@ -1,11 +1,8 @@
/* eslint-disable */ const lang = {
const ko = { contact: '연락처',
headings: { experience: '경력',
contact: "연락처", education: '학력',
experience: "경력", skills: '보유스킬',
education: "학력", about: '자기소개'
skills: "보유스킬", };
about: "자기소개" export default lang;
}
};
export default ko;

View File

@ -1,11 +1,8 @@
/* eslint-disable */ const lang = {
const lt = { contact: 'Kontaktai',
headings: { experience: 'Patirtis',
contact: 'Kontaktai', education: 'Išsilavinimas',
experience: 'Patirtis', skills: 'Įgūdžiai',
education: 'Išsilavinimas', about: 'Apie mane'
skills: 'Įgūdžiai',
about: 'Apie mane'
}
}; };
export default lt; export default lang;

View File

@ -1,11 +1,8 @@
/* eslint-disable */ const lang = {
const nl = { contact: 'Contact',
headings: { experience: 'Ervaringen',
contact: 'Contact', education: 'Opleidingen',
experience: 'Ervaringen', skills: 'Skills',
education: 'Opleidingen', about: 'Over mij'
skills: 'Skills', };
about: 'Over mij' export default lang;
}
};
export default nl;

View File

@ -1,11 +1,8 @@
/* eslint-disable */ const lang = {
const pl = { contact: 'Kontakt',
headings: { experience: 'Doświadczenie',
contact: 'Kontakt', education: 'Wykształcenie',
experience: 'Doświadczenie', skills: 'Umiejętności',
education: 'Wykształcenie', about: 'O mnie'
skills: 'Umiejętności',
about: 'O mnie'
}
}; };
export default pl; export default lang;

View File

@ -1,11 +1,9 @@
/* eslint-disable */ const lang = {
const ptbr = { contact: 'Contato',
headings: { experience: 'Experiência Profissional',
contact: 'Contato', /* You can choose, "Educação" or "Formação Acadêmica"! But the second one is more professional and is more used. */
experience: 'Experiência Profissional', education: 'Formação Acadêmica',
education: 'Educação', skills: 'Competências',
skills: 'Competências', about: 'Sobre'
about: 'Sobre'
}
}; };
export default ptbr; export default lang;

View File

@ -1,11 +1,8 @@
/* eslint-disable */ const lang = {
const pt = { contact: 'Contactos',
headings: { experience: 'Experiência Profissional',
contact: 'Contactos', education: 'Educação',
experience: 'Experiência Profissional', skills: 'Competências',
education: 'Educação', about: 'Sobre mim'
skills: 'Competências',
about: 'Sobre mim'
}
}; };
export default pt; export default lang;

View File

@ -1,13 +1,9 @@
/* eslint-disable */ const lang = {
contact: 'Контакты',
const ru = { experience: 'Опыт',
headings: { education: 'Образование',
contact: "Контакты", skills: 'Навыки',
experience: "Опыт", about: 'Обо мне'
education: "Обучение",
skills: "Навыки",
about: "Обо мне"
}
}; };
export default ru; export default lang;

View File

@ -1,11 +1,8 @@
/* eslint-disable */ const lang = {
const sv = { contact: 'Kontakt',
headings: { experience: 'Arbetslivserfarenhet',
contact: 'Kontakt', education: 'Utbildning',
experience: 'Arbetslivserfarenhet', skills: 'Kunskaper',
education: 'Utbildning', about: 'Om mig'
skills: 'Kunskaper',
about: 'Om mig'
}
}; };
export default sv; export default lang;

View File

@ -1,11 +1,8 @@
/* eslint-disable */ const lang = {
const th = { contact: 'ข้อมูลติดต่อ',
headings: { experience: 'ประสบการณ์ทำงาน',
contact: 'ข้อมูลติดต่อ', education: 'ประวัติการศึกษา',
experience: 'ประสบการณ์ทำงาน', skills: 'ทักษะและความสามารถ',
education: 'ประวัติการศึกษา', about: 'ข้อมูลส่วนตัว'
skills: 'ทักษะและความสามารถ',
about: 'ข้อมูลส่วนตัว'
}
}; };
export default th; export default lang;

View File

@ -1,11 +1,8 @@
/* eslint-disable */ const lang = {
const tr = { contact: 'İletişim',
headings: { experience: 'Deneyim',
contact: 'İletişim', education: 'Eğitim',
experience: 'Deneyim', skills: 'Yetenekler',
education: 'Eğitim', about: 'Hakkımda'
skills: 'Yetenekler',
about: 'Hakkımda'
}
}; };
export default tr; export default lang;

View File

@ -1,11 +1,8 @@
/* eslint-disable */ const lang = {
const zhtw = { contact: '聯絡方式',
headings: { experience: '經歷',
contact: '聯絡方式', education: '學歷',
experience: '經歷', skills: '技能專長',
education: '學歷', about: '自我介紹'
skills: '技能專長',
about: '自我介紹'
}
}; };
export default zhtw; export default lang;

View File

@ -13,7 +13,7 @@
</div> </div>
<div class="left half"> <div class="left half">
<div class="experience"> <div class="experience">
<h3>{{ lang.headings.experience }}</h3> <h3>{{ lang.experience }}</h3>
<div class="experience-block" v-for="experience in person.experience" :key="experience.company"> <div class="experience-block" v-for="experience in person.experience" :key="experience.company">
<span class="company"> {{experience.company}} </span> <span class="company"> {{experience.company}} </span>
<span class="job-title"> {{experience.position}} </span> <span class="job-title"> {{experience.position}} </span>
@ -22,7 +22,7 @@
</div> </div>
</div> </div>
<div class="contact"> <div class="contact">
<h3>{{ lang.headings.contact }}</h3> <h3>{{ lang.contact }}</h3>
<table> <table>
<tr> <tr>
<td><i class="fa fa-envelope" aria-hidden="true"></i></td> <td><i class="fa fa-envelope" aria-hidden="true"></i></td>
@ -49,13 +49,13 @@
</div> </div>
<div class="right half"> <div class="right half">
<div class="education"> <div class="education">
<h3>{{ lang.headings.education }}</h3> <h3>{{ lang.education }}</h3>
<div class="education-block" v-for="education in person.education" :key="education.degree"> <div class="education-block" v-for="education in person.education" :key="education.degree">
<span class="degree">{{education.degree}}</span> <span class="degree">{{education.degree}}</span>
<span class="degree-description">{{education.description}}</span> <span class="degree-description">{{education.description}}</span>
</div> </div>
</div> </div>
<h3>{{ lang.headings.skills }}</h3> <h3>{{ lang.skills }}</h3>
<div class="skills"> <div class="skills">
<div class="skill-block" v-for="skill in person.skills" :key="skill.name"> <div class="skill-block" v-for="skill in person.skills" :key="skill.name">
<span class="skill">{{skill.name}}</span> <span class="skill">{{skill.name}}</span>

View File

@ -13,7 +13,7 @@
</div> </div>
<div class="left half"> <div class="left half">
<div class="experience"> <div class="experience">
<h3>{{ lang.headings.experience }}</h3> <h3>{{ lang.experience }}</h3>
<div class="experience-block" v-for="experience in person.experience" :key="experience.company"> <div class="experience-block" v-for="experience in person.experience" :key="experience.company">
<span class="company"> {{experience.company}} </span> <span class="company"> {{experience.company}} </span>
<span class="job-title"> {{experience.position}} </span> <span class="job-title"> {{experience.position}} </span>
@ -22,7 +22,7 @@
</div> </div>
</div> </div>
<div class="contact"> <div class="contact">
<h3>{{ lang.headings.contact }}</h3> <h3>{{ lang.contact }}</h3>
<table> <table>
<tr> <tr>
<td><a :href="'mailto:'+person.contact.email">{{person.contact.email}}</a></td> <td><a :href="'mailto:'+person.contact.email">{{person.contact.email}}</a></td>
@ -49,13 +49,13 @@
</div> </div>
<div class="right half"> <div class="right half">
<div class="education"> <div class="education">
<h3>{{ lang.headings.education }}</h3> <h3>{{ lang.education }}</h3>
<div class="education-block" v-for="education in person.education" :key="education.degree"> <div class="education-block" v-for="education in person.education" :key="education.degree">
<span class="degree">{{education.degree}}</span> <span class="degree">{{education.degree}}</span>
<span class="degree-description">{{education.description}}</span> <span class="degree-description">{{education.description}}</span>
</div> </div>
</div> </div>
<h3>{{ lang.headings.skills }}</h3> <h3>{{ lang.skills }}</h3>
<div class="skills"> <div class="skills">
<div class="skill-block" v-for="skill in person.skills" :key="skill.name"> <div class="skill-block" v-for="skill in person.skills" :key="skill.name">
<span class="skill">{{skill.name}}</span> <span class="skill">{{skill.name}}</span>

View File

@ -5,7 +5,7 @@
<div class="heading" id="myselfpic"> <div class="heading" id="myselfpic">
</div> </div>
<div class="section-headline"> <div class="section-headline">
{{ lang.headings.contact }} {{ lang.contact }}
</div> </div>
<div class="item"> <div class="item">
<div class="icon"> <div class="icon">
@ -13,7 +13,7 @@
</div> </div>
<div class="text"> <div class="text">
<ul> <ul>
<li> Born {{person.birth.year}} in {{person.birth.location}}</li> <li> {{ lang.born }} {{person.birth.year}} {{ lang.bornIn }} {{person.birth.location}}</li>
</ul> </ul>
</div> </div>
</div> </div>
@ -77,7 +77,7 @@
<div class="item last"> <div class="item last">
<div class="section-headline"> <div class="section-headline">
{{ lang.headings.skills }} {{ lang.skills }}
</div> </div>
<div class="skill" v-for="skill in person.skills" :key="skill.name"> <div class="skill" v-for="skill in person.skills" :key="skill.name">
<div class="right"> <div class="right">
@ -98,7 +98,7 @@
<div>{{person.position}}</div> <div>{{person.position}}</div>
</div> </div>
<div class="section-headline">{{ lang.headings.experience }}</div> <div class="section-headline">{{ lang.experience }}</div>
<div class="block" v-for="experience in person.experience" :key="experience.company"> <div class="block" v-for="experience in person.experience" :key="experience.company">
<div class="block-helper"></div> <div class="block-helper"></div>
<h3 class="headline">{{experience.position}} - {{experience.company}}</h3> <h3 class="headline">{{experience.position}} - {{experience.company}}</h3>
@ -107,7 +107,7 @@
{{experience.description}} {{experience.description}}
</p> </p>
</div> </div>
<div class="section-headline">{{ lang.headings.education }}</div> <div class="section-headline">{{ lang.education }}</div>
<div class="block" v-for="education in person.education" :key="education.degree"> <div class="block" v-for="education in person.education" :key="education.degree">
<div class="block-helper"></div> <div class="block-helper"></div>
<div class="headline">{{education.degree}}</div> <div class="headline">{{education.degree}}</div>

View File

@ -16,7 +16,7 @@
</div> </div>
<div class="resume-content"> <div class="resume-content">
<div class="experience"> <div class="experience">
<h3>{{ lang.headings.experience }}</h3> <h3>{{ lang.experience }}</h3>
<div class="experience-block" v-for="experience in person.experience" :key="experience.company"> <div class="experience-block" v-for="experience in person.experience" :key="experience.company">
<div class="row"> <div class="row">
@ -32,7 +32,7 @@
</div> </div>
</div> </div>
<div class="education"> <div class="education">
<h3>{{ lang.headings.education }}</h3> <h3>{{ lang.education }}</h3>
<div class="education-block" v-for="education in person.education" :key="education.degree"> <div class="education-block" v-for="education in person.education" :key="education.degree">
<div class="row"> <div class="row">
<span class="degree">{{education.degree}}</span> <span class="degree">{{education.degree}}</span>
@ -43,7 +43,7 @@
</div> </div>
</div> </div>
<div class="skill-section"> <div class="skill-section">
<h3>{{ lang.headings.skills }}</h3> <h3>{{ lang.skills }}</h3>
<div class="skills" v-for="skill in person.skills" :key="skill.name"> <div class="skills" v-for="skill in person.skills" :key="skill.name">
<div class="skill-block"> <div class="skill-block">
<i class="material-icons">details</i> <i class="material-icons">details</i>
@ -55,7 +55,7 @@
<span>{{person.knowledge}} </span> <span>{{person.knowledge}} </span>
</div> </div>
<div class="contact"> <div class="contact">
<h3>{{ lang.headings.contact }}</h3> <h3>{{ lang.contact }}</h3>
<a :href="'mailto:'+person.contact.email"> {{person.contact.email}}</a> <a :href="'mailto:'+person.contact.email"> {{person.contact.email}}</a>
<span>;&nbsp;</span> <span>;&nbsp;</span>
<a :href="'tel:'+person.contact.phone">{{person.contact.phone}}</a> <a :href="'tel:'+person.contact.phone">{{person.contact.phone}}</a>

View File

@ -1,6 +1,10 @@
import yaml from 'js-yaml'; import yaml from 'js-yaml';
import { PERSON } from '../../resume/data.yml'; import {
import { terms } from '../terms'; PERSON
} from '../../resume/data.yml';
import {
terms
} from '../terms';
// Called by templates to decrease redundancy // Called by templates to decrease redundancy
function getVueOptions (name) { function getVueOptions (name) {
@ -14,11 +18,24 @@ function getVueOptions (name) {
}, },
computed: { computed: {
lang () { lang () {
return this.terms[this.person.lang]; const defaultLang = this.terms.en;
const useLang = this.terms[this.person.lang];
// overwrite non-set fields with default lang
Object.keys(defaultLang)
.filter(k => !useLang[k])
.forEach(k => {
console.log(k);
useLang[k] = defaultLang[k];
});
return useLang;
} }
} }
}; };
return opt; return opt;
} }
export { getVueOptions }; export {
getVueOptions
};

View File

@ -18,7 +18,7 @@
</div> </div>
<div id="resume-body"> <div id="resume-body">
<div id="experience-container"> <div id="experience-container">
<h2 id="experience-title">{{ lang.headings.experience }}</h2> <h2 id="experience-title">{{ lang.experience }}</h2>
<div class="spacer"></div> <div class="spacer"></div>
<div class="experience" v-for="experience in person.experience" :key="experience.company"> <div class="experience" v-for="experience in person.experience" :key="experience.company">
<h2 class="company">{{experience.company}}</h2> <h2 class="company">{{experience.company}}</h2>
@ -34,7 +34,7 @@
</div> </div>
</div> </div>
<div id="education-container"> <div id="education-container">
<h2 id="education-title">{{ lang.headings.education }}</h2> <h2 id="education-title">{{ lang.education }}</h2>
<div class="spacer"></div> <div class="spacer"></div>
<div class="education" v-for="education in person.education" :key="education.degree"> <div class="education" v-for="education in person.education" :key="education.degree">
<h2 class="education-description">{{education.description}}</h2> <h2 class="education-description">{{education.description}}</h2>
@ -42,7 +42,7 @@
</div> </div>
</div> </div>
<div id="skills-container" v-if="person.skills != []"> <div id="skills-container" v-if="person.skills != []">
<h2 id="skills-title">{{ lang.headings.skills }}</h2> <h2 id="skills-title">{{ lang.skills }}</h2>
<div class="spacer"></div> <div class="spacer"></div>
<p id="skill-description">{{person.knowledge}}</p> <p id="skill-description">{{person.knowledge}}</p>
<ul id="skill-list"> <ul id="skill-list">
@ -56,7 +56,7 @@
</div> </div>
<div id="resume-footer"> <div id="resume-footer">
<div v-if="person.about"> <div v-if="person.about">
<h2>{{ lang.headings.about }}</h2> <h2>{{ lang.about }}</h2>
<p>{{person.about}}</p> <p>{{person.about}}</p>
</div> </div>
</div> </div>

View File

@ -15,7 +15,7 @@
</div> </div>
</div> </div>
<div class="contact"> <div class="contact">
<h3>{{ lang.headings.contact }}</h3> <h3>{{ lang.contact }}</h3>
<div class="contact-row"> <div class="contact-row">
<a :href="'mailto:'+person.contact.email">{{person.contact.email}}</a> <a :href="'mailto:'+person.contact.email">{{person.contact.email}}</a>
</div> </div>
@ -47,7 +47,7 @@
</div> </div>
<div class="left-col"> <div class="left-col">
<div class="experience"> <div class="experience">
<h3>{{ lang.headings.experience }}</h3> <h3>{{ lang.experience }}</h3>
<div class="experience-block" v-for="experience in person.experience"> <div class="experience-block" v-for="experience in person.experience">
<div class="row"> <div class="row">
<span class="company"> {{experience.company}} -</span> <span class="company"> {{experience.company}} -</span>
@ -62,7 +62,7 @@
</div> </div>
</div> </div>
<div class="education"> <div class="education">
<h3>{{ lang.headings.education }}</h3> <h3>{{ lang.education }}</h3>
<div class="education-block" v-for="education in person.education"> <div class="education-block" v-for="education in person.education">
<div class="row"> <div class="row">
<span class="degree">{{education.degree}}</span> <span class="degree">{{education.degree}}</span>
@ -73,7 +73,7 @@
</div> </div>
</div> </div>
<div class="skills-block"> <div class="skills-block">
<h3>{{ lang.headings.skills }}</h3> <h3>{{ lang.skills }}</h3>
<div class="skills"> <div class="skills">
<div class="skill" v-for="skill in person.skills"> <div class="skill" v-for="skill in person.skills">
<span class="skill-name">{{skill.name}}</span> <span class="skill-name">{{skill.name}}</span>

View File

@ -15,7 +15,7 @@
</div> </div>
</div> </div>
<div class="contact"> <div class="contact">
<h3>{{ lang.headings.contact }}</h3> <h3>{{ lang.contact }}</h3>
<div class="contact-row"> <div class="contact-row">
<a :href="'mailto:'+person.contact.email">{{person.contact.email}}</a> <a :href="'mailto:'+person.contact.email">{{person.contact.email}}</a>
</div> </div>
@ -47,7 +47,7 @@
</div> </div>
<div class="right-col"> <div class="right-col">
<div class="experience"> <div class="experience">
<h3>{{ lang.headings.experience }}</h3> <h3>{{ lang.experience }}</h3>
<div class="experience-block" v-for="experience in person.experience" :key="experience.company"> <div class="experience-block" v-for="experience in person.experience" :key="experience.company">
<div class="row"> <div class="row">
<span class="company"> {{experience.company}} -</span> <span class="company"> {{experience.company}} -</span>
@ -62,7 +62,7 @@
</div> </div>
</div> </div>
<div class="education"> <div class="education">
<h3>{{ lang.headings.education }}</h3> <h3>{{ lang.education }}</h3>
<div class="education-block" v-for="education in person.education" :key="education.degree"> <div class="education-block" v-for="education in person.education" :key="education.degree">
<div class="row"> <div class="row">
<span class="degree">{{education.degree}}</span> <span class="degree">{{education.degree}}</span>
@ -73,7 +73,7 @@
</div> </div>
</div> </div>
<div class="skills-block"> <div class="skills-block">
<h3>{{ lang.headings.skills }}</h3> <h3>{{ lang.skills }}</h3>
<div class="skills"> <div class="skills">
<div class="skill" v-for="skill in person.skills" :key="skill.name"> <div class="skill" v-for="skill in person.skills" :key="skill.name">
<span class="skill-name">{{skill.name}}</span> <span class="skill-name">{{skill.name}}</span>