From 0db9413cac3f5bba67ddeed129bfdb99d8a2b99a Mon Sep 17 00:00:00 2001 From: Ekaitz Zarraga Date: Tue, 10 Mar 2020 19:50:41 +0100 Subject: Cover creator code sketch --- utils/cover/cover.scm | 390 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 390 insertions(+) create mode 100644 utils/cover/cover.scm (limited to 'utils/cover/cover.scm') diff --git a/utils/cover/cover.scm b/utils/cover/cover.scm new file mode 100644 index 0000000..2678986 --- /dev/null +++ b/utils/cover/cover.scm @@ -0,0 +1,390 @@ +(import (scheme base) + (scheme char) + (chibi) + (chibi string) + (chibi sxml) + (srfi 1)) + +(include "barcode.scm") +; GUILE +#;(use-modules (sxml simple) + (srfi srfi-1)) + +;; CONTENTS +(define isbn "9780201379624") +(define book-title "Qué es la informática") +(define book-title-before "Qué es la") +(define book-title-word "Informática") +(define book-title-after "") +(define book-subject "Informática") +(define book-authors '("Giacomo Tesio" "Ekaitz Zarraga")) +(define book-summary "Hola,\n\nSoy Ekaitz\nZarragahola hola hola hola hola hola + hola hola hola hola hola hola hola hola hola hola hola + hola hola hola hola hola hola hola hola hola hola hola + hola hola hola hola hola hola hola hola hola hola hola + hola hola hola hola hola hola hola hola hola hola hola + hola hola hola hola hola hola hola hola hola hola hola + hola hola hola hola hola hola hola hola hola hola hola + hola hola hola hola hola hola hola hola hola hola hola + hola hola hola hola hola hola hola ") +(define company-info "ElenQ Technology is a project that... blabla bla bla + blablabla blablablabla blablabla") + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; UTILS ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(define num number->string) +(define (mm x) ; add mm mark + (string-append (num x) "mm")) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; DEFINITIONS ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +; SIZE +; Take spine from the outside because it's related to the amount of pages +(define spine-width 20) ;mm +(define spine-title-margin-min (* 0.1 spine-width)) +(define spine-title-max-size 10) +(define spine-title-size + (let ((size (- spine-width (* 2 spine-title-margin-min)))) + (if (> size spine-title-max-size) + spine-title-max-size + size))) + +;B5 Paper size +(define page-height 250) ;mm +(define page-width 176) ;mm +(define margin 3) ;mm + +(define text-size (exact->inexact (/ page-height 70))); mm +(define subject-size (* 1.5 text-size)); mm +(define authors-size (* 2 text-size)) +(define title-size (* 2.5 text-size)); mm +(define main-title-size ; mm + (let ((size (exact->inexact + (* 2.1 + (/ page-width + (length (string->list book-title-word))))))) + (if (< (/ page-height 4) size) + (exact->inexact (/ page-height 4)) + size))) + +(define width (+ (* 2 margin) (* 2 page-width) spine-width)) ;mm +(define height (+ (* 2 margin) page-height)) ;mm +(define viewBox (string-append "0 0 " + (num width) + " " + (num height))) +; INFO: Setting viewbox and size to the same it makes the measurements real +; world ones, in this case millimeters +; Read more: https://mpetroff.net/2013/08/analysis-of-svg-units/ + +(define (elenq-logo sub size x y) ; 10 x 4mm + `(g (@ (id "elenq-logo") + (transform ,(string-append "translate(" (num x) "," (num y) ")" "scale(" (num size) ")"))) + (g (@ (transform "scale(0.1667)")) + (text (@ (x 0) + (y 0) + (style "font-size: 30; line-height: 1.25; font-family: armata; stroke: none; text-anchor: middle")) + "ElenQ") + (text (@ (x 0) + (y 8) + (style "font-size: 10; line-height: 1.25; font-family: armata; stroke: none; text-anchor: middle;")) + ,sub)))) +;(define elenq-technology (elenq-logo "TECHNOLOGY" 1 0 0)) +;(define elenq-publishing (elenq-logo "PUBLISHING" 1 0 0)) + +(define style + (string-append " + .margin-mark { + stroke-width: 0.1; + stroke-linecap: butt; + stroke: red; + } + .title-back { + font-family: 'Pathway Gothic One'; + font-size: "(num title-size)"; + fill: white; + } + .title-spine { + font-family: 'Pathway Gothic One'; + font-size: "(num spine-title-size)"; + dominant-baseline: mathematical; + fill: black; + } + .authors-spine { + font-family: 'Lato'; + font-size: "(num text-size)"; + dominant-baseline: mathematical; + text-anchor: end; + } + #black-part { + fill: black; + } + .text-elenq{ + font-family:Lato; + -inkscape-font-specification:'Lato Light Italic'; + font-style: italic; + font-weight: 300; + fill: black; + font-size: "(num text-size)"; + text-align: justify; + } + .text-summary { + font-family:Lato; + font-size: "(num text-size)"; + fill: white; + text-align: justify; + } + rect.subject{ + fill: black; + } + text.subject{ + fill: white; + font-size: "(num subject-size)"; + -inkscape-font-specification:'Lato Light'; + font-family:Lato; + font-weight: 300; + } + .main-title { + font-size: "(num main-title-size)"; + font-family: 'Pathway Gothic One'; + text-anchor: middle; + } + .main-title-before { + font-size: "(num (* 1.5 title-size))"; + -inkscape-font-specification:'Lato Light'; + font-family:Lato; + font-weight:300; + font-style:normal; + font-stretch:normal; + font-variant:normal; + } + .main-title-after { + font-size: "(num (* 1 title-size))"; + -inkscape-font-specification:'Lato LightItalic'; + font-family:Lato; + font-weight:300; + font-style:italic; + font-stretch:normal; + font-variant:normal; + text-anchor: end; + } + .author { + font-size: "(num authors-size)"; + font-family:Lato; + font-style:normal; + font-stretch:normal; + font-variant:normal; + text-anchor: end; + } + ")) + +; Text area, Inkscape-only svg parameter +(define (textArea text class x y w h) + `(flowRoot + (@ (class ,class)) + (flowRegion + (rect (@ (width ,w) + (height ,h) + (x ,x) + (y ,y)))) + ,(map (lambda (p) + `(flowPara ,p)) + + (reverse + (fold + (lambda (s acc) + (if (string=? s "") + (cons "" acc) + (let* ((prev (car acc)) + (val (string-append prev + (if (string=? "" prev) + "" " ") + s))) + (cons val (cdr acc))))) + (list "") + (string-split + text + #\newline)))))) + +(display "") +(display (sxml->xml + `(svg + (@ (width ,(mm width)) + (height ,(mm height)) + (viewBox ,viewBox)) + (defs + (style ,style)) + + + ; BLACK BACKGROUND FOR SUMMARY + (g (@ (transform ,(string-append + ; TODO extender lo negro en el margen + "translate("(num margin)"," (num (+ margin (* 0.05 page-height))) ") + scale(" (num (* 0.95 page-width)) ")"))) + (path (@ (id "black-part") + (d "M 1.00, 0.10 L 0.30, 0.00 L 0.00, 0.16 L 0.00, 0.67 L 0.45, 0.76 L 0.97, 0.67 Z")))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; CUTTING MARKS ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + ,(map (lambda (posx posy rot) + `(g (@ (id ,(string-append "marks-" + (num posx) + "-" + (num posy))) + (transform ,rot)) + (line (@ + (x1 ,(+ posx)) + (y1 ,(+ posy margin)) + (x2 ,(+ posx (* 0.6 margin))) + (y2 ,(+ posy margin)) + (class "margin-mark"))) + (line (@ + (x1 ,(+ posx margin)) + (y1 ,(+ posy)) + (x2 ,(+ posx margin)) + (y2 ,(+ posy (* 0.6 margin))) + (class "margin-mark"))))) + + (list 0 0 width width) + (list 0 height 0 height) + (list "rotate(0,0,0)" + (string-append "rotate(-90, 0," (num height) ")") + (string-append "rotate(-270," (num width) ", 0)") + (string-append "rotate(-180," (num width) "," (num height) ")"))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; BACK SIDE ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + ; TITLE + BOOK SUMMARY + ,(textArea + (string-upcase book-title) + "title-back" + (+ margin (* 0.15 page-width)) + (- (+ margin (* page-height 0.25)) 15) + (* 0.7 page-width) + (* 0.25 page-height)) + + + ,(textArea book-summary + "text-summary" + (+ margin (* 0.15 page-width)) + (+ margin (* page-height 0.25)) + (* 0.7 page-width) + (* 0.25 page-height)) + + + ; LOGO + ELENQ SUMMARY + ,(elenq-logo "TECHNOLOGY" + 3 + (* (+ (+ margin (* 0.5 page-width)) + (+ margin (* 0.5 page-width) + (- (* 0.5 page-width) (* 0.1 page-width)))) 0.5) + (+ margin (* 0.70 page-height) -10)) + ,(textArea company-info + "text-elenq" + (+ margin (* 0.5 page-width)) + (+ margin (* 0.70 page-height)) + (- (* 0.5 page-width) (* 0.1 page-width)) + (- (* 0.25 page-height) (* 0.1 page-height))) + + + ; BARCODE + ,(barcode-sxml isbn + (+ margin (* 0.1 page-width)) + (+ margin (* 0.75 page-height)) + (* 0.25 page-width)) + + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; SPINE ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ,(let ((x (+ margin page-width)) + (y height) + (width (+ margin margin page-height)) + (height spine-width)) + `(g (@ (transform + ,(string-append "translate(" (num x) "," (num y) ") rotate (-90)"))) + (rect (@ (height ,height) + (width ,width) + (style "fill: white;"))) + + (text (@ (class "title-spine") + (x ,(* 0.2 width)) + (y ,(* 0.5 spine-width)) + (width ,(* 0.3 width)) + (height ,spine-title-size)) + ,book-title) + (text (@ (class "authors-spine") + (x ,(* 0.9 width)) + (y ,(* 0.5 spine-width)) + (width ,(* 0.3 width)) + (height ,spine-title-size)) + ,(string-join book-authors ", ")))) + + ,(elenq-logo "PUBLISHING" + (* spine-width 0.1 0.75) + (+ margin page-width (* 0.5 spine-width)) + (+ margin (* 0.95 page-height))) + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; FRONT SIDE ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ,(let* ((win (* 0.35 page-width)) + (w (+ win margin)) + (h (* 1.5 subject-size)) + (x (- width margin win)) + (y (+ margin (* 0.15 page-height)))) + `(g + (rect (@ (class "subject") + (x ,x) + (y ,y) + (width ,w) + (height ,h))) + + (text + (@ (class "subject") + (x ,(+ x (* 0.10 w))) + (y ,(+ y (* 0.75 h))) + (w ,w) + (h ,h)) + ,book-subject))) + + (text (@ (class "main-title-before") + (x ,(exact->inexact (- width + (- page-width (/ page-width 8)) + margin))) + (y ,(+ margin (* 0.30 page-height)))) + ,book-title-before) + (text (@ (class "main-title") + (x ,(exact->inexact (- width (/ page-width 2) margin))) + (y ,(+ main-title-size margin (* 0.30 page-height)))) + ,(string-upcase book-title-word)) + + + ; TODO PENSAR SI QUITAR ESTO + (text (@ (class "main-title-after") + (x ,(exact->inexact (- width (/ page-width 8) margin))) + (y ,(+ main-title-size margin (* 0.37 page-height)))) + "Subtítulo que puede ser una frase resumen") + + ,(map (lambda (author pos) + `(text (@ (class "author") + (x ,(exact->inexact (- width (/ page-width 8) margin))) + (y ,(+ main-title-size + margin + (* 0.37 page-height) + (* pos (* 1.5 authors-size))))) + ,author)) + book-authors + (iota (length book-authors))) + + ,(elenq-logo "PUBLISHING" + 3 + (exact->inexact (- width (/ page-width 2) margin)) + (+ margin (* 0.95 page-height))) + + ))) -- cgit v1.2.3