This repository was archived by the owner on Jan 20, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathUpdate Snapshots.sketchplugin
144 lines (126 loc) · 4.67 KB
/
Update Snapshots.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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
// (ctrl command option r)
var folderURL = getFolderURL()
getSelectedArtboards().forEach(function (artboard) {
updateScreenshotInArtboard(artboard, folderURL)
})
function getSelectedArtboards() {
function getArtboardOfLayer(layer) {
if (layer.isKindOfClass(MSArtboardGroup)) {
return layer
} else if (layer.isKindOfClass(MSLayer)) {
return getArtboardOfLayer(layer.parentGroup())
}
}
function unique(a) {
var seen = {};
return a.filter(function(item) {
return seen.hasOwnProperty(item) ? false : (seen[item] = true);
});
}
var selectedArtboards = []
for (var i = 0; i < context.selection.count(); i++) {
selectedArtboards.push(getArtboardOfLayer(context.selection.objectAtIndex(i)))
}
return unique(selectedArtboards)
}
function updateScreenshotInArtboard(artboard, sourcePathURL) {
var SCREEN_NAME = "[Screen]";
var SCREENSHOT_NAME = "Screenshot";
var SCREENSHOT_EXT = ".png";
var name = artboard.name();
var pageName = pageOfArtboard(artboard).name();
var pageLang = null
if (pageName.indexOf("[") >= 0 && pageName.indexOf("]") >= 0) {
pageLang = pageName.substring(pageName.indexOf("[") + 1, pageName.lastIndexOf("]"))
}
var screenshotMaskLayer = findSublayer(artboard, SCREEN_NAME);
if (screenshotMaskLayer == nil) {
showMessage("Can't find layer named " + SCREEN_NAME + " in artboard " + artboard.name());
return;
}
var newImage = null;
var fileName1 = name + SCREENSHOT_EXT;
var fileName2 = pageLang + "-" + name + SCREENSHOT_EXT;
var imageURL1 = sourcePathURL.URLByAppendingPathComponent(fileName1);
var imageURL2 = sourcePathURL.URLByAppendingPathComponent(fileName2);
if (NSFileManager.defaultManager().fileExistsAtPath(imageURL1.path()))) {
newImage = loadImageAtURL(imageURL1)
} else if (NSFileManager.defaultManager().fileExistsAtPath(imageURL2.path()))) {
newImage = loadImageAtURL(imageURL2)
}
if (newImage != null) {
var screenParent = screenshotMaskLayer.parentGroup()
// Remove all sublayers that are MSBitmapLayer
var layersToDelete = []
for (var i = 0; i < screenParent.layers().count(); i++) {
var layer = screenParent.layers().objectAtIndex(i);
if (layer.isKindOfClass(MSBitmapLayer)) {
layersToDelete.push(layer)
}
}
for (var i = 0; i < layersToDelete.length; i++) {
screenParent.removeLayer(layersToDelete[i])
}
// Insert new MSBitmapLayer
var imageLayer = addImgToGroup(screenParent, newImage, SCREENSHOT_NAME)
imageLayer.frame().setWidth(screenshotMaskLayer.frame().width());
} else {
showMessage("Can't read image file named " + fileName1 + " or " + fileName2);
}
}
function addImgToGroup(group, image, layerName) {
var doc = context.document;
var layer = MSBitmapLayer.new();
group.addLayers([layer]);
layer.setConstrainProportions(false);
layer.setRawImage_convertColourspace_collection(image, false, doc.documentData().images());
layer.setName(layerName);
layer.frame().setWidth(image.size().width);
layer.frame().setHeight(image.size().height);
layer.setConstrainProportions(true);
return layer
}
function findSublayer(parent, name) {
for (var i = 0; i < parent.layers().count(); i++) {
var layer = parent.layers().objectAtIndex(i);
if (layer.name() == name) {
return layer;
} else if (layer.isKindOfClass(MSLayerGroup)) {
var foundLayer = findSublayer(layer, name);
if (foundLayer != null) {
return foundLayer;
}
}
}
return null;
}
function getFolderURL() {
var openPanel = NSOpenPanel.openPanel()
openPanel.setCanChooseDirectories(true)
openPanel.setCanChooseFiles(false)
openPanel.setCanCreateDirectories(false)
openPanel.setTitle("Choose a source screenshots folder")
openPanel.setPrompt("Choose")
openPanel.runModal()
return openPanel.URLs().firstObject();
}
function loadImageAtURL(URL) {
return NSImage.alloc().initWithContentsOfURL(URL);
}
function showMessage(message) {
var alert = NSAlert.new()
alert.setMessageText(message)
alert.addButtonWithTitle("OK")
alert.runModal()
}
function pageOfArtboard(artboard) {
for (var i = 0; i < context.document.pages().count(); i++) {
var page = context.document.pages()[i];
for (var j = 0; j < page.artboards().count(); j++) {
if (page.artboards()[j] == artboard) {
return page;
}
}
}
return null;
}