/
slicy.sketchplugin
123 lines (115 loc) · 3.49 KB
/
slicy.sketchplugin
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
var artboards = [[doc currentPage] artboards];
var sketchDoc = undefined;
var assetsFolder = undefined;
var layerNames = [];
var uniqueNames = [];
layers = doc.currentPage().layers();
var nameCount = 0;
function exportWithOptions(layer,path,extension,scale){
scaleValue = scale && scale.length ? scale[0].match(/\d/)[0] : 1;
if(scale && scale[0].match(/\+/)){
var export_data = [{
"format": extension.replace(".",""),
"scale": 1,
"suffix": ""
},{
"format": extension.replace(".",""),
"scale": scaleValue,
"suffix": ""
}];
}
else{
var export_data = [{
"format": extension.replace(".",""),
"scale": scaleValue,
"suffix": ""
}];
}
var export_options = [layer exportOptions];
var export_sizes = [export_options sizes];
// Clear all exportable sizes
while([export_sizes count] > 0) {
[[export_sizes firstObject] remove]
}
for (var s = 0; s < export_data.length; s++) {
var size_data = export_data[s]
var size = [[layer exportOptions] addExportSize]
[size setFormat:size_data.format]
[size setScale:size_data.scale]
[size setName:size_data.suffix]
}
// This is just a hack to force the updating of the UI to see the new sizes in the inspector
[[doc currentPage] deselectAllLayers]
[layer select:true byExpandingSelection:true]
var rect = [layer rectByAccountingForStyleSize:[[layer absoluteRect] rect]];
log(rect)
var slices = [MSSliceMaker slicesFromExportableLayer:layer inRect:rect];
eachArray(slices,function(slice,i){
var layerName = path;
layerName += export_data[i].scale > 1 ? "@"+export_data[i].scale : "";
layerName += extension;
[doc saveArtboardOrSlice: slice toFile: layerName];
})
}
function eachArray(list,callback){
for(var i=0, l = [list count]; i<l; i++){
callback(list.objectAtIndex(i),i);
}
}
function eachLayer(layers,func){
if([layers firstObject].class() === MSArtboardGroup){
eachArray(layers,function(art){
var layers = art.children()
eachArray(layers,func)
});
}
else{
eachArray(layers,func)
}
}
function main(){
if(sketch.doc.fileURL()){
sketchDoc = sketch.doc.fileURL().path();
assetsFolder = sketchDoc.replace(".sketch","") + ".assets/";
}
else{
[doc showMessage:"Save your work before exporting"]
return 0;
}
//Delete folder
[[NSFileManager defaultManager] removeItemAtPath:assetsFolder error:nil];
//Create unique names
eachLayer(layers,function(layer){
var match = 0;
var layerName = layer.name();
var isExportable = layerName.match(/\..+$/);
if(isExportable){
layerName = layer.name().replace(/\..+$/,"");
layerName = layerName.replace(" ","-");
layerName = layerName.toLowerCase();
layerNames.forEach(function(existingName){
if(layerName === existingName){
match += 1;
}
})
layerNames.push(layerName);
match > 0 ? uniqueNames.push(layerName+"-"+match) : uniqueNames.push(layerName);
}
})
eachLayer(layers,function(layer){
var layerName = layer.name();
var options = layerName.match(/\..+$/);
if(options){
var extension = options[0].match(/\.\w+/)[0];
var scale = options[0].match(/[\+\-@].+/);
if(layer.isVisible() === 1){
var path = assetsFolder + uniqueNames[nameCount];
exportWithOptions(layer, path, extension, scale)
}
nameCount++;
}
});
var doneMessage = "Exported " + layerNames.length + " elements";
[doc showMessage:doneMessage ]
}
main()