Photoshop: Get/copy colour of shape in selected layer?

I’m wondering if it’s possible via a script in Photoshop to get the colour (RGB Hex colour) from the shape in the selected layer and copy it to the clipboard?

So in this example it would copy the orange colour from the selected layer as FF9640 to the clipboard?
(The equivalent of selecting Layer > Layer Content Options from the menu bar, then copying the Hex colour at the bottom.)

I have a few scripts for different things in Photoshop, but don’t even know if something like this would be possible :slight_smile:

Hi. The basic premise is doable. You can get the value by dropping a color sampler and having PS convert its value to RGB hex. I’ve previously posted the sampler method on this forum. Unless your shape is a hard-edged square, the real problem is determining the correct coordinates for dropper placement. It may require a workaround of some sort. Good luck.

–edited for grammar

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

I’d like to point out that the Tonton code is not ugly and hacky at all, just my quick attempt to extract the needed info from the mile of data it spits out.

Someone good with Javascript could edit the Tonton code to just neatly spit out the needed hex code. That’s not me.