├── .gitignore ├── sketchpack.json ├── Pages ├── View Next Page.sketchplugin └── View Previous Page.sketchplugin ├── Layers └── Toggle Layers.sketchplugin ├── README.md ├── Text └── Split Combine Text.sketchplugin │ └── Contents │ └── Sketch │ ├── manifest.json │ ├── combine.cocoascript │ └── split.cocoascript └── LICENSE /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .git 3 | TODO.md -------------------------------------------------------------------------------- /sketchpack.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "JW Plugins", 3 | "description": "A small collection of plugins for manipulating text, switching pages, and toggling layers", 4 | "tags": ["text", "pages", "commands"] 5 | } -------------------------------------------------------------------------------- /Pages/View Next Page.sketchplugin: -------------------------------------------------------------------------------- 1 | // View Next Page (ctrl alt command →) 2 | 3 | var pages = [doc pages], 4 | current = [doc currentPage], 5 | pageCount = pages.count() - 1; 6 | 7 | for (var i = 0; i < pages.count(); i++) { 8 | 9 | if (pages[i] == current) { 10 | if (i == pageCount) { 11 | [doc setCurrentPage:[0]]; 12 | } else { 13 | var next = pages[i+1]; 14 | [doc setCurrentPage:next]; 15 | }; 16 | }; 17 | 18 | }; -------------------------------------------------------------------------------- /Pages/View Previous Page.sketchplugin: -------------------------------------------------------------------------------- 1 | // View Previous Page (ctrl alt command ←) 2 | 3 | var pages = [doc pages], 4 | current = [doc currentPage], 5 | pageCount = pages.count() - 1; 6 | 7 | for (var i = 0; i < pages.count(); i++) { 8 | 9 | if (pages[i] == current) { 10 | if (i == 0) { 11 | var last = pages[pageCount]; 12 | [doc setCurrentPage:last]; 13 | } else { 14 | var prev = pages[i-1]; 15 | [doc setCurrentPage:prev]; 16 | }; 17 | }; 18 | 19 | }; -------------------------------------------------------------------------------- /Layers/Toggle Layers.sketchplugin: -------------------------------------------------------------------------------- 1 | // Toggle Layers (ctrl alt cmd h) 2 | 3 | var doc = context.document; 4 | var layerCompare = "👀"; // change this to whatever you'd like to match 5 | var layerGroups = doc.currentPage().children(); 6 | 7 | for (var i=0; i b.y) { 27 | return 1; 28 | } 29 | if (a.y < b.y) { 30 | return -1; 31 | } 32 | // a must be equal to b 33 | return 0; 34 | }); 35 | 36 | var lineHeight = [newLayer lineHeight], 37 | newFrame = [newLayer frame], 38 | combinedText = textArray.map(function(elem){ 39 | return elem.text; 40 | }).join("\n"); 41 | 42 | // Bug in Sketch causes lineHeight to return 0 if set to auto. Faking it with magic number. 43 | if (lineHeight == 0) { 44 | lineHeight = [newLayer fontSize] * 1.2; 45 | }; 46 | 47 | [newLayer setStringValue: combinedText]; 48 | [newFrame setY: textArray[0].y]; 49 | [newLayer select:true byExpandingSelection:true] 50 | 51 | // New layer still retains old height info; bug? 52 | newFrame.setHeight(Math.round(lineHeight * textArray.length)); 53 | 54 | }; -------------------------------------------------------------------------------- /Text/Split Combine Text.sketchplugin/Contents/Sketch/split.cocoascript: -------------------------------------------------------------------------------- 1 | var onRun = function(context) { 2 | // Split text lines to layers 3 | 4 | var selectedLayers = context.selection, 5 | selectedCount = selectedLayers.count(); 6 | 7 | if (selectedCount == 0) { 8 | log('No layers are selected.'); 9 | } else { 10 | // Loop through selected layers 11 | for (var i=0; i