

// apply properties like fonts, size, … to letters of words in selected type layer;
// kerning in this case and for all type layers in the document;
// 2024, use it at your own risk;
if (app.documents.length > 0) {
var theRegExp = /\?/gi;
var theTypeLayers = collectTypeLayers ();
for (var m = 0; m < theTypeLayers.length; m++) {
changeWordProperties (theTypeLayers[m][1], theRegExp, -500)
}
};
//////////////////
////// change word properties //////
function changeWordProperties (theId, theRegExp, newKerning) {
var originalRulerUnits = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.PIXELS;
//////////////////
try {
// get font of active layer;
var ref = new ActionReference();
ref.putIdentifier( charIDToTypeID("Lyr "), theId );
var layerDesc = executeActionGet(ref);
var layerSet = typeIDToStringID(layerDesc.getEnumerationValue(stringIDToTypeID("layerSection")));
var isBackground = layerDesc.getBoolean(stringIDToTypeID("background"));
// if not layer group collect values;
if (layerSet != "layerSectionEnd" && layerSet != "layerSectionStart" && isBackground != true) {
var hasText = layerDesc.hasKey(stringIDToTypeID("textKey"));
if (hasText == true) {
var textDesc = layerDesc.getObjectValue(stringIDToTypeID('textKey'));
var theText = textDesc.getString(stringIDToTypeID('textKey'));
//var shapeList = textDesc.getList(stringIDToTypeID('textShape'));
var kernRange = textDesc.getList(stringIDToTypeID('kerningRange'));
var rangeList = textDesc.getList(stringIDToTypeID('textStyleRange'));
var idTxtt = charIDToTypeID( "Txtt" );
var idFrom = charIDToTypeID( "From" );
var idT = charIDToTypeID( "T " );
var idTxLr = charIDToTypeID( "TxLr" );
var idTxt = charIDToTypeID( "Txt " );
var idsetd = charIDToTypeID( "setd" );
// change text;
var desc6 = new ActionDescriptor();
var idnull = charIDToTypeID( "null" );
var ref1 = new ActionReference();
ref1.putIdentifier( idTxLr, theId );
desc6.putReference( idnull, ref1 );
var desc7 = new ActionDescriptor();
desc7.putString( idTxt, theText );
//////////////////////////////////////////////////////
var kerningRanges = new ActionList;
var theCounter = 0;
if (kernRange.count > 0) {var thisKerningRange = kernRange.getObjectValue(theCounter)};
// kernRange
for (var m = 0; m < theText.length; m++) {
// check for relevant existing kerning range;
if (kernRange.count > 0) {
if (thisKerningRange.getInteger(idFrom) == m) {
kerningRanges.putObject( stringIDToTypeID( "kerningRange"), thisKerningRange);
theCounter++;
if (theCounter < kernRange.count) {
var thisKerningRange = kernRange.getObjectValue(theCounter)
}
};
};
// check for regexp;
if (theText[m].match(theRegExp) != null) {
var desc15 = new ActionDescriptor();
desc15.putInteger( idFrom, m - 1 );
desc15.putInteger( idT, m );
desc15.putInteger( stringIDToTypeID("kerning"), newKerning );
kerningRanges.putObject( stringIDToTypeID( "kerningRange"), desc15);
};
};
//////////////////////////////////////////////////////
desc7.putList( idTxtt, rangeList );
desc7.putList( stringIDToTypeID( "kerningRange"), kerningRanges);
//////////////////////////////////////////////////////
desc6.putObject( idT, idTxLr, desc7 );
executeAction( idsetd, desc6, DialogModes.NO );
}
}
}
catch (e) {};
app.preferences.rulerUnits = originalRulerUnits;
};
////// collect type layers from active document //////
function collectTypeLayers () {
// get number of layers;
var ref = new ActionReference();
ref.putEnumerated( charIDToTypeID("Dcmn"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
var applicationDesc = executeActionGet(ref);
var theNumber = applicationDesc.getInteger(stringIDToTypeID("numberOfLayers"));
// process the layers;
var theLayers = new Array;
for (var m = 0; m <= theNumber; m++) {
try {
var ref = new ActionReference();
ref.putIndex( charIDToTypeID( "Lyr " ), m);
var layerDesc = executeActionGet(ref);
var layerSet = typeIDToStringID(layerDesc.getEnumerationValue(stringIDToTypeID("layerSection")));
var isBackground = layerDesc.getBoolean(stringIDToTypeID("background"));
// if not layer group collect values;
if (layerSet != "layerSectionEnd" && layerSet != "layerSectionStart" && isBackground != true && layerDesc.hasKey(stringIDToTypeID("textKey")) == true) {
var visible = layerDesc.getBoolean(stringIDToTypeID("visible"));
var theName = layerDesc.getString(stringIDToTypeID('name'));
var theID = layerDesc.getInteger(stringIDToTypeID('layerID'));
theLayers.push([theName, theID, visible])
};
}
catch (e) {};
};
return theLayers
};