Skip to content

Instantly share code, notes, and snippets.

@kgn
Created October 23, 2016 02:37
Show Gist options
  • Select an option

  • Save kgn/50b0b3d0cee3e7d92ee854fdabd35388 to your computer and use it in GitHub Desktop.

Select an option

Save kgn/50b0b3d0cee3e7d92ee854fdabd35388 to your computer and use it in GitHub Desktop.
SketchAPI plugin to organize layers. Orders them based on their frames and renames them with a prefix.
var sketch = context.api()
function moveForward(layer, amount) {
for (var i = 0; i < amount; ++i) {
layer.moveForward()
}
}
function organizeLayers(prefix, layers) {
var sortedLayers = [];
layers.forEach(function(layer, index) {
var insertIndex;
sortedLayers.forEach(function(newLayer, newIndex) {
if (layer.frame.x < newLayer.frame.x || layer.frame.y < newLayer.frame.y) {
insertIndex = newIndex;
}
});
if (insertIndex) {
sortedLayers.splice(insertIndex, 0, layer);
} else {
sortedLayers.push(layer);
}
});
var indexOffset = sortedLayers[0].index;
sortedLayers.forEach(function(layer, index){
layer.name = prefix+" "+(index+1);
moveForward(layer, indexOffset-layer.index-index);
});
}
function testOrganizeLayers1(tester) {
var page = sketch.selectedDocument.selectedPage;
var parent = page.newGroup();
var prefix = "Table Row";
var bottomLayer = parent.newGroup({"name":"Bottom Group"});
var layer3 = parent.newGroup({"name":"Group 3", "frame": new Rectangle(0, 88, 100, 44)});
var layer2 = parent.newGroup({"name":"Group 2", "frame": new Rectangle(0, 44, 100, 44)});
var layer4 = parent.newGroup({"name":"Group 4", "frame": new Rectangle(0, 132, 100, 44)});
var layer1 = parent.newGroup({"name":"Group 1", "frame": new Rectangle(0, 0, 100, 44)});
var topLayer = parent.newGroup({"name":"Top Group"});
organizeLayers(prefix, [layer1, layer2, layer3, layer4]);
tester.assertEqual(topLayer.index, 5);
tester.assertEqual(layer1.name, prefix+" 1");
tester.assertEqual(layer1.index, 4);
tester.assertEqual(layer2.name, prefix+" 2");
tester.assertEqual(layer2.index, 3);
tester.assertEqual(layer3.name, prefix+" 3");
tester.assertEqual(layer3.index, 2);
tester.assertEqual(layer4.name, prefix+" 4");
tester.assertEqual(layer4.index, 1);
tester.assertEqual(bottomLayer.index, 0);
parent.remove();
}
var tests = {
"suites" : {
"OrganizeLayers": {
"tests" : {
testOrganizeLayers1
}
}
}
}
log(sketch.tester.runUnitTests(tests));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment