-1

I have a simple script for editing metadata in Adobe Bridge with find and replace functionality. It is for Description section only.

I need to make it work for Keywords section only instead. I tried to change description into keywords (with and without Description > Keywords), but the end result is the script which doesn't work. What (else) needs to be changed or added in order to achieve what I need?

edit:

I tried to change description into title to make the script work for the Title section and it worked.

So the question is what exactly should replace description to make this work for the Keywords section?

I saw in one script that for Bridge it should be Key Words (separate), so if that's the case, how should I write that in the code? (yes, I'm a noob in javascript)

Find Replace In Description.jsx - link to github

#target bridge
if( BridgeTalk.appName == "bridge" ) {
ReplaceDescription = new MenuElement("command", "Find and Replace", "at the end of tools");
}
ReplaceDescription.onSelect = function () {
var win = new Window( 'dialog', 'Find && Replace' );
g = win.graphics;
var myBrush = g.newBrush(g.BrushType.SOLID_COLOR, [0.99, 0.99, 0.99, 1]);
g.backgroundColor = myBrush;
win.orientation='column';
win.p1= win.add("panel", undefined, undefined, {borderStyle:"black"});
win.p1.preferredSize=[380,100];
win.g1 = win.p1.add('group');
win.g1.orientation = "row";
win.title = win.g1.add('statictext',undefined,'Caption Editor');
win.title.alignment="fill";
var g = win.title.graphics;
g.font = ScriptUI.newFont("Georgia","BOLDITALIC",22);
win.p6= win.p1.add("panel", undefined, undefined, {borderStyle:"black"}); //Replace
win.p6.preferredSize=[380,100];
win.g600 =win.p6.add('group');
win.g600.orientation = "row";
win.g600.alignment='fill';
win.g600.st1 = win.g600.add('statictext',undefined,'Replace');
win.g600.st1.preferredSize=[75,20];
win.g600.et1 = win.g600.add('edittext');
win.g600.et1.preferredSize=[200,20];
win.g610 =win.p6.add('group');
win.g610.orientation = "row";
win.g610.alignment='fill';
win.g610.st1 = win.g610.add('statictext',undefined,'With');
win.g610.st1.helpTip="Leave this field blank if you want to remove the characters";
win.g610.st1.preferredSize=[75,20];
win.g610.et1 = win.g610.add('edittext');
win.g610.et1.preferredSize=[200,20];
win.g620 =win.p6.add('group');
win.g620.orientation = "row";
win.g620.alignment='fill';
win.g620.cb1 = win.g620.add('checkbox',undefined,'Global');
win.g620.cb1.helpTip="Replace all occurrences of";
win.g620.cb2 = win.g620.add('checkbox',undefined,'Case Insensitive');
win.g620.cb2.value=true;
win.g620.cb3 = win.g620.add('checkbox',undefined,'Remove any ()[]');
win.g620.cb3.value=false;
win.g1000 =win.p1.add('group');
win.g1000.orientation = "row";
win.g1000.alignment='center';
win.g1000.bu1 = win.g1000.add('button',undefined,'Process');
win.g1000.bu1.preferredSize=[170,30];
win.g1000.bu2 = win.g1000.add('button',undefined,'Cancel');
win.g1000.bu2.preferredSize=[170,30];
win.g1000.bu1.onClick=function(){
if(win.g600.et1.text == ''){
alert("No replace value has been entered!");
return;
}
win.close(0);
var sels = app.document.selections;
for(var a in sels){
var thumb = sels[a];
md = thumb.synchronousMetadata;
if(win.g620.cb1.value && !win.g620.cb2.value) var patt = new RegExp (win.g600.et1.text.toString(),"g");
if(!win.g620.cb1.value && win.g620.cb2.value) var patt = new RegExp (win.g600.et1.text.toString(),"i");
if(win.g620.cb1.value && win.g620.cb2.value) var patt = new RegExp (win.g600.et1.text.toString(),"gi");
if(!win.g620.cb1.value && !win.g620.cb2.value) var patt = new RegExp (win.g600.et1.text.toString());
md.namespace = "http://purl.org/dc/elements/1.1/";
var Caption = md.description ? md.description[0] : "";
if(Caption == "") continue;
var result=patt.test(Caption.toString());
if(result == true){
var newCaption = Caption.replace(patt,win.g610.et1.text.toString());
if(win.g620.cb3.value) newCaption = newCaption.replace(/["'\(\)]/g, "");
md.description='';
md.description = newCaption;
}
}
}
win.show();
app.document.chooseMenuItem("PurgeCacheForSelected");
};
Mark Amery
  • 143,130
  • 81
  • 406
  • 459
astx123
  • 85
  • 8
  • I'd played around with metadata before and it should be a simple question of replacing one string with another. Have you tried distilling your script into minimum code - get & alert description & then changing it? – Ghoul Fool Dec 13 '17 at 16:59
  • I simply tested the script in Adobe Bridge. Also the thing is that I don't know pretty much nothing about javascript, so when I look at this code idk what else can be done beside changing `description` to `keywords` in it... – astx123 Dec 13 '17 at 17:31
  • It works when I change it to 'title' for the Title section. I saw somewhere that maybe I should put `key words` instead of `keywords` - how do I put this in the code? I was trying but it didn't work. – astx123 Dec 13 '17 at 20:38
  • 1
    Looks like you solved your own problem. Nice one! – Ghoul Fool Dec 14 '17 at 17:37

1 Answers1

1

I've found a different script which provides the functionality I need, and even better since it gives the option to add and remove keywords:

#target bridge  

   if( BridgeTalk.appName == "bridge" ) {  
keyReplace = MenuElement.create("command", "Add-Replace-Remove Keyword", "at the end of tools");
}
keyReplace.onSelect = function () { 
      mainReplaceKeyword();
      }

function mainReplaceKeyword(){
if(app.version.substr(0,app.version.indexOf('.'))==1){
alert("Sorry You Need CS3 or CS4 to run this script!"); 
return;
    }
var dlg =
"dialog{text:'Script Interface',bounds:[100,100,500,310],"+
"panel0:Panel{bounds:[10,10,390,200] , text:'' ,properties:{borderStyle:'etched',su1PanelCoordinates:true},"+
"title:StaticText{bounds:[60,10,350,40] , text:'Add/Replace/Remove Keyword' ,properties:{scrolling:undefined,multiline:undefined}},"+
"panel1:Panel{bounds:[10,40,370,150] , text:'' ,properties:{borderStyle:'etched',su1PanelCoordinates:true},"+
"addKey:Checkbox{bounds:[20,10,160,31] , text:'Add Keyword' },"+
"statictext1:StaticText{bounds:[20,40,119,60] , text:'Replace' ,properties:{scrolling:undefined,multiline:undefined}},"+
"From:EditText{bounds:[120,40,350,60] , text:'' ,properties:{multiline:false,noecho:false,readonly:false}},"+
"statictext2:StaticText{bounds:[20,80,90,97] , text:'With' ,properties:{scrolling:undefined,multiline:undefined}},"+
"To:EditText{bounds:[120,80,350,100] , text:'' ,properties:{multiline:false,noecho:false,readonly:false}}},"+
"button0:Button{bounds:[10,160,180,181] , text:'Ok' },"+
"button1:Button{bounds:[200,160,370,181] , text:'Cancel' }}};";
var win = new Window(dlg,"Replace Keyword");
win.center();

win.panel0.title.graphics.font = ScriptUI.newFont("Times","BOLDITALIC",20);
g = win.graphics;
b=win.panel0.title.graphics;
var myBrush = g.newBrush(g.BrushType.SOLID_COLOR, [0.99, 0.99, 0.20, 1]);
g.backgroundColor = myBrush;
var myPen =b.newPen (g.PenType.SOLID_COLOR, [0.00, 0.00, 0.99, 1],lineWidth=1);
var myPen2 =b.newPen (g.PenType.SOLID_COLOR, [0.99, 0.00, 0.00, 1],lineWidth=1);
g.foregroundColor = myPen;
b.foregroundColor = myPen2;
win.panel0.panel1.From.active=true;
win.panel0.panel1.addKey.onClick = function() { 
if(win.panel0.panel1.addKey.value) {
    win.panel0.panel1.statictext1.text = "New Keyword";
    win.panel0.panel1.From.active=true;
    win.panel0.panel1.statictext2.visible=false;
    win.panel0.panel1.To.visible=false;
    }
if(!win.panel0.panel1.addKey.value) {
    win.panel0.panel1.statictext1.text = "Replace";
    win.panel0.panel1.statictext2.visible=true;
    win.panel0.panel1.To.visible=true;
    win.panel0.panel1.From.active=true;
    }
}
win.center();
var done = false; 
    while (!done) { 
      var x = win.show(); 
      if (x == 0 || x == 2) {
        win.canceled = true;
        done = true; 
      } else if (x == 1) { 
        done = true; 
       var result = valiDate();
        if(result != true) {
            alert(result);
            return;
        }else{    
            var Replace = win.panel0.panel1.From.text;
            var With = win.panel0.panel1.To.text;
            var addKey = win.panel0.panel1.addKey.value;
            processKeyword(Replace,With,addKey);
        }
      } 
   } 

function valiDate(){
    if(win.panel0.panel1.From.text =='') return "No Keyword Entered!";
return true;
}
function processKeyword(Replace,Witha,ddKey){
try{
loadXMPScript();
}catch(e){
alert("Can not load XMPScript\r" + e.message);  
    }

var items = app.document.selections;
  for (var i = 0; i < items.length; i++){ 
      var file=new Thumbnail(items[i]);
try{
var xmpFile = new XMPFile(file.path, XMPConst.UNKNOWN,XMPConst.OPEN_FOR_UPDATE);
}catch(e){
        alert("Problem opening xmp for update:-\r" + file.path +"\r" +e.message);
        return;
    }
try{
var xmp = xmpFile.getXMP();
}catch(e){
        alert("Problem opening xmp data:-\r"  + e.message);
        return;
    }
try{
var tmpCount =  xmp.countArrayItems(XMPConst.NS_DC, "subject");
}catch(e){
    alert("Cannot get count \r" + e.message);
    }
            if(addKey){
                xmp.appendArrayItem(XMPConst.NS_DC, "subject", Replace, 0,XMPConst.ARRAY_IS_ORDERED);
                }
if(tmpCount >0 && !addKey){
        for (var a =0;a<tmpCount;a++){
            var     Keyword = xmp.getArrayItem(XMPConst.NS_DC,'subject', a+1);
            if(Keyword == Replace && With == '') {
                xmp.deleteArrayItem(XMPConst.NS_DC,'subject', a+1);
                }
            if(Keyword == Replace && With != ''){
                xmp.setArrayItem(XMPConst.NS_DC,'subject', a+1,With);
                }
        }
}

if (xmpFile.canPutXMP(xmp)) {
xmpFile.putXMP(xmp);
}else{
alert(e.message);   
    }
xmpFile.closeFile(XMPConst.CLOSE_UPDATE_SAFELY);
}
unloadXMPScript();
}
}

function loadXMPScript()
{
    var results = new XMPLibMsg("XMPScript Library already loaded", 0, false);

    if (!ExternalObject.AdobeXMPScript)
    {
        try
        {
            ExternalObject.AdobeXMPScript = new ExternalObject('lib:AdobeXMPScript');       
            results.message = "XMPScript Library loaded";
        }
        catch (e)
        {
            alert("Could not load AdobeXMPScript \r" + e.message);
            results.message = "ERROR Loading AdobeXMPScript: " + e;
            results.line = e.line;
            results.error = true;
        }
    }

    return results;
}
function unloadXMPScript()
{
    var results = new XMPLibMsg("XMPScript Library not loaded", 0, false);

    if( ExternalObject.AdobeXMPScript ) 
    {
        try
        {
            ExternalObject.AdobeXMPScript.unload();
            ExternalObject.AdobeXMPScript = undefined;
            results.message = "XMPScript Library successfully unloaded";
        }
        catch (e)
        {
            results.message = "ERROR unloading AdobeXMPScript: " + e;
            results.line = e.line;
            results.error = true;
        }
    }

    return results;
}
function XMPLibMsg (inMessage, inLine, inError)
{
    this.message = inMessage;
    this.line = inLine;
    this.error = inError;
}
astx123
  • 85
  • 8