• Global community
    • Language:
      • Deutsch
      • English
      • Español
      • Français
      • Português
  • 日本語コミュニティ
    Dedicated community for Japanese speakers
  • 한국 커뮤니티
    Dedicated community for Korean speakers
Exit
1

Change color of a single word in a text layer and turn symbols to superscript using Javascript?

Participant ,
Oct 22, 2022 Oct 22, 2022

Copy link to clipboard

Copied

Hi, 

Kindly help me in modifying the below javascript. Totally two things that I would like to modify it,

 

1) If the given input in the dialog box as "Get 20% discount", the word "Discount" alone has to turn Green in color.  Example: Get 20% discount --> Get 20% discount
2) If the given input in the dialog box is "Get 20% discount#", the symbol "#" has to turn into a superscript. Example: Get 20% discount# ---> Get 20% discount#

 

The below script basically replaces the existing text layer in specific artboards if the text layer matches the font type(Arial-BoldMT) & artboard dimension. 

 

var doc = app.activeDocument;
var oldPref = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.PIXELS;
 
var ab, aLayer, aW, aH

var defaultValue = '';
var desktopHead = prompt("Paste your new headline", defaultValue);

var docLayers = doc.layers.length; //getting top layers because artboards are top layers

for(var i=0;i<docLayers;i++){
aLayer = doc.layers[i];
ab = artboard_rectangle(aLayer);
aW = ab[2]-ab[0];
aH = ab[3]-ab[1];
if((aW == 1000 && aH == 1000) || (aW == 400 && aH == 500)){//add more sizes here
findTextLayer (aLayer)
}//end if for artboard size
}//end for loop

app.preferences.rulerUnits = oldPref;

function findTextLayer(pLayer){
var layLen = pLayer.layers.length;
for(var j = 0;j<layLen;j++){
var layerRef = pLayer.layers[j];
if(pLayer.layers[j].typename == 'LayerSet'){
findTextLayer (pLayer.layers[j]);
}//end if for finding layerset
else{
if (layerRef.kind === LayerKind.TEXT) {
if(layerRef.textItem.font === "Arial-BoldMT"){//make sure you have correct font name
layerRef.textItem.contents = desktopHead;
}//end if for text font
}//end if for layerkind text
}//end else
};//end for loop
 
};//end function

function artboard_rectangle(layer)
{
try {
var r = new ActionReference();
r.putProperty(stringIDToTypeID("property"), stringIDToTypeID("artboard"));
if (layer) r.putIdentifier(stringIDToTypeID("layer"), layer.id);
else r.putEnumerated(stringIDToTypeID("layer"), stringIDToTypeID("ordinal"), stringIDToTypeID("targetEnum"));
var d = executeActionGet(r).getObjectValue(stringIDToTypeID("artboard")).getObjectValue(stringIDToTypeID("artboardRect"));
var bounds = new Array();
bounds[0] = d.getUnitDoubleValue(stringIDToTypeID("left"));
bounds[1] = d.getUnitDoubleValue(stringIDToTypeID("top"));
bounds[2] = d.getUnitDoubleValue(stringIDToTypeID("right"));
bounds[3] = d.getUnitDoubleValue(stringIDToTypeID("bottom"));

return bounds;
}
catch(e) { alert(e); }
}
 
 

Thanks in advance. 

TOPICS
Actions and scripting , macOS , Windows

Views

688

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines

correct answers 2 Correct answers

Guide , Oct 25, 2022 Oct 25, 2022

 

#target photoshop

var greenText = 'discount',
    greenColor = [0, 255, 0],
    superscriptText = '#',
    s2t = stringIDToTypeID;

var doc = app.activeDocument;
var oldPref = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.PIXELS;

var ab, aLayer, aW, aH

var defaultValue = 'Get 20% discount#';
var desktopHead = prompt("Paste your new headline", defaultValue);

var docLayers = doc.layers.length; //getting top layers because artboards are top layers

