diff --git a/Super Export.jsx b/Super Export.jsx index 77e8165..a02d3e7 100644 --- a/Super Export.jsx +++ b/Super Export.jsx @@ -1 +1,539 @@ -/** Super Export.jsx by: Josh Wright company: Bendy Tree, LLC (http://www.bendytree.com) created: July 30, 2011 repo: https://github.com/bendytree/Photoshop-Scripts **/ (function(){ var doc = app.activeDocument; app.preferences.rulerUnits = Units.PIXELS; app.preferences.typeUnits = TypeUnits.PIXELS; /********************************************************************************/ /******************************** UTILTIES **********************************/ String.prototype.trim = function(){ return this.replace(/^ */, "").replace(/ *$/, ""); } function keys(obj){ var keys = []; for(i in obj) if (obj.hasOwnProperty(i)) { keys.push(i); } return keys; }; function clone(obj){ if(obj == null || typeof(obj) != 'object') return obj; var temp = {}; // changed, obj.constructor() for(var key in obj) temp[key] = clone(obj[key]); return temp; } Array.prototype.indexOf = function(el) { for (var i = 0; i < this.length; i += 1) { if (this[i] == el) return i; } return -1; }; Array.prototype.lastIndexOf = function(el) { for (var i = this.length-1; i >= 0; i -= 1) { if (this[i] == el) return i; } return -1; }; Array.prototype.distinct = function() { var derivedArray = []; for (var i = 0; i < this.length; i += 1) { if (derivedArray.indexOf(this[i]) == -1) { derivedArray.push(this[i]) } } return derivedArray; }; Array.prototype.each = function(callback) { var derivedArray = []; for (var i = 0; i < this.length; i += 1) { derivedArray.push(callback(this[i], i)); } return derivedArray; }; /********************************************************************************/ /***************************** LAYER DATA & CACHING ***************************/ function convertLayerToData(layer){ var data = { layer: layer, isSet: layer.typename == "LayerSet", name: layer.name, startedVisible: layer.visible, tags: {}, hasTags: false, siblings: [], descendents: [], ancestors: [], children: [], exportPath: "" }; // Get tags if(data.name.indexOf("exportPath-") != -1){ data.exportPath = data.name.substring(data.name.lastIndexOf("-")+1).trim(); } else if(data.name.indexOf("-") != -1){ var tags = data.name.substring(data.name.lastIndexOf("-")+1).trim().split(","); for(var i=0; i 0){ for(var i=0; i "; l.siblings.each(function(c){ txt += c.name + ", "; }); //$.writeln(txt); }); //return; /********************************************************************************/ /********************************** REVERTING *********************************/ var selectedLayer = doc.activeLayer; var originalHistoryState = doc.activeHistoryState; var revert = function(){ doc.activeHistoryState = originalHistoryState; doc.activeLayer = selectedLayer; layerDatas.each(function(l){ if(l.startedVisible != l.layer.visible) l.layer.visible = l.startedVisible; }); } /********************************************************************************/ /****************************** HIDE HASHED LAYERS ****************************/ //Hide hashed layerDatas.each(function(l){ if(l.name.indexOf("#") != -1 && l.layer.visible != false) l.layer.visible = false; }); /********************************************************************************/ /********************************* HELPERS ************************************/ var cropRx = /^ *crop/i; var runCroppingLayers = function(data){ data.children.each(function(c){ if(cropRx.test(c.name)){ //hide it if(c.layer.visible != false) c.layer.visible = false; //crop it if(c.layer.bounds) doc.crop(c.layer.bounds); } }); } function hideSiblingsOfSelfAndOfParent(data){ var chain = [data]; data.ancestors.each(function(a){ chain.push(a); }); chain.each(function(a){ //show ancestors if(a.layer.visible != true) a.layer.visible = true; //hide ancestors siblings a.siblings.each(function(sib){ var setVisible = new RegExp(/^ *[*]/).test(sib.name); if(sib.layer.visible != setVisible) sib.layer.visible = setVisible; }); }); } function getExportOptions(layerInfo){ var options = new ExportOptionsSaveForWeb(); if(layerInfo.extension == "jpg"){ options.format = SaveDocumentType.JPEG; //-24 //JPEG, COMPUSERVEGIF, PNG-8, BMP //Quality if(layerInfo.q){ if(isNaN(parseFloat(layerInfo.q)) == false){ layerInfo.q = Math.max(Math.min(parseFloat(layerInfo.q), 100), 0); if(layerInfo.q<=1){ layerInfo.q = Math.round(layerInfo.q*100); } } } options.quality = layerInfo.q || 80; }else if(layerInfo.extension == "png"){ options.format = SaveDocumentType.PNG; //JPEG, COMPUSERVEGIF, PNG-8, BMP options.quality = 100; options.PNG8 = false; }else if(layerInfo.extension == "gif"){ options.format = SaveDocumentType.COMPUSERVEGIF; //JPEG, COMPUSERVEGIF, PNG-8, BMP options.matte = MatteType.NONE; options.transparency = true; } return options; } var getCurrentDocumentIndex = function(){ for(var i=0; i 5) { // SHOW THE WINDOW var win = new Window("dialog{text:'Script Interface',bounds:[100,100,400,220],\ btnExportAll:Button{bounds:[20,20,140,70] , text:'Export All ' },\ btnOne:Button{bounds:[160,20,280,70] , text:'Export One ' },\ prog:Progressbar{bounds:[20,90,280,101] , value:0,maxvalue:100},\ lblProgress:StaticText{bounds:[20,40,280,70] , text:'Saving 10 Images... ' ,properties:{scrolling:true,multiline:true}}\ };"); win.lblProgress.visible = false; win.btnExportAll.text = "Export All ("+exportableLayers.length+")"; win.btnExportAll.active = true; win.btnExportAll.onClick = function(){ prepGuiForExport(); win.lblProgress.text = "Exporting All Images..."; exportableLayers.each(function(l, i){ win.prog.value = ((i+1)*100.0)/(exportableLayers.length+1); exportLayer(l); }); win.prog.value = 100; win.close(); }; win.btnOne.text = activeLayerDataToExport.name; win.btnOne.onClick = function(){ prepGuiForExport(); win.lblProgress.text = "Exporting "+activeLayerDataToExport.name+"..."; win.prog.value = 50; exportLayer(activeLayerDataToExport, exportPath); win.close(); }; win.center(); win.show(); } else { exportableLayers.each(function(l){ exportLayer(l, exportPath); }); } })(); \ No newline at end of file +/** + +Super Export.jsx + by: Josh Wright + company: Bendy Tree, LLC (http://www.bendytree.com) + created: July 30, 2011 + repo: https://github.com/bendytree/Photoshop-Scripts + +**/ +(function(){ + + var doc = app.activeDocument; + app.preferences.rulerUnits = Units.PIXELS; + app.preferences.typeUnits = TypeUnits.PIXELS; + + + + /********************************************************************************/ + /******************************** UTILTIES **********************************/ + + String.prototype.trim = function(){ + return this.replace(/^ */, "").replace(/ *$/, ""); + } + + function keys(obj){ + var keys = []; + for(i in obj) if (obj.hasOwnProperty(i)) + { + keys.push(i); + } + return keys; + }; + + function clone(obj){ + if(obj == null || typeof(obj) != 'object') + return obj; + + var temp = {}; // changed, obj.constructor() + + for(var key in obj) + temp[key] = clone(obj[key]); + return temp; + } + + Array.prototype.indexOf = function(el) { + for (var i = 0; i < this.length; i += 1) { + if (this[i] == el) return i; + } + return -1; + }; + + Array.prototype.lastIndexOf = function(el) { + for (var i = this.length-1; i >= 0; i -= 1) { + if (this[i] == el) return i; + } + return -1; + }; + + Array.prototype.distinct = function() { + var derivedArray = []; + for (var i = 0; i < this.length; i += 1) { + if (derivedArray.indexOf(this[i]) == -1) { + derivedArray.push(this[i]) + } + } + return derivedArray; + }; + + Array.prototype.each = function(callback) { + var derivedArray = []; + for (var i = 0; i < this.length; i += 1) { + derivedArray.push(callback(this[i], i)); + } + return derivedArray; + }; + + + /********************************************************************************/ + /***************************** LAYER DATA & CACHING ***************************/ + + function convertLayerToData(layer){ + var data = { + layer: layer, + isSet: layer.typename == "LayerSet", + name: layer.name, + startedVisible: layer.visible, + tags: {}, + hasTags: false, + siblings: [], + descendents: [], + ancestors: [], + children: [], + exportPath: "" + }; + + // Get tags + if(data.name.indexOf("exportPath-") != -1){ + data.exportPath = data.name.substring(data.name.lastIndexOf("-")+1).trim(); + } else if(data.name.indexOf("-") != -1){ + var tags = data.name.substring(data.name.lastIndexOf("-")+1).trim().split(","); + for(var i=0; i 0){ + for(var i=0; i "; + l.siblings.each(function(c){ + txt += c.name + ", "; + }); + //$.writeln(txt); + }); + //return; + + + /********************************************************************************/ + /********************************** REVERTING *********************************/ + + var selectedLayer = doc.activeLayer; + var originalHistoryState = doc.activeHistoryState; + + var revert = function(){ + doc.activeHistoryState = originalHistoryState; + doc.activeLayer = selectedLayer; + + layerDatas.each(function(l){ + if(l.startedVisible != l.layer.visible) + l.layer.visible = l.startedVisible; + }); + } + + /********************************************************************************/ + /****************************** HIDE HASHED LAYERS ****************************/ + + //Hide hashed + layerDatas.each(function(l){ + if(l.name.indexOf("#") != -1 && l.layer.visible != false) + l.layer.visible = false; + }); + + + /********************************************************************************/ + /********************************* HELPERS ************************************/ + + var cropRx = /^ *crop/i; + var runCroppingLayers = function(data){ + data.children.each(function(c){ + if(cropRx.test(c.name)){ + + //hide it + if(c.layer.visible != false) + c.layer.visible = false; + + //crop it + if(c.layer.bounds) + doc.crop(c.layer.bounds); + } + }); + } + + function hideSiblingsOfSelfAndOfParent(data){ + var chain = [data]; + data.ancestors.each(function(a){ + chain.push(a); + }); + + chain.each(function(a){ + //show ancestors + if(a.layer.visible != true) + a.layer.visible = true; + + //hide ancestors siblings + a.siblings.each(function(sib){ + var setVisible = new RegExp(/^ *[*]/).test(sib.name); + if(sib.layer.visible != setVisible) + sib.layer.visible = setVisible; + }); + }); + } + + + function getExportOptions(layerInfo){ + var options = new ExportOptionsSaveForWeb(); + if(layerInfo.extension == "jpg"){ + options.format = SaveDocumentType.JPEG; //-24 //JPEG, COMPUSERVEGIF, PNG-8, BMP + + //Quality + if(layerInfo.q){ + if(isNaN(parseFloat(layerInfo.q)) == false){ + layerInfo.q = Math.max(Math.min(parseFloat(layerInfo.q), 100), 0); + if(layerInfo.q<=1){ + layerInfo.q = Math.round(layerInfo.q*100); + } + } + } + options.quality = layerInfo.q || 80; + }else if(layerInfo.extension == "png"){ + options.format = SaveDocumentType.PNG; //JPEG, COMPUSERVEGIF, PNG-8, BMP + options.quality = 100; + options.PNG8 = false; + }else if(layerInfo.extension == "gif"){ + options.format = SaveDocumentType.COMPUSERVEGIF; //JPEG, COMPUSERVEGIF, PNG-8, BMP + options.matte = MatteType.NONE; + options.transparency = true; + } + return options; + } + + var getCurrentDocumentIndex = function(){ + for(var i=0; i 5) + { + // SHOW THE WINDOW + var win = new Window("dialog{text:'Script Interface',bounds:[100,100,400,220],\ + btnExportAll:Button{bounds:[20,20,140,70] , text:'Export All ' },\ + btnOne:Button{bounds:[160,20,280,70] , text:'Export One ' },\ + prog:Progressbar{bounds:[20,90,280,101] , value:0,maxvalue:100},\ + lblProgress:StaticText{bounds:[20,40,280,70] , text:'Saving 10 Images... ' ,properties:{scrolling:true,multiline:true}}\ + };"); + win.lblProgress.visible = false; + win.btnExportAll.text = "Export All ("+exportableLayers.length+")"; + win.btnExportAll.active = true; + win.btnExportAll.onClick = function(){ + prepGuiForExport(); + win.lblProgress.text = "Exporting All Images..."; + + exportableLayers.each(function(l, i){ + win.prog.value = ((i+1)*100.0)/(exportableLayers.length+1); + exportLayer(l); + }); + win.prog.value = 100; + + win.close(); + }; + win.btnOne.text = activeLayerDataToExport.name; + win.btnOne.onClick = function(){ + prepGuiForExport(); + win.lblProgress.text = "Exporting "+activeLayerDataToExport.name+"..."; + win.prog.value = 50; + exportLayer(activeLayerDataToExport, exportPath); + win.close(); + }; + win.center(); + win.show(); + } + else + { + exportableLayers.each(function(l){ + exportLayer(l, exportPath); + }); + } +})(); +