1
0
Fork 0

art: Updated prettier config

This commit is contained in:
Joost De Cock 2019-08-03 15:53:41 +02:00 committed by Joost De Cock
parent 545ebbfee4
commit 13cb9ca5ee
4 changed files with 199 additions and 149 deletions

View file

@ -4,6 +4,12 @@
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {
"@freesewing/prettier-config": {
"version": "2.0.0-beta.37",
"resolved": "https://registry.npmjs.org/@freesewing/prettier-config/-/prettier-config-2.0.0-beta.37.tgz",
"integrity": "sha512-JISpjXqT/EkSDSzd1asQkBDQPbrVuqPEsy8aafICLoP0WV4R2YcTYCX9YuoE+87lKsFP3X7oKW27nkJ/84P2Aw==",
"dev": true
},
"abbrev": { "abbrev": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@ -2275,7 +2281,8 @@
"ansi-regex": { "ansi-regex": {
"version": "2.1.1", "version": "2.1.1",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"aproba": { "aproba": {
"version": "1.2.0", "version": "1.2.0",
@ -2296,12 +2303,14 @@
"balanced-match": { "balanced-match": {
"version": "1.0.0", "version": "1.0.0",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"brace-expansion": { "brace-expansion": {
"version": "1.1.11", "version": "1.1.11",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"balanced-match": "^1.0.0", "balanced-match": "^1.0.0",
"concat-map": "0.0.1" "concat-map": "0.0.1"
@ -2316,17 +2325,20 @@
"code-point-at": { "code-point-at": {
"version": "1.1.0", "version": "1.1.0",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"concat-map": { "concat-map": {
"version": "0.0.1", "version": "0.0.1",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"console-control-strings": { "console-control-strings": {
"version": "1.1.0", "version": "1.1.0",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"core-util-is": { "core-util-is": {
"version": "1.0.2", "version": "1.0.2",
@ -2443,7 +2455,8 @@
"inherits": { "inherits": {
"version": "2.0.3", "version": "2.0.3",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"ini": { "ini": {
"version": "1.3.5", "version": "1.3.5",
@ -2455,6 +2468,7 @@
"version": "1.0.0", "version": "1.0.0",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"number-is-nan": "^1.0.0" "number-is-nan": "^1.0.0"
} }
@ -2469,6 +2483,7 @@
"version": "3.0.4", "version": "3.0.4",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"brace-expansion": "^1.1.7" "brace-expansion": "^1.1.7"
} }
@ -2476,12 +2491,14 @@
"minimist": { "minimist": {
"version": "0.0.8", "version": "0.0.8",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"minipass": { "minipass": {
"version": "2.2.4", "version": "2.2.4",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"safe-buffer": "^5.1.1", "safe-buffer": "^5.1.1",
"yallist": "^3.0.0" "yallist": "^3.0.0"
@ -2500,6 +2517,7 @@
"version": "0.5.1", "version": "0.5.1",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"minimist": "0.0.8" "minimist": "0.0.8"
} }
@ -2580,7 +2598,8 @@
"number-is-nan": { "number-is-nan": {
"version": "1.0.1", "version": "1.0.1",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"object-assign": { "object-assign": {
"version": "4.1.1", "version": "4.1.1",
@ -2592,6 +2611,7 @@
"version": "1.4.0", "version": "1.4.0",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"wrappy": "1" "wrappy": "1"
} }
@ -2677,7 +2697,8 @@
"safe-buffer": { "safe-buffer": {
"version": "5.1.1", "version": "5.1.1",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"safer-buffer": { "safer-buffer": {
"version": "2.1.2", "version": "2.1.2",
@ -2713,6 +2734,7 @@
"version": "1.0.2", "version": "1.0.2",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"code-point-at": "^1.0.0", "code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0", "is-fullwidth-code-point": "^1.0.0",
@ -2732,6 +2754,7 @@
"version": "3.0.1", "version": "3.0.1",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"ansi-regex": "^2.0.0" "ansi-regex": "^2.0.0"
} }
@ -2775,12 +2798,14 @@
"wrappy": { "wrappy": {
"version": "1.0.2", "version": "1.0.2",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"yallist": { "yallist": {
"version": "3.0.2", "version": "3.0.2",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
} }
} }
}, },

View file

@ -11,7 +11,7 @@
"major": "npm version major -m ':bookmark: v%s' && npm run build", "major": "npm version major -m ':bookmark: v%s' && npm run build",
"test": "echo \"Error: no test specified\" && exit 1", "test": "echo \"Error: no test specified\" && exit 1",
"clean": "rimraf dist", "clean": "rimraf dist",
"pretty": "npx prettier --write \"src/*.js\"", "prettier": "npx prettier --write 'src/**'",
"lint": "eslint --fix \"src/*.js\"", "lint": "eslint --fix \"src/*.js\"",
"dev": "backpack", "dev": "backpack",
"build": "backpack build" "build": "backpack build"
@ -26,6 +26,7 @@
"url": "https://github.com/freesewing/svg2pdf/issues" "url": "https://github.com/freesewing/svg2pdf/issues"
}, },
"homepage": "https://github.com/freesewing/svg2pdf#readme", "homepage": "https://github.com/freesewing/svg2pdf#readme",
"prettier": "@freesewing/prettier-config",
"husky": { "husky": {
"hooks": { "hooks": {
"pre-commit": "lint-staged" "pre-commit": "lint-staged"
@ -46,6 +47,7 @@
"shell-exec": "1.0.2" "shell-exec": "1.0.2"
}, },
"devDependencies": { "devDependencies": {
"@freesewing/prettier-config": "2.0.0-beta.37",
"backpack-core": "0.7.0", "backpack-core": "0.7.0",
"nodemon": "1.18.6" "nodemon": "1.18.6"
} }

View file

@ -1,76 +1,82 @@
<html> <html>
<head> <head>
<title>Convert your SVG pattern</title> <title>Convert your SVG pattern</title>
<link href="https://fonts.googleapis.com/css?family=Domine|Open+Sans+Condensed:300" rel="stylesheet"> <link
<style> href="https://fonts.googleapis.com/css?family=Domine|Open+Sans+Condensed:300"
body { rel="stylesheet"
font-family: 'Domine', serif; />
font-size: 100%; <style>
max-width: 600px; body {
margin: 30px auto; font-family: 'Domine', serif;
} font-size: 100%;
h1 { max-width: 600px;
font-family: 'Open Sans Condensed', sans-serif; margin: 30px auto;
font-size: 3rem; }
} h1 {
</style> font-family: 'Open Sans Condensed', sans-serif;
font-size: 3rem;
}
</style>
</head> </head>
<body> <body>
<p align="center"> <p align="center">
<a title="Go to freesewing.org" href="https://freesewing.org/"> <a title="Go to freesewing.org" href="https://freesewing.org/">
<img src="https://freesewing.org/img/logo/black.svg" align="center" width="150px" alt="Freesewing logo"/> <img
src="https://freesewing.org/img/logo/black.svg"
align="center"
width="150px"
alt="Freesewing logo"
/>
</a> </a>
</p> </p>
<h1>Convert your freesewing pattern</h1> <h1>Convert your freesewing pattern</h1>
<form method="POST" action="/" enctype='multipart/form-data'> <form method="POST" action="/" enctype="multipart/form-data">
<h2>Upload your pattern</h2> <h2>Upload your pattern</h2>
<input type="file" id="svg" name="svg" accept="image/svg+xml"> <input type="file" id="svg" name="svg" accept="image/svg+xml" />
<h2>Choose a file format</h2> <h2>Choose a file format</h2>
<p> <p>
<input type="radio" name="format" value="ps" id="ps"> <input type="radio" name="format" value="ps" id="ps" />
<label for='ps'>PostScript (.ps)</label> <label for="ps">PostScript (.ps)</label>
</p> </p>
<p> <p>
<input type="radio" name="format" value="pdf" checked id="pdf"> <input type="radio" name="format" value="pdf" checked id="pdf" />
<label for='pdf'>Portable Document Format (.pdf)</label> <label for="pdf">Portable Document Format (.pdf)</label>
</p> </p>
<h2>Choose a paper size</h2> <h2>Choose a paper size</h2>
<p> <p>
<input type="radio" name="size" value="full" id="full" checked> <input type="radio" name="size" value="full" id="full" checked />
<label for='full'>Full size (do not tile)</label> <label for="full">Full size (do not tile)</label>
</p> </p>
<p> <p>
<input type="radio" name="size" value="a4" id="a4"> <input type="radio" name="size" value="a4" id="a4" />
<label for='a4'>A4</label> <label for="a4">A4</label>
</p> </p>
<p> <p>
<input type="radio" name="size" value="a3" id="a3"> <input type="radio" name="size" value="a3" id="a3" />
<label for='a3'>A3</label> <label for="a3">A3</label>
</p> </p>
<p> <p>
<input type="radio" name="size" value="a2" id="a2"> <input type="radio" name="size" value="a2" id="a2" />
<label for='a2'>A2</label> <label for="a2">A2</label>
</p> </p>
<p> <p>
<input type="radio" name="size" value="a1" id="a1"> <input type="radio" name="size" value="a1" id="a1" />
<label for='a1'>A1</label> <label for="a1">A1</label>
</p> </p>
<p> <p>
<input type="radio" name="size" value="a0" id="a0"> <input type="radio" name="size" value="a0" id="a0" />
<label for='a0'>A0</label> <label for="a0">A0</label>
</p> </p>
<p> <p>
<input type="radio" name="size" value="letter" id="letter"> <input type="radio" name="size" value="letter" id="letter" />
<label for='letter'>Letter</label> <label for="letter">Letter</label>
</p> </p>
<p> <p>
<input type="radio" name="size" value="tabloid" id="tabloid"> <input type="radio" name="size" value="tabloid" id="tabloid" />
<label for='tabloid'>Tabloid</label> <label for="tabloid">Tabloid</label>
</p> </p>
<h2>We'll do the rest</h2> <h2>We'll do the rest</h2>
<input type="submit" value="Convert my pattern"> <input type="submit" value="Convert my pattern" />
</form> </form>
</body> </body>
</html> </html>

View file

@ -1,123 +1,140 @@
import express from "express"; import express from 'express'
import cors from "cors"; import cors from 'cors'
import bodyParser from "body-parser"; import bodyParser from 'body-parser'
import path from "path"; import path from 'path'
import fs from "fs"; import fs from 'fs'
import formidable from "formidable"; import formidable from 'formidable'
import shellExec from "shell-exec"; import shellExec from 'shell-exec'
const app = express(); const app = express()
app.use(cors()); app.use(cors())
app.use(bodyParser.json()); app.use(bodyParser.json())
const port = process.env.PORT || 4000; const port = process.env.PORT || 4000
const formats = ['pdf','ps']; const formats = ['pdf', 'ps']
const sizes = ['full', 'a4','a3','a2','a1','a0','letter','tabloid']; const sizes = ['full', 'a4', 'a3', 'a2', 'a1', 'a0', 'letter', 'tabloid']
app.get("/", async (req, res) => res.sendFile(path.resolve(__dirname+'/form.html'))); app.get('/', async (req, res) => res.sendFile(path.resolve(__dirname + '/form.html')))
app.post("/", async (req, res) => { app.post('/', async (req, res) => {
let form = new formidable.IncomingForm(); let form = new formidable.IncomingForm()
form.parse(req, (err, fields, files) => { form.parse(req, (err, fields, files) => {
if(err || typeof files.svg === "undefined" || if (
err ||
typeof files.svg === 'undefined' ||
formats.indexOf(fields.format) === -1 || formats.indexOf(fields.format) === -1 ||
sizes.indexOf(fields.size) === -1 sizes.indexOf(fields.size) === -1
) return res.sendFile(path.resolve(__dirname+'/form.html')); )
let upload = files.svg.path; return res.sendFile(path.resolve(__dirname + '/form.html'))
let cmd; let upload = files.svg.path
if(fields.size === "full") { // Do not tile let cmd
let target = `/tmp/pattern.${fields.format}`; if (fields.size === 'full') {
cmd = `/usr/bin/inkscape --export-${fields.format}=${target} ${upload}`; // Do not tile
let target = `/tmp/pattern.${fields.format}`
cmd = `/usr/bin/inkscape --export-${fields.format}=${target} ${upload}`
shellExec(cmd).then(() => { shellExec(cmd).then(() => {
return res.sendFile(target); return res.sendFile(target)
}); })
} else { // Do tile } else {
let untiled = "/tmp/untiled.ps"; // Do tile
let tiled = "/tmp/tiled.ps"; let untiled = '/tmp/untiled.ps'
cmd = `/usr/bin/inkscape --export-ps=${untiled} ${upload}`; let tiled = '/tmp/tiled.ps'
cmd = `/usr/bin/inkscape --export-ps=${untiled} ${upload}`
shellExec(cmd).then(() => { shellExec(cmd).then(() => {
cmd = `/usr/local/bin/tile -a -m${fields.size} -s1 -t"On-demand tiler" ${untiled} > ${tiled}`; cmd = `/usr/local/bin/tile -a -m${
fields.size
} -s1 -t"On-demand tiler" ${untiled} > ${tiled}`
shellExec(cmd).then(() => { shellExec(cmd).then(() => {
if(fields.format === "ps") return res.sendFile(tiled); if (fields.format === 'ps') return res.sendFile(tiled)
cmd = `/usr/bin/ps2pdf14 ${tiled} ${tiled}.pdf`; cmd = `/usr/bin/ps2pdf14 ${tiled} ${tiled}.pdf`
shellExec(cmd).then(() => { shellExec(cmd).then(() => {
return res.sendFile(tiled+'.pdf'); return res.sendFile(tiled + '.pdf')
}); })
}); })
}); })
} }
}); })
}); })
app.post("/api", async (req, res) => { app.post('/api', async (req, res) => {
if( if (
typeof req.body.svg === "undefined" || typeof req.body.svg === 'undefined' ||
typeof req.body.format === "undefined" || typeof req.body.format === 'undefined' ||
typeof req.body.size === "undefined" || typeof req.body.size === 'undefined' ||
formats.indexOf(req.body.format) === -1 || formats.indexOf(req.body.format) === -1 ||
sizes.indexOf(req.body.size) === -1 sizes.indexOf(req.body.size) === -1
) )
return res.sendStatus(400); return res.sendStatus(400)
let storage = "/fs/storage/tmp/"; let storage = '/fs/storage/tmp/'
let dir = createTempDir(storage); let dir = createTempDir(storage)
let svg = storage+dir+"/draft.svg"; let svg = storage + dir + '/draft.svg'
let cmd = ""; let cmd = ''
// Save svg to disk // Save svg to disk
fs.writeFile(svg, req.body.svg, err => { fs.writeFile(svg, req.body.svg, err => {
if(err) { if (err) {
console.log(err); console.log(err)
return res.sendStatus(500); return res.sendStatus(500)
} }
let target = storage+dir+"/pattern-"+req.body.size; let target = storage + dir + '/pattern-' + req.body.size
if(req.body.size === "full") { // Do not tile if (req.body.size === 'full') {
if (req.body.format === "ps") { // Do not tile
target += ".ps"; if (req.body.format === 'ps') {
cmd = "/usr/bin/inkscape --export-ps="+target+" "+svg; target += '.ps'
shellExec(cmd).then(() => { cmd = '/usr/bin/inkscape --export-ps=' + target + ' ' + svg
return res.send({link: process.env.TILER_DOWNLOAD+"/tmp/"+dir+"/pattern-full.ps"}); shellExec(cmd).then(() => {
}); return res.send({ link: process.env.TILER_DOWNLOAD + '/tmp/' + dir + '/pattern-full.ps' })
})
} else { } else {
target += ".pdf"; target += '.pdf'
cmd = "/usr/bin/inkscape --export-pdf="+target+" "+svg; cmd = '/usr/bin/inkscape --export-pdf=' + target + ' ' + svg
shellExec(cmd).then(() => { shellExec(cmd).then(() => {
return res.send({link: process.env.TILER_DOWNLOAD+"/tmp/"+dir+"/pattern-full.pdf"}); return res.send({
}); link: process.env.TILER_DOWNLOAD + '/tmp/' + dir + '/pattern-full.pdf'
})
})
} }
} else { // Do tile } else {
target += ".pdf"; // Do tile
let untiled = storage+dir+"/untiled.ps"; target += '.pdf'
let tiled = storage+dir+"/tiled.ps"; let untiled = storage + dir + '/untiled.ps'
cmd = `/usr/bin/inkscape --export-ps=${untiled} ${svg}`; let tiled = storage + dir + '/tiled.ps'
shellExec(cmd).then(() => { cmd = `/usr/bin/inkscape --export-ps=${untiled} ${svg}`
cmd = `/usr/local/bin/tile -a -m${req.body.size} -s1 -t"freesewing.org" ${untiled} > ${tiled}`; shellExec(cmd).then(() => {
console.log('tile cmd', cmd); cmd = `/usr/local/bin/tile -a -m${
shellExec(cmd).then(() => { req.body.size
cmd = `/usr/bin/ps2pdf14 ${tiled} ${target}`; } -s1 -t"freesewing.org" ${untiled} > ${tiled}`
shellExec(cmd).then(() => { console.log('tile cmd', cmd)
return res.send({link: process.env.TILER_DOWNLOAD+"/tmp/"+dir+"/pattern-"+req.body.size+".pdf"}); shellExec(cmd).then(() => {
}); cmd = `/usr/bin/ps2pdf14 ${tiled} ${target}`
}); shellExec(cmd).then(() => {
}); return res.send({
} link:
}); process.env.TILER_DOWNLOAD + '/tmp/' + dir + '/pattern-' + req.body.size + '.pdf'
}); })
})
})
})
}
})
})
const createTempDir = folder => {
let dir = newDir()
let path = folder + dir
fs.mkdirSync(path, { recursive: true }, err => {
if (err) console.log('mkdirFailed', err)
})
const createTempDir = (folder) => { return dir
let dir = newDir();
let path = folder+dir;
fs.mkdirSync(path, {recursive: true}, (err) => {
if(err) console.log("mkdirFailed", err);
});
return dir;
} }
const newDir = (length = 10) => { const newDir = (length = 10) => {
let dir = ""; let dir = ''
let possible = "abcdefghijklmnopqrstuvwxyz"; let possible = 'abcdefghijklmnopqrstuvwxyz'
for (let i = 0; i < length; i++) for (let i = 0; i < length; i++)
dir += possible.charAt(Math.floor(Math.random() * possible.length)); dir += possible.charAt(Math.floor(Math.random() * possible.length))
return dir; return dir
} }
app.listen(port, err => { console.log(`> listening on port ${port}`) }); app.listen(port, err => {
console.log(`> listening on port ${port}`)
})