1 | 'use strict';
|
2 | var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
|
3 | require('babel-polyfill');
|
4 | var _through = require('through2');
|
5 | var _through2 = _interopRequireDefault(_through);
|
6 | var _gulpUtil = require('gulp-util');
|
7 | var _path = require('path');
|
8 | var _fs = require('fs');
|
9 | var _spritesmith = require('spritesmith');
|
10 | var _spritesmith2 = _interopRequireDefault(_spritesmith);
|
11 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
12 | var PLUGIN_NAME = 'gulp-stylus-sprites';
|
13 | var EXTNAMES = ['.png', '.jpg', '.jpeg', '.gif'];
|
14 | var defOpts = {
|
15 | imgSrcBase: 'sprite',
|
16 | stylusFileName: 'sprite',
|
17 | spritesmithOpts: {}
|
18 | };
|
19 | var filesDataCache = {};
|
20 | module.exports = function () {
|
21 | var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
22 | var _Object$assign = Object.assign({}, defOpts, opts),
|
23 | imgSrcBase = _Object$assign.imgSrcBase,
|
24 | stylusFileName = _Object$assign.stylusFileName,
|
25 | spritesmithOpts = _Object$assign.spritesmithOpts;
|
26 | var dirGroups = [];
|
27 | var spriteHash = {};
|
28 | var transform = function transform(file, encode, callback) {
|
29 | var _this = this;
|
30 | if (file.isNull()) {
|
31 | this.push(file);
|
32 | callback();
|
33 | return;
|
34 | }
|
35 | if (!file.isBuffer()) return;
|
36 | var dirGroup = (0, _path.relative)('', (0, _path.dirname)(file.path));
|
37 | if (dirGroups.indexOf(dirGroup) !== -1) {
|
38 | callback();
|
39 | return;
|
40 | }
|
41 | dirGroups.push(dirGroup);
|
42 | var srcImageFilenames = (0, _fs.readdirSync)(dirGroup).map(function (fileName) {
|
43 | return (0, _path.join)(dirGroup, fileName);
|
44 | });
|
45 | srcImageFilenames = srcImageFilenames.filter(function (fileName) {
|
46 | return EXTNAMES.some(function (name) {
|
47 | return (0, _path.extname)(fileName).toLowerCase() === name;
|
48 | });
|
49 | });
|
50 | var filesData = {};
|
51 | srcImageFilenames.forEach(function (fileName) {
|
52 | var fileData = (0, _fs.readFileSync)(fileName).toString();
|
53 | if (filesDataCache[fileName]) {
|
54 | filesData[fileName] = fileData;
|
55 | } else {
|
56 | filesDataCache[fileName] = fileData;
|
57 | filesData[fileName] = null;
|
58 | }
|
59 | });
|
60 | var _iteratorNormalCompletion = true;
|
61 | var _didIteratorError = false;
|
62 | var _iteratorError = undefined;
|
63 | try {
|
64 | for (var _iterator = Object.entries(filesDataCache)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
65 | var _step$value = _slicedToArray(_step.value, 2),
|
66 | key = _step$value[0],
|
67 | val = _step$value[1];
|
68 | if (!filesData[key]) {
|
69 | delete filesDataCache[key];
|
70 | }
|
71 | }
|
72 | } catch (err) {
|
73 | _didIteratorError = true;
|
74 | _iteratorError = err;
|
75 | } finally {
|
76 | try {
|
77 | if (!_iteratorNormalCompletion && _iterator.return) {
|
78 | _iterator.return();
|
79 | }
|
80 | } finally {
|
81 | if (_didIteratorError) {
|
82 | throw _iteratorError;
|
83 | }
|
84 | }
|
85 | }
|
86 | var isChanged = Object.entries(filesData).some(function (_ref) {
|
87 | var _ref2 = _slicedToArray(_ref, 2),
|
88 | val = _ref2[0],
|
89 | key = _ref2[1];
|
90 | return filesDataCache[key] !== val;
|
91 | });
|
92 | if (!isChanged) {
|
93 | callback();
|
94 | return;
|
95 | }
|
96 | _spritesmith2.default.run(Object.assign({ src: srcImageFilenames }, spritesmithOpts), function (err, result) {
|
97 | if (err) throw new _gulpUtil.PluginError(PLUGIN_NAME, err);
|
98 | var fileRootPath = (0, _path.relative)(imgSrcBase, dirGroup + '.png');
|
99 | var imageFile = new _gulpUtil.File();
|
100 | imageFile.path = fileRootPath;
|
101 | imageFile.contents = new Buffer(result.image, 'binary');
|
102 | _this.push(imageFile);
|
103 | var _iteratorNormalCompletion2 = true;
|
104 | var _didIteratorError2 = false;
|
105 | var _iteratorError2 = undefined;
|
106 | try {
|
107 | for (var _iterator2 = Object.entries(result.coordinates)[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
|
108 | var _step2$value = _slicedToArray(_step2.value, 2),
|
109 | filePath = _step2$value[0],
|
110 | obj = _step2$value[1];
|
111 | var mapKey = (0, _path.relative)(imgSrcBase, filePath);
|
112 | spriteHash[mapKey] = Object.assign({ url: '/' + fileRootPath }, obj);
|
113 | }
|
114 | } catch (err) {
|
115 | _didIteratorError2 = true;
|
116 | _iteratorError2 = err;
|
117 | } finally {
|
118 | try {
|
119 | if (!_iteratorNormalCompletion2 && _iterator2.return) {
|
120 | _iterator2.return();
|
121 | }
|
122 | } finally {
|
123 | if (_didIteratorError2) {
|
124 | throw _iteratorError2;
|
125 | }
|
126 | }
|
127 | }
|
128 | callback();
|
129 | });
|
130 | };
|
131 | var flush = function flush(callback) {
|
132 | this.push(new _gulpUtil.File({
|
133 | path: stylusFileName + '.styl',
|
134 | contents: new Buffer(createCss(JSON.stringify(spriteHash)))
|
135 | }));
|
136 | this.emit('end');
|
137 | callback();
|
138 | };
|
139 | var createCss = function createCss(cssHash) {
|
140 | if (cssHash) {
|
141 | return 'sprite-hash = ' + cssHash + '\n' + mixin();
|
142 | } else {
|
143 | return '';
|
144 | }
|
145 | };
|
146 | var mixin = function mixin() {
|
147 | return 'sprite(filepath, scale = 1)\n image-hash = sprite-hash[filepath]\n if !image-hash\n error(\'Not found image file \' + filepath + \'.\')\n width: (image-hash.width * scale)px\n height: (image-hash.height * scale)px\n url = image-hash.url\n background: url(url) no-repeat\n background-position: (-1 * image-hash.x * scale)px (-1 * image-hash.y * scale)px\n if scale != 1\n background-size: (image-hash.width * scale)px, (image-hash.height * scale)px\nsprite-retina(filepath)\n sprite filepath, 0.5';
|
148 | };
|
149 | return _through2.default.obj({ objectMode: true }, transform, flush);
|
150 | }; |
\ | No newline at end of file |