From 7e4af24115001df71b8593f5dfb4f1840da30bb2 Mon Sep 17 00:00:00 2001 From: salomonelli Date: Sat, 20 May 2017 14:01:19 +0200 Subject: [PATCH] UPDATE routing --- electroshot-config.json | 2 +- node/app.js | 5 +- old/public/js/javascript.js | 5 +- ...me-material-dark.pdf => material-dark.pdf} | Bin 68066 -> 68040 bytes src/App.vue | 1 + src/fix-resume.js | 193 +++++++++++++++++ src/pages/resume.vue | 13 ++ src/router/index.js | 6 + static/javascript.js | 196 ++++++++++++++++++ 9 files changed, 415 insertions(+), 6 deletions(-) rename pdf/{resume-material-dark.pdf => material-dark.pdf} (88%) create mode 100644 src/fix-resume.js create mode 100644 src/pages/resume.vue create mode 100644 static/javascript.js diff --git a/electroshot-config.json b/electroshot-config.json index a2e392a..4d6b25d 100644 --- a/electroshot-config.json +++ b/electroshot-config.json @@ -1 +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/best-resume-ever/pdf/resume-material-dark.pdf"}] \ No newline at end of file +[{"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/best-resume-ever/pdf/material-dark.pdf"}] \ No newline at end of file diff --git a/node/app.js b/node/app.js index 8df9236..0ededa4 100644 --- a/node/app.js +++ b/node/app.js @@ -26,7 +26,7 @@ const convert = async() => { */ const electroshotScript = resume => { const dir = path.join(__dirname, '../pdf'); - return 'electroshot localhost:8080/#/' + resume + + return 'electroshot localhost:8080/#/resume/' + resume + ' 2481x3508 --pdf-margin none --format pdf --out ' + dir + ' --filename "' + resume + '.pdf" --pdf-background; '; }; @@ -41,8 +41,9 @@ const getResumesFromDirectories = () => { .filter(dir => dir.includes('resume-') && dir !== 'resume-XX') .map(dir => { let name = dir.replace('resume-', ''); + let fileName = dir.replace('.vue', ''); return { - path: dir.replace('.vue', ''), + path: fileName.replace('resume-', ''), name: name.replace('-', ' ') }; }); diff --git a/old/public/js/javascript.js b/old/public/js/javascript.js index 4a650a3..d8a9d03 100755 --- a/old/public/js/javascript.js +++ b/old/public/js/javascript.js @@ -64,7 +64,6 @@ const calcNewFontSizes = elements => { .map(el => getFontSizeOfElement(el) * 0.99); }; - /** * checks if DOM-element has box-shadow * @param {HTMLElement} element @@ -74,7 +73,7 @@ const hasBoxShadow = element => { const style = window .getComputedStyle(element, null) .getPropertyValue('box-shadow'); - if (style != 'none') return style; + if (style !== 'none') return style; else return ''; }; @@ -129,7 +128,7 @@ const addNewBoxShadow = (element, position, boxShadow) => { const getElementsWithShadows = elements => { const ar = [].slice.call(elements); return ar - .filter(el => hasBoxShadow(el) != '') + .filter(el => hasBoxShadow(el) !== '') .map(el => { return { element: el, diff --git a/pdf/resume-material-dark.pdf b/pdf/material-dark.pdf similarity index 88% rename from pdf/resume-material-dark.pdf rename to pdf/material-dark.pdf index 8a3700a96c4170ccd695f4848859858c4df0a690..a1f7bb35a8e0cbee6d368c5da8579a6017a8ed75 100644 GIT binary patch delta 7992 zcmZWu2Q(aC`&OfuAczvHY?LT#ZP8oQT`hW67eosQE4oD@EYWM!)uKnRh#rX&y#)z^ z1hJw=jS`>V@BGjId|xtW&Ye5Yec$JK@B7ZonYr^Vne0O{S%R$)7$gY--2#CGFLz;T z30+SIH9NE;KuAsYas&>7Ubg?5)I^!uU}QjGMMZ!&+RM@I0kvQDkk#xfOSo6ClFir% zvFct3aX8V9*`Ir~v;x~2PFKQG0Ld2=wdHSo>&)E^HPgt{a_{(hR*5Hd+kY{4Xo>8` zTx{%^#s1zsEor>)mjZrXOo~svxD!m)Wjuh14r~oMO}Bwx0Oo%$d3q|Hx$c@}HEj8+UUf7>Ytl02$oUhJGbR29GrM%oOa#eNB zUz968*f!7mC8w_=e$$S!N!x&0s#IVi$+t#>$}puIS~ba%lnkg=9y&G%#`su=x@W5l zWuc6))`ng#S7g?oyQOw%hlWhyoRYk|Cz(H}JPsCZ&`S8hZ0=wwB$bEm&GCHsaoLa+ zSDHoB`6k0+mqM|Lpi}C?ta#gdk)mr^ba%k2JrnPDlfPMvBs)_bepv-BUdOE6_G{K~#v;OUM8edUKb#dNY z;Iv^^b}MUNwywD1@*+^{fL&*!!lA(UBbbUkp!;n(nMu7)cHc0$=uKkO6jMfqYuONW zf+@+c26J*m24#X1w5mA4y}Wj5pvX=vm25YTgymrTfNDUX1*>0!`QgY!*N4hFDN<*; z1xSiYG4dA1ElI*YTb}&-vd8_?$z{c4(WZyB&nKO89>G&b2Ee z?;ayY^#fc~&I1m+$Ox-P!|nm%1t&{^_gVW_(r`8(2UW|F{1w8=F{I)7X4bq(NgS-A z`smK7j{?BWQ00WA>P{p=FN|Z#AgX);bs9d_6ai{%5XIo#Q8f>91d1IGJ5ke%Y*Yz0 zmNXnzi1utDJ9{ge+5&yO^}#ES@ds&9_+HvVjfe zqGF!g?=ZEi2eQfmI_!qP5h-bHZEdA&CvcikI%{=OYw;%``>VL_aN8e9J~@diW+Sw` zEhCT3L)Hv4P9;(>wj@8-Ld1M}AC4ijv6PRZeBNZ|$ReOs9aL-H{z(8h zE{w?iCgMe>XTSaxNYhXsUh{r+&ektJjTFZ zZF9Mms1`iA`T16NeCY9>=_Zxz-FlTZ+sP}%PfR#d@ZEezlx;sZM+JYHy*k!42>4oU z*|~!u5_=~$ID;#SmTr_l7 zO5{jLicGJmv$2$p09yK=cx?V8QIZQk-lysZlPpB|+J?V->ME27W**0x$3A=Gc(rxQ zGWcd1K3ZtBXgVPeu<4Z0p=#Zbjw|9?U!A}yOv#3AK^CrGr~psv9Nz=i)FQmj56xMJ0M~GzA^?+ z%2e0%$>i~G<#6LUQg%Qwku4MyHir5MTpZ++c6Aye62j29shZ}aXs1@`!$ z80^Is2Hj7}F`WBY61xxT`<+x1}|oBr_8+LXM#@rJu%qH6_` z1JTcNtAY;??^R3^^g6uN8#g?7J!lp%v%ssQcxS&TUAD2Xv31b9J`pQ8rD}-dS@ClU ztr7Z&pehlB_KPXYyk?uw`Chs%p+@Wxigwm$h4N#;x5eD1>jl6ktUf>9iQM5~QTkS; z57gRwpVb5(sdu{mGu?*goX&ISc=d`tZkKg-r&rINvf&HUi;bR!XUe(!^6elHMx~B8 zgo5v;4Bnpbpxrcaue^Ctiz3nzpi^0U)yUK&mjEM8%hT7Q=G50KFT)?xVKT1yDc(^{s z5JD;!twecXwdBjYWArf6CIqu5yw?)HKkRVUbmQ1~`RKHFaADE+dDV(!aIDhLTMyF~ zf`YO##pCBYPuI~w) z?X_m&Iu(PxXo@2IbH8BeQ`&g4imSIDn;KEJ)XJJTL9NA2OUli4DZdepLoPmfn3fzy zPkw%Ex>R2$Ytij0PvB0ebgEszPC}S2Rw|z*PsH-9{5Z;fHRY>kwr>59LmxY_KQ5!Y zeN#`0g!bCPHqUvtOKV`~TJ$1j+@^ZaB|z#?=8b)NYCYfDg~$ncCZRS7R#(E=*6K{a zH;B90Dnu@wrsST3-qOl9$ox?DO)^PzPzOc_ULq{`#)|_nYEzvvA$d!0No5Ej>~4{lSnM!h+Q21iLzf1lazfHy`a*d0CbYQb`X#Qp`c;V^CWxglS0G!>t=`=- zO@CV{{?*BcDtZ$06c87;eH6dz-|-=F7Q9WsjESZ~H7t z)OUK$3We7k49HdJ{K~LspIZQ8@cZ=egAlozmM3pbRhCZ7#h*>g4%hacssEl^01f>5 z(&ZiE<#WLI$oDMpQ5yrHqE%5-CHMPjpc{Aa_5)>xVCVT_49SxR0nkF4Fp7N{S_UD7 zd$UpPsschc+*>}e2G6fZ$%|shF3QQ)2r$1HnmBRl1T*Xsqr$scHII5+k@s0tGLlY` zmCEq$+k_aGt9LTV)>7^X#agCac}9s4SzyT|rvZ0A3^$yRgzI?qPa+Yr18iasnl#|M zE>zXR;A%!$490aBJ~MpzdiQ4don~&@a(oI?ab#v4Gw_rzJCb&YYg!VsdlN=E-K8@` zGIO2c-b*U$laB?D`ohB2@vlRuZEn8#y!EuJFh2_8%Y>)&fLSJ>1hivhdpkuv62fWI%!db~Ru_AJg-bfCv-x){7cLjvjFk_P%O+hmpJOHued?53KAzfG_ z!Z-YeYYO+(;1g{ckC*nZ5D5R!{j*co4Bg)EB(19DSeZxiJ&zyIb7x$))8(7&x_oDm z$uboB9I)soYAmbe*p!qsY^Z9|_3Zk-o448gI!(oi0-ku1#;9)0ZVgiY^LRf^|YOlTE7$LG7m0M}(w)_{oo-ew0LbfS zWOZMgN++Hbt8!M76diD;0QSH<$1G*@#PpAnf`5)ME%1bhc?EZEo=}bidk)>x%wl@g zd5ob;m`^HH{}}MK5m&UyF$wUCdP26=20*E$9#H`alYISG@3G<3!@sqW%7O-l>E85C zel~JLnmmP0KVG+cc)gi5q$rlD=rr~d?ZQ*2ER;e*q*$@g&g_IyBxik*$&q-xZrr&e zlIE1b-F3%8yblwOPKBxZ-sV%5oF#I(^AyuK6#%RtT3h*A=APTY4Y|tFxU2H{>gpobDNAh-uYv`Afyu<)9q zx+vh#83^38OA=olx2GD<^?P~tx{#^ud|9LXXM^$ehxSg7Shx*G+w&~FV!fZuKF+kH zJ`*)t$kWhtJoB+`MXB^?09id)ftVqrDE$3l5EIa<;azh$z4nch99#_-XVUGCuSiaz zYqED=vxTccWp?ltNwt$Y^21Dk*-7%-D_|$}_ zXBre2@)LIsmo20+31rtWo@1u!!gnaG*9Vch*!P8Hw`Dns2c0UKnu9Xn2u7<0WGHJP z&FL^U%_x%O^Ks8=M`P{B^%Uu!v));vbuql1f!6`tu^QCOl*#ca9A`M&5=Akp0^_ws zS(!cxMaO>N&3a07o=CC7`rK~B3rb>znh22app{yh$tT_xTE?o5p$~T7NCfu=M3_Sq*bk5(2R!W2ox97a&c|%HW1$A z${o6vb{b*44PZf`GTi2G9mivRU#R7wg>)?%V6yAKu z;<4ps*wV5lbX`?k5Mf}SU*dGg9ZA(nkI_QNE^5ekPlI(+_Q$9RCDxjO0J2A}=XwRi zC#H#V#i&~!bxOUL#dGx&<*MLh%*!=;S5N-Eu`WM;*gUXv>5&V3UN%v`cRwhk1@@!` zU^qcoh7mL3fa^`GTD^BDoOho*X`8^36j@o$a1RVmSP42de)_=Vm22yI>8*|AB3@~7 z81R7BmOXF13Q`_;=6G{#b?^*pD1{v%p&qTZyK9SH+X}_b#*{rxC)@%Okr5&a-A}n6 zlHjHLjgb`96FlEz8x%#RrLr~QC12`leKh;jbALn*s1Dli{pKAUVHZu zZ|{Hxp+HTxn-0XN+g*=K>?xeDo)T@ZdhuNWDio(Uyl%}BQ$BGptHfhnb2g6oR6up- zkk>?FiQM*GY0V>GK3KbJ_bnZCD4m6*B-2T^L@ZH0;a zM%HV?#KO40Fnn0$(jVIG^VgHvAWs&_n^|#o_t*9b-t~ese0w_2?(6@+;!!mE>+(wd zgKq3$=&J{>)wA0HuaTW0Ayy2SQ9CP|1o6qjf{yll3FVk#lHx5n`cc=iXn}mV#>AUp z0e823rXixuDkK8c=g|Bk6qfIBAOA)9wFa+NCVSCsQ8G8P-63M*bF16p$`Xd7!pX{c z%CY5|$5S5^XoSp{xU10_cd4hm*3FXLSD)y;u|7gmBL;qh$P)ziOB8=$+?fW7itrBk z{F5a~U`2E`Vw=?|WEAHL_T1o61K%uIzON`Is)gkO-=ho}tYl9O|^)b@6y z4{H5XOQqWaykM!cit8l)NN{b}dC{Ygx5zpVFWmZ-a-5{3;2WUNd?h?clyGZIkb8gB z3LonhMd3`Qu<#0XF%XT(tqYtls1s-qb=Sc~lM|!7OrtykTs{&-0FSsAZ4C|0495eg zIO2>JMk?O&%)5K#quUDdlw+ru|rwNpl&_ zr~cWbCc8n@#zvjq{Q=!FfG-Mpgdi(iX5sqR!XthIs~aIP%03w0lU~xvvsR!Z^kRNF zhsNCTAo<9>o;TJI*er5E>(M}*2?slo5(B^Fg;+e<*QZ(hk6$0ZAs!_#{%(&oEUuTb}0g-X> z2Kok#yvrYF$uJQ2l59 zZj>mF9S~y&OuFaRDn4l$zcHfN9YPl*ZX3usH|tDy>_=IIre!UzwM#`43urC$s~a+= z`b_GnzC9gA#N+(yndGPKHL;16xYPsplP-x74F@~qi$^?0E3@t)h_wsN49GK-ol+@xisKF8Jz`O1r)c>FtT=UQ(_(qQotucFDJDK+0L z$E#yDT=5%#jZ)&H3|0|w+`?{+N+>!-#UwcwqqzhiPu!N-XtrCh49V?aF?`JxfO8}B zS2_cUfwZQnNIOY#Za=B2X`{Ye3X{cz4e8}>OvD6T3q+IvQ*GT^i-Xoxj7xtfO_(Gz zO?+ofL<^%me!ksR%iIEM&5k9q8B09DTlpGW+RD@jsvv!c)2ED_TiC9374(d&_z3GS zl#}tA#2j#}^&|?{@#pHl$g$jMZO)w3UjMR(9iDc497T+Dy6=B129~24Q_97BE<2Q| znh6~X&z=LZ$j{HL{_H zU#O5rAPJ!G*ej3EGnjTXv+7YoplVL$E#n|HPOz8xKo9+M-al@NVcr=CUg{`7v%QQM7-pPB${p)c{YvWlfwT7J2t9hkh zi1PY1*glPnrOjn86<}VOGDXdVU%nu~vzphznHF(m>Pvw|A-I$|Z@cA9F&V|t{OR){ z{lO&Hfuj*a%2CvJuDq#3DwN@arB4Y&VoDKY)ph2Ntq$u*R%01<`#Sp)E-r}57Jla> z4+O|!Api68EHz$%om4kc_u~n zzS?`YGWoXz->3?yVu4N%z87plybZLo%Gt*?O&4OH>i>nCT4_wT{ z6w>c(hcl9Ku>XekKnuK=Z>GE#pABLxS8{~N>!d-GJoxbGfTcly`9h^2e+CVK!r*^q z1_G6q{69X-|JNM?gUb9R43n1n6NAE}p?{VM3I{{}tT7ZW^;bEea2V)+Gjo}LC|p|V z&zZnL;J;D`1O1%^7zqBCFii6AlE5UvGJk2npl~?LA8CcbWF#fi)2N7VQ-P!*)IgxR HzQ%t5h&)$x delta 7997 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 RTqPnQAwgnxb`>4f{|8WKlIj2e diff --git a/src/App.vue b/src/App.vue index addbc12..e6c3768 100755 --- a/src/App.vue +++ b/src/App.vue @@ -7,6 +7,7 @@ diff --git a/src/router/index.js b/src/router/index.js index 625e89d..b914e4f 100755 --- a/src/router/index.js +++ b/src/router/index.js @@ -1,6 +1,7 @@ import Vue from 'vue'; import Router from 'vue-router'; import ResumeMaterialDark from '@/components/resume-material-dark'; +import Resume from '@/pages/resume'; Vue.use(Router); @@ -10,6 +11,11 @@ export default new Router({ path: '/resume-material-dark', name: 'resume-material-dark', component: ResumeMaterialDark + }, + { + path: '/resume/:resumeid', + name: 'resume', + component: Resume } ] }); diff --git a/static/javascript.js b/static/javascript.js new file mode 100644 index 0000000..d8a9d03 --- /dev/null +++ b/static/javascript.js @@ -0,0 +1,196 @@ +/** + * gets all DOM-elements on page + * @return {HTMLElement[]} DOM-elements + */ +const getAllDOMElements = () => { + return document.getElementsByTagName('*'); +}; + +/** + * gets DOM-element of #resumeX + * @param {HTMLElement} page + * @return {HTMLElement} + */ +const getResumeDOMElement = page => { + return page.children[0]; +}; + +/** + * returns DOM-element of + * @return {HTMLElement} + */ +const getPageDOMElement = () => { + return document.getElementsByTagName('page')[0]; +}; + +/** + * checks whether auto-font adjustment is enabled for resume + * @param {HTMLElement} resume + * @return {boolean} + */ +const autoFontEnabled = resume => { + return resume.hasAttribute('autofont'); +}; + +/** + * checks whether content is greater than page + * @param {HTMLElement} resume + * @param {HTMLElement} page + * @return {boolean} false if content fits to page + */ +const contentIsGreaterThanPage = (resume, page) => { + const pageHeight = page.offsetHeight; + const resumeHeight = resume.offsetHeight; + if (pageHeight < resumeHeight) return true; + else return false; +}; + +/** + * gets font size of DOM-elemnt + * @param {HTMLElement} element + * @return {number} font size of element + */ +const getFontSizeOfElement = element => { + const style = window.getComputedStyle(element, null).getPropertyValue('font-size'); + return parseFloat(style); +}; + +/** + * calculates new font size of all DOM-elements + * @param {HTMLElement[]} + */ +const calcNewFontSizes = elements => { + return elements + .map(el => getFontSizeOfElement(el) * 0.99); +}; + +/** + * checks if DOM-element has box-shadow + * @param {HTMLElement} element + * @return {string} '' if no shadow, otherwise shadow e.g. 'rgba(0, 0, 0, 0.137255) 0px 2px 2px 0px' + */ +const hasBoxShadow = element => { + const style = window + .getComputedStyle(element, null) + .getPropertyValue('box-shadow'); + if (style !== 'none') return style; + else return ''; +}; + +/** + * gets absolute position of element + * @param {HTMLElement} element + * @return {{}} + */ +const getAbsolutePositionOfElement = element => { + return { + top: element.getBoundingClientRect().top, + left: element.getBoundingClientRect().left + }; +}; + +/** + * gets border radius of element + * @param {HTMLElement} element + * @return {string} e.g. '50%' + */ +const getBorderRadiusOfElement = element => { + return window + .getComputedStyle(element, null) + .getPropertyValue('border-radius'); +}; + +/** + * adds new box shadow + * @param {HTMLElement} element + * @param {{}} position e.g. { left: 10, top: 100} + * @param {string} boxShadow e.g. 'rgba(0, 0, 0, 0.137255) 0px 2px 2px 0px' + */ +const addNewBoxShadow = (element, position, boxShadow) => { + let div = document.createElement('div'); + div.style.height = element.offsetHeight; + div.style.width = element.offsetWidth; + div.style.borderRadius = getBorderRadiusOfElement(element); + div.style.position = 'absolute'; + div.style.boxShadow = boxShadow; + div.style.webkitPrintColorAdjust = 'exact'; + div.style.webkitFilter = 'opacity(1)'; + div.style.top = position.top; + div.style.left = position.left; + document.getElementsByTagName('body')[0].appendChild(div); +}; + +/** + * gets all elements with shadows + * @param {HTMLElement[]} elements on page + * @return {HTMLElement[]} elements with shadows + */ +const getElementsWithShadows = elements => { + const ar = [].slice.call(elements); + return ar + .filter(el => hasBoxShadow(el) !== '') + .map(el => { + return { + element: el, + shadow: hasBoxShadow(el) + }; + }); +}; + +/** + * fixes shadows, since normal box-shadow cannot be printed in chrome, + * see: http://stackoverflow.com/questions/13975198/text-shadow-and-box-shadow-while-printing-chrome + */ +const fixBoxShadows = () => { + const elements = getAllDOMElements(); + const elementsWithShadow = getElementsWithShadows(elements); + elementsWithShadow.forEach(element => { + const position = getAbsolutePositionOfElement(element.element); + element.element.style.boxShadow = 'none'; + addNewBoxShadow(element.element, position, element.shadow); + }); +}; + +/** + * checks if the page contains a resume + * @return {Boolean} true if page contains resume + */ +const isResume = () => { + if (document.getElementsByTagName('page')[0]) return true; + else return false; +}; + +/** + * checks whether font needs to be fixed, and if fixes it + */ +const checkFont = () => { + const page = getPageDOMElement(); + const resume = getResumeDOMElement(page); + const fixFont = function(resume, page) { + const elements = getAllDOMElements(); + const elementsAr = [].slice.call(elements); + const newFontSizes = calcNewFontSizes(elementsAr); + elementsAr.forEach((el, i) => el.style.fontSize = newFontSizes[i] + 'px'); + if (contentIsGreaterThanPage(resume, page)) fixFont(resume, page); + }; + if ( + autoFontEnabled(resume) && + contentIsGreaterThanPage(resume, page) + ) fixFont(resume, page); +}; + +const isElectron = () => { + return window && window.process && window.process.type; +} + +/** + * fixes resume + */ +const fixResume = () => { + if (!isResume()) return; + checkFont(); + //if (isElectron()) + fixBoxShadows(); +}; + +fixResume();