//Hello! This script allows you to quickly relink images that have had their filenames changed. //Useful for: Ebooks where the links in indesign have spaces (or asterisks, or question marks … ) in the file names, after cleaning the filenames this script can quickly find and relink each image. #targetengine "session"; var doc = app.activeDocument; var chars = doc.characterStyles.everyItem(); var characterStyles = chars.name; var searchin = false; app.scriptPreferences.enableRedraw = true; var w = new Window ("palette", "Richard Linkalter"); w.orientation = "row"; var lnk = w.add("group"); lnk.orientation = "column"; lnk.alignment = ['left', 'top']; var selectGroup = lnk.add("group"); selectGroup.add("statictext", [0,0,100,30], "Select links:"); var selAllButton = selectGroup.add("button", [0,0,80,30], "Select All"); selectGroup.orientation = "row"; //lnk.add("statictext", undefined, "Select links:"); //var selAllButton = buttonsGroup.add("button", undefined, "Select All"); var linksArray = []; var indexArray = []; var linksList = lnk.add("listbox", [0, 0, 200, 300], linksArray, {multiselect: true}); linksLoad(linksList, true); var linksCheckGroup = lnk.add("group"); linksCheckGroup.orientation = "row"; var linksCheck = linksCheckGroup.add("checkbox", [0, 0, 15, 15], ""); linksCheckGroup.add("statictext", [0, 0, 185, 20], "Only show missing links"); linksCheck.value = true; linksCheck.onClick = function() { linksLoad(linksList, linksCheck.value) }; var dlg = w.add("group"); dlg.orientation = "column"; dlg.alignment = ['right', 'top']; //var prependTitle = dlg.add("statictext", undefined, "Prepend text"); //prependTitle.alignment = 'left'; var prependGroup = dlg.add ("panel", undefined, "Prepend text"); var preCheck = prependGroup.add ("checkbox", [0, 0, 15, 15], ""); var preText = prependGroup.add ("edittext", [0, 0, 275, 20], "", {multiline: false, wantReturn: true}); prependGroup.orientation = "row"; prependGroup.alignment = 'left'; //var appendTitle = dlg.add("statictext", undefined, "Append text"); //appendTitle.alignment = 'left'; var appendGroup = dlg.add ("panel", undefined, "Append text"); var appCheck = appendGroup.add("checkbox", [0, 0, 15, 15], ""); var appText = appendGroup.add ("edittext", [0, 0, 115, 20], "", {multiline: false, wantReturn: true}); var appDrop = appendGroup.add("dropdownlist", [0, 0, 150, 20], ["Before extension", "After extension"]); appDrop.selection = 0; appendGroup.orientation = "row"; appendGroup.alignment = "left"; //var changeTitle = dlg.add("statictext", undefined, "Replace text"); //changeTitle.alignment = 'left'; var changeGroup = dlg.add ("panel", undefined, "Replace text"); changeGroup.orientation = "column"; var group1 = changeGroup.add ("group"); var check1 = group1.add ("checkbox", [0, 0, 15, 15], ""); check1.value = true; group1.add("statictext", [0, 0, 50, 20], "Set 1:"); var removedText1 = group1.add ("edittext", [0, 0, 85, 20], "", {multiline: false, wantReturn: true}); group1.add("statictext", [0, 0, 25, 20], " to "); var replacedText1 = group1.add ("edittext", [0, 0, 85, 20], "", {multiline: false, wantReturn: true}); group1.orientation = "row"; group1.alignment = 'left'; var group2 = changeGroup.add("group"); var check2 = group2.add ("checkbox", [0, 0, 15, 15], ""); group2.add("statictext", [0, 0, 50, 20], "Set 2:"); var removedText2 = group2.add ("edittext", [0, 0, 85, 20], "", {multiline: false, wantReturn: true}); group2.add("statictext", [0, 0, 25, 20], " to "); var replacedText2 = group2.add ("edittext", [0, 0, 85, 20], "", {multiline: false, wantReturn: true}); group2.orientation = "row"; group2.alignment = 'left'; var group3 = changeGroup.add("group"); var check3 = group3.add ("checkbox", [0, 0, 15, 15], ""); group3.add("statictext", [0, 0, 50, 20], "Set 3:"); var removedText3 = group3.add ("edittext", [0, 0, 85, 20], "", {multiline: false, wantReturn: true}); group3.add("statictext", [0, 0, 25, 20], " to "); var replacedText3 = group3.add ("edittext", [0, 0, 85, 20], "", {multiline: false, wantReturn: true}); group3.orientation = "row"; group3.alignment = 'left'; var repl4 = changeGroup.add("group"); var rcheck4 = repl4.add ("checkbox", [0, 0, 15, 15], ""); repl4.add("statictext", [0, 0, 50, 20], "Set 4:"); var removedText4 = repl4.add ("edittext", [0, 0, 85, 20], "", {multiline: false, wantReturn: true}); repl4.add("statictext", [0, 0, 25, 20], " to "); var replacedText4 = repl4.add ("edittext", [0, 0, 85, 20], "", {multiline: false, wantReturn: true}); repl4.orientation = "row"; repl4.alignment = 'left'; var repl5 = changeGroup.add("group"); var rcheck5 = repl5.add ("checkbox", [0, 0, 15, 15], ""); repl5.add("statictext", [0, 0, 50, 20], "Set 5:"); var removedText5 = repl5.add ("edittext", [0, 0, 85, 20], "", {multiline: false, wantReturn: true}); repl5.add("statictext", [0, 0, 25, 20], " to "); var replacedText5 = repl5.add ("edittext", [0, 0, 85, 20], "", {multiline: false, wantReturn: true}); repl5.orientation = "row"; repl5.alignment = 'left'; //var extTitle = dlg.add("statictext", undefined, "Change extension"); //extTitle.alignment = 'left'; var group4 = dlg.add("panel", undefined, "Change extension"); var check4 = group4.add("checkbox", [0, 0, 15, 15], ""); group4.add("statictext", undefined, "[Filename]."); var extText = group4.add ("edittext", [0, 0, 85, 20], "", {multiline: false, wantReturn: true}); group4.add("statictext", [0, 0, 105, 20], ""); group4.orientation = "row"; group4.alignment = 'left'; var group5 = dlg.add("panel", undefined, "Has extension"); var check5 = group5.add("checkbox", [0, 0, 15, 15], ""); group5.add("statictext", undefined, "Filename contains an extension"); group5.add("statictext", [0, 0, 80, 20], ""); group5.orientation = "row"; group5.alignment = 'left'; dlg.add("statictext", [0, 0, 50, 10], ""); var buttonsGroup = dlg.add("group"); var closeButton = buttonsGroup.add("button", undefined, "Close"); var selectedButton = buttonsGroup.add("button", undefined, "Relink Selected"); var autoButton = buttonsGroup.add("button", undefined, "Relink Auto"); buttonsGroup.orientation = "row"; buttonsGroup.alignment = 'right'; closeButton.onClick = function() {w.close()}; selectedButton.onClick = function() {selectRelink(check1.value, removedText1.text, replacedText1.text, check2.value, removedText2.text, replacedText2.text, check3.value, removedText3.text, replacedText3.text, preCheck.value, preText.text, linksList.selection, indexArray, linksList, linksCheck.value, appCheck.value, appText.text, appDrop.selection.index, check4.value, extText.text, check5.value, rcheck4.value, removedText4.text, replacedText4.text, rcheck5.value, removedText5.text, replacedText5.text )}; autoButton.onClick = function() {autoRelink(linksList.items, indexArray, linksList, linksCheck.value)}; //findButton.onClick = function() {relink(check1.value, removedText1.text, replacedText1.text, check2.value, removedText2.text, replacedText2.text, check3.value, removedText3.text, replacedText3.text, preCheck.value, preText.text, linksList, linksCheck.value, appCheck.value, appText.text, appDrop.selection.index, check4.value, extText.text, indexArray )}; selAllButton.onClick = function() {linksList.selection = linksList.items}; w.show (); function autoRelink(sel, index, linksList, linkBool){ var selection = sel; if (selection != null){ var loc = Folder.selectDialog("Select image source location"); var p = new Window ("palette", "Relinking…"); var progress = p.add("progressbar", undefined, 0, selection.length); progress.preferredSize.width = 300; p.show(); var missing = false; for (i = 0; i < selection.length; i++){ var indexer = selection[i].index; var linkNo = index[indexer]; var curLink = doc.links[linkNo]; var linkName = curLink.name; var re = /(?:\.([^.]+))?$/; var ext = re.exec(linkName)[1]; if (ext != undefined){ var extension = linkName.substr(linkName.lastIndexOf('.'), linkName.length); linkName = linkName.substr(0, linkName.lastIndexOf('.')); } linkName = linkName.split(" ").join("_"); linkName = linkName.split(".").join("-"); var linkName = linkName.split(/[^A-Za-z0-9\-_]/g).join(""); if (ext != undefined){ linkName = linkName + extension; } var file = File(loc + "/" + linkName); if (file.exists){ curLink.relink(file); } else { missing = true; } progress.value = i; } if (missing){ alert("Some links weren't found"); } p.close(); linksLoad(linksList, linkBool); } else { alert("Some links weren't found"); } linksLoad(linksList, linkBool); } function selectRelink(c1, old1, new1, c2, old2, new2, c3, old3, new3, pC, pText, sel, index, linksList, linkBool, aC, aText, aExt, eC, eText, hasExt, c4, old4, new4, c5, old5, new5){ var selection = sel; if (selection != null){ var loc = Folder.selectDialog("Select image source location"); var p = new Window ("palette", "Relinking…"); var progress = p.add("progressbar", undefined, 0, selection.length); progress.preferredSize.width = 300; p.show(); var missing = false; for (i = 0; i < selection.length; i++){ var indexer = selection[i].index; var linkNo = index[indexer]; var curLink = doc.links[linkNo]; var linkName = curLink.name; if (hasExt){ var re = /(?:\.([^.]+))?$/; var ext = re.exec(linkName)[1]; if (ext != undefined){ var extension = linkName.substr(linkName.lastIndexOf('.'), linkName.length); linkName = linkName.substr(0, linkName.lastIndexOf('.')); } } if (c1){ linkName = linkName.split(old1).join(new1); } if (c2) { linkName = linkName.split(old2).join(new2); } if (c3) { linkName = linkName.split(old3).join(new3); } if (c4) { linkName = linkName.split(old4).join(new4); } if (c5) { linkName = linkName.split(old5).join(new5); } if (ext != undefined){ linkName = linkName + extension; } if (pC){ linkName = pText + linkName; } if (aC){ var re = /(?:\.([^.]+))?$/; var ext = re.exec(linkName)[1]; if ((aExt == 0) && (ext != undefined)){ linkName = linkName.substr(0, linkName.lastIndexOf('.')) + aText + "." + ext; } else { linkName = linkName + aText; } } if (eC){ var re = /(?:\.([^.]+))?$/; var ext = re.exec(linkName)[1]; if (ext != undefined){ linkName = linkName.substr(0, linkName.lastIndexOf('.')) + "." + eText; } else { linkName = linkName + "." + eText } } var file = File(loc + "/" + linkName); if (file.exists){ curLink.relink(file); } else { missing = true; } progress.value = i; } if (missing){ alert("Some links weren't found"); } p.close(); linksLoad(linksList, linkBool); } else { alert("No links were selected."); } } /*function relink(c1, old1, new1, c2, old2, new2, c3, old3, new3, pC, pText, linksList, linkBool, aC, aText, aExt, eC, eText, iArray){ var loc = Folder.selectDialog("Select image source location"); var p = new Window ("palette", "Relinking…"); var progress = p.add("progressbar", undefined, 0, doc.links.count()); progress.preferredSize.width = 300; p.show(); var missing = false; for (i = 0; i < iArray.length; i++){ var curLink = doc.links[iArray[i]]; var linkName = curLink.name; if (c1){ linkName = linkName.split(old1).join(new1); } if (c2) { linkName = linkName.split(old2).join(new2); } if (c3) { linkName = linkName.split(old3).join(new3); } if (pC){ linkName = pText + linkName; } if (aC){ var re = /(?:\.([^.]+))?$/; var ext = re.exec(linkName)[1]; if ((aExt == 0) && (ext != undefined)){ linkName = linkName.substr(0, linkName.lastIndexOf('.')) + aText + "." + ext; } else { linkName = linkName + aText; } } if (eC){ var re = /(?:\.([^.]+))?$/; var ext = re.exec(linkName)[1]; if (ext != undefined){ linkName = linkName.substr(0, linkName.lastIndexOf('.')) + "." + eText; } else { linkName = linkName + "." + eText } } var file = File(loc + "/" + linkName); if (file.exists){ curLink.relink(file); } else { missing = true; } progress.value = i; } if (missing){ alert("Some links weren't found"); } linksLoad(linksList, linkBool); } */ function linksLoad(linksList, linkBool){ linksList.removeAll(); if (linkBool){ linksArray = []; indexArray = []; for (i = 0; i < doc.links.count(); i++){ if (doc.links[i].status == LinkStatus.LINK_MISSING){ linksArray.push(doc.links[i].name); linksList.add("item", doc.links[i].name); indexArray.push(doc.links[i].index); } } } else { linksArray = doc.links.everyItem().name; indexArray = doc.links.everyItem().index; var i = 0; while (linksList.items.length < linksArray.length) { linksList.add ("item", doc.links[i].name); i++; } } }