for (var i = 0; i < docLaye
...

Votes

Translate

Translate
Guide , Oct 26, 2022 Oct 26, 2022

 

#target photoshop

var replaceColor = [
    { text: 'discount', color: '00ff00' },
    { text: 'get', color: 'ff0000' },
    { text: '20%', color: '0000ff' },
    { text: '#', color: 'ff00ff' }],
    superscriptText = '#',
    s2t = stringIDToTypeID;

var doc = app.activeDocument;
var oldPref = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.PIXELS;

var ab, aLayer, aW, aH

var defaultValue = 'Get 20% discount#';
var desktopHead = prompt("Paste your new headline", defaultValue);
...

Votes

Translate

Translate
Adobe
Community Expert ,
Oct 24, 2022 Oct 24, 2022

Copy link to clipboard

Copied

Just looking at old unanswered post. That script I wrote, will mess up with your example here, as it looks for the % sign after discount.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Participant ,
Oct 26, 2022 Oct 26, 2022

Copy link to clipboard

Copied

Ya, that's right Chuck. The solution given by @jazz-y  for the superscript works well. Thanks to both of you for pitching in. Nice to have such skillful developers here. 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Guide ,
Oct 25, 2022 Oct 25, 2022

Copy link to clipboard

Copied

 

#target photoshop

var greenText = 'discount',
    greenColor = [0, 255, 0],
    superscriptText = '#',
    s2t = stringIDToTypeID;

var doc = app.activeDocument;
var oldPref = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.PIXELS;

var ab, aLayer, aW, aH

var defaultValue = 'Get 20% discount#';
var desktopHead = prompt("Paste your new headline", defaultValue);

var docLayers = doc.layers.length; //getting top layers because artboards are top layers

for (var i = 0; i < docLayers; i++) {
    aLayer = doc.layers[i];
    ab = artboard_rectangle(aLayer);
    aW = ab[2] - ab[0];
    aH = ab[3] - ab[1];
    if ((aW == 1000 && aH == 1000) || (aW == 400 && aH == 500)) {//add more sizes here
        findTextLayer(aLayer)
    }//end if for artboard size
}//end for loop

app.preferences.rulerUnits = oldPref;

function findTextLayer(pLayer) {
    var layLen = pLayer.layers.length;
    for (var j = 0; j < layLen; j++) {
        var layerRef = pLayer.layers[j];
        if (pLayer.layers[j].typename == 'LayerSet') {
            findTextLayer(pLayer.layers[j]);
        }//end if for finding layerset
        else {
            if (layerRef.kind === LayerKind.TEXT) {
                if (layerRef.textItem.font === "Arial-BoldMT") {//make sure you have correct font name
                    layerRef.textItem.contents = desktopHead;

                    var d = new ActionDescriptor(),
                        style = new ActionDescriptor();
                    d.putDouble(s2t('red'), greenColor[0])
                    d.putDouble(s2t('grain'), greenColor[1])
                    d.putDouble(s2t('blue'), greenColor[2])
                    style.putObject(s2t('color'), s2t('RGBColor'), d)

                    replaceTextStyleByContent(layerRef.id, greenText, style)

                    var style = new ActionDescriptor();
                    style.putEnumerated(s2t('baseline'), s2t('baseline'), s2t('superScript'))
                    replaceTextStyleByContent(layerRef.id, superscriptText, style)
                }//end if for text font
            }//end if for layerkind text
        }//end else
    };//end for loop

};//end function

function artboard_rectangle(layer) {
    try {
        var r = new ActionReference();
        r.putProperty(stringIDToTypeID("property"), stringIDToTypeID("artboard"));
        if (layer) r.putIdentifier(stringIDToTypeID("layer"), layer.id);
        else r.putEnumerated(stringIDToTypeID("layer"), stringIDToTypeID("ordinal"), stringIDToTypeID("targetEnum"));
        var d = executeActionGet(r).getObjectValue(stringIDToTypeID("artboard")).getObjectValue(stringIDToTypeID("artboardRect"));
        var bounds = new Array();
        bounds[0] = d.getUnitDoubleValue(stringIDToTypeID("left"));
        bounds[1] = d.getUnitDoubleValue(stringIDToTypeID("top"));
        bounds[2] = d.getUnitDoubleValue(stringIDToTypeID("right"));
        bounds[3] = d.getUnitDoubleValue(stringIDToTypeID("bottom"));

        return bounds;
    }
    catch (e) { alert(e); }
}

function replaceTextStyleByContent(layerID, text, newStyleDesc) {
    var s2t = stringIDToTypeID;
    (r = new ActionReference()).putProperty(s2t('property'), p = s2t('textKey'));
    r.putIdentifier(s2t('layer'), layerID);
    if (executeActionGet(r).hasKey(p)) {
        var textItem = executeActionGet(r).getObjectValue(p),
            sList = textItem.getList(s2t('textStyleRange')),
            l = new ActionList(),
            styleSheet = [],
            content = textItem.getString(p);
        for (var i = 0; i < sList.count; i++) {
            var cur = sList.getObjectValue(i);
            styleSheet.push({
                from: cur.getInteger(s2t('from')),
                to: cur.getInteger(s2t('to')),
                style: function (d) {
                    if (d.hasKey(p = s2t('styleSheetHasParent')) && d.getBoolean(p)) if (d.hasKey(p = s2t('baseParentStyle'))) extendDescriptor(d.getObjectValue(p), d)
                    return d;
                }(cur.getObjectValue(s2t('textStyle'))),
            })
            styleSheet[i].text = content.substring(styleSheet[i].from, styleSheet[i].to);
        };

        do {
            var len = styleSheet.length,
                found = false;
            for (var i = 0; i < len; i++) {
                var offset = 0,
                    cur = styleSheet[i].text;
                if (cur) {
                    var match = cur.match(new RegExp(text, 'i')),
                        from, to;
                    if (match) {
                        from = cur.indexOf(match[0]) + offset
                        to = from + match[0].length
                        offset += match[0].length
                        cur = cur.substring(cur.indexOf(match[0]) + match[0].length)
                        customStyle = setCustomStyle(styleSheet[i], from, to, newStyleDesc)
                        styleSheet.splice.apply(styleSheet, [i, 1].concat(customStyle));
                        len += customStyle.length - 1;
                        i += customStyle.length - 1;
                        found = true
                    }
                }
            }
        } while (found)

        var l = new ActionList();
        for (var i = 0; i < styleSheet.length; i++) {
            var d = new ActionDescriptor();
            d.putObject(s2t('textStyle'), s2t('textStyle'), styleSheet[i].style)
            d.putInteger(s2t('from'), styleSheet[i].from)
            d.putInteger(s2t('to'), styleSheet[i].to)
            l.putObject(s2t('textStyleRange'), d)
        }
        textItem.putList(s2t('textStyleRange'), l);
        (r = new ActionReference()).putIdentifier(s2t('layer'), layerID);
        (d = new ActionDescriptor()).putReference(s2t('target'), r);
        d.putObject(s2t('to'), s2t('textLayer'), textItem);
        executeAction(s2t('set'), d, DialogModes.NO);
    }

    function setCustomStyle(baseStyleSheet, from, to, newStyleDesc) {
        var output = [],
            offset = baseStyleSheet.from;
        if (baseStyleSheet.from != from + offset) {
            output.push({
                from: baseStyleSheet.from,
                to: from + offset,
                style: baseStyleSheet.style,
                text: baseStyleSheet.text.substring(0, from)
            })
        }
        var customStyle = new ActionDescriptor();
        extendDescriptor(baseStyleSheet.style, customStyle);
        extendDescriptor(customStyle, newStyleDesc, true);

        output.push({
            from: from + offset,
            to: to + offset,
            style: newStyleDesc,
            text: null
        })
        if (baseStyleSheet.to != to + offset) {
            output.push({
                from: to + offset,
                to: baseStyleSheet.to,
                style: baseStyleSheet.style,
                text: baseStyleSheet.text.substring(to)
            })
        }
        return output;
    }

    /** tnx to @r-bin
     * https://community.adobe.com/t5/photoshop-ecosystem-discussions/how-to-copy-save-styles-typeface-font-size-design-etc-of-arbitrary-text-fragments-and-apply-them-to/m-p/10522630
     */
    function extendDescriptor(src_desc, dst_desc) {
        try {
            for (var i = 0; i < src_desc.count; i++) {
                var key = src_desc.getKey(i);
                if (dst_desc.hasKey(key)) continue;
                var type = src_desc.getType(key);
                switch (type) {
                    case DescValueType.ALIASTYPE: dst_desc.putPath(key, src_desc.getPath(key)); break;
                    case DescValueType.BOOLEANTYPE: dst_desc.putBoolean(key, src_desc.getBoolean(key)); break;
                    case DescValueType.CLASSTYPE: dst_desc.putClass(key, src_desc.getClass(key)); break;
                    case DescValueType.DOUBLETYPE: dst_desc.putDouble(key, src_desc.getDouble(key)); break;
                    case DescValueType.INTEGERTYPE: dst_desc.putInteger(key, src_desc.getInteger(key)); break;
                    case DescValueType.LISTTYPE: dst_desc.putList(key, src_desc.getList(key)); break;
                    case DescValueType.RAWTYPE: dst_desc.putData(key, src_desc.getData(key)); break;
                    case DescValueType.STRINGTYPE: dst_desc.putString(key, src_desc.getString(key)); break;
                    case DescValueType.LARGEINTEGERTYPE: dst_desc.putLargeInteger(key, src_desc.getLargeInteger(key)); break;
                    case DescValueType.REFERENCETYPE: dst_desc.putReference(key, src_desc.getReference(key)); break;
                    case DescValueType.OBJECTTYPE: dst_desc.putObject(key, src_desc.getObjectType(key), src_desc.getObjectValue(key)); break;
                    case DescValueType.ENUMERATEDTYPE: dst_desc.putEnumerated(key, src_desc.getEnumerationType(key), src_desc.getEnumerationValue(key)); break;
                    case DescValueType.UNITDOUBLE: dst_desc.putUnitDouble(key, src_desc.getUnitDoubleType(key), src_desc.getUnitDoubleValue(key)); break;
                    default: alert("Unknown data type in descriptor"); return false;
                }
            }
            return true;
        }
        catch (e) { throw (e); }
    }
}

 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Participant ,
Oct 26, 2022 Oct 26, 2022

Copy link to clipboard

Copied

Thank you so much @jazz-y This is working great. I am able to replace it with any symbol to make it a superscript. That's amazing. I just had one more question. Is it possible to input multiple words to change the colors? Currently, it's only a one-word "discount". What if I have multiple words that need to change color? 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Guide ,
Oct 26, 2022 Oct 26, 2022

Copy link to clipboard

Copied

 

#target photoshop

var replaceColor = [
    { text: 'discount', color: '00ff00' },
    { text: 'get', color: 'ff0000' },
    { text: '20%', color: '0000ff' },
    { text: '#', color: 'ff00ff' }],
    superscriptText = '#',
    s2t = stringIDToTypeID;

var doc = app.activeDocument;
var oldPref = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.PIXELS;

var ab, aLayer, aW, aH

var defaultValue = 'Get 20% discount#';
var desktopHead = prompt("Paste your new headline", defaultValue);

var docLayers = doc.layers.length; //getting top layers because artboards are top layers

for (var i = 0; i < docLayers; i++) {
    aLayer = doc.layers[i];
    ab = artboard_rectangle(aLayer);
    aW = ab[2] - ab[0];
    aH = ab[3] - ab[1];
    if ((aW == 1000 && aH == 1000) || (aW == 400 && aH == 500)) {//add more sizes here
        findTextLayer(aLayer)
    }//end if for artboard size
}//end for loop

app.preferences.rulerUnits = oldPref;

function findTextLayer(pLayer) {
    var layLen = pLayer.layers.length;
    for (var j = 0; j < layLen; j++) {
        var layerRef = pLayer.layers[j];
        if (pLayer.layers[j].typename == 'LayerSet') {
            findTextLayer(pLayer.layers[j]);
        }//end if for finding layerset
        else {
            if (layerRef.kind === LayerKind.TEXT) {
                if (layerRef.textItem.font === "Arial-BoldMT") {//make sure you have correct font name
                    layerRef.textItem.contents = desktopHead;
                    for (var i = 0; i < replaceColor.length; i++) {
                        replaceTextStyleByContent(layerRef.id, replaceColor[i].text, colorDescFromHEX(replaceColor[i].color))
                    }
                    var style = new ActionDescriptor();
                    style.putEnumerated(s2t('baseline'), s2t('baseline'), s2t('superScript'))
                    replaceTextStyleByContent(layerRef.id, superscriptText, style)
                }//end if for text font
            }//end if for layerkind text
        }//end else
    };//end for loop

};//end function

function artboard_rectangle(layer) {
    try {
        var r = new ActionReference();
        r.putProperty(stringIDToTypeID("property"), stringIDToTypeID("artboard"));
        if (layer) r.putIdentifier(stringIDToTypeID("layer"), layer.id);
        else r.putEnumerated(stringIDToTypeID("layer"), stringIDToTypeID("ordinal"), stringIDToTypeID("targetEnum"));
        var d = executeActionGet(r).getObjectValue(stringIDToTypeID("artboard")).getObjectValue(stringIDToTypeID("artboardRect"));
        var bounds = new Array();
        bounds[0] = d.getUnitDoubleValue(stringIDToTypeID("left"));
        bounds[1] = d.getUnitDoubleValue(stringIDToTypeID("top"));
        bounds[2] = d.getUnitDoubleValue(stringIDToTypeID("right"));
        bounds[3] = d.getUnitDoubleValue(stringIDToTypeID("bottom"));

        return bounds;
    }
    catch (e) { alert(e); }
}

function colorDescFromHEX(hex) {
    var d = new ActionDescriptor(),
        style = new ActionDescriptor(),
        c = new SolidColor;
    c.rgb.hexValue = hex;
    d.putDouble(s2t('red'), c.rgb.red)
    d.putDouble(s2t('grain'), c.rgb.green)
    d.putDouble(s2t('blue'), c.rgb.blue)
    style.putObject(s2t('color'), s2t('RGBColor'), d)

    return style;
}

function replaceTextStyleByContent(layerID, text, newStyleDesc) {
    var s2t = stringIDToTypeID;
    (r = new ActionReference()).putProperty(s2t('property'), p = s2t('textKey'));
    r.putIdentifier(s2t('layer'), layerID);
    if (executeActionGet(r).hasKey(p)) {
        var textItem = executeActionGet(r).getObjectValue(p),
            sList = textItem.getList(s2t('textStyleRange')),
            l = new ActionList(),
            styleSheet = [],
            content = textItem.getString(p);
        for (var i = 0; i < sList.count; i++) {
            var cur = sList.getObjectValue(i);
            styleSheet.push({
                from: cur.getInteger(s2t('from')),
                to: cur.getInteger(s2t('to')),
                style: function (d) {
                    if (d.hasKey(p = s2t('styleSheetHasParent')) && d.getBoolean(p)) if (d.hasKey(p = s2t('baseParentStyle'))) extendDescriptor(d.getObjectValue(p), d)
                    return d;
                }(cur.getObjectValue(s2t('textStyle'))),
            })
            styleSheet[i].text = content.substring(styleSheet[i].from, styleSheet[i].to);
        };

        do {
            var len = styleSheet.length,
                found = false;
            for (var i = 0; i < len; i++) {
                var offset = 0,
                    cur = styleSheet[i].text;
                if (cur) {
                    var match = cur.match(new RegExp(text, 'i')),
                        from, to;
                    if (match) {
                        from = cur.indexOf(match[0]) + offset
                        to = from + match[0].length
                        offset += match[0].length
                        cur = cur.substring(cur.indexOf(match[0]) + match[0].length)
                        customStyle = setCustomStyle(styleSheet[i], from, to, newStyleDesc)
                        styleSheet.splice.apply(styleSheet, [i, 1].concat(customStyle));
                        len += customStyle.length - 1;
                        i += customStyle.length - 1;
                        found = true
                    }
                }
            }
        } while (found)

        var l = new ActionList();
        for (var i = 0; i < styleSheet.length; i++) {
            var d = new ActionDescriptor();
            d.putObject(s2t('textStyle'), s2t('textStyle'), styleSheet[i].style)
            d.putInteger(s2t('from'), styleSheet[i].from)
            d.putInteger(s2t('to'), styleSheet[i].to)
            l.putObject(s2t('textStyleRange'), d)
        }
        textItem.putList(s2t('textStyleRange'), l);
        (r = new ActionReference()).putIdentifier(s2t('layer'), layerID);
        (d = new ActionDescriptor()).putReference(s2t('target'), r);
        d.putObject(s2t('to'), s2t('textLayer'), textItem);
        executeAction(s2t('set'), d, DialogModes.NO);
    }

    function setCustomStyle(baseStyleSheet, from, to, newStyleDesc) {
        var output = [],
            offset = baseStyleSheet.from;
        if (baseStyleSheet.from != from + offset) {
            output.push({
                from: baseStyleSheet.from,
                to: from + offset,
                style: baseStyleSheet.style,
                text: baseStyleSheet.text.substring(0, from)
            })
        }
        var customStyle = new ActionDescriptor();
        extendDescriptor(baseStyleSheet.style, customStyle);
        extendDescriptor(customStyle, newStyleDesc, true);

        output.push({
            from: from + offset,
            to: to + offset,
            style: newStyleDesc,
            text: null
        })
        if (baseStyleSheet.to != to + offset) {
            output.push({
                from: to + offset,
                to: baseStyleSheet.to,
                style: baseStyleSheet.style,
                text: baseStyleSheet.text.substring(to)
            })
        }
        return output;
    }

    /** tnx to 
     * https://community.adobe.com/t5/photoshop-ecosystem-discussions/how-to-copy-save-styles-typeface-font-size-design-etc-of-arbitrary-text-fragments-and-apply-them-to/m-p/10522630
     */
    function extendDescriptor(src_desc, dst_desc) {
        try {
            for (var i = 0; i < src_desc.count; i++) {
                var key = src_desc.getKey(i);
                if (dst_desc.hasKey(key)) continue;
                var type = src_desc.getType(key);
                switch (type) {
                    case DescValueType.ALIASTYPE: dst_desc.putPath(key, src_desc.getPath(key)); break;
                    case DescValueType.BOOLEANTYPE: dst_desc.putBoolean(key, src_desc.getBoolean(key)); break;
                    case DescValueType.CLASSTYPE: dst_desc.putClass(key, src_desc.getClass(key)); break;
                    case DescValueType.DOUBLETYPE: dst_desc.putDouble(key, src_desc.getDouble(key)); break;
                    case DescValueType.INTEGERTYPE: dst_desc.putInteger(key, src_desc.getInteger(key)); break;
                    case DescValueType.LISTTYPE: dst_desc.putList(key, src_desc.getList(key)); break;
                    case DescValueType.RAWTYPE: dst_desc.putData(key, src_desc.getData(key)); break;
                    case DescValueType.STRINGTYPE: dst_desc.putString(key, src_desc.getString(key)); break;
                    case DescValueType.LARGEINTEGERTYPE: dst_desc.putLargeInteger(key, src_desc.getLargeInteger(key)); break;
                    case DescValueType.REFERENCETYPE: dst_desc.putReference(key, src_desc.getReference(key)); break;
                    case DescValueType.OBJECTTYPE: dst_desc.putObject(key, src_desc.getObjectType(key), src_desc.getObjectValue(key)); break;
                    case DescValueType.ENUMERATEDTYPE: dst_desc.putEnumerated(key, src_desc.getEnumerationType(key), src_desc.getEnumerationValue(key)); break;
                    case DescValueType.UNITDOUBLE: dst_desc.putUnitDouble(key, src_desc.getUnitDoubleType(key), src_desc.getUnitDoubleValue(key)); break;
                    default: alert("Unknown data type in descriptor"); return false;
                }
            }
            return true;
        }
        catch (e) { throw (e); }
    }
}

 

* in principle, there is no need to update the text layer when searching and changing each word (we can build a new style sheet and update text layer once), however, I did not take into account this way based on the initial setting of the task and now more effort is required to optimize the code. Perhaps later I will return to this issue.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Participant ,
Nov 11, 2022 Nov 11, 2022

Copy link to clipboard

Copied

Hi @jazz-y , In the above script, Is there a way to ignore text layers that already have active superscript??

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Oct 26, 2022 Oct 26, 2022

Copy link to clipboard

Copied

how it's work?

 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Nov 29, 2023 Nov 29, 2023

Copy link to clipboard

Copied

LATEST

Hello! @jazz-y Thank you so much for this code. I modified it to select a word/words and chage the text color based on user input in a prompt. It works, but for certain artboards, it will replace the font and color of the textlayer even if it doesn't contain the text searched for. Is there a way to not alter the base styles of the layer if it's missing default values?

 

function newText() {
  var defaultValue = "";
  var newPrompt = prompt(
    "Which word or words do you want to change?",
    defaultValue
  );

  if (newPrompt === null) {
    return;
  } else {
    return newPrompt;
  }
}

function newColor() {
  var defaultValue = "000000";
  var newPrompt = prompt(
    "What color do you want to change it to? (Hex code 6 characters)",
    defaultValue
  );

  if (newPrompt === null) {
    return;
  } else {
    return newPrompt;
  }
}

var replaceColor = [{ text: newText(), color: newColor() }];
var s2t = stringIDToTypeID;
var doc = app.activeDocument;
var docLayers = doc.layers.length; //getting top layers because artboards are top layers

for (var i = 0; i < docLayers; i++) {
  if (doc.layers[i].visible && !doc.layers[i].allLocked) {
    aLayer = doc.layers[i];
    findTextLayer(aLayer);
  }
} //end for loop

function findTextLayer(pLayer) {
  var layLen = pLayer.layers.length;
  for (var j = 0; j < layLen; j++) {
    var layerRef = pLayer.layers[j];
    if (layerRef.typename == "LayerSet") {
      findTextLayer(layerRef);
    } //end if for finding layerset
    else {
      if (layerRef.kind === LayerKind.TEXT) {
        for (var i = 0; i < replaceColor.length; i++) {
          replaceTextStyleByContent(
            layerRef.id,
            replaceColor[i].text,
            colorDescFromHEX(replaceColor[i].color)
          );
        }
      } //end if for layerkind text
    } //end else
  } //end for loop
} //end function

function colorDescFromHEX(hex) {
  var d = new ActionDescriptor(),
    style = new ActionDescriptor(),
    c = new SolidColor();
  c.rgb.hexValue = hex;
  d.putDouble(s2t("red"), c.rgb.red);
  d.putDouble(s2t("grain"), c.rgb.green);
  d.putDouble(s2t("blue"), c.rgb.blue);
  style.putObject(s2t("color"), s2t("RGBColor"), d);

  return style;
}

function replaceTextStyleByContent(layerID, text, newStyleDesc) {
  var s2t = stringIDToTypeID;
  (r = new ActionReference()).putProperty(
    s2t("property"),
    (p = s2t("textKey"))
  );
  r.putIdentifier(s2t("layer"), layerID);
  if (executeActionGet(r).hasKey(p)) {
    var textItem = executeActionGet(r).getObjectValue(p),
      sList = textItem.getList(s2t("textStyleRange")),
      l = new ActionList(),
      styleSheet = [],
      content = textItem.getString(p);
    for (var i = 0; i < sList.count; i++) {
      var cur = sList.getObjectValue(i);
      styleSheet.push({
        from: cur.getInteger(s2t("from")),
        to: cur.getInteger(s2t("to")),
        style: (function (d) {
          if (d.hasKey((p = s2t("styleSheetHasParent"))) && d.getBoolean(p))
            if (d.hasKey((p = s2t("baseParentStyle"))))
              extendDescriptor(d.getObjectValue(p), d);
          return d;
        })(cur.getObjectValue(s2t("textStyle"))),
      });
      styleSheet[i].text = content.substring(
        styleSheet[i].from,
        styleSheet[i].to
      );
    }

    do {
      var len = styleSheet.length,
        found = false;
      for (var i = 0; i < len; i++) {
        var offset = 0,
          cur = styleSheet[i].text;
        if (cur) {
          var match = cur.match(new RegExp(text, "i")),
            from,
            to;
          if (match) {
            from = cur.indexOf(match[0]) + offset;
            to = from + match[0].length;
            offset += match[0].length;
            cur = cur.substring(cur.indexOf(match[0]) + match[0].length);
            customStyle = setCustomStyle(styleSheet[i], from, to, newStyleDesc);
            styleSheet.splice.apply(styleSheet, [i, 1].concat(customStyle));
            len += customStyle.length - 1;
            i += customStyle.length - 1;
            found = true;
          }
        }
      }
    } while (found);

    var l = new ActionList();
    for (var i = 0; i < styleSheet.length; i++) {
      var d = new ActionDescriptor();
      d.putObject(s2t("textStyle"), s2t("textStyle"), styleSheet[i].style);
      d.putInteger(s2t("from"), styleSheet[i].from);
      d.putInteger(s2t("to"), styleSheet[i].to);
      l.putObject(s2t("textStyleRange"), d);
    }
    textItem.putList(s2t("textStyleRange"), l);
    (r = new ActionReference()).putIdentifier(s2t("layer"), layerID);
    (d = new ActionDescriptor()).putReference(s2t("target"), r);
    d.putObject(s2t("to"), s2t("textLayer"), textItem);
    executeAction(s2t("set"), d, DialogModes.NO);
  }

  function setCustomStyle(baseStyleSheet, from, to, newStyleDesc) {
    var output = [],
      offset = baseStyleSheet.from;
    if (baseStyleSheet.from != from + offset) {
      output.push({
        from: baseStyleSheet.from,
        to: from + offset,
        style: baseStyleSheet.style,
        text: baseStyleSheet.text.substring(0, from),
      });
    }
    var customStyle = new ActionDescriptor();
    extendDescriptor(baseStyleSheet.style, customStyle);
    extendDescriptor(customStyle, newStyleDesc, true);

    output.push({
      from: from + offset,
      to: to + offset,
      style: newStyleDesc,
      text: null,
    });
    if (baseStyleSheet.to != to + offset) {
      output.push({
        from: to + offset,
        to: baseStyleSheet.to,
        style: baseStyleSheet.style,
        text: baseStyleSheet.text.substring(to),
      });
    }
    return output;
  }

  /** tnx to
   * https://community.adobe.com/t5/photoshop-ecosystem-discussions/how-to-copy-save-styles-typeface-font-size-design-etc-of-arbitrary-text-fragments-and-apply-them-to/m-p/10522630
   */
  function extendDescriptor(src_desc, dst_desc) {
    try {
      for (var i = 0; i < src_desc.count; i++) {
        var key = src_desc.getKey(i);
        if (dst_desc.hasKey(key)) continue;
        var type = src_desc.getType(key);
        switch (type) {
          case DescValueType.ALIASTYPE:
            dst_desc.putPath(key, src_desc.getPath(key));
            break;
          case DescValueType.BOOLEANTYPE:
            dst_desc.putBoolean(key, src_desc.getBoolean(key));
            break;
          case DescValueType.CLASSTYPE:
            dst_desc.putClass(key, src_desc.getClass(key));
            break;
          case DescValueType.DOUBLETYPE:
            dst_desc.putDouble(key, src_desc.getDouble(key));
            break;
          case DescValueType.INTEGERTYPE:
            dst_desc.putInteger(key, src_desc.getInteger(key));
            break;
          case DescValueType.LISTTYPE:
            dst_desc.putList(key, src_desc.getList(key));
            break;
          case DescValueType.RAWTYPE:
            dst_desc.putData(key, src_desc.getData(key));
            break;
          case DescValueType.STRINGTYPE:
            dst_desc.putString(key, src_desc.getString(key));
            break;
          case DescValueType.LARGEINTEGERTYPE:
            dst_desc.putLargeInteger(key, src_desc.getLargeInteger(key));
            break;
          case DescValueType.REFERENCETYPE:
            dst_desc.putReference(key, src_desc.getReference(key));
            break;
          case DescValueType.OBJECTTYPE:
            dst_desc.putObject(
              key,
              src_desc.getObjectType(key),
              src_desc.getObjectValue(key)
            );
            break;
          case DescValueType.ENUMERATEDTYPE:
            dst_desc.putEnumerated(
              key,
              src_desc.getEnumerationType(key),
              src_desc.getEnumerationValue(key)
            );
            break;
          case DescValueType.UNITDOUBLE:
            dst_desc.putUnitDouble(
              key,
              src_desc.getUnitDoubleType(key),
              src_desc.getUnitDoubleValue(key)
            );
            break;
          default:
            alert("Unknown data type in descriptor");
            return false;
        }
      }
      return true;
    } catch (e) {
      throw e;
    }
  }
}

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines