UNPKG

6.32 kBJavaScriptView Raw
1'use strict';
2var _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"); } }; }();
3require('babel-polyfill');
4var _through = require('through2');
5var _through2 = _interopRequireDefault(_through);
6var _gulpUtil = require('gulp-util');
7var _path = require('path');
8var _fs = require('fs');
9var _spritesmith = require('spritesmith');
10var _spritesmith2 = _interopRequireDefault(_spritesmith);
11function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
12var PLUGIN_NAME = 'gulp-stylus-sprites';
13var EXTNAMES = ['.png', '.jpg', '.jpeg', '.gif'];
14var defOpts = {
15 imgSrcBase: 'sprite',
16 stylusFileName: 'sprite',
17 spritesmithOpts: {}
18};
19var filesDataCache = {};
20module.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