Ugly and hacky. Would be much better if I knew AM code better.
But it’s working for me.
Mostly using code from Tonton Pixel:
http://www.tonton-pixel.com/scripts/utility-scripts/get-layer-info-code/index.html
use AppleScript version "2.4" -- Mac OS 10.10 (Yosemite) or later.
use scripting additions
set layerInfo to get_layer_info_code()
set hexColor to parse_shape_color(layerInfo)
return hexColor
on parse_shape_color(layerInfo)
set {delimitHolder, AppleScript's text item delimiters} to {AppleScript's text item delimiters, "RGBColor"}
set RGBdata to text item 2 of layerInfo
tell RGBdata to set {redData, greenData, bluedata} to {paragraph 5, paragraph 9, paragraph 13}
set AppleScript's text item delimiters to "\"<double>\": "
set {theRed, theGreen, theBlue} to {text item 2 of redData, text item 2 of greenData, text item 2 of bluedata}
set AppleScript's text item delimiters to delimitHolder
tell application "Adobe Photoshop CS6"
set theRGBcolor to {class:RGB color, red:theRed, green:theGreen, blue:theBlue}
set theHexcolor to convert color theRGBcolor to RGB Hex
end tell
return theHexcolor
end parse_shape_color
on get_layer_info_code()
tell application "/Applications/Adobe Photoshop CS6/Adobe Photoshop CS6.app"
set layerInfo to do javascript "
/*
<javascriptresource>
<name>Get Layer Info Code...</name>
<about>\"Get Layer Info Code\" v1.0
Get information in JSON AM Data Format from the currently active layer.
Utility script using the \"JSON Action Manager\" scripting library.
© 2016 Michel MARIANI.
</about>
<menu>automate</menu>
<category>JSON Action Manager Code Utility</category>
</javascriptresource>
*/
//------------------------------------------------------------------------------
// File: Get Layer Info Code.js
// Version: 1.0
// Release Date: 2016-05-01
// Copyright: © 2016 Michel MARIANI <http://www.tonton-pixel.com/blog/>
// Licence: GPL <http://www.gnu.org/licenses/gpl.html>
//------------------------------------------------------------------------------
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//------------------------------------------------------------------------------
// Version History:
// 1.0:
// - Initial release.
//------------------------------------------------------------------------------
// jamEngine.jsxinc v4.4.4 (minified)
if(typeof jamEngine!=='object') {var jamEngine={};(function() {var that;jamEngine.meaningfulIds=false;jamEngine.parseFriendly=false;jamEngine.displayDialogs=DialogModes.ERROR;var conflictingStringIdStrs={\"'Algn'\":[\"align\",\"alignment\"],\"'AntA'\":[\"antiAlias\",\"antiAliasedPICTAcquire\"],\"'BckL'\":[\"backgroundLayer\",\"backgroundLevel\"],\"'BlcG'\":[\"blackGenerationType\",\"blackGenerationCurve\"],\"'BlcL'\":[\"blackLevel\",\"blackLimit\"],\"'Blks'\":[\"blacks\",\"blocks\"],\"'BlrM'\":[\"blurMethod\",\"blurMore\"],\"'BrgC'\":[\"brightnessEvent\",\"brightnessContrast\"],\"'BrsD'\":[\"brushDetail\",\"brushesDefine\"],\"'Brsh'\":[\"brush\",\"brushes\"],\"'Clcl'\":[\"calculation\",\"calculations\"],\"'ClrP'\":[\"colorPalette\",\"coloredPencil\"],\"'Cnst'\":[\"constant\",\"constrain\"],\"'CntC'\":[\"centerCropMarks\",\"conteCrayon\"],\"'Cntr'\":[\"center\",\"contrast\"],\"'CrtD'\":[\"createDroplet\",\"createDuplicate\"],\"'CstP'\":[\"customPalette\",\"customPhosphors\"],\"'Cstm'\":[\"custom\",\"customPattern\"],\"'Drkn'\":[\"darken\",\"darkness\"],\"'Dstr'\":[\"distort\",\"distortion\",\"distribute\",\"distribution\"],\"'Dstt'\":[\"desaturate\",\"destWhiteMax\"],\"'FlIn'\":[\"fileInfo\",\"fillInverse\"],\"'Gd '\":[\"good\",\"guide\"],\"'GnrP'\":[\"generalPreferences\",\"generalPrefs\",\"preferencesClass\"],\"'GrSt'\":[\"grainStippled\",\"graySetup\"],\"'Grdn'\":[\"gradientClassEvent\",\"gridMinor\"],\"'Grn '\":[\"grain\",\"green\"],\"'Grns'\":[\"graininess\",\"greens\"],\"'HstP'\":[\"historyPreferences\",\"historyPrefs\"],\"'HstS'\":[\"historyState\",\"historyStateSourceType\"],\"'ImgP'\":[\"imageCachePreferences\",\"imagePoint\"],\"'In '\":[\"in\",\"stampIn\"],\"'IntW'\":[\"interfaceWhite\",\"intersectWith\"],\"'Intr'\":[\"interfaceIconFrameDimmed\",\"interlace\",\"interpolation\",\"intersect\"],\"'JPEG'\":[\"JPEG\",\"JPEGFormat\"],\"'LghD'\":[\"lightDirection\",\"lightDirectional\"],\"'LghO'\":[\"lightOmni\",\"lightenOnly\"],\"'LghS'\":[\"lightSource\",\"lightSpot\"],\"'Lns '\":[\"lens\",\"lines\"],\"'Mgnt'\":[\"magenta\",\"magentas\"],\"'MrgL'\":[\"mergeLayers\",\"mergedLayers\"],\"'Mxm '\":[\"maximum\",\"maximumQuality\"],\"'NTSC'\":[\"NTSC\",\"NTSCColors\"],\"'NmbL'\":[\"numberOfLayers\",\"numberOfLevels\"],\"'PlgP'\":[\"pluginPicker\",\"pluginPrefs\"],\"'Pncl'\":[\"pencilEraser\",\"pencilWidth\"],\"'Pnt '\":[\"paint\",\"point\"],\"'Prsp'\":[\"perspective\",\"perspectiveIndex\"],\"'PrvM'\":[\"previewMacThumbnail\",\"previewMagenta\"],\"'Pstr'\":[\"posterization\",\"posterize\"],\"'RGBS'\":[\"RGBSetup\",\"RGBSetupSource\"],\"'Rds '\":[\"radius\",\"reds\"],\"'ScrD'\":[\"scratchDisks\",\"screenDot\"],\"'ShdI'\":[\"shadingIntensity\",\"shadowIntensity\"],\"'ShpC'\":[\"shapeCurveType\",\"shapingCurve\"],\"'ShrE'\":[\"sharpenEdges\",\"shearEd\"],\"'Shrp'\":[\"sharpen\",\"sharpness\"],\"'SplC'\":[\"splitChannels\",\"supplementalCategories\"],\"'Spot'\":[\"spot\",\"spotColor\"],\"'SprS'\":[\"separationSetup\",\"sprayedStrokes\"],\"'StrL'\":[\"strokeLength\",\"strokeLocation\"],\"'Strt'\":[\"saturation\",\"start\"],\"'TEXT'\":[\"char\",\"textType\"],\"'TIFF'\":[\"TIFF\",\"TIFFFormat\"],\"'TglO'\":[\"toggleOptionsPalette\",\"toggleOthers\"],\"'TrnG'\":[\"transparencyGamutPreferences\",\"transparencyGrid\",\"transparencyGridSize\"],\"'TrnS'\":[\"transferSpec\",\"transparencyShape\",\"transparencyStop\"],\"'Trns'\":[\"transparency\",\"transparent\"],\"'TxtC'\":[\"textClickPoint\",\"textureCoverage\"],\"'TxtF'\":[\"textureFile\",\"textureFill\"],\"'UsrM'\":[\"userMaskEnabled\",\"userMaskOptions\"],\"'c@#^'\":[\"inherits\",\"pInherits\"],\"'comp'\":[\"comp\",\"sInt64\"],\"'doub'\":[\"floatType\",\"IEEE64BitFloatingPoint\",\"longFloat\"],\"'long'\":[\"integer\",\"longInteger\",\"sInt32\"],\"'magn'\":[\"magnitude\",\"uInt32\"],\"'null'\":[\"null\",\"target\"],\"'shor'\":[\"sInt16\",\"sMInt\",\"shortInteger\"],\"'sing'\":[\"IEEE32BitFloatingPoint\",\"sMFloat\",\"shortFloat\"]};jamEngine.getConflictingStringIdStrs=function(charIdStr) {return conflictingStringIdStrs[charIdStr]||null;};jamEngine.uniIdStrToId=function(uniIdStr) {var id=0;if(typeof uniIdStr==='string') {if((uniIdStr.length===(1+4+1))&&(uniIdStr.charAt(0)===\"'\")&&(uniIdStr.charAt(5)===\"'\")) {id=app.charIDToTypeID(uniIdStr.substring(1,5));} else {id=app.stringIDToTypeID(uniIdStr);}} return id;};var smallestHashValue=app.charIDToTypeID(\" \");jamEngine.idToUniIdStrs=function(id) {var charIdStr=\"\";var stringIdStr=app.typeIDToStringID(id);if(id>=smallestHashValue) {charIdStr=\"'\"+app.typeIDToCharID(id)+\"'\";if(stringIdStr!==\"\") {if(charIdStr in conflictingStringIdStrs) {stringIdStr=conflictingStringIdStrs[charIdStr];}}} return[charIdStr,stringIdStr];};jamEngine.equivalentUniIdStrs=function(uniIdStr1,uniIdStr2) {return this.uniIdStrToId(uniIdStr1)===this.uniIdStrToId(uniIdStr2);};function putInReference(ref,containers) {if(containers.constructor===Array) {var count=containers.length;for(var i=0;i<count;i++) {var container=that.parseCompact(containers[i]);var desiredClassId=that.uniIdStrToId(container[0]);var typedValue=that.parseCompact(container[1]);var form=typedValue[0];var value=typedValue[1];switch(form) {case\"<class>\":ref.putClass(desiredClassId);break;case\"<enumerated>\":var enumerated=that.parseCompact(value);ref.putEnumerated(desiredClassId,that.uniIdStrToId(enumerated[0]),that.uniIdStrToId(enumerated[1]));break;case\"<identifier>\":ref.putIdentifier(desiredClassId,value);break;case\"<index>\":ref.putIndex(desiredClassId,value);break;case\"<name>\":ref.putName(desiredClassId,value);break;case\"<offset>\":ref.putOffset(desiredClassId,value);break;case\"<property>\":ref.putProperty(desiredClassId,that.uniIdStrToId(value));break;default:throw new Error(\"[jamEngine putInReference] Unknown reference form: \"+form);break;}}} else {throw new Error(\"[jamEngine putInReference] JavaScript array expected\");}} function putInList(list,items) {if(items.constructor===Array) {var count=items.length;for(var i=0;i<count;i++) {var item=that.parseCompact(items[i]);var type=item[0];var value=item[1];switch(type) {case\"<boolean>\":list.putBoolean(value);break;case\"<class>\":list.putClass(that.uniIdStrToId(value));break;case\"<data>\":list.putData(value);break;case\"<double>\":list.putDouble(value);break;case\"<enumerated>\":var enumerated=that.parseCompact(value);list.putEnumerated(that.uniIdStrToId(enumerated[0]),that.uniIdStrToId(enumerated[1]));break;case\"<integer>\":list.putInteger(value);break;case\"<largeInteger>\":list.putLargeInteger(value);break;case\"<list>\":var actionList=new ActionList();putInList(actionList,value);list.putList(actionList);break;case\"<object>\":var object=that.parseCompact(value);if(object[1]) {var actionDescriptor=new ActionDescriptor();putInDescriptor(actionDescriptor,object[1]);list.putObject(that.uniIdStrToId(object[0]),actionDescriptor);} else {list.putClass(that.uniIdStrToId(object[0]));} break;case\"<path>\":var fileRef=new File(value);list.putPath(fileRef);break;case\"<reference>\":var actionReference=new ActionReference();putInReference(actionReference,value);list.putReference(actionReference);break;case\"<string>\":list.putString(value);break;case\"<unitDouble>\":var unitDouble=that.parseCompact(value);list.putUnitDouble(that.uniIdStrToId(unitDouble[0]),unitDouble[1]);break;default:throw new Error(\"[jamEngine putInList] Unknown list type: \"+type);break;}}} else {throw new Error(\"[jamEngine putInList] JavaScript array expected\");}} function putInDescriptor(desc,members) {if(members.constructor===Object) {for(var key in members) {if(members.hasOwnProperty(key)) {var keyID=that.uniIdStrToId(key);var member=that.parseCompact(members[key]);var type=member[0];var value=member[1];switch(type) {case\"<boolean>\":desc.putBoolean(keyID,value);break;case\"<class>\":desc.putClass(keyID,that.uniIdStrToId(value));break;case\"<data>\":desc.putData(keyID,value);break;case\"<double>\":desc.putDouble(keyID,value);break;case\"<enumerated>\":var enumerated=that.parseCompact(value);desc.putEnumerated(keyID,that.uniIdStrToId(enumerated[0]),that.uniIdStrToId(enumerated[1]));break;case\"<integer>\":desc.putInteger(keyID,value);break;case\"<largeInteger>\":desc.putLargeInteger(keyID,value);break;case\"<list>\":var actionList=new ActionList();putInList(actionList,value);desc.putList(keyID,actionList);break;case\"<object>\":var object=that.parseCompact(value);if(object[1]) {var actionDescriptor=new ActionDescriptor();putInDescriptor(actionDescriptor,object[1]);desc.putObject(keyID,that.uniIdStrToId(object[0]),actionDescriptor);} else {desc.putClass(keyID,that.uniIdStrToId(object[0]));} break;case\"<path>\":var fileRef=new File(value);desc.putPath(keyID,fileRef);break;case\"<reference>\":var actionReference=new ActionReference();putInReference(actionReference,value);desc.putReference(keyID,actionReference);break;case\"<string>\":desc.putString(keyID,value);break;case\"<unitDouble>\":var unitDouble=that.parseCompact(value);desc.putUnitDouble(keyID,that.uniIdStrToId(unitDouble[0]),unitDouble[1]);break;default:throw new Error(\"[jamEngine putInDescriptor] Unknown descriptor type: \"+type);break;}}}} else {throw new Error(\"[jamEngine putInDescriptor] JavaScript object expected\");}} var contextRules={\"'Algn'\":{\"<classKey>\":{\"bevelEmboss\":\"align\",\"frameFX\":\"align\",\"gradientFill\":\"align\",\"gradientLayer\":\"align\",\"patternFill\":\"align\",\"patternLayer\":\"align\"},\"<event>\":\"align\",\"<key>\":\"alignment\"},\"'AntA'\":{\"<class>\":\"antiAliasedPICTAcquire\",\"<key>\":\"antiAlias\"},\"'BckL'\":{\"<class>\":\"backgroundLayer\",\"<key>\":\"backgroundLevel\"},\"'BlcG'\":{\"<enumType>\":\"blackGenerationType\",\"<key>\":\"blackGenerationCurve\"},\"'BlcL'\":{\"<classKey>\":{\"'GEfc'\":\"blackLevel\",\"CMYKSetup\":\"blackLimit\"},\"<eventKey>\":{\"reticulation\":\"blackLevel\"}},\"'Blks'\":{\"<typeValue>\":{\"colors\":\"blacks\",\"extrudeType\":\"blocks\"}},\"'BlrM'\":{\"<enumType>\":\"blurMethod\",\"<event>\":\"blurMore\",\"<key>\":\"blurMethod\"},\"'BrgC'\":{\"<class>\":\"brightnessContrast\",\"<event>\":\"brightnessContrast\"},\"'BrsD'\":{\"<enumValue>\":\"brushesDefine\",\"<key>\":\"brushDetail\"},\"'Brsh'\":{\"<class>\":\"brush\",\"<key>\":\"brushes\"},\"'Clcl'\":{\"<class>\":\"calculation\",\"<enumValue>\":\"calculations\",\"<key>\":\"calculation\"},\"'ClrP'\":{\"<typeValue>\":{\"'GEft'\":\"coloredPencil\"},\"<enumType>\":\"colorPalette\",\"<event>\":\"coloredPencil\"},\"'Cnst'\":{\"<classKey>\":{\"channelMatrix\":\"constant\"},\"<unknown>\":\"constrain\"},\"'CntC'\":{\"<typeValue>\":{\"'GEft'\":\"conteCrayon\"},\"<event>\":\"conteCrayon\",\"<key>\":\"centerCropMarks\"},\"'Cntr'\":{\"<classKey>\":{\"'GEfc'\":\"contrast\",\"brightnessContrast\":\"contrast\",\"document\":\"center\",\"polygon\":\"center\",\"quadrilateral\":\"center\"},\"<eventKey>\":{\"adaptCorrect\":\"contrast\",\"brightnessEvent\":\"contrast\",\"grain\":\"contrast\",\"halftoneScreen\":\"contrast\",\"sumie\":\"contrast\",\"tornEdges\":\"contrast\",\"waterPaper\":\"contrast\"},\"<enumValue>\":\"center\"},\"'CrtD'\":{\"<enumValue>\":\"createDuplicate\",\"<event>\":\"createDroplet\"},\"'CstP'\":{\"<class>\":\"customPhosphors\",\"<key>\":\"customPalette\"},\"'Cstm'\":{\"<enumValue>\":\"customPattern\",\"<event>\":\"custom\",\"<key>\":\"custom\"},\"'Drkn'\":{\"<enumValue>\":\"darken\",\"<key>\":\"darkness\"},\"'Dstr'\":{\"<classKey>\":{\"'GEfc'\":\"distortion\"},\"<eventKey>\":{\"glass\":\"distortion\",\"addNoise\":\"distribution\"},\"<enumType>\":\"distribution\",\"<enumValue>\":\"distort\",\"<event>\":\"distribute\"},\"'Dstt'\":{\"<enumValue>\":\"desaturate\",\"<event>\":\"desaturate\",\"<key>\":\"destWhiteMax\"},\"'FlIn'\":{\"<typeValue>\":{\"fillColor\":\"fillInverse\",\"menuItemType\":\"fileInfo\"},\"<class>\":\"fileInfo\",\"<key>\":\"fileInfo\"},\"'Gd '\":{\"<class>\":\"guide\",\"<enumValue>\":\"good\"},\"'GnrP'\":{\"<class>\":\"preferencesClass\",\"<enumValue>\":\"generalPreferences\",\"<key>\":\"generalPrefs\"},\"'GrSt'\":{\"<class>\":\"graySetup\",\"<enumValue>\":\"grainStippled\",\"<key>\":\"graySetup\"},\"'Grdn'\":{\"<class>\":\"gradientClassEvent\",\"<event>\":\"gradientClassEvent\",\"<key>\":\"gridMinor\"},\"'Grn '\":{\"<typeValue>\":{\"'GEft'\":\"grain\"},\"<classKey>\":{\"'GEfc'\":\"grain\",\"RGBColor\":\"green\",\"blackAndWhite\":\"green\",\"channelMatrix\":\"green\",\"channelMixer\":\"green\"},\"<eventKey>\":{\"blackAndWhite\":\"green\",\"channelMixer\":\"green\",\"filmGrain\":\"grain\"},\"<enumValue>\":\"green\",\"<event>\":\"grain\"},\"'Grns'\":{\"<enumValue>\":\"greens\",\"<key>\":\"graininess\"},\"'HstP'\":{\"<enumValue>\":\"historyPreferences\",\"<key>\":\"historyPrefs\"},\"'HstS'\":{\"<class>\":\"historyState\",\"<enumType>\":\"historyStateSourceType\"},\"'ImgP'\":{\"<class>\":\"imagePoint\",\"<enumValue>\":\"imageCachePreferences\"},\"'In '\":{\"<enumValue>\":\"stampIn\",\"<key>\":\"in\"},\"'IntW'\":{\"<event>\":\"intersectWith\",\"<key>\":\"interfaceWhite\"},\"'Intr'\":{\"<typeValue>\":{\"shapeOperation\":\"intersect\"},\"<classKey>\":{\"GIFFormat\":\"interlace\",\"SaveForWeb\":\"interlace\",\"application\":\"interfaceIconFrameDimmed\",\"computedBrush\":\"interpolation\",\"dBrush\":\"interpolation\",\"gradientClassEvent\":\"interpolation\",\"photoshopEPSFormat\":\"interpolation\",\"sampledBrush\":\"interpolation\"},\"<eventKey>\":{\"convertMode\":\"interpolation\",\"imageSize\":\"interpolation\",\"transform\":\"interpolation\"},\"<event>\":\"intersect\"},\"'JPEG'\":{\"<class>\":\"JPEGFormat\",\"<enumValue>\":\"JPEG\"},\"'LghD'\":{\"<enumType>\":\"lightDirection\",\"<enumValue>\":\"lightDirectional\",\"<key>\":\"lightDirection\"},\"'LghO'\":{\"<typeValue>\":{\"diffuseMode\":\"lightenOnly\",\"lightType\":\"lightOmni\"}},\"'LghS'\":{\"<class>\":\"lightSource\",\"<enumValue>\":\"lightSpot\",\"<key>\":\"lightSource\"},\"'Lns '\":{\"<enumType>\":\"lens\",\"<enumValue>\":\"lines\",\"<key>\":\"lens\"},\"'Mgnt'\":{\"<typeValue>\":{\"channel\":\"magenta\",\"colors\":\"magentas\",\"guideGridColor\":\"magenta\"},\"<key>\":\"magenta\"},\"'MrgL'\":{\"<enumValue>\":\"mergedLayers\",\"<event>\":\"mergeLayers\"},\"'Mxm '\":{\"<enumValue>\":\"maximumQuality\",\"<event>\":\"maximum\",\"<key>\":\"maximum\"},\"'NTSC'\":{\"<enumValue>\":\"NTSC\",\"<event>\":\"NTSCColors\"},\"'NmbL'\":{\"<classKey>\":{\"'GEfc'\":\"numberOfLevels\",\"document\":\"numberOfLayers\"},\"<eventKey>\":{\"cutout\":\"numberOfLevels\"}},\"'PlgP'\":{\"<class>\":\"pluginPrefs\",\"<enumValue>\":\"pluginPicker\",\"<key>\":\"pluginPrefs\"},\"'Pncl'\":{\"<enumValue>\":\"pencilEraser\",\"<key>\":\"pencilWidth\"},\"'Pnt '\":{\"<typeValue>\":{\"textType\":\"point\"},\"<class>\":\"point\",\"<event>\":\"paint\"},\"'Prsp'\":{\"<enumValue>\":\"perspective\",\"<key>\":\"perspectiveIndex\"},\"'PrvM'\":{\"<enumValue>\":\"previewMagenta\",\"<key>\":\"previewMacThumbnail\"},\"'Pstr'\":{\"<class>\":\"posterize\",\"<event>\":\"posterize\",\"<key>\":\"posterization\"},\"'RGBS'\":{\"<enumType>\":\"RGBSetupSource\",\"<key>\":\"RGBSetup\"},\"'Rds '\":{\"<enumValue>\":\"reds\",\"<key>\":\"radius\"},\"'ScrD'\":{\"<enumValue>\":\"screenDot\",\"<key>\":\"scratchDisks\"},\"'ShdI'\":{\"<classKey>\":{\"'GEfc'\":\"shadowIntensity\"},\"<eventKey>\":{\"watercolor\":\"shadowIntensity\"},\"<unknown>\":\"shadingIntensity\"},\"'ShpC'\":{\"<classKey>\":{\"application\":\"shapingCurve\"},\"<class>\":\"shapingCurve\",\"<key>\":\"shapeCurveType\"},\"'ShrE'\":{\"<event>\":\"sharpenEdges\",\"<key>\":\"shearEd\"},\"'Shrp'\":{\"<event>\":\"sharpen\",\"<key>\":\"sharpness\"},\"'SplC'\":{\"<event>\":\"splitChannels\",\"<key>\":\"supplementalCategories\"},\"'Spot'\":{\"<enumValue>\":\"spotColor\",\"<key>\":\"spot\"},\"'SprS'\":{\"<typeValue>\":{\"'GEft'\":\"sprayedStrokes\"},\"<enumValue>\":\"separationSetup\",\"<event>\":\"sprayedStrokes\"},\"'StrL'\":{\"<enumType>\":\"strokeLocation\",\"<key>\":\"strokeLength\"},\"'Strt'\":{\"<classKey>\":{\"currentToolOptions\":\"saturation\",\"fileNamingRules\":\"start\",\"HSBColorClass\":\"saturation\",\"hueSatAdjustment\":\"saturation\",\"hueSatAdjustmentV2\":\"saturation\",\"lineClass\":\"start\",\"range\":\"start\",\"vibrance\":\"saturation\"},\"<eventKey>\":{\"replaceColor\":\"saturation\",\"variations\":\"saturation\",\"vibrance\":\"saturation\"},\"<enumValue>\":\"saturation\"},\"'TEXT'\":{\"<enumType>\":\"textType\",\"<key>\":\"textType\"},\"'TIFF'\":{\"<class>\":\"TIFFFormat\",\"<enumValue>\":\"TIFF\"},\"'TglO'\":{\"<enumValue>\":\"toggleOptionsPalette\",\"<key>\":\"toggleOthers\"},\"'TrnG'\":{\"<classKey>\":{\"application\":\"transparencyGrid\",\"transparencyPrefs\":\"transparencyGridSize\"},\"<enumType>\":\"transparencyGridSize\",\"<enumValue>\":\"transparencyGamutPreferences\"},\"'TrnS'\":{\"<classKey>\":{\"bevelEmboss\":\"transparencyShape\",\"dropShadow\":\"transparencyShape\",\"innerGlow\":\"transparencyShape\",\"innerShadow\":\"transparencyShape\",\"outerGlow\":\"transparencyShape\"},\"<class>\":\"transparencyStop\",\"<unknown>\":\"transferSpec\"},\"'Trns'\":{\"<enumValue>\":\"transparent\",\"<key>\":\"transparency\"},\"'TxtC'\":{\"<classKey>\":{\"'GEfc'\":\"textureCoverage\",\"textLayer\":\"textClickPoint\"},\"<eventKey>\":{\"underpainting\":\"textureCoverage\"}},\"'TxtF'\":{\"<event>\":\"textureFill\",\"<key>\":\"textureFile\"},\"'UsrM'\":{\"<enumType>\":\"userMaskOptions\",\"<key>\":\"userMaskEnabled\"},\"'null'\":{\"<class>\":\"null\",\"<enumValue>\":\"null\",\"<event>\":\"null\",\"<key>\":\"target\"}};function getFromId(context,parentContext) {var uniIdStr;var kind=context[0];var id=context[1];if(id<smallestHashValue) {uniIdStr=app.typeIDToStringID(id);} else {uniIdStr=\"'\"+app.typeIDToCharID(id)+\"'\";if(that.meaningfulIds) {if(uniIdStr in contextRules) {function resolveIdStr(candidates) {var idStr=\"\";for(var parentString in candidates) {if(candidates.hasOwnProperty(parentString)) {if(parentContext[1]===that.uniIdStrToId(parentString)) {idStr=candidates[parentString];break;}}} return idStr;} var resolvedIdStr=\"\";var rule=contextRules[uniIdStr];if(parentContext) {switch(kind) {case\"<key>\":if((parentContext[0]===\"<class>\")&&(\"<classKey>\"in rule)) {resolvedIdStr=resolveIdStr(rule[\"<classKey>\"]);} else if((parentContext[0]===\"<event>\")&&(\"<eventKey>\"in rule)) {resolvedIdStr=resolveIdStr(rule[\"<eventKey>\"]);} break;case\"<enumValue>\":if((parentContext[0]===\"<enumType>\")&&(\"<typeValue>\"in rule)) {resolvedIdStr=resolveIdStr(rule[\"<typeValue>\"]);} break;}} if(resolvedIdStr!==\"\") {uniIdStr=resolvedIdStr;} else if(kind in rule) {uniIdStr=rule[kind];}} else {var stringIDStr=app.typeIDToStringID(id);if(stringIDStr!==\"\") {uniIdStr=stringIDStr;}}}} return uniIdStr;} var incompatiblePlatformPath=\"\";var getEventId=app.stringIDToTypeID(\"get\");var targetKeyId=app.stringIDToTypeID(\"target\");var propertyClassId=app.stringIDToTypeID(\"property\");function getFromReference(ref) {var propertyId=0;var arr=[];do {try{var desiredClassId=ref.getDesiredClass();}catch(e){break;} if(propertyId!==0) {var propertyCompact=that.buildCompact(\"<property>\",getFromId([\"<key>\",propertyId],[\"<class>\",desiredClassId]));arr.push(that.buildCompact(getFromId([\"<class>\",propertyClassId]),propertyCompact));propertyId=0;} var desiredCompact;var aFormID=ref.getForm();switch(aFormID) {case ReferenceFormType.CLASSTYPE:desiredCompact=that.buildCompact(\"<class>\",null);break;case ReferenceFormType.ENUMERATED:var enumTypeContext=[\"<enumType>\",ref.getEnumeratedType()];var enumValueContext=[\"<enumValue>\",ref.getEnumeratedValue()];desiredCompact=that.buildCompact(\"<enumerated>\",that.buildCompact(getFromId(enumTypeContext),getFromId(enumValueContext,enumTypeContext)));break;case ReferenceFormType.IDENTIFIER:desiredCompact=that.buildCompact(\"<identifier>\",ref.getIdentifier());break;case ReferenceFormType.INDEX:desiredCompact=that.buildCompact(\"<index>\",ref.getIndex());break;case ReferenceFormType.NAME:desiredCompact=that.buildCompact(\"<name>\",ref.getName());break;case ReferenceFormType.OFFSET:desiredCompact=that.buildCompact(\"<offset>\",ref.getOffset());break;case ReferenceFormType.PROPERTY:if(desiredClassId===propertyClassId) {propertyId=ref.getProperty();} else {desiredCompact=that.buildCompact(\"<property>\",getFromId([\"<key>\",ref.getProperty()],[\"<class>\",desiredClassId]));} break;default:throw new Error(\"[jamEngine getFromReference] Unknown reference form type: \"+aFormID);break;} if(desiredClassId!==propertyClassId) {arr.push(that.buildCompact(getFromId([\"<class>\",desiredClassId]),desiredCompact));} ref=ref.getContainer();} while(ref);return arr;} function getFromList(list) {var arr=[];var itemCount=list.count;for(var itemIndex=0;itemIndex<itemCount;itemIndex++) {var itemCompact;var typeID;try{typeID=list.getType(itemIndex);}catch(e){continue;} switch(typeID) {case DescValueType.BOOLEANTYPE:itemCompact=that.buildCompact(\"<boolean>\",list.getBoolean(itemIndex));break;case DescValueType.CLASSTYPE:itemCompact=that.buildCompact(\"<class>\",getFromId([\"<class>\",list.getClass(itemIndex)]));break;case DescValueType.DOUBLETYPE:itemCompact=that.buildCompact(\"<double>\",list.getDouble(itemIndex));break;case DescValueType.ENUMERATEDTYPE:var enumTypeContext=[\"<enumType>\",list.getEnumerationType(itemIndex)];var enumValueContext=[\"<enumValue>\",list.getEnumerationValue(itemIndex)];itemCompact=that.buildCompact(\"<enumerated>\",that.buildCompact(getFromId(enumTypeContext),getFromId(enumValueContext,enumTypeContext)));break;case DescValueType.INTEGERTYPE:itemCompact=that.buildCompact(\"<integer>\",list.getInteger(itemIndex));break;case DescValueType.LISTTYPE:itemCompact=that.buildCompact(\"<list>\",getFromList(list.getList(itemIndex)));break;case DescValueType.OBJECTTYPE:var objectTypeContext=[\"<class>\",list.getObjectType(itemIndex)];var objectValue=list.getObjectValue(itemIndex);itemCompact=that.buildCompact(\"<object>\",that.buildCompact(getFromId(objectTypeContext),getFromDescriptor(objectValue,objectTypeContext)));break;case DescValueType.ALIASTYPE:try {var fileRef=list.getPath(itemIndex);itemCompact=that.buildCompact(\"<path>\",fileRef.fsName);} catch(e) {itemCompact=that.buildCompact(\"<path>\",incompatiblePlatformPath);} break;case DescValueType.REFERENCETYPE:itemCompact=that.buildCompact(\"<reference>\",getFromReference(list.getReference(itemIndex)));break;case DescValueType.STRINGTYPE:itemCompact=that.buildCompact(\"<string>\",list.getString(itemIndex));break;case DescValueType.UNITDOUBLE:var unitTypeContext=[\"<unit>\",list.getUnitDoubleType(itemIndex)];var doubleValue=list.getUnitDoubleValue(itemIndex);itemCompact=that.buildCompact(\"<unitDouble>\",that.buildCompact(getFromId(unitTypeContext),doubleValue));break;default:var isRawType;var isLargeIntegerType;try{isRawType=(typeID===DescValueType.RAWTYPE);}catch(e){} try{isLargeIntegerType=(typeID===DescValueType.LARGEINTEGERTYPE);}catch(e){} if(isRawType) {itemCompact=that.buildCompact(\"<data>\",list.getData(itemIndex));} else if(isLargeIntegerType) {itemCompact=that.buildCompact(\"<largeInteger>\",list.getLargeInteger(itemIndex));} else {throw new Error(\"[jamEngine getFromList] Unknown descriptor value type: \"+typeID);} break;} arr[itemIndex]=itemCompact;} return arr;} function getFromDescriptor(desc,parentContext) {if(desc) {var obj={};var keyCount;try{keyCount=desc.count;}catch(e){return null;} for(var keyIndex=0;keyIndex<keyCount;keyIndex++) {var keyID=desc.getKey(keyIndex);var keyString=getFromId([\"<key>\",keyID],parentContext);var keyCompact;var typeID;try{typeID=desc.getType(keyID);}catch(e){continue;} switch(typeID) {case DescValueType.BOOLEANTYPE:keyCompact=that.buildCompact(\"<boolean>\",desc.getBoolean(keyID));break;case DescValueType.CLASSTYPE:keyCompact=that.buildCompact(\"<class>\",getFromId([\"<class>\",desc.getClass(keyID)]));break;case DescValueType.DOUBLETYPE:keyCompact=that.buildCompact(\"<double>\",desc.getDouble(keyID));break;case DescValueType.ENUMERATEDTYPE:var enumTypeContext=[\"<enumType>\",desc.getEnumerationType(keyID)];var enumValueContext=[\"<enumValue>\",desc.getEnumerationValue(keyID)];keyCompact=that.buildCompact(\"<enumerated>\",that.buildCompact(getFromId(enumTypeContext),getFromId(enumValueContext,enumTypeContext)));break;case DescValueType.INTEGERTYPE:keyCompact=that.buildCompact(\"<integer>\",desc.getInteger(keyID));break;case DescValueType.LISTTYPE:keyCompact=that.buildCompact(\"<list>\",getFromList(desc.getList(keyID)));break;case DescValueType.OBJECTTYPE:var objectTypeContext=[\"<class>\",desc.getObjectType(keyID)];var objectValue=desc.getObjectValue(keyID);keyCompact=that.buildCompact(\"<object>\",that.buildCompact(getFromId(objectTypeContext),getFromDescriptor(objectValue,objectTypeContext)));break;case DescValueType.ALIASTYPE:try {var fileRef=desc.getPath(keyID);keyCompact=that.buildCompact(\"<path>\",fileRef.fsName);} catch(e) {keyCompact=that.buildCompact(\"<path>\",incompatiblePlatformPath);} break;case DescValueType.REFERENCETYPE:keyCompact=that.buildCompact(\"<reference>\",getFromReference(desc.getReference(keyID)));break;case DescValueType.STRINGTYPE:keyCompact=that.buildCompact(\"<string>\",desc.getString(keyID));break;case DescValueType.UNITDOUBLE:var unitTypeContext=[\"<unit>\",desc.getUnitDoubleType(keyID)];var doubleValue=desc.getUnitDoubleValue(keyID);keyCompact=that.buildCompact(\"<unitDouble>\",that.buildCompact(getFromId(unitTypeContext),doubleValue));break;default:var isRawType;var isLargeIntegerType;try{isRawType=(typeID===DescValueType.RAWTYPE);}catch(e){} try{isLargeIntegerType=(typeID===DescValueType.LARGEINTEGERTYPE);}catch(e){} if(isRawType) {keyCompact=that.buildCompact(\"<data>\",desc.getData(keyID));} else if(isLargeIntegerType) {keyCompact=that.buildCompact(\"<largeInteger>\",desc.getLargeInteger(keyID));} else {throw new Error(\"[jamEngine getFromDescriptor] Unknown descriptor value type: \"+typeID);} break;} obj[keyString]=keyCompact;} return obj;} else {return null;}} jamEngine.jsonToActionDescriptor=function(descriptorObj) {that=this;var actionDescriptor;if(descriptorObj) {actionDescriptor=new ActionDescriptor();putInDescriptor(actionDescriptor,descriptorObj);} return actionDescriptor;};jamEngine.jsonToActionReference=function(referenceArr) {that=this;var actionReference;if(referenceArr) {actionReference=new ActionReference();putInReference(actionReference,referenceArr);} return actionReference;};jamEngine.eventIdAndActionDescriptorToJson=function(eventId,actionDescriptor) {that=this;var eventIdContext=[\"<event>\",eventId];return{\"<event>\":getFromId(eventIdContext),\"<descriptor>\":getFromDescriptor(actionDescriptor,eventIdContext)};};jamEngine.classIdAndActionDescriptorToJson=function(classId,actionDescriptor) {that=this;var classIdContext=[\"<class>\",classId];return{\"<class>\":getFromId(classIdContext),\"<descriptor>\":getFromDescriptor(actionDescriptor,classIdContext)};};jamEngine.actionReferenceToJson=function(actionReference) {that=this;return getFromReference(actionReference);};function getReferenceClassId(ref) {classId=0;do {try{var desiredClassId=ref.getDesiredClass();}catch(e){break;} if(desiredClassId!==propertyClassId) {classId=desiredClassId;break;} ref=ref.getContainer();} while(ref);return classId;} jamEngine.jsonPlay=function(eventUniIdStr,descriptorObj,displayDialogs) {var eventId=this.uniIdStrToId(eventUniIdStr);var desc=this.jsonToActionDescriptor(descriptorObj);var parentContext;if(eventId===getEventId) {var ref=desc.getReference(targetKeyId);parentContext=[\"<class>\",getReferenceClassId(ref)];} else {parentContext=[\"<event>\",eventId];} return getFromDescriptor(app.executeAction(eventId,desc,displayDialogs||this.displayDialogs),parentContext);};jamEngine.jsonGet=function(referenceArr) {var ref=this.jsonToActionReference(referenceArr);return getFromDescriptor(app.executeActionGet(ref),[\"<class>\",getReferenceClassId(ref)]);};jamEngine.normalizeJsonItem=function(item,options) {function normalizeItem(item) {var explicit=that.parseCompact(item);var type=explicit[0];var value=explicit[1];var normalizedValue;switch(type) {case\"<boolean>\":case\"<data>\":case\"<double>\":case\"<identifier>\":case\"<index>\":case\"<integer>\":case\"<largeInteger>\":case\"<name>\":case\"<offset>\":case\"<path>\":case\"<string>\":normalizedValue=value;break;case\"<class>\":normalizedValue=value&&getFromId([\"<class>\",that.uniIdStrToId(value)]);break;case\"<enumerated>\":var enumerated=that.parseCompact(value);var enumTypeContext=[\"<enumType>\",that.uniIdStrToId(enumerated[0])];var enumValueContext=[\"<enumValue>\",that.uniIdStrToId(enumerated[1])];normalizedValue=that.buildCompact(getFromId(enumTypeContext),getFromId(enumValueContext,enumTypeContext));break;case\"<list>\":normalizedValue=[];for(var i=0;i<value.length;i++) {normalizedValue.push(normalizeItem(value[i]));} break;case\"<object>\":var object=that.parseCompact(value);var objectClassContext=[\"<class>\",that.uniIdStrToId(object[0])];var objectDescriptor=object[1];var normalizedDescriptor;if(objectDescriptor===null) {normalizedDescriptor=null;} else {normalizedDescriptor={};for(var key in objectDescriptor) {if(objectDescriptor.hasOwnProperty(key)) {var objectKeyContext=[\"<key>\",that.uniIdStrToId(key)];normalizedDescriptor[getFromId(objectKeyContext,objectClassContext)]=normalizeItem(objectDescriptor[key]);}}} normalizedValue=that.buildCompact(getFromId(objectClassContext),normalizedDescriptor);break;case\"<property>\":normalizedValue=getFromId([\"<key>\",that.uniIdStrToId(value)]);break;case\"<reference>\":normalizedValue=[];for(var i=0;i<value.length;i++) {var container=that.parseCompact(value[i]);normalizedValue.push(that.buildCompact(getFromId([\"<class>\",that.uniIdStrToId(container[0])]),normalizeItem(container[1])));} break;case\"<unitDouble>\":var unitDouble=that.parseCompact(value);var unitTypeContext=[\"<unit>\",that.uniIdStrToId(unitDouble[0])];normalizedValue=that.buildCompact(getFromId(unitTypeContext),unitDouble[1]);break;default:throw new Error(\"[jamEngine.normalizeJsonItem] Unknown item type: \"+type);break;} return that.buildCompact(type,normalizedValue);} that=this;var saveMeaningfulIds=this.meaningfulIds;var saveParseFriendly=this.parseFriendly;if(options&&(options.constructor===Object)) {if(typeof options.meaningfulIds!=='undefined') {this.meaningfulIds=options.meaningfulIds;} if(typeof options.parseFriendly!=='undefined') {this.parseFriendly=options.parseFriendly;}} var normalizedItem=normalizeItem(item);this.meaningfulIds=saveMeaningfulIds;this.parseFriendly=saveParseFriendly;return normalizedItem;};function simplifyRef(ref) {var simplifiedRef=[];for(var i=0;i<ref.length;i++) {var element=ref[i];var simplifiedElement={};var desiredClass=element[0];var form=element[1][0];var value=element[1][1];switch(form) {case\"<class>\":case\"<identifier>\":case\"<index>\":case\"<name>\":case\"<offset>\":case\"<property\":simplifiedElement[desiredClass]=value;break;case\"<enumerated>\":simplifiedElement[desiredClass]=value[1];break;default:throw new Error(\"[jamEngine simplifyRef] Unexpected element form: \"+form);break;} simplifiedRef.push(simplifiedElement);} return simplifiedRef;} function simplifyItem(item,hook) {var simplifiedItem;var type=item[0];var value=item[1];switch(type) {case\"<boolean>\":case\"<class>\":case\"<data>\":case\"<double>\":case\"<integer>\":case\"<largeInteger>\":case\"<path>\":case\"<string>\":simplifiedItem=value;break;case\"<list>\":simplifiedItem=simplifyList(value,hook);break;case\"<enumerated>\":case\"<unitDouble>\":simplifiedItem=value[1];break;case\"<object>\":simplifiedItem=simplifyDesc(value[1],hook);break;case\"<reference>\":simplifiedItem=simplifyRef(value);break;default:throw new Error(\"[jamEngine simplifyItem] Unexpected item type: \"+type);break;} return simplifiedItem;} function simplifyList(list,hook) {var simplifiedList=[];for(var i=0;i<list.length;i++) {simplifiedList.push(simplifyItem(list[i],hook));} return simplifiedList;} function simplifyDesc(desc,hook) {var getDefaultValue=function(desc,key){return simplifyItem(desc[key],hook);};var simplifiedDesc={};for(var key in desc) {if(desc.hasOwnProperty(key)) {var value=undefined;if(typeof hook==='function') {value=hook(desc,key,getDefaultValue);} if(typeof value==='undefined') {value=simplifyItem(desc[key],hook);} simplifiedDesc[key]=value;}} return simplifiedDesc;} jamEngine.simplifyObject=function(object,hookFunction) {return simplifyDesc((this.normalizeJsonItem(object,{meaningfulIds:true,parseFriendly:true}))[1][1],hookFunction);};jamEngine.simplifyList=function(list,hookFunction) {return simplifyList((this.normalizeJsonItem(list,{meaningfulIds:true,parseFriendly:true}))[1],hookFunction);};jamEngine.parseCompact=function(compact) {var result=[];if(compact.constructor===Object) {var keys=[];for(var k in compact) {if(compact.hasOwnProperty(k)) {keys.push(k);}} if(keys.length===1) {result[0]=keys[0];result[1]=compact[keys[0]];} else {throw new Error(\"[jamEngine.parseCompact] Syntax error: \"+compact.toSource());}} else if(compact.constructor===Array) {if(compact.length===2) {result[0]=compact[0];result[1]=compact[1];} else {throw new Error(\"[jamEngine.parseCompact] Syntax error: \"+compact.toSource());}} else {throw new Error(\"[jamEngine.parseCompact] JavaScript object or array expected\");} return result;};jamEngine.compactToExplicit=function(compact,typeKey,valueKey) {var explicit={};var typeValue=this.parseCompact(compact);explicit[typeKey||\"<type>\"]=typeValue[0];explicit[valueKey||\"<value>\"]=typeValue[1];return explicit;};jamEngine.buildCompact=function(type,value) {var compact;if(typeof type==='string') {if(this.parseFriendly) {compact=[type,value];} else {compact={};compact[type]=value;}} else {throw new Error(\"[jamEngine.buildCompact] String expected\");} return compact;};jamEngine.explicitToCompact=function(explicit,typeKey,valueKey) {var compact;if(explicit.constructor===Object) {compact=this.buildCompact(explicit[typeKey||\"<type>\"],explicit[valueKey||\"<value>\"]);} else {throw new Error(\"[jamEngine.explicitToCompact] JavaScript object expected\");} return compact;};for(var charIdStr in conflictingStringIdStrs) {if(conflictingStringIdStrs.hasOwnProperty(charIdStr)) {var stringIdStrs=conflictingStringIdStrs[charIdStr];for(var index=stringIdStrs.length-1;index>=0;index--) {var stringIdStr=stringIdStrs[index];if(!(app.charIDToTypeID(charIdStr.substring(1,5))===app.stringIDToTypeID(stringIdStr))) {stringIdStrs.splice(index,1);}} if(stringIdStrs.length<2) {delete conflictingStringIdStrs[charIdStr];}}} for(var charIdStr in contextRules) {if(contextRules.hasOwnProperty(charIdStr)) {if(charIdStr in conflictingStringIdStrs) {var rule=contextRules[charIdStr];for(var kind in rule) {if(rule.hasOwnProperty(kind)) {switch(kind) {case\"<class>\":case\"<event>\":case\"<enumType>\":case\"<enumValue>\":case\"<key>\":case\"<unknown>\":if(app.charIDToTypeID(charIdStr.substring(1,5))!=app.stringIDToTypeID(rule[kind])) {throw new Error(\"[jamEngine] \"+\"\\\"\"+charIdStr+\"\\\" and \\\"\"+rule[kind]+\"\\\" are not equivalent ID strings\");} break;case\"<classKey>\":case\"<eventKey>\":case\"<typeValue>\":for(var parent in rule[kind]) {if(rule[kind].hasOwnProperty(parent)) {if(app.charIDToTypeID(charIdStr.substring(1,5))!=app.stringIDToTypeID(rule[kind][parent])) {throw new Error(\"[jamEngine] \"+\"\\\"\"+charIdStr+\"\\\" and \\\"\"+rule[kind][parent]+\"\\\" are not equivalent ID strings\");}}} break;}}}} else {delete contextRules[charIdStr];}}}}());}
// jamJSON.jsxinc v4.4 (minified)
if(typeof jamJSON!=='object') {var jamJSON={};(function() {var state;var stack;var container;var key;var value;var escapes={'\\\\':'\\\\','\"':'\"','/':'/','t':'\\t','n':'\\n','r':'\\r','f':'\\f','b':'\\b'};var action={'{':{go:function() {stack.push({state:'ok'});container={};state='firstokey';},ovalue:function() {stack.push({container:container,state:'ocomma',key:key});container={};state='firstokey';},firstavalue:function() {stack.push({container:container,state:'acomma'});container={};state='firstokey';},avalue:function() {stack.push({container:container,state:'acomma'});container={};state='firstokey';}},'}':{firstokey:function() {var pop=stack.pop();value=container;container=pop.container;key=pop.key;state=pop.state;},ocomma:function() {var pop=stack.pop();container[key]=value;value=container;container=pop.container;key=pop.key;state=pop.state;}},'[':{go:function() {stack.push({state:'ok'});container=[];state='firstavalue';},ovalue:function() {stack.push({container:container,state:'ocomma',key:key});container=[];state='firstavalue';},firstavalue:function() {stack.push({container:container,state:'acomma'});container=[];state='firstavalue';},avalue:function() {stack.push({container:container,state:'acomma'});container=[];state='firstavalue';}},']':{firstavalue:function() {var pop=stack.pop();value=container;container=pop.container;key=pop.key;state=pop.state;},acomma:function() {var pop=stack.pop();container.push(value);value=container;container=pop.container;key=pop.key;state=pop.state;}},':':{colon:function() {if(container.hasOwnProperty(key)) {throw new SyntaxError(\"[jamJSON.parse] Duplicate key: “\"+key+\"”\");} state='ovalue';}},',':{ocomma:function() {container[key]=value;state='okey';},acomma:function() {container.push(value);state='avalue';}},'true':{go:function() {value=true;state='ok';},ovalue:function() {value=true;state='ocomma';},firstavalue:function() {value=true;state='acomma';},avalue:function() {value=true;state='acomma';}},'false':{go:function() {value=false;state='ok';},ovalue:function() {value=false;state='ocomma';},firstavalue:function() {value=false;state='acomma';},avalue:function() {value=false;state='acomma';}},'null':{go:function() {value=null;state='ok';},ovalue:function() {value=null;state='ocomma';},firstavalue:function() {value=null;state='acomma';},avalue:function() {value=null;state='acomma';}}};var number={go:function() {state='ok';},ovalue:function() {state='ocomma';},firstavalue:function() {state='acomma';},avalue:function() {state='acomma';}};var string={go:function() {state='ok';},firstokey:function() {key=value;state='colon';},okey:function() {key=value;state='colon';},ovalue:function() {state='ocomma';},firstavalue:function() {state='acomma';},avalue:function() {state='acomma';}};var commentFunc=function(){};function debackslashify(text) {return text.replace(/\\\\(?:u(.{4})|([^u]))/g,function(a,b,c){return(b)?String.fromCharCode(parseInt(b,16)):escapes[c];});} jamJSON.parse=function(text,validate,allowComments) {if(validate) {var tx=/^[\\x20\\t\\n\\r]*(?:([,:\\[\\]{}]|true|false|null)|(-?(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?(?:[eE][+\\-]?[0-9]+)?)|\"((?:[^\\r\\n\\t\\\\\\\"]|\\\\(?:[\"\\\\\\/trnfb]|u[0-9a-fA-F]{4}))*)\")/;var txc=/^[\\x20\\t\\n\\r]*(?:(\\/(?:\\/.*|\\*(?:.|[\\r\\n])*?\\*\\/))|([,:\\[\\]{}]|true|false|null)|(-?(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?(?:[eE][+\\-]?[0-9]+)?)|\"((?:[^\\r\\n\\t\\\\\\\"]|\\\\(?:[\"\\\\\\/trnfb]|u[0-9a-fA-F]{4}))*)\")/;var r;var i;var actionFunc;state='go';stack=[];try {while(true) {i=(allowComments)?1:0;r=(allowComments)?txc.exec(text):tx.exec(text);if(!r) {break;} if(allowComments&&r[1]) {actionFunc=commentFunc;} else if(r[i+1]) {actionFunc=action[r[i+1]][state];} else if(r[i+2]) {value=+r[i+2];actionFunc=number[state];} else {value=debackslashify(r[i+3]);actionFunc=string[state];} if(actionFunc) {actionFunc();text=text.slice(r[0].length);} else {break;}}} catch(e) {state=e;} if(state!=='ok'||/[^\\x20\\t\\n\\r]/.test(text)) {throw state instanceof SyntaxError?state:new SyntaxError(\"[jamJSON.parse] Invalid JSON\");} return value;} else {return eval('('+text+')');}};var escapable=/[\\\\\\\"\\x00-\\x1F\\x7F-\\x9F\\u00AD\\u0600-\\u0604\\u070F\\u17B4\\u17B5\\u200C-\\u200F\\u2028-\\u202F\\u2060-\\u206F\\uFEFF\\uFFF0-\\uFFFF]/g;var meta={'\\b':'\\\\b','\\t':'\\\\t','\\n':'\\\\n','\\f':'\\\\f','\\r':'\\\\r','\"':'\\\\\"','\\\\':'\\\\\\\\'};var gap;var indent;var prefixIndent;function quote(string) {escapable.lastIndex=0;return escapable.test(string)?'\"'+string.replace(escapable,function(a){var c=meta[a];return(typeof c==='string')?c:'\\\\u'+('0000'+a.charCodeAt(0).toString(16).toUpperCase()).slice(-4);})+'\"':'\"'+string+'\"';} function str(value) {var i;var k;var v;var mind=gap;var partial;switch(typeof value) {case'string':return quote(value);case'number':return isFinite(value)?String(value):'null';case'boolean':case'null':return String(value);case'object':if(!value) {return'null';} gap+=indent;partial=[];if(value.constructor===Array) {for(i=0;i<value.length;i++) {partial[i]=str(value[i]);} v=(partial.length===0)?(gap?'[\\n'+prefixIndent+mind+']':'[ ]'):(gap?'[\\n'+prefixIndent+gap+partial.join(',\\n'+prefixIndent+gap)+'\\n'+prefixIndent+mind+']':'[ '+partial.join(', ')+' ]');gap=mind;return v;} else {for(k in value) {if(value.hasOwnProperty(k)) {v=str(value[k]);if(v) {partial.push(quote(k)+(gap&&((v.charAt(0)==='{')||(v.charAt(0)==='['))?':\\n'+prefixIndent+gap:': ')+v);}}} v=(partial.length===0)?(gap?'{\\n'+prefixIndent+mind+'}':'{ }'):(gap?'{\\n'+prefixIndent+gap+partial.join(',\\n'+prefixIndent+gap)+'\\n'+prefixIndent+mind+'}':'{ '+partial.join(', ')+' }');gap=mind;return v;} default:throw new SyntaxError(\"[jamJSON.stringify] Invalid JSON\");}} jamJSON.stringify=function(value,space,prefix) {var i;gap='';indent='';prefixIndent='';if(typeof space==='number') {for(i=0;i<space;i++) {indent+=' ';}} else if(typeof space==='string') {indent=space;} if(typeof prefix==='number') {for(i=0;i<prefix;i++) {prefixIndent+=' ';}} else if(typeof prefix==='string') {prefixIndent=prefix;} return prefixIndent+str(value);};}());}
// jamUtils.jsxinc v4.4 (minified)
if(typeof jamUtils!=='object') {var jamUtils={};(function() {jamUtils.toDistanceUnit=function(amount,amountBasePerInch) {return(amount/amountBasePerInch)*72.0;};jamUtils.fromDistanceUnit=function(amount,amountBasePerInch) {return(amount/72.0)*amountBasePerInch;};jamUtils.fontExists=function(fontPostScriptName) {var useDOM=true;var found=false;if(useDOM) {for(var i=0;i<app.fonts.length;i++) {if(app.fonts[i].postScriptName===fontPostScriptName) {found=true;break;}}} else {var saveMeaningfulIds=jamEngine.meaningfulIds;var saveParseFriendly=jamEngine.parseFriendly;jamEngine.meaningfulIds=true;jamEngine.parseFriendly=true;var resultDescriptorObj=jamEngine.jsonGet ([[\"property\",[\"<property>\",\"fontList\"]],[\"application\",[\"<enumerated>\",[\"ordinal\",\"targetEnum\"]]]]);var fontPostScriptNameArr=resultDescriptorObj[\"fontList\"][1][1][\"fontPostScriptName\"][1];for(var i=0;i<fontPostScriptNameArr.length;i++) {if(fontPostScriptNameArr[i][1]===fontPostScriptName) {found=true;break;}} jamEngine.meaningfulIds=saveMeaningfulIds;jamEngine.parseFriendly=saveParseFriendly;} return found;};jamUtils.loadAction=function(action,actionSet,actionsFilePath) {try {jamEngine.jsonGet([[\"action\",[\"<name>\",action]],[\"actionSet\",[\"<name>\",actionSet]]]);var found=true;} catch(e) {var found=false;} if(!found) {jamEngine.jsonPlay(\"open\",{\"target\":[\"<path>\",actionsFilePath]});}};jamUtils.loadActionSet=function(actionSet,actionsFilePath) {try {jamEngine.jsonGet([[\"actionSet\",[\"<name>\",actionSet]]]);var found=true;} catch(e) {var found=false;} if(!found) {jamEngine.jsonPlay(\"open\",{\"target\":[\"<path>\",actionsFilePath]});}};jamUtils.loadPreset=function(presetProperty,presetName,presetFilePath) {var useDOM=false;var useOpen=true;var classes={\"brush\":\"brush\",\"colors\":\"color\",\"gradientClassEvent\":\"gradientClassEvent\",\"style\":\"styleClass\",\"pattern\":\"'PttR'\",\"shapingCurve\":\"shapingCurve\",\"customShape\":\"customShape\",\"toolPreset\":\"toolPreset\"};var presetClass=classes[presetProperty];var saveMeaningfulIds=jamEngine.meaningfulIds;var saveParseFriendly=jamEngine.parseFriendly;jamEngine.meaningfulIds=true;jamEngine.parseFriendly=true;var found=false;var resultDescriptorObj=jamEngine.jsonGet ([[\"property\",[\"<property>\",\"presetManager\"]],[\"application\",[\"<enumerated>\",[\"ordinal\",\"targetEnum\"]]]]);var presetManagerArr=resultDescriptorObj[\"presetManager\"][1];for(var i=0;i<presetManagerArr.length;i++) {var presets=presetManagerArr[i][1];if(presets[0]===presetClass) {var presetsArr=presets[1][\"name\"][1];for(var j=0;j<presetsArr.length;j++) {if(presetsArr[j][1]===presetName) {found=true;break;}} break;}} if(!found) {if(useDOM) {app.load(new File(presetFilePath));} else if(useOpen) {jamEngine.jsonPlay(\"open\",{\"target\":[\"<path>\",presetFilePath]});} else {jamEngine.jsonPlay (\"set\",{\"target\":[\"<reference>\",[[\"property\",[\"<property>\",presetProperty]],[\"application\",[\"<enumerated>\",[\"ordinal\",\"targetEnum\"]]]]],\"to\":[\"<path>\",presetFilePath],\"append\":[\"<boolean>\",true]});}} jamEngine.meaningfulIds=saveMeaningfulIds;jamEngine.parseFriendly=saveParseFriendly;};function getFileObject(file) {var fileObject;if(file instanceof File) {fileObject=file;} else if(typeof file==='string') {fileObject=new File(file);} else {throw new Error('[jamUtils getFileObject] Invalid argument');} return fileObject;} jamUtils.readTextFile=function(textFile) {var text=null;var file=getFileObject(textFile);if(file.open(\"r\")) {text=file.read();file.close();} return text;};jamUtils.readJsonFile=function(jsonFile) {return jamJSON.parse(this.readTextFile(jsonFile),true);};jamUtils.writeTextFile=function(textFile,text) {var file=getFileObject(textFile);if(file.open('w','TEXT')) {file.encoding='UTF-8';file.lineFeed='unix';file.write('\\uFEFF');file.write(text);file.close();}};jamUtils.writeJsonFile=function(jsonFile,data,space) {this.writeTextFile(jsonFile,jamJSON.stringify(data,space));};jamUtils.cloneData=function(data) {var clone;if(data===null) {clone=data;} else if(data.constructor===Object) {clone={};for(var k in data) {if(data.hasOwnProperty(k)) {clone[k]=this.cloneData(data[k]);}}} else if(data.constructor===Array) {clone=[];for(var i=0;i<data.length;i++) {clone.push(this.cloneData(data[i]));}} else {clone=data;} return clone;};jamUtils.mergeData=function(data,defaultData) {for(var k in defaultData) {if(defaultData.hasOwnProperty(k)) {if(k in data) {if((defaultData[k]!==null)&&(defaultData[k].constructor===Object)) {data[k]=this.mergeData(data[k],defaultData[k]);}} else {data[k]=this.cloneData(defaultData[k]);}}} return data;};var jsonCustomOptionsStringKey=\"jsonCustomOptions\";jamUtils.getCustomOptions=function(signature,defaultOptions) {var saveMeaningfulIds=jamEngine.meaningfulIds;var saveParseFriendly=jamEngine.parseFriendly;jamEngine.meaningfulIds=true;jamEngine.parseFriendly=false;try {var resultObj=jamEngine.classIdAndActionDescriptorToJson(jamEngine.uniIdStrToId(signature),app.getCustomOptions(signature));var customOptions=jamJSON.parse(resultObj[\"<descriptor>\"][jsonCustomOptionsStringKey][\"<string>\"],true)} catch(e) {var customOptions={};} jamEngine.meaningfulIds=saveMeaningfulIds;jamEngine.parseFriendly=saveParseFriendly;return this.mergeData(customOptions,defaultOptions);};jamUtils.putCustomOptions=function(signature,customOptions,persistent) {var descriptorObj={};descriptorObj[jsonCustomOptionsStringKey]=[\"<string>\",jamJSON.stringify(customOptions)];app.putCustomOptions(signature,jamEngine.jsonToActionDescriptor(descriptorObj),persistent);};jamUtils.eraseCustomOptions=function(signature) {app.eraseCustomOptions(signature);};jamUtils.dataToHexaString=function(dataString,lowercase) {var hexaDigits=[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"A\",\"B\",\"C\",\"D\",\"E\",\"F\"];var hexaString=\"\";var length=dataString.length;for(var index=0;index<length;index++) {var dataByte=dataString.charCodeAt(index);if((dataByte>=0x00)&&(dataByte<=0xFF)) {hexaString+=hexaDigits[(dataByte&0xF0)>>4]+hexaDigits[dataByte&0x0F];} else {throw new Error(\"[jamUtils.dataToHexaString] Invalid data string\");}} if(lowercase) {hexaString=hexaString.toLowerCase();} return hexaString;};jamUtils.hexaToDataString=function(hexaString) {var dataString=\"\";var length=hexaString.length;if(((length%2)===0)&&(/^[0-9A-Fa-f]*$/.test(hexaString))) {for(var index=0;index<length;index+=2) {var byteString=hexaString.slice(index,index+2);dataString+=String.fromCharCode(parseInt(byteString,16));}} else {throw new Error(\"[jamUtils.hexaToDataString] Invalid hexa string\");} return dataString;};}());}
//------------------------------------------------------------------------------
jamEngine.meaningfulIds = true;
jamEngine.parseFriendly = false;
//------------------------------------------------------------------------------
var expandTabs = false;
var promptString = \"Save code to JavaScript file:\";
var signature = \"json-action-manager-get-layer-info-code-options\";
var defaultOptions =
{
defaultFile: \"~/Desktop/get-layer-info.js\",
dialogWidth: 512,
dialogHeight: 768,
dialogX: 0,
dialogY: 0
};
var defaultFile = new File (defaultOptions.defaultFile);
//------------------------------------------------------------------------------
function displayDialog (text)
{
// Get an available UI font among a list of favorites
function getAvailableUIFont (fontsArray)
{
// List all fonts available in Photoshop in JSON format
var fontsObj = { };
for (var i = 0; i < app.fonts.length; i++)
{
var family = app.fonts[i].family;
if (!(family in fontsObj))
{
fontsObj[family] = { };
}
fontsObj[family][app.fonts[i].style] =
{
\"name\": app.fonts[i].name
};
}
var availableFont;
var fontFamily;
var fontStyle;
var fontSize;
for (var i = 0; i < fontsArray.length; i++)
{
fontFamily = fontsArray[i][0];
if (fontFamily in fontsObj)
{
fontStyle = fontsArray[i][1];
if (fontStyle in fontsObj[fontFamily])
{
fontSize = fontsArray[i][2];
availableFont = ScriptUI.newFont (fontFamily, fontStyle, fontSize)
break;
}
}
}
return availableFont;
}
var monospacedFont =
getAvailableUIFont
(
[
[ \"Monaco\", \"Regular\", 12 ],
[ \"Lucida Sans Typewriter\", \"Regular\", 14 ],
[ \"Courier\", \"Regular\", 16 ],
[ \"Courier New\", \"Regular\", 14 ]
]
);
defaultFile = new File (customOptions.defaultFile);
var dialog = new Window ('dialog', \"Get Layer Info Code\", undefined, { resizeable: true });
dialog.orientation = \"column\";
dialog.preferredSize.width = customOptions.dialogWidth;
dialog.preferredSize.height = customOptions.dialogHeight;
dialog.onResizing = function ()
{
this.layout.resize ();
};
dialog.onShow = function ()
{
var x = customOptions.dialogX;
var y = customOptions.dialogY;
if ((x !== 0) || (y !== 0))
{
this.location.x = x;
this.location.y = y;
}
logArea.text = text;
};
var codeGroup = dialog.add ('group');
codeGroup.orientation = \"column\";
codeGroup.alignment = [ \"fill\", \"fill\" ];
var logArea = codeGroup.add ('edittext', undefined, \"\", { multiline: true, readonly: true });
logArea.alignment = [ \"fill\", \"fill\" ];
logArea.minimumSize = [ -1, 64 ];
if (monospacedFont)
{
logArea.graphics.font = monospacedFont;
}
var actionButtonsGroup = codeGroup.add ('group');
actionButtonsGroup.alignment = [ \"center\", \"bottom\" ];
actionButtonsGroup.orientation = \"row\";
actionButtonsGroup.alignChildren = \"fill\";
var file;
var saveButton = actionButtonsGroup.add ('button', undefined, 'Save...');
saveButton.onClick = function ()
{
file = defaultFile.saveDlg (promptString);
if (file)
{
jamUtils.writeTextFile (file, text);
defaultFile = file;
}
};
var buttonsGroup = dialog.add ('group');
buttonsGroup.alignment = [ \"right\", \"bottom\" ];
buttonsGroup.orientation = \"row\";
buttonsGroup.alignChildren = \"fill\";
var cancelButton = buttonsGroup.add ('button', undefined, 'Cancel', { name: \"cancel\" });
cancelButton.onClick = function ()
{
dialog.close (false);
};
var okButton = buttonsGroup.add ('button', undefined, 'OK', { name: \"ok\" });
okButton.onClick = function ()
{
customOptions.defaultFile = defaultFile.fsName;
customOptions.dialogWidth = dialog.size.width;
customOptions.dialogHeight = dialog.size.height;
customOptions.dialogX = dialog.location.x;
customOptions.dialogY = dialog.location.y;
dialog.close (true);
};
return dialog.show ();
}
//------------------------------------------------------------------------------
var codeHeader =
'//@includepath \"~/JSON Action Manager/\"\\n' +
'//@include \"jamEngine.jsxinc\"\\n';
var resultVariable = \"resultDescriptorObj\";
//------------------------------------------------------------------------------
function getInfoCode (ref, desc, comment)
{
var commentCode = (comment) ? \"// \" + comment + \"\\n\" : \"\";
var infoCode =
commentCode +
resultVariable + \" = jamEngine.jsonGet\\n\" +
\"(\\n\" +
jamJSON.stringify (ref, (expandTabs) ? 4 : '\\t', (expandTabs) ? 4 : '\\t') + \"\\n\" +
\");\\n\" +
resultVariable + \" =\\n\" +
jamJSON.stringify (desc, (expandTabs) ? 4 : '\\t') +
\";\\n\" +
\"\\n\";
return infoCode;
}
//------------------------------------------------------------------------------
var appVersion = parseInt (app.version);
if (appVersion >= 10) // CS3
{
var ref;
var desc = null;
try
{
ref =
[
{ \"layer\": { \"<enumerated>\": { \"ordinal\": \"targetEnum\" } } },
{ \"document\": { \"<enumerated>\": { \"ordinal\": \"targetEnum\" } } }
];
desc = jamEngine.jsonGet (ref);
}
catch (e)
{
alert (\"No layer selected.\");
}
if (desc)
{
var layerInfoCode =
codeHeader +
\"\\n\" +
\"jamEngine.meaningfulIds = \" + jamEngine.meaningfulIds + \";\\n\" +
\"jamEngine.parseFriendly = \" + jamEngine.parseFriendly + \";\\n\" +
\"\\n\" +
\"var \" + resultVariable + \";\\n\" +
\"\\n\" +
getInfoCode (ref, desc, \"Get properties of current layer\");
var customOptions = jamUtils.getCustomOptions (signature, defaultOptions);
layerInfoCode;
}
}
else
{
alert (\"Sorry, this script requires Photoshop CS3 or later.\");
}
//------------------------------------------------------------------------------
"
end tell
return layerInfo
end get_layer_info_code