Hallo Thomas,
diese Frage ist vor einiger Zeit in
Gibt es eine Möglichkeit Textvariablen extern zu definieren? diskutiert worden.
Dort verweist Peter Kahrel auf sein Skript
variables.jsx .
Dort findet sich auch ein Verweis auf zwei InDesign CS3-Skripte im Premium-Forum, die ich nun hier anhänge. In CS4 und CS5 sind sie noch nicht getestet.
======================================
In <
Gibt es eine Möglichkeit Textvariablen extern zu definieren? > wurde die Möglichkeit angefragt, Textvariablen extern zu definieren und bei Bedarf einzulesen.
Hier eine Skriptstudie, die diese Aufgabe zu lösen versucht.
Voraussetzung: eine Textdatei, in der die benötigten Daten in folgender Struktur enthalten sind.
Code Variablenname:Variableninhalt[Absatzschaltung] Beispiel (s. Anhang)
Code // Textvariablen_benutzerdefiniert.jsx //DESCRIPTION: Befüllt Variablen mit benutzerdefiniertem Text über externe Liste /* Die Einträge in der Listendatei benötigen folgendes Format: Variablenname:Variableninhalt[Absatzschaltung] Unmittelbar nach dem Variablennamen folgt ein Doppelpunkt. Direkt hinter diesem steht der Inhalt der Variable. */ var d = app.activeDocument; // Ortung der Konfigurationsdatei var myConfig = getData ( scriptDir () + '/' + 'config.txt' ); // Auslesen der Listendatei var myData = getData ( myConfig.data ); // Zerlegung des Inhalts der Listendatei var myArray = myData.data.split ( '\n' ); // Abarbeitung der Definitionszeilen for ( i = 0; i < myArray.length; i++ ) setVar ( myArray[i]. split( ':' ) ) alert ( 'Fertig!' ); // =============================================================== // Funktionen // =============================================================== // ---------------------------------------------------------------------------------------------- // Zuweisung der Variableninhalte // ( ggf. Definition der Variablen ) // ---------------------------------------------------------------------------------------------- function setVar ( aPair ) { var myName = aPair[0]; var myValue = aPair[1]; if ( myName.replace ( / +/g, '' ) == '' ) // Variablenname ist leer; z.B. bei Leerzeile return; try { d.textVariables.item ( myName ).name; // Prüfung, ob Variable bereits existiert var myVar = d.textVariables.item ( myName ); } catch ( e ) { // die Variable existiert nicht => neu anlegen var myVar = d.textVariables.add ( {name:myName, variableType:VariableTypes.CUSTOM_TEXT_TYPE} ); } try { myVar.variableOptions.contents = myValue; // Übergabe des Inhalts } catch(e) {alert (e)}; } // ---------------------------------------------------------------------------------------------- // Ortung des Skriptverzeichnisses // ( für Skriptpalette und ESTK II ) // ---------------------------------------------------------------------------------------------- function scriptDir () { try { return File ( app.activeScript ).path; } catch ( e ) { return File ( e.fileName ).path; } } // ---------------------------------------------------------------------------------------------- // Auslesen des Inhalts einer übergebenen Textdatei // ---------------------------------------------------------------------------------------------- function getData ( theFilePath ) { var temp = ''; var theFile = new File ( theFilePath ) if (!theFile.exists ) // Datei nicht gefunden { var nf = new File; var theFile = File.openDialog (); // Dialog zur Auwahl der Datei if ( theFile == null ) // nichts ausgewählt => Ausstieg exit (); else // Datei ausgewählt => Festhalten in Config-Datei { writeData( theFile , File ( scriptDir () + '/' + 'config.txt' ) ); return { data:theFile }; } } theFile.open ( 'r', undefined, undefined ); //theFile.encoding = 'UTF-8'; var temp = theFile.read (); // Auslesen der Textdatei theFile.close (); return { data:temp, file:theFile }; } // ---------------------------------------------------------------------------------------------- // Schreiben einer Textdatei // ---------------------------------------------------------------------------------------------- function writeData ( aData, theFile ) { theFile.open ( 'w', 'Text', 'R*ch' ); theFile.encoding = 'UTF-8'; theFile.write ( aData ); theFile.close (); } Das Skript prüft zunächst, ob sich in dem Verzeichnis, in dem es abgelegt ist, eine Datei 'config.txt', in welcher der Pfad zur Listendatei angegeben ist, findet.
Wenn nicht, dann wird der Pfad zur Listendatei über einen Dialog ermittelt und in einer neu angelegten 'config.txt' festgehalten.
Fortan ermittelt das Skript bei jedem Start den Pfad zur Listendatei mit den Defininitonen über diese config.txt. Bei Bedarf (Änderung des Pfads zur Listendatei) kann die config.txt einfach gelöscht werden.
Aus dieser Listendatei werden die Definitionen von Variablennamen und -inhalt ausgelesen.
Jeder Datensatz besteht aus einem Absatz und wird durch eine Absatzschaltung begrenzt.
Er besteht aus zwei Datenfeldern, die durch einen Doppelpunkt getrennt sind (siehe auch Anhang):
Code Variablenname:Variableninhalt Existiert bereits eine Variable mit dem angegebenen Namen, wird diese verwendet und mit dem neuen Inhalt befüllt. Handelt es sich dabei nicht um den erwarteten Typ (benutzerdefinierter Text), erscheint eine Fehlermeldung - das Skript macht aber weiter.
Existiert diese Variable nicht, wird sie neu angelegt und dann mit dem Inhalt befüllt.
Und hier das Gegenstück zum Exportieren der Textvariablen mit benutzerdefiniertem Text:
Code // TextvariablenExport.jsx //DESCRIPTION: Exportiert Variablen mit benutzerdefiniertem Text in externe Liste /* Die Einträge in der Listendatei erhalten folgendes Format: Variablenname:Variableninhalt[Absatzschaltung] */ var d = app.activeDocument; var myConfig = getData ( scriptDir () + '/' + 'config.txt' ); // Auslesen der Config-Datei var myData = getData ( myConfig.data ); var myArray = new Array; for ( i = 0; i < d.textVariables.length; i++ ) getUserdefinedVar (d.textVariables[i] ) writeData( myArray.join ( '\n' ), myData.file ); // alert ( 'Fertig!' ); // =============================================================== // Funktionen // =============================================================== // ---------------------------------------------------------------------------------------------- // Sammeln der Variablen mit benutzerdefiniertem Text // ---------------------------------------------------------------------------------------------- function getUserdefinedVar ( aVar ) { if ( aVar.variableType != VariableTypes.CUSTOM_TEXT_TYPE) return; var aString = aVar.name + ':' + aVar.variableOptions.contents; myArray.push( aString ); } // ---------------------------------------------------------------------------------------------- // Ortung des Skriptverzeichnisses // ( für Skriptpalette und ESTK II ) // ---------------------------------------------------------------------------------------------- function scriptDir () { try { return File ( app.activeScript ).path; } catch ( e ) { return File ( e.fileName ).path; } } // ---------------------------------------------------------------------------------------------- // Auslesen des Inhalts einer übergebenen Textdatei // ---------------------------------------------------------------------------------------------- function getData ( theFilePath ) { var temp = ''; var theFile = new File ( theFilePath ) if (theFilePath.match('config.txt') && !theFile.exists ) // Datei nicht gefunden { var nf = new File; var theFile = File.openDialog (); // Dialog zur Auwahl der Datei if ( theFile == null ) // nichts ausgewählt => Ausstieg theFile = File ( scriptDir () + '/' + 'Textvariablen.txt' ); writeData( theFile , File ( scriptDir () + '/' + 'config.txt' ) ); return { data:theFile.fullName }; } theFile.open ( 'r', undefined, undefined ); //theFile.encoding = 'UTF-8'; var temp = theFile.read (); // Auslesen der Textdatei theFile.close (); return { data:temp, file:theFile }; } // ---------------------------------------------------------------------------------------------- // Schreiben einer Textdatei // ---------------------------------------------------------------------------------------------- function writeData ( aData, theFile ) { theFile.open ( 'w', 'Text', 'R*ch' ); theFile.encoding = 'UTF-8'; theFile.write ( aData ); theFile.close (); } Dieses Skript greift auf eine config.txt zurück (oder legt sie neu an), in welcher der Pfad zur Listendatei angegeben ist. Wenn beide Skripte im selben Verzeichnis sind, bedienen sie dieselbe Listendatei - rein und raus.