Skip to content

Commit c97df5d

Browse files
committed
refactor cli
1 parent 92e3771 commit c97df5d

File tree

5 files changed

+207
-85
lines changed

5 files changed

+207
-85
lines changed

Dockerfile

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
FROM node:18-slim
2+
# RUN echo "registry=https://registry.npmmirror.com/"> ~/.npmrc
3+
RUN npm install -g @mapbox/spritezero glob minimist
4+
COPY bin/spritezero /usr/local/lib
5+
RUN ln -s /usr/local/lib/spritezero /usr/local/bin/
6+
7+
ENTRYPOINT [ "spritezero" ]

bin/spritezero

Lines changed: 46 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -2,103 +2,75 @@
22

33
var spritezero = require('@mapbox/spritezero');
44
var fs = require('fs');
5-
var queue = require('queue-async');
6-
var multiline = require('multiline');
75
var path = require('path');
8-
var stringify = require('json-stable-stringify');
6+
var glob = require('glob');
97
var argv = require('minimist')(process.argv.slice(2), {
10-
boolean: ['retina', 'unique', 'h', 'help']
8+
default: { _: ['.', '.'] },
9+
boolean: ['retina', 'unique', 'h', 'help']
1110
});
12-
13-
function filepaths (dir) {
14-
return fs.readdirSync(dir)
15-
.filter(function (d) {
16-
return !d.match(/^\./);
17-
})
18-
.map(function (d) {
19-
return path.join(dir, d);
20-
});
21-
}
22-
23-
function showHelp () {
24-
console.log(multiline(function () {
25-
/*
26-
spritezero
27-
28-
Generate sprite sheets for maps and the web using SVG files as input
29-
30-
Usage
31-
<output> <inputdir>
32-
33-
Example
34-
spritezero maki maki/
35-
*/ }));
11+
12+
function showHelp() {
13+
console.log(`
14+
spritezero
15+
Generate sprite sheets for maps and the web using SVG files as input
16+
Usage
17+
18+
<output> <inputdir>
19+
20+
Example
21+
spritezero maki maki
22+
`);
3623
}
3724

3825
if (argv.help || argv._.length < 2) {
39-
showHelp();
40-
/* istanbul ignore next */
41-
process.exit(1);
26+
showHelp();
27+
/* istanbul ignore next */
28+
process.exit(1);
4229
}
4330

4431
var ratio = 1;
4532
var unique = false;
4633

4734
if (argv.retina) {
48-
ratio = 2;
35+
ratio = 2;
4936
} else if (argv.ratio) {
50-
ratio = parseFloat(argv.ratio);
37+
ratio = parseFloat(argv.ratio);
5138
}
5239

5340
if (argv.unique) {
54-
unique = true;
41+
unique = true;
5542
}
5643

5744
var outfile = argv._[0];
5845
var input = argv._[1];
5946

60-
function loadFile (file, callback) {
61-
fs.readFile(file, function (err, res) {
62-
return callback(err, {
63-
svg: res,
64-
id: path.basename(file).replace('.svg', '')
65-
});
66-
});
47+
function sortById(a, b) {
48+
return b.id < a.id;
6749
}
6850

69-
function sortById (a, b) {
70-
return b.id < a.id;
51+
const buffers = glob
52+
.sync(input + '/*.svg')
53+
.map((f) => ({
54+
svg: fs.readFileSync(f),
55+
id: path.basename(f).replace('.svg', '')
56+
}))
57+
.sort(sortById);
58+
59+
var genLayout = unique ? spritezero.generateLayoutUnique : spritezero.generateLayout;
60+
genLayout({ imgs: buffers, pixelRatio: ratio, format: true }, saveLayout);
61+
genLayout({ imgs: buffers, pixelRatio: ratio, format: false }, saveImage);
62+
63+
function saveLayout(err, formattedLayout) {
64+
if (err) throw err;
65+
fs.writeFileSync(outfile + '.json', JSON.stringify(formattedLayout, undefined, ' '));
7166
}
7267

73-
var q = queue(16);
74-
75-
filepaths(input).forEach(function (file) {
76-
q.defer(loadFile, file);
77-
});
78-
79-
q.awaitAll(function (err, buffers) {
68+
function saveImage(err, layout) {
69+
if (err) throw err;
70+
spritezero.generateImage(layout, function (err, image) {
8071
if (err) throw err;
81-
82-
buffers.sort(sortById);
83-
84-
function saveLayout (err, formattedLayout) {
85-
if (err) throw err;
86-
fs.writeFile(outfile + '.json', stringify(formattedLayout, {space: ' '}), 'utf8', function (err) {
87-
if (err) throw err;
88-
});
89-
}
90-
91-
function saveImage (err, layout) {
92-
if (err) throw err;
93-
spritezero.generateImage(layout, function (err, image) {
94-
if (err) throw err;
95-
fs.writeFile(outfile + '.png', image, function (err) {
96-
if (err) throw err;
97-
});
98-
});
99-
}
100-
101-
var genLayout = unique ? spritezero.generateLayoutUnique : spritezero.generateLayout;
102-
genLayout({ imgs: buffers, pixelRatio: ratio, format: true }, saveLayout);
103-
genLayout({ imgs: buffers, pixelRatio: ratio, format: false }, saveImage);
104-
});
72+
fs.writeFileSync(outfile + '.png', image, function (err) {
73+
if (err) throw err;
74+
});
75+
});
76+
}

bin/spritezero_bak

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
#!/usr/bin/env node
2+
3+
var spritezero = require('@mapbox/spritezero');
4+
var fs = require('fs');
5+
var queue = require('queue-async');
6+
var multiline = require('multiline');
7+
var path = require('path');
8+
var stringify = require('json-stable-stringify');
9+
var argv = require('minimist')(process.argv.slice(2), {
10+
boolean: ['retina', 'unique', 'h', 'help']
11+
});
12+
13+
function filepaths (dir) {
14+
return fs.readdirSync(dir)
15+
.filter(function (d) {
16+
return !d.match(/^\./);
17+
})
18+
.map(function (d) {
19+
return path.join(dir, d);
20+
});
21+
}
22+
23+
function showHelp () {
24+
console.log(multiline(function () {
25+
/*
26+
spritezero
27+
28+
Generate sprite sheets for maps and the web using SVG files as input
29+
30+
Usage
31+
<output> <inputdir>
32+
33+
Example
34+
spritezero maki maki/
35+
*/ }));
36+
}
37+
38+
if (argv.help || argv._.length < 2) {
39+
showHelp();
40+
/* istanbul ignore next */
41+
process.exit(1);
42+
}
43+
44+
var ratio = 1;
45+
var unique = false;
46+
47+
if (argv.retina) {
48+
ratio = 2;
49+
} else if (argv.ratio) {
50+
ratio = parseFloat(argv.ratio);
51+
}
52+
53+
if (argv.unique) {
54+
unique = true;
55+
}
56+
57+
var outfile = argv._[0];
58+
var input = argv._[1];
59+
60+
function loadFile (file, callback) {
61+
fs.readFile(file, function (err, res) {
62+
return callback(err, {
63+
svg: res,
64+
id: path.basename(file).replace('.svg', '')
65+
});
66+
});
67+
}
68+
69+
function sortById (a, b) {
70+
return b.id < a.id;
71+
}
72+
73+
var q = queue(16);
74+
75+
filepaths(input).forEach(function (file) {
76+
q.defer(loadFile, file);
77+
});
78+
79+
q.awaitAll(function (err, buffers) {
80+
if (err) throw err;
81+
82+
buffers.sort(sortById);
83+
84+
function saveLayout (err, formattedLayout) {
85+
if (err) throw err;
86+
fs.writeFile(outfile + '.json', stringify(formattedLayout, {space: ' '}), 'utf8', function (err) {
87+
if (err) throw err;
88+
});
89+
}
90+
91+
function saveImage (err, layout) {
92+
if (err) throw err;
93+
spritezero.generateImage(layout, function (err, image) {
94+
if (err) throw err;
95+
fs.writeFile(outfile + '.png', image, function (err) {
96+
if (err) throw err;
97+
});
98+
});
99+
}
100+
101+
var genLayout = unique ? spritezero.generateLayoutUnique : spritezero.generateLayout;
102+
genLayout({ imgs: buffers, pixelRatio: ratio, format: true }, saveLayout);
103+
genLayout({ imgs: buffers, pixelRatio: ratio, format: false }, saveImage);
104+
});

package.json

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,16 @@
1717
"vector"
1818
],
1919
"dependencies": {
20-
"minimist": "^1.2.0",
21-
"multiline": "^1.0.2",
22-
"queue-async": "^1.2.1",
23-
"json-stable-stringify": "^1.0.1",
24-
"@mapbox/spritezero": "~5.0.0"
20+
"@mapbox/spritezero": "^8.0.3",
21+
"glob": "^10.2.6",
22+
"minimist": "^1.2.8"
2523
},
2624
"devDependencies": {
27-
"eslint": "^4.0.0",
28-
"tap": "^10.1.0"
29-
},
30-
"engines": {
31-
"node": ">=4.0.0"
25+
"eslint": "^4.19.1",
26+
"tap": "^10.7.3"
3227
},
3328
"scripts": {
3429
"lint": "eslint bin/spritezero test/",
3530
"test": "npm run lint && tap test/test.js"
3631
}
37-
}
32+
}

prettier.config.cjs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
module.exports = {
2+
// 一行最多 200 字符..
3+
printWidth: 200,
4+
// 行尾需要有分号
5+
semi: true,
6+
// 使用单引号
7+
singleQuote: true,
8+
// 末尾需要有逗号
9+
trailingComma: 'none',
10+
// 大括号内的首尾需要空格
11+
bracketSpacing: true,
12+
// jsx 不使用单引号,而使用双引号
13+
jsxSingleQuote: false,
14+
// jsx 标签的反尖括号需要换行
15+
jsxBracketSameLine: true,
16+
// 箭头函数,只有一个参数的时候,也需要括号
17+
arrowParens: 'always',
18+
// arrowParens: 'avoid',
19+
20+
// 使用 2 个空格缩进
21+
tabWidth: 2,
22+
23+
// 不使用缩进符,而使用空格
24+
useTabs: false,
25+
26+
// 对象的 key 仅在必要时用引号
27+
quoteProps: 'as-needed',
28+
// 每个文件格式化的范围是文件的全部内容
29+
rangeStart: 0,
30+
rangeEnd: Infinity,
31+
32+
// 不需要写文件开头的 @prettier
33+
requirePragma: false,
34+
// 不需要自动在文件开头插入 @prettier
35+
insertPragma: false,
36+
// 使用默认的折行标准
37+
proseWrap: 'preserve',
38+
// 根据显示样式决定 html 要不要折行
39+
htmlWhitespaceSensitivity: 'css',
40+
// vue 文件中的 script 和 style 内不用缩进
41+
vueIndentScriptAndStyle: false,
42+
// 换行符使用 lf
43+
endOfLine: 'lf'
44+
};

0 commit comments

Comments
 (0)