// german script for searching and replacing text in one ore more documents for indesign cs5
// strings are saved in a text file, which can be altered via the given interface in "options" ("Einstellungen")
// ©Samjessa Lewy, 2011
// this script is non-commercial and free to use; it may be altered or changed in any way - but is not for sale!
// loading targetengine for the use of a palette
#targetengine "adobe"
// user will be asked to choose the target text file
myFile = readFile();
// for further processing the informations in the text file will be saved in an array
myArray = loadFileArray(myFile);
// the start window (actually a palette) is called
createStartWindow (myArray);
// calls a dialogue to choose a text file
function readFile()
{
var myFile = File.openDialog("Datei öffnen:", "TXT Files:*.TXT;");
myFile.open("r");
return myFile;
}
// creates an array from given text file
function loadFileArray(myFile)
{
var contents = new Array();
var heads = new Array();
var myArray = new Array();
myFile.open("r");
var lineCount = 0;
while(myDoc = myFile.readln()){
if (myDoc.search(/<head>/) == -1){
contents[lineCount] = myDoc.split(",");
lineCount++;
}
else
{
myDoc = myDoc.replace (/<head>/, "");
myDoc = myDoc.replace (/<\/head>/, "");
heads[lineCount] = myDoc;
}
}
myArray[0] = contents;
myArray[1] = heads;
return myArray;
}
// writes the target text file with given result string
function writeTXT(result, myFile){
myFile.open ("w");
if(myFile.write(result))
{
return true;
}
else
{
return false;
}
}
// changes headline in the target line of the array
function editHeadline(line, myArray, value)
{
for (var i = 0; i < myArray[0].length; i++)
{
if (i == line)
{
myArray[1][i] = value;
}
}
return myArray;
}
// adds new line to the array
function addLine(line, myArray, findWhat, replaceBy, comment, word, grep, active)
{
myLine = new Array();
myLine[0] = findWhat;
myLine[1] = replaceBy;
myLine[2] = comment;
myLine[3] = word;
myLine[4] = grep;
myLine[5] = active;
if (line == 0)
{
myArray[0].unshift(myLine);
}
else
{
myArray[0].push(myLine);
}
return myArray;
}
// changes target line in the array with given information
function editLine(line, myArray, findWhat, replaceBy, comment, word, grep, active)
{
for (var i = 0; i < myArray[0].length; i++)
{
if (i == line)
{
myArray[0][i][0] = findWhat;
myArray[0][i][1] = replaceBy;
myArray[0][i][2] = comment;
myArray[0][i][3] = word;
myArray[0][i][4] = grep;
myArray[0][i][5] = active;
}
}
return myArray;
}
// removes line from array
function deleteLine(line, myArray)
{
for (var i = 0; i < myArray[0].length; i++)
{
if (i == line)
{
myArray[0].splice(i, 1);
}
}
return myArray;
}
// creates the result string from array for writing the text file
function createTemplate(myArray)
{
var result = "";
for (var i = 0; i < myArray[0].length; i++)
{
if (myArray[1][i] != "" && myArray[1][i] != undefined && myArray[1][i] != null)
{
result = result + "<head>" + myArray[1][i] + "</head>\r";
}
result = result + myArray[0][i][0] + "," + myArray[0][i][1] + "," + myArray[0][i][2] +","+ myArray[0][i][3] + "," + myArray[0][i][4] + "," + myArray[0][i][5] + "\r";
}
return result;
}
// executes a grep search
function searchGrep(findWhat, replaceBy, type)
{
app.findGrepPreferences = app.changeGrepPreferences = null;
app.findGrepPreferences.findWhat = findWhat;
app.changeGrepPreferences.changeTo = replaceBy;
if (type == "document")
{
app.activeDocument.changeGrep();
}
else if(type == "all")
{
for (var i = 0; i < app.documents.length; i++)
{
app.documents[i].changeGrep();
}
}
else
{
alert("Diese Aktion existiert (noch?) nicht!");
}
}
// executes a text search
function searchText(findWhat, replaceBy, wordoption, type)
{
app.findTextPreferences = app.changeTextPreferences = null;
app.findTextPreferences.findWhat = findWhat;
app.changeTextPreferences.changeTo = replaceBy;
app.findChangeTextOptions.wholeWord = wordoption;
app.findChangeTextOptions.caseSensitive = true;
if (type == "document")
{
app.activeDocument.changeText();
}
else if(type == "all")
{
for (var i = 0; i < app.documents.length; i++)
{
app.documents[i].changeText();
}
}
else
{
alert("Diese Aktion existiert (noch?) nicht!");
}
}
// creates the progress bar shown during search and replace
var ProgressBar = function(/*str*/title)
{
var w = new Window('palette', ' '+title, {x:0, y:0, width:340, height:60}),
pb = w.add('progressbar', {x:20, y:12, width:300, height:12}, 0, 100),
st = w.add('statictext', {x:10, y:36, width:320, height:20}, '');
st.justify = 'center';
w.center();
this.reset = function(msg,maxValue)
{
st.text = msg;
pb.value = 0;
pb.maxvalue = maxValue||0;
pb.visible = !!maxValue;
w.show();
};
this.hit = function() {++pb.value;};
this.hide = function() {w.hide();};
this.close = function() {w.close();};
};
// creates the start window (actually a palette)
function createStartWindow(myArray)
{
// verifies that an array is given, else user will be asked to choose a text file again
if (myArray == "" || myArray == "undefined" || myArray == null)
{
myFile = readFile();
myArray = loadFileArray(myFile);
}
// creating palette with text and buttons
var myStartWindow = new Window ("palette");
myStartWindow.add("statictext", undefined, "Bitte wählen:");
var myButtonGroup = myStartWindow.add ("group");
myButtonGroup.orientation = "column";
var options = myButtonGroup.add("button", [0,0,150,20], "Einstellungen");
var execute = myButtonGroup.add("button", [0,0,150,20], "Ausführen");
var executeonall = myButtonGroup.add("button",[0,0,150,20],"Auf alle ausführen");
var close = myButtonGroup.add("button", [0,0,150,20], "Schließen", {name: "cancel"});
// defining functions of the buttons
close.onClick = function()
{
myStartWindow.close();
exit();
}
options.onClick = function()
{
createOptionsWindow (myArray);
}
// executing search on active document
execute.onClick = function()
{
// initialising progress bar
var pBar = new ProgressBar("Suche & Ersetze");
myArray = loadFileArray(myFile);
pBar.reset("Führe durch...", myArray[0].length);
// executing search for every line, checking the given options
for (var i = 0; i < myArray[0].length; i++)
{
pBar.hit();
$.sleep(10);
if(myArray[0][i][5] == "j")
{
var findWhat = myArray[0][i][0];
var replaceBy = myArray[0][i][1];
if(myArray[0][i][3] == "j")
{
var wordoption = true;
}
else
{
var wordoption = false;
}
if(myArray[0][i][4] == "j")
{
$.sleep(10);
// parameter "document" is given for searching only in the active document
searchGrep(findWhat, replaceBy, "document");
}
else
{
$.sleep(10);
// parameter "document" is given for searching only in the active document
searchText (findWhat, replaceBy, wordoption, "document");
}
}
}
}
// executing search on all documents
executeonall.onClick = function()
{
// initialising progress bar
var pBarOnAll = new ProgressBar("Suche & Ersetze");
myArray = loadFileArray(myFile);
pBarOnAll.reset("Führe durch...", myArray[0].length);
// executing search for every line, checking the given options
for (var i = 0; i < myArray[0].length; i++)
{
pBarOnAll.hit();
$.sleep(10);
if(myArray[0][i][5] == "j")
{
var findWhat = myArray[0][i][0];
var replaceBy = myArray[0][i][1];
if(myArray[0][i][3] == "j")
{
var wordoption = true;
}
else
{
var wordoption = false;
}
if(myArray[0][i][4] == "j")
{
$.sleep(10);
// parameter "all" is given for searching in all documents
searchGrep(findWhat, replaceBy, "all");
}
else
{
$.sleep(10);
// parameter "all" is given for searching in all documents
searchText (findWhat, replaceBy, wordoption, "all");
}
}
}
}
myStartWindow.show ();
}
// creating options window
function createOptionsWindow(myArray)
{
// verifies that an array is given, else user will be asked to choose a text file again
if (myArray == "" || myArray == "undefined" || myArray == null)
{
myFile = readFile();
myArray = loadFileArray(myFile);
}
// creating options view
var myEditHeadButtons = new Array();
var editHeadButtonCount = 0;
var myOptionWindow = new Window ("dialog", "Einstellungen", undefined,{scrolling: true});
myPanel = myOptionWindow.add("panel");
myPanel.orientation = "column";
// reading array line by line for display
for (var i =0; i < myArray[0].length; i++)
{
// getting headline and creating edit button
if (myArray[1][i] != "" && myArray[1][i] != undefined && myArray[1][i] != null)
{
var myHeadGroup= myPanel.add("group");
myHeadGroup.orientation = "row";
myHeadGroup.alignment = "left";
myHeadGroup.add("statictext", undefined, myArray[1][i]);
myEditHeadButtons[editHeadButtonCount] = myHeadGroup.add("button",[0,0,50,20],"edit");
myEditHeadButtons[editHeadButtonCount].name = i;
myEditHeadButtons[editHeadButtonCount].onClick = function()
{
line = this.name;
// window for editing headline is called
myArray = createEditHeadlineWindow(line, myArray);
myOptionWindow.close();
createOptionsWindow(myArray);
}
editHeadButtonCount++;
// creating listbox for search/replace commands
var myList = myPanel.add("listbox", undefined, "",{numberOfColumns: 6, showHeaders: true,columnTitles: ["Finde", "Ersetze Durch", "Kommentar","Wortsuche", "Grep", "Aktiv"],columnWidths: [100,100,100,100, 100, 100]});
}
// adding subitems, showing "j" as "Ja" and "n" as "Nein"
with (myList.add("Item", myArray[0][i][0]))
{
subItems[0].text = myArray[0][i][1];
subItems[1].text = myArray[0][i][2];
if (myArray[0][i][3] == "j")
{
subItems[2].text = "Ja";
}
else
{
subItems[2].text = "Nein";
}
if (myArray[0][i][4] == "j")
{
subItems[3].text = "Ja";
}
else
{
subItems[3].text = "Nein";
}
if (myArray[0][i][5] == "j")
{
subItems[4].text = "Ja";
}
else
{
subItems[4].text = "Nein";
}
}
}
// window for editing a line is called via double click on subitem
myList.onDoubleClick = function()
{
line = myList.selection.index;
myArray = createEditLineWindow(line, myArray);
// closing options window for reload (updating the display)
myOptionWindow.close();
createOptionsWindow(myArray);
}
// creating buttons
var addLineButton = myPanel.add("button", undefined, "Neuer Eintrag");
addLineButton.alignment = "left";
var buttonGroup = myPanel.add("group");
var closeOptions = buttonGroup.add("button", [0,0,100,20], "Schließen");
var save = buttonGroup.add("button", [0,0,100,20], "Speichern");
// window for adding a new search/replace command is called via click on addLineButton
addLineButton.onClick = function()
{
myArray = createAddLineWindow(myArray);
myOptionWindow.close();
createOptionsWindow(myArray);
}
// template will be created and saved to the text file by clicking on save
save.onClick = function()
{
result = createTemplate(myArray);
writeTXT(result,myFile);
alert("Änderungen gespeichert!");
}
// closing window by clicking on closeOptions
closeOptions.onClick = function()
{
// array from file will be loaded and compared to the current array - user will be warned if unsaved changes are found
var myOldArray = new Array();
myOldArray = loadFileArray(myFile);
saved = true;
if (myOldArray.length == myArray.length && myOldArray[0].length == myArray[0].length && myOldArray[1].length == myArray[1].length)
{
for (var i = 0; i < myArray[0].length; i++)
{
if (myArray[0][i][0] != null && myArray[0][i][0] != "undefined" && myOldArray[0][i][0] != null && myOldArray[0][i][0] != "undefined")
{
if (myArray[0][i][0] != myOldArray[0][i][0])
{
saved = false;
}
if (myArray[0][i][1] != myOldArray[0][i][1])
{
saved = false;
}
if (myArray[0][i][2] != myOldArray[0][i][2])
{
saved = false;
}
if (myArray[0][i][3] != myOldArray[0][i][3])
{
saved = false;
}
if (myArray[0][i][4] != myOldArray[0][i][4])
{
saved = false;
}
if (myArray[0][i][5] != myOldArray[0][i][5])
{
saved = false;
}
if (myArray[1][i] != myOldArray[1][i])
{
saved = false;
}
}
}
}
else
{
saved = false;
}
if (saved == true)
{
// no changes are found -> close window
myOptionWindow.close();
}
else
{
// found unsaved changes, user will be asked, if he really wants to quit
var warningWindow = new Window ("dialog", "Nichtgespeicherte Änderungen gefunden");
myWarningText = warningWindow.add("staticText", undefined, "Wollen Sie das Fenster wirklich schließen?\rDie nicht gespeicherten Änderungen gehen verloren!");
warningWindow.add("button", undefined, "Ja", {name:"ok"});
warningWindow.add("button", undefined, "Abbrechen", {name:"cancel"});
if (warningWindow.show() == 1)
{
// user wants to close the options anyway -> window is closed
warningWindow.close();
myOptionWindow.close();
}
}
}
myOptionWindow.show();
}
// creating window for editing headline
function createEditHeadlineWindow(line, myArray)
{
// saving value of given line in variable headvalue
for (var i = 0; i < myArray[0].length; i++)
{
if (i == line)
{
var headvalue = myArray[1][i];
}
}
// creating window
var myEditHeadlineWindow = new Window("dialog", "Headline ändern");
var myEditHeadlineGroup = myEditHeadlineWindow.add("group");
var myInput = myEditHeadlineGroup.add("edittext", undefined, headvalue);
myInput.characters = 20;
myEditHeadlineGroup.add("button", undefined, "OK");
myEditHeadlineGroup.add("button", undefined, "Cancel");
if (myEditHeadlineWindow.show() == 1)
{
// by clicking on "OK" the array is altered
myArray = editHeadline(line, myArray, myInput.text);
return myArray;
}
else
{
// by clicking on "Cancel" the window will be closed
myEditHeadlineWindow.close();
return myArray;
}
}
// creating window for editing a search/replace command
function createEditLineWindow(line, myArray)
{
var clicked = false;
// getting values of given line
for (var i = 0; i < myArray[0].length; i++)
{
if (i == line)
{
var findWhat = myArray[0][i][0];
var replaceBy = myArray[0][i][1];
var comment = myArray[0][i][2];
var word = myArray[0][i][3];
var grep = myArray[0][i][4];
var active = myArray[0][i][5];
}
}
// creating the view for edit line window
var myEditLineWindow = new Window("dialog", "Befehl bearbeiten");
var myEditLinePanel = myEditLineWindow.add("panel");
myEditLinePanel.orientation = "column";
var DeleteLineButton = myEditLinePanel.add("button", undefined, "Eintrag löschen");
DeleteLineButton.alignment = "left";
DeleteLineButton.onClick = function()
{
// removing line from array, if delete button is clicked
myArray = deleteLine(line, myArray);
myEditLineWindow.close();
}
var EditFindWhat = myEditLinePanel.add("group");
EditFindWhat.orientation = "row";
var findWhatLabel = EditFindWhat.add("statictext", undefined, "Finde:");
var findWhatInput = EditFindWhat.add("edittext", undefined, findWhat);
findWhatInput.characters = 20;
findWhatLabel.characters = 10;
var EditReplaceBy = myEditLinePanel.add("group");
EditReplaceBy.orientation = "row";
var replaceByLabel = EditReplaceBy.add("statictext", undefined, "Ersetze durch:");
var replaceByInput = EditReplaceBy.add("edittext", undefined, replaceBy);
replaceByInput.characters = 20;
replaceByLabel.characters = 10;
var EditComment = myEditLinePanel.add("group");
EditComment.orientation = "row";
var commentLabel = EditComment.add("statictext", undefined, "Kommentar:");
var commentInput = EditComment.add("edittext", undefined, comment);
commentInput.characters = 20;
commentLabel.characters = 10;
var EditWord = myEditLinePanel.add("group");
EditWord.orientation = "row";
EditWord.alignment = "left";
var wordLabel = EditWord.add("statictext", undefined, "Wortsuche:");
var WordYesRadio = EditWord.add("radiobutton", undefined, "ja");
var WordNoRadio = EditWord.add("radiobutton", undefined, "nein");
wordLabel.characters = 10;
if (word == "j")
{
WordYesRadio.value = true;
}
else
{
WordNoRadio.value = true;
}
var EditGrep = myEditLinePanel.add("group");
EditGrep.orientation = "row";
EditGrep.alignment = "left";
var grepLabel = EditGrep.add("statictext", undefined, "Grep:");
var grepYesRadio = EditGrep.add("radiobutton", undefined, "ja");
var grepNoRadio = EditGrep.add("radiobutton", undefined, "nein");
grepLabel.characters = 10;
if (grep == "j")
{
grepYesRadio.value = true;
}
else
{
grepNoRadio.value = true;
}
var EditStatus = myEditLinePanel.add("group");
EditStatus.orientation = "row";
EditStatus.alignment = "left";
var statusLabel = EditStatus.add("statictext", undefined, "Aktiv:");
var ActiveYesRadio = EditStatus.add("radiobutton", undefined, "ja");
var ActiveNoRadio = EditStatus.add("radiobutton", undefined, "nein");
statusLabel.characters = 10;
if (active == "j")
{
ActiveYesRadio.value = true;
}
else
{
ActiveNoRadio.value = true;
}
var EditLineButtons = myEditLinePanel.add("group");
EditLineButtons.orientation = "row";
var SaveButton = EditLineButtons.add("button", undefined, "Speichern");
var CloseButton = EditLineButtons.add("button", undefined, "Abbrechen", {name:"cancel"});
// saving changes after checking radio values
SaveButton.onClick = function()
{
if (WordYesRadio.value == true)
{
word = "j";
}
else
{
word = "n";
}
if (grepYesRadio.value == true)
{
grep = "j";
}
else
{
grep = "n";
}
if (ActiveYesRadio.value == true)
{
active = "j";
}
else
{
active = "n";
}
// changes line in array with given values
myArray = editLine(line, myArray, findWhatInput.text, replaceByInput.text, commentInput.text, word, grep,active);
myEditLineWindow.close();
}
myEditLineWindow.show();
return myArray;
}
// creating window for adding a search/replace command
function createAddLineWindow(myArray)
{
var myAddLineWindow = new Window("dialog", "Neuer Befehl");
var myAddLinePanel = myAddLineWindow.add("panel");
myAddLinePanel.orientation = "column";
var EditLine = myAddLinePanel.add("group");
EditLine.orientation = "row";
EditLine.alignment = "left";
var selectLabel = EditLine.add("statictext", undefined, "Zeile:");
var selectList = EditLine.add("dropdownlist", undefined, ["Am Anfang", "Am Ende"]);
selectList.selection = 1;
selectLabel.characters = 10;
var EditFindWhat = myAddLinePanel.add("group");
EditFindWhat.orientation = "row";
var findWhatLabel = EditFindWhat.add("statictext", undefined, "Finde:");
var findWhatInput = EditFindWhat.add("edittext");
findWhatInput.characters = 20;
findWhatLabel.characters = 10;
var EditReplaceBy = myAddLinePanel.add("group");
EditReplaceBy.orientation = "row";
var replaceByLabel = EditReplaceBy.add("statictext", undefined, "Ersetze durch:");
var replaceByInput = EditReplaceBy.add("edittext");
replaceByInput.characters = 20;
replaceByLabel.characters = 10;
var EditComment = myAddLinePanel.add("group");
EditComment.orientation = "row";
var commentLabel = EditComment.add("statictext", undefined, "Kommentar:");
var commentInput = EditComment.add("edittext");
commentInput.characters = 20;
commentLabel.characters = 10;
var EditWord = myAddLinePanel.add("group");
EditWord.orientation = "row";
EditWord.alignment = "left";
var wordLabel = EditWord.add("statictext", undefined, "Wortsuche:");
var WordYesRadio = EditWord.add("radiobutton", undefined, "ja");
var WordNoRadio = EditWord.add("radiobutton", undefined, "nein");
wordLabel.characters = 10;
var EditGrep = myAddLinePanel.add("group");
EditGrep.orientation = "row";
EditGrep.alignment = "left";
var grepLabel = EditGrep.add("statictext", undefined, "Grep:");
var grepYesRadio = EditGrep.add("radiobutton", undefined, "ja");
var grepNoRadio = EditGrep.add("radiobutton", undefined, "nein");
grepLabel.characters = 10;
var EditStatus = myAddLinePanel.add("group");
EditStatus.orientation = "row";
EditStatus.alignment = "left";
var statusLabel = EditStatus.add("statictext", undefined, "Aktiv:");
var ActiveYesRadio = EditStatus.add("radiobutton", undefined, "ja");
var ActiveNoRadio = EditStatus.add("radiobutton", undefined, "nein");
statusLabel.characters = 10;
var AddLineButtons = myAddLinePanel.add("group");
AddLineButtons.orientation = "row";
var SaveButton = AddLineButtons.add("button", undefined, "Speichern");
var CloseButton = AddLineButtons.add("button", undefined, "Abbrechen", {name:"cancel"});
// saving changes after checking radio values
SaveButton.onClick = function()
{
if (WordYesRadio.value == true)
{
word = "j";
}
else
{
word = "n";
}
if (grepYesRadio.value == true)
{
grep = "j";
}
else
{
grep = "n";
}
if (ActiveYesRadio.value == true)
{
active = "j";
}
else
{
active = "n";
}
selection = selectList.selection.toString();
if (selection.match("Anfang"))
{
line = 0;
}
else
{
line = myArray[0].length + 1;
}
// adding line to array at given position with given values
myArray = addLine(line, myArray, findWhatInput.text, replaceByInput.text, commentInput.text, word, grep, active);
myAddLineWindow.close();
}
myAddLineWindow.show();
return myArray;
}