InDesign Skripte sind mächtige Werkzeuge, mit denen sich Arbeitsabläufe in Adobe InDesign automatisieren und effizienter gestalten lassen. Ob es darum geht, wiederkehrende Aufgaben zu beschleunigen, komplexe Layout-Operationen automatisch auszuführen oder personalisierte Dokumente in Serie zu erstellen – Skripte sparen Zeit und reduzieren Fehler.
Diese Skript-Sammlung bietet eine übersichtliche Auswahl an Skripten für verschiedene Anwendungsbereiche: von einfachen Automatisierungen wie das Umbenennen von Ebenen oder das Anpassen von Textrahmen bis hin zu komplexeren Lösungen, die ganze Dokumentstrukturen analysieren und verändern.
Inhaltsverzeichnis
Ausgabe / Export / Sicherung
Alle Buch-Dokumente mit ausgewählten Ebenen als PDF exportieren
Alle Buch-Dokumente mit ausgewählten Ebenen als PDF exportieren
Alle Seiten eines Dokuments als Snippet exportieren
automatische Sicherungskopien in Unterordner erstellen
automatische Sicherungskopien in Unterordner erstellen
automatische Sicherungskopien in Unterordner erstellen
Einzelseitenexport im Flash-Format aus InDesign CS4 und höher
Liste mit Schriften im Dokument ausgeben
Mit Zeichenformat ausgezeichneten Text als RTF exportieren
Mit Zeichenformat ausgezeichneten Text als RTF exportieren
Problematische Verknüpfungen suchen (-> Verpacken)
Verpacken per Skript
Vorschau Extraktor
Daten importieren
Automatische Platzierung von ausgewählten Word-, PDF- und InDesign-Dateien
Alle Seiten einer externen InDesign-Datei platzieren/importieren
Dokumente einrichten
Bibliotheksobjekt anhand Selektion benennen
Buch erstellen mit InDesign-Dateien eines ausgewählten Verzeichnisses
Grundlinienraster einrichten
drei kleine Helferlein beim Sichern von geöffneten Dokumenten (1/3)
drei kleine Helferlein beim Sichern von geöffneten Dokumenten (2/3)
drei kleine Helferlein beim Sichern von geöffneten Dokumenten (3/3)
Skriptgenerator für Skripte, die Ebenen ein-/ausblenden
Musterseitenobjekte gezielt lösen
Zusammenfügen mehrer Dokumente zu einem Dokument
Farbe
cmyk farben in cmy
Eingebettete ICC-Profile von Bildern ermitteln
Farben reduzieren / Duplikate entfernen
Farbfelder sortieren
Grafisches
Alle selektierten Bilder öffnen (editieren)
Alle verknüpften Abbildungen des aktiven Druckbogens öffnen
Anzeigenleistung hin- und herschalten
Automatische Bildplatzierung
Bilder Kopieren/Einfügen mit schwarzem Pfeil und Offset-Erhaltung
Bilder neu verknüpfen mit Daten in Unterverzeichnissen.
Bilder100ProzentCS2.scpt
Bildernamen pro Seite und der Reihe nach auflisten
Doppelte Bilder vermeiden
Ein-/Ausschalten der Überprüfung von Verknüpfungen beim Öffnen von Dokumenten
Endungen von verknüpften Bilddateien ändern bzw. löschen
Ermittlung von Metadaten von verknüpften Bildern
Fehlende Bildverknüpfungen mit Datei in angegebenem Verzeichnis/Unterverzeichnis neu verknüpfen
Gespiegelte Bilder finden
Grafik an Satzspiegel anpassen
[Illustrator CS2] Texttyp umwandeln: Punkt- zu Flächentext und umgekehrt
Auswahl als EPS exportieren
Bilder skalieren per Skript
Fehlende Verknüpfungen ausgeben
Fehlende Verknüpfungen ausgeben
Leere Bildrahmen löschen
Öffne Bildverknüpfung im Online Stockfoto-Katalog
planePath.jsx (Pfadecken mildern per gleitendem Mittelwert)
reducePath.jsx (Pfade vereinfachen / Punkte reduzieren)
scatterPath.jsx (Pfade aufrauen)
Sichtbarkeit der Objektebenen mit Ebenen des Dokuments synchronisieren
smoothPath.jsx (weiche Bezier-Punkte berechnen)
Verknüpfte PDF-Dateien verschieben
Layout (Ausrichten, Zeichnen)
»Gehe zu Seite« ? in allen offenen Dokumenten
Hilfslinie von Druckbogen auf Seite(n) des Druckbogens bringen
Maße eines ausgewählten Bildrahmens, des Bildes und Versatz des Bildes
Windows-variante für image_names.scpt
aktive Ebene ein- oder ausblenden
Skriptgenerator für Skripte, die Ebenen ein-/ausblenden
CreatePageandMirrorGuides.jsx + MakeFoldMarksOnGuides.jsx
CreatePageandMirrorGuides.jsx + MakeFoldMarksOnGuides.jsx
Maße von Objekten mit bestimmtem Objektstil ändern
"Objekte verteilen" per Script
Per Dialog ausgewählte Bilder entfernen
Rahmen an Oberkanten von Buchstaben alinieren
Rahmen an Oberkanten von Buchstaben alinieren
Satzspiegel anhand von ausgewählten Seitenobjekten einstellen
»Seite zurück« ? in allen offenen Dokumenten
»Seite vor« ? in allen offenen Dokumenten
Seiten-Eigenschaften platzierter PDF-, AI- und INDD-Dateien ändern
Seiteninhalte austauschen
Selektierte Objekte auf nächst höhere Ebene bewegen
Selektierte Objekte auf nächst niedrigere Ebene bewegen
Zoomen auf feste Größe und Zentrieren des Druckbogens
Neu / Öffnen
Alle Dateien im InDesign Buch öffnen oder schließen
Dateien mit unterdrückten Fehlermeldungen öffnen.
Menüeintrag "Öffnen ohne Fehlermeldung" im Datei-Menü
Oberfläche
afterOpen EventHandler in CS4
Alle offenen Dokumente schließen, ohne sie zu sichern
Dialoge wiederherstellen
Selektion zwischenspeichern (Laden)
Selektion zwischenspeichern (Merken)
Skript in allen Dokumenten der geöffneten Büchern ausführen
Skript in allen Dokumenten eines ausgewählten Buchs ausführen
Skript in allen Dokumenten eines ausgewählten Verzeichnisses und dessen Unterverzeichnisse ausführen
Tabellen
Allen Tabellen eines Dokuments ein Tabellenformat zuweisen
Bring waagerechte Tabellenkonturen nach vorn
Höhe von Tabellenzellen global zuweisen
Ausgewählten Zellen einer Tabelle eine definierte Abfolge von Flächenfarben zuweisen]
Leere Tabellenzellen befüllen
Senkrechte Tabellenkonturen nach vorn holen
Tabellenzeile duplizieren
Tabellenzeile in nächster Spalte beginnen oder zurück
Text
Absätze farbig hinterlegen
Alle Abweichungen löschen
Alle Textflüsse exportieren und mit dem Export verlinken
An Trennstellen bedingte Trennungen einfügen
Aus einer Fußnote hinter deren Referenz im Text springen
Ausgewählten Text über Kontextmenü googeln
Ausgewählten Text über Tastendruck googeln
Austausch von Absatzformaten einer Formatgruppe durch Formate einer anderen Formatgruppe (im ausgewählten Textabschnitt)
Bestimmten Worten automatisch Zeichenformat zuweisen
Datum im Text aktualisieren
Didot-Punkt einstellen
Einstellungen des Suchen/Ersetzen-Dialogs in Textdatei speichern / RecordFindChange_CS3-CS5.jsx
Einstellungen des Suchen/Ersetzen-Dialogs in Textdatei speichern / RecordFindChange_CS3.jsx
Ersetzen von Sonderzeichen in Indexeinträgen
Erweiterung der Textauswahl auf den Bereich der aktuellen Zeichenformatierung
erzwungener Blocksatz, wenn Länge der letzten Zeile ein Limit überschreitet
Externe Liste von Textvariablen mit benutzerdefiniertem Text einarbeiten
Finde nächste Trennung
Finde vorherige Trennung
Formaten und Text einige Absatzattribute zuweisen
Fußnote mit Formaten aus den Fußnotenoptionen und ggf. mit ausgewähltem Text erstellen
Fußnotenoptionen: Synchronisation der Linie über Fußnoten
Fußnotentexte in ausgewähltem Text hoch- oder herunterschieben
Getrennte Worte in Übersichtsliste mit Verknüpfung darstellen
Gleiche Silbentrennung für alle Absatzformate
GREP-Fundstellen auflisten
Griechischen Unicode-Zeichen ein schriftschnittspezifisches Zeichenformat zuweisen
Gruppierung von aufeinanderfolgenden Zahlen durch f. und ff.
Hängender Einzug
Hebräischen Unicode-Zeichen ein schriftschnittspezifisches Zeichenformat zuweisen
Hyperlinks bei Text mit Zeichenformat
InDesign C3 5.0.2 Mac Absatzformate komplett umbenennen
InDesign C3 5.0.2 Mac Absatzformate komplett umbenennen
Reihenfolge der ausgewählten Zeichen umkehren
Namen von Absatz- und Zeichenformaten säubern
URLs mit einem Zeichenformat auszeichnen
aus Text in Klammern [] Fußnoten erzeugen
Indexeinträge auf der Basis von Zeichenformaten
Indexeinträge mit Unterstichworten über eine Konkordanzdatei erzeugen.
Indexthemen aus einer externen Liste importieren
Inhaltsverzeichnisse aktualisieren
Kleine Erweiterung des Standardskripts FindChangeByList.jsx
Leere Textrahmen löschen
Mehrspaltige Textrahmen an Inhalt anpassen
Mehrspaltigen Textrahmen in einzelne Rahmen trennen
Monatsnamen bei Datumsangaben in Zahlen wandeln
Reihenfolge von Segmenten eines ausgewählten Texts umkehren
Schrift-Eigenschaften auflisten
Schriftschnitte in Zeichenformaten einfrieren (nur bei Abweichungen zum Absatzformat)
Schriftschnitte in Zeichenformaten einfrieren
Set mit Fußnotenoptionen
Sonderzeichen '∞' (unendlich) einfügen
Text durch Bild ersetzen (z.B. Barcodes)
Texte mit einem ausgewählten Zeichenformat im Dokument ermitteln
Textvariablenexport
Übersatztext formatieren
Verbindung von aufeinanderfolgenden Zahlen durch Bis-Strich (1)
Verbindung von aufeinanderfolgenden Zahlen durch Bis-Strich (2)
Vertikaler Keil nur bei bestimmten Absatzformaten
Vertikaler Keil nur bei bestimmten Absatzformaten
Vertikaler Keil nur bei bestimmten Absatzformaten
Verwendete Zeichen einer Schrift im Dokument ermitteln
Verwendung von Textvariablen im Text anzeigen
Web- und email-Adressen verlinken
Weitere Erweiterung des Standardskripts FindChangeByList.jsx
Worte in Versalbuchstaben umwandeln in Groß-/Kleinschreibung (erster Buchstabe im Wort groß)
Wörter mit falscher Silbentrennung finden
Zahlen per Faktor umrechnen (mit Rundung)
Zeichenformat auf Basis des ersten ausgewählten Zeichens erstellen und allen Vorkommen dieses Fonts im Dokument zuweisen
Zeichenformat auf bestimmte Zeichen nach der ursprünglichen Formatierung erweitern
Zeichenformat "[Ohne]"
Zeilenweiser Verlauf der Schriftgrössen
Zwei Testscripts für die Version 04 des BilderKatalog-Scripts
Ausgabe / Export / Sicherung
Alle Buch-Dokumente mit ausgewählten Ebenen als PDF exportieren
PDFExportLayersInBookWithChoice.jsx
Hallo,
anbei noch eine Änderung des Skripts
PDFExportLayersInBookWithChoice.jsx, mit dem man nun auch die Buchdokumente für den PDF-Export einzeln auswählen kann.
Damit hat man nun folgende Möglichkeiten:
1. Ausgewählte Ebenen in allen Buchdokumenten eines Buchs ein- oder ausblenden ohne PDF-Export (Referenz-Dokument zur Auswahl der Ebenen ist das erste Dokument des Buchs).
2. Ausgewählte Ebenen in ausgewählten Buchdokumenten eines Buchs ein- oder ausblenden mit PDF-Export.
Einschränkung: Wenn im Buch viele Dokumente vorhanden sind, so ist das Menü zur Auswahl der einzelnen Dokumente evtl. nicht komplett am Monitor sichtbar. (Bei meinem Monitor ist das bei einer Anzahl von ca. 35-40 Dokumenten in einem Buch der Fall).
//PDFExportLayersInBookWithChoice.jsx
//DESCRIPTION: Ausgewählte Ebenen im Buch als PDF exportieren
//Autor: zaphodbeeblebroxx
if (app.books.length == 1) {
var myDocs=app.books[0].bookContents;
var myDocsNames = app.books[0].bookContents.everyItem().fullName;
var myFirstDoc = app.open(File(myDocs[0].fullName), false); // Referenz-Datei für Ebenen = 1. Dokument des Buchs
var myFirstDocLayers = myFirstDoc.layers.everyItem().name; // Ebenen der Ref.-Datei
var myPrinterPresets = app.pdfExportPresets.everyItem().name; // PDF-Export Preferences
var myErrors = 0;
var myErrorText = "";
var myVisitedDocs = 0;
var myExportedDocs = 0;
var mySelectedLayer = getLayer();
if (theChoice){
var mySelectedDocs = getDocs();
}
else{
theSelectedDocs = new Array();
for (oneDoc = 0; oneDoc < app.books[0].bookContents.length; oneDoc++) {
theSelectedDocs[oneDoc] = "true";
}
}
///////
bookProc(app.books[0]);
if (myErrors != 0){
if (theChoice){
var myExportText = "\r\r" + myExportedDocs + " Dokument(e) wurde(n) mit der PDF-Exportvorgabe '" + theSelectedPreset +"' exportiert.";
}
else{
var myExportText = "";
}
alert("Fertig. " + myVisitedDocs + " Dokument(e) bearbeitet!\r" + myErrors + " Fehler: Ausgewählte Ebene(n) ist/sind in einem oder mehreren Buchdokumenten nicht vorhanden!\r" + myErrorText + "" + myExportText);
}
exit();
}
alert ("Bitte genau 1 Buch öffnen!");
///////////////////////////
function bookProc(aBook) {
var theDocs=aBook.bookContents;
for (oneDoc = 0; oneDoc < aBook.bookContents.length; oneDoc++) {
if (theSelectedDocs[oneDoc]){
myDoc = app.open(File(theDocs[oneDoc].fullName), false);
//alle Ebenen im Buch-Dok. ausblenden
for (oneLayer = 0; oneLayer < myDoc.layers.length; oneLayer++){
myDoc.layers.item(oneLayer).visible = false;
}
//nur die ausgewählten Ebenen einblenden
for (oneLayer = 0; oneLayer < myFirstDocLayers.length; oneLayer++){
try {
myDoc.layers.item(myFirstDocLayers[oneLayer]).visible = theSelectedLayers[oneLayer];
}
catch (e){
myErrors = myErrors + 1;
var myNewError = "Ebene '" + myFirstDocLayers[oneLayer] + "' ist im Dokument '" + myDoc.name + "' nicht vorhanden!";
myErrorText += myNewError + "\r";
}
}
if ((theChoice) && (theSelectedDocs[oneDoc])){
var myPDFExportPreset = theSelectedPreset;
var myFileName = myDoc.fullName.fullName.replace(/\.indd/i, ".pdf");
myDoc.exportFile(ExportFormat.pdfType, File(myFileName), false, app.pdfExportPresets.item(myPDFExportPreset));
myExportedDocs += 1;
}
myDoc.close(SaveOptions.yes);
myVisitedDocs += 1;
}
}
if ((theChoice) && (!theSelectedDocs[0])){
myFirstDoc.close(SaveOptions.yes);
}
}
//---------------
// Dialog
//---------------
function getLayer()
{
var myFieldWidth = 100;
var myCheckbox = new Array();
theSelectedLayers = new Array();
theSelectedLayerNames = new Array();
var myDialog = app.dialogs.add({name:"Ebenen im Buch ein-/ausblenden mit PDF-Export"});
with(myDialog.dialogColumns.add()){
with(dialogRows.add()){
with(borderPanels.add()){
with(dialogColumns.add()){
staticTexts.add({staticLabel:"Ebenen auswählen:", minWidth:myFieldWidth});
}
with(dialogColumns.add()){
for (oneLayer = 0; oneLayer < myFirstDocLayers.length; oneLayer++){
var myLayerVisible = myFirstDoc.layers.item(oneLayer).visible;
myCheckbox[oneLayer] = checkboxControls.add({staticLabel:""+ myFirstDocLayers[oneLayer], checkedState:myLayerVisible});
}
}
with(dialogRows.add()){
with(borderPanels.add()){
with(dialogColumns.add()){
with(thePrintMe = enablingGroups.add({staticLabel:"Ausgewählte Ebenen exportieren", checkedState:false})){
with(dialogColumns.add()){
with(dialogRows.add()){
with(dialogColumns.add()){
staticTexts.add({staticLabel:"PDF-Export-Vorgabe:", minWidth:myFieldWidth});
}
with(dialogColumns.add()){
var thePrinterPreset = dropdowns.add({stringList:myPrinterPresets, selectedIndex:0});;
}
}
}
}
}
}
}
}
}
}
var theResult = myDialog.show();
if(theResult == true){
theChoice = thePrintMe.checkedState;
theSelectedPreset = myPrinterPresets[thePrinterPreset.selectedIndex];
for (oneLayer = 0; oneLayer < myFirstDocLayers.length; oneLayer++){
theSelectedLayers[oneLayer] = myCheckbox[oneLayer].checkedState;
theSelectedLayerNames[oneLayer] = myFirstDocLayers[oneLayer];
}
myDialog.destroy();
}
else{
myDialog.destroy();
myFirstDoc.close(SaveOptions.no);
exit();
}
return (theSelectedLayers, theSelectedLayerNames, theSelectedPreset, theChoice);
}
//---------------
// Dialog zur Auswahl der Dokumente
//---------------
function getDocs()
{
var myFieldWidth = 100;
theSelectedDocs = new Array();
myDocsCheckbox = new Array();
var myDialog = app.dialogs.add({name:"Buch-Dokumente auswählen"});
with(myDialog.dialogColumns.add()){
with(dialogRows.add()){
with(borderPanels.add()){
with(dialogColumns.add()){
for (oneDoc = 0; oneDoc < myDocs.length; oneDoc++){
var myLength = myDocsNames[oneDoc].split(":").length-1;
var myTmpDocName = myDocsNames[oneDoc].split(":")[myLength];
myDocsCheckbox[oneDoc] = checkboxControls.add({staticLabel:"Dok. " + (oneDoc+1) + " : "+ myTmpDocName, checkedState:false});
}
}
}
}
}
var theResult = myDialog.show();
if(theResult == true){
for (oneDoc = 0; oneDoc < myDocs.length; oneDoc++){
theSelectedDocs[oneDoc] = myDocsCheckbox[oneDoc].checkedState;
if (theSelectedDocs[oneDoc]){
var mySelectionChecker = "true";
}
}
myDialog.destroy();
}
else{
myDialog.destroy();
myFirstDoc.close(SaveOptions.no);
exit();
}
if (!mySelectionChecker){
myFirstDoc.close(SaveOptions.no);
alert("Kein Dokument für PDF-Export ausgewählt! Skript wird beendet.");
exit();
}
return (theSelectedDocs);
}
Skript ist lauffähig ab Version CS2
Alle Buch-Dokumente mit ausgewählten Ebenen als PDF exportieren
PDFExportLayersInBookWithChoice.jsx
Link zur Ursprungsdiskussion im Forum
Hallo,
conma hat in
Bestimmte Ebene ausdrucken von ausgewählten Dateien nach einem Skript gesucht, mit dem man bestimmte Ebenen aller Dokumente eines Buchs ein-/ausblenden kann, um dann die einzelnen Dokumente des Buchs als PDFs zu exportieren.
Hier ein Skript, dass ich unter CS2 für diesen Zweck verwende.
//PDFExportLayersInBookWithChoice.jsx
//DESCRIPTION: Ausgewählte Ebenen im Buch als PDF exportieren
//Autor: zaphodbeeblebroxx
if (app.books.length == 1) {
var myDocs=app.books[0].bookContents;
var myFirstDoc = app.open(File(myDocs[0].fullName), false); // Referenz-Datei für Ebenen = 1. Dokument des Buchs
var myFirstDocLayers = myFirstDoc.layers.everyItem().name; // Ebenen der Ref.-Datei
var myPrinterPresets = app.pdfExportPresets.everyItem().name; // PDF-Export Preferences
var myErrors = 0;
var myErrorText = "";
var mySelectedLayer = getLayer();
for (oneBook = 0; oneBook < app.books.length; oneBook++) {
if (app.books[oneBook].bookContents.length > 1)
bookProc(app.books[oneBook]);
}
if (myErrors != 0){
alert("Fertig. " + app.books[0].bookContents.length + " Dokumente bearbeitet!\r" + myErrors + " Fehler: Ausgewählte Ebene(n) ist/sind in ein oder mehreren Buchdokumenten nicht vorhanden!\r" + myErrorText);
}
exit();
}
alert ("Bitte genau 1 Buch öffnen!");
function bookProc(aBook) {
var theDocs=aBook.bookContents;
var firstDoc = app.open(File(theDocs[0].fullName), false);
for (oneDoc = 0; oneDoc < aBook.bookContents.length; oneDoc++) {
myDoc = app.open(File(theDocs[oneDoc].fullName), false);
//alle Ebenen im Buch-Dok. ausblenden
for (oneLayer = 0; oneLayer < myDoc.layers.length; oneLayer++){
myDoc.layers.item(oneLayer).visible = false;
}
//nur die ausgewählten Ebenen einblenden
for (oneLayer = 0; oneLayer < myFirstDocLayers.length; oneLayer++){
try {
myDoc.layers.item(myFirstDocLayers[oneLayer]).visible = theSelectedLayers[oneLayer];
}
catch (e){
myErrors = myErrors + 1;
var myNewError = "Ebene '" + myFirstDocLayers[oneLayer] + "' ist im Dokument '" + myDoc.name + "' nicht vorhanden!";
alert(myNewError);
myErrorText += myNewError + "\r";
}
}
if (theChoice){
var myPDFExportPreset = theSelectedPreset;
var myFileName = myDoc.fullName.fullName.replace(/\.indd/i, ".pdf");
myDoc.exportFile(ExportFormat.pdfType, File(myFileName), false, app.pdfExportPresets.item(myPDFExportPreset));
}
myDoc.close(SaveOptions.yes);
}
}
//---------------
// Dialog
//---------------
function getLayer()
{
var myFieldWidth = 100;
var myCheckbox = new Array();
theSelectedLayers = new Array();
theSelectedLayerNames = new Array();
var myDialog = app.dialogs.add({name:"Ebenen im Buch ein-/ausblenden"});
with(myDialog.dialogColumns.add()){
with(dialogRows.add()){
with(borderPanels.add()){
with(dialogColumns.add()){
staticTexts.add({staticLabel:"Ebenen auswählen:", minWidth:myFieldWidth});
}
with(dialogColumns.add()){
for (oneLayer = 0; oneLayer < myFirstDocLayers.length; oneLayer++){
var myLayerVisible = myFirstDoc.layers.item(oneLayer).visible;
myCheckbox[oneLayer] = checkboxControls.add({staticLabel:""+ myFirstDocLayers[oneLayer], checkedState:myLayerVisible});
}
}
with(dialogRows.add()){
with(borderPanels.add()){
with(dialogColumns.add()){
with(thePrintMe = enablingGroups.add({staticLabel:"Ausgewählte Ebenen exportieren", checkedState:false})){
with(dialogColumns.add()){
with(dialogRows.add()){
with(dialogColumns.add()){
staticTexts.add({staticLabel:"PDF-Export-Vorgabe:", minWidth:myFieldWidth});
}
with(dialogColumns.add()){
var thePrinterPreset = dropdowns.add({stringList:myPrinterPresets, selectedIndex:0});;
}
}
}
}
}
}
}
}
}
}
var theResult = myDialog.show();
if(theResult == true){
theChoice = thePrintMe.checkedState;
theSelectedPreset = myPrinterPresets[thePrinterPreset.selectedIndex];
for (oneLayer = 0; oneLayer < myFirstDocLayers.length; oneLayer++){
theSelectedLayers[oneLayer] = myCheckbox[oneLayer].checkedState;
theSelectedLayerNames[oneLayer] = myFirstDocLayers[oneLayer];
}
myDialog.destroy();
}
else{
myDialog.destroy();
exit();
}
return (theSelectedLayers, theSelectedLayerNames, theSelectedPreset, theChoice);
}
Als Referenz für die Auswahl der ein-/auszublendende Ebenen dient das erste Dokument des geöffneten Buchs. (Kann aber auch verändert werden). Im Menü kann man dann die Ebenen auswählen, die ein- bzw. ausgeblendet werden sollen.
Optional kann man noch eine PDF-Export-Voreinstellung auswählen, wenn das ganze per PDF-Export gedruckt werden soll. Wird keine PDF-Export-Voreinstellung ausgewählt werden nur die ausgewählten Ebenen in allen Buch-Dokumenten ein-/ausgeblendet.
Matthias
Skript ist lauffähig ab Version CS2
Alle Seiten eines Dokuments als Snippet exportieren
ExportDoc2Snippets.jsx
Das folgende Skript exportiert die Objekte aller Seiten des aktiven Dokuments (ohne Musterseitenobjekte) als Snippets im Unterverzeichnis 'Snippets' relativ zum Dokumentverzeichnis oder - falls das Dokument noch nicht gesichert sein sollte, auf dem Desktop.
// ExportDoc2Snippets.jsx
//DESCRIPTION: Exportiert die Objekte aller Seiten des aktiven Dokuments (ohne Musterseitenobjekte) als Snippets im Unterverzeichnis 'Snippets', relativ zum Dokumentverzeichnis oder auf dem Desktop.
var myDoc = app.activeDocument;
var myDigitLength = myDoc.pages[-1].name.length;
var myPath = ( myDoc.saved == true ) ? myDoc.filePath.fullName + "/Snippets/" : '~/Desktop/Snippets/';
Folder( myPath ).create();
for ( var i = 0; i < myDoc.pages.length; i++ )
doPage( myDoc.pages[i] );
function doPage( onePage )
{
if ( onePage.pageItems.length > 1 )
{
var myItems = new Array;
for ( var k = 0; k < onePage.pageItems.length; k++ )
myItems.push( onePage.pageItems[k] );
var myGroup = onePage.groups.add( myItems );
exportItem( myGroup, onePage.name );
myGroup.ungroup( );
}
else if ( onePage.pageItems.length == 1 )
{
exportItem( onePage.pageItems[0], onePage.name );
}
}
function exportItem( anItem, aPage )
{
anItem.exportFile( 'InDesign-Snippet', File( myPath + myDoc.name + '_' + aPage + '.ids' ) );
}
Skript ist lauffähig ab Version CS2
automatische Sicherungskopien in Unterordner erstellen
saveVersions.jsx
Link zur Ursprungsdiskussion im Forum
Nach meinen eigenen ersten positiven Erfahrungen mit dem EventSkript saveCopy.jsx wuchs mein Interesse an einem Skript, daß beim Sichern automatisch mehrere unterschiedliche Versionen eines Dokuments verwaltet.
Das folgende EventSkript saveVersions.jsx macht das:
1. Beim zweiten Sichern nach Neuanlage eines Dokuments (also bevor die erste gesicherte Version überschrieben wird) erscheint eine Aufforderung zur Eingabe der maximalen Zahl der zu verwaltenden Versionen (Standard ist 5).
2. Nach Bestätigung des Dialogs (Vorsicht, er ist hartnäckig und erwartet eine Zahl > 0) wird in einem Unterverzeichnis des Verzeichnisses, in dem das Dokument liegt, namens "Versionen" eine Sicherungskopie der alten Fassung angelegt; diese Sicherungskopie erhält den Namen "[Dokumentname]_1.indd".
3. Mit jedem weiteren Sichern (nur, wenn sich im Dokument etwas geändert hat) erfolgt eine Erhöhung der Versionsnummer, bis die maximale Versionszahl erreicht ist; ist die maximale Versionszahl erreicht, wird der Zähler wieder auf 1 zurückgesetzt und die Numerierungsschleife beginnt von vorn (erst wird "[Dokumentname]_1.indd" überschrieben(!), das nächste Mal "[Dokumentname]_2.indd".
4. Die undo-History im aktuellen Dokument bleibt erhalten.
Am 1.9.2009 wurden
zwei Änderungsvorschläge von Uwe Laubender eingearbeitet, womit Fehlermeldungen z.B. beim Ändern der Reihenfolge der Dokumente in einem Buch oder beim Verpacken von einem Buch erfolgreich verhindert werden können.
//saveVersions.jsx
//DESCRIPTION: Sichert Versionen des aktiven Dokuments in einer numerierten Schleife
#targetengine "session"
var myEventListenerVersions = app.addEventListener("beforeSave", SaveVersion);
function SaveVersion()
{
var myFolderName = 'Versionen';
var myDoc = app.documents.firstItem();
// Sicherungskopie nur dann erstellen, wenn das Dokument nach seiner Erzeugung bereits gesichert wurde
// (also als Datei auf einem Datenträger existiert)
if (myDoc.saved == true)
{
var myCounter = getVersion (myDoc); // bezieht Versionsnummer; diese wird bei Bedarf neu eingerichtet
var myPathName = myDoc.filePath.fullName + '/' + myFolderName;
var mySFolder = Folder(myPathName);
try {
// Sicherungsordner anlegen
mySFolder.create();
}
catch(e)
{
alert("Problem beim Anlegen des Ordners")
}
// Versionskopien erstellen
var myName = setVersionName(myDoc.name, myCounter);
File(myDoc.fullName).copy(myPathName + "/" + myName);
}
}
function getVersion(aDoc)
{
if (myMax = aDoc.extractLabel( 'theMax' ))
{
// Versionsnummer angelegt
myVersion = aDoc.extractLabel( 'theVersion' )
}
else
{
// Versionsnummer nicht angelegt
do
{
// Eingabeaufforderung max. Versionszahl
myMax = prompt ('Maximale Versionszahl:', 5);
if (myMax == null)
exit();
} while (myMax < 1)
myVersion = '0';
aDoc.insertLabel( 'theVersion', myVersion);
aDoc.insertLabel( 'theMax', myMax);
}
// Sichern der Versionsdaten
myNewVersion = setVersion( aDoc, [myMax, myVersion]);
return myNewVersion;
}
function setVersion( aDoc, aData )
{
myNum = Number( aData[1] );
(myNum >= Number( aData[0] )) ? myNum = 1 : myNum++;
aDoc.insertLabel( 'theVersion', String( myNum ) );
return String( myNum );
}
function setVersionName(aName, aCounter)
{
var myIndex = aName.indexOf( '.indd');
if (myIndex == -1)
{
var theNewName = aName + '_' + aCounter;
}
else
{
var theNewName = aName.substring(0, myIndex) + '_' + aCounter + aName.substring(myIndex, aName.length);
}
return theNewName;
}
Die maximale Zahl der zu verwaltenden Versionen von
saveVersions.jsx bleibt wie auch der aktuelle Zähler in einem versteckten Etikett im Dokument erhalten. Diese Zahl kann man mit dem Skript
VersionsCounter.jsx ändern (der aktuell vergebene Wert wird im Eingabedialog als Standardvorgabe eingeblendet).
Skript ist lauffähig ab Version CS3
automatische Sicherungskopien in Unterordner erstellen
VersionsCounter.jsx
Die maximale Zahl der zu verwaltenden Versionen von
saveVersions.jsx bleibt wie auch der aktuelle Zähler in einem versteckten Etikett im Dokument erhalten. Diese Zahl kann man mit dem folgenden Skript ändern (der aktuell vergebene Wert wird im Eingabedialog als Standardvorgabe eingeblendet):
// VersionsCounter.jsx
//DESCRIPTION: Setzt die maximale Versionszahl für das Eventskript saveVersion.jsx
setMax(app.activeDocument);
function setMax( aDoc )
{
if (myMax = aDoc.extractLabel( 'theMax' )) {}
else
var myMax = 1;
do
{
var myMax = prompt ('Maximale Versionszahl:', myMax);
if (myMax == null)
exit();
} while (myMax < 1)
aDoc.insertLabel( 'theMax', myMax);
return myMax;
}
Skript ist lauffähig ab Version CS3
automatische Sicherungskopien in Unterordner erstellen
saveCopy.jsx
Link zur Ursprungsdiskussion im Forum
Angeregt durch die Anfrage in
versionierung von dateien OHNE version cue? kopiert das folgende Eventskript für InDesign CS3 vor dem Sichern der aktuellen Datei deren ursprüngliche Version in einem Unterordner namens "Sicherung", welcher bei Bedarf vom Skript angelegt wird.
//saveCopy.jsx
#targetengine "myEngine"
var myEventListenerCopy = app.addEventListener("beforeSave", SaveCopy, false);
function SaveCopy()
{
var myDoc = app.activeDocument;
// Sicherungskopie nur dann erstellen, wenn das Dokument nach seiner Erzeugung bereits gesichert wurde
// (also als Datei auf einem Datenträger existiert)
if (myDoc.saved == true)
{
var myPathName = myDoc.filePath.fullName + "/Sicherung";
var myFolder = Folder(myPathName);
try {
// Sicherungsordner anlegen
myFolder.create();
}
catch(e)
{
alert("Problem beim Anlegen des Ordners")
}
// Kopie erstellen
File(myDoc.fullName).copy(myPathName + "/" + myDoc.name);
}
}
Das Skript wird im Ordner "Startup Scripts" ("/Users/xxxx/Library/Preferences/Adobe InDesign/Version 5.0/Scripts/Startup Scripts") abgelegt, damit es automatisch mit InDesign CS3 gestartet wird.
Skript ist lauffähig ab Version CS3
Einzelseitenexport im Flash-Format aus InDesign CS4 und höher
exportEachPageAsFlash.jsx
Link zur Ursprungsdiskussion im Forum
Das Skript exportiert alle Seiten des aktiven Dokuments als Einzelseiten im Flash-Format.
Diese werden in einem per Dialog auszuwählenden Verzeichnis abgelegt.
Die Flash-Dateien übernehmen den Namen des Dokuments als Präfix.
// exportEachPageAsFlash.jsx
//DESCRIPTION:Exportiert alle Seiten des aktiven Dokuments einzeln im Flash-Format
//Author: Martin Fischer
// Versionsunterscheidung
if ( Number((app.version +"").substr(0,1)) < 6)
{
alert('Das Skript erfordert InDesign CS4 oder höher.');
exit();
}
else
{
var suffix = (Number((app.version +"").substr(0,1)) == 6)
? '.xfl'
: '.fla';
}
var d = app.documents.firstItem();
// Auswahl Zielverzeichnis
var f = Folder.selectDialog( "Zielverzeichnis für Flashdateien auswählen:" );
if (f != null)
{
// Einzelseiten
app.xflExportPreferences.dynamicDocumentExportReaderSpreads = false;
var base_name = f.fullName + '/' + d.name.replace(/\.indd$/g,'') + '_';
// erste Seite
var flash_file = new File(base_name + d.pages.firstItem().name + suffix);
app.xflExportPreferences.pageRange = d.pages.firstItem().name;
d.exportFile(ExportFormat.PACKAGED_XFL, flash_file, true);
// folgende Seiten
for (var i = 1; i < d.pages.length; i++)
{
var flash_file = new File( base_name + d.pages.item(i).name + suffix);
app.xflExportPreferences.pageRange = d.pages.item(i).name;
d.exportFile(ExportFormat.PACKAGED_XFL, flash_file, false);
}
}
Skript ist lauffähig ab Version CS4
Liste mit Schriften im Dokument ausgeben
fonts_of_doc.jsx
Link zur Ursprungsdiskussion im Forum
Das Skript ermittelt die im Dokument verwendeten Schriften und gibt sie in einer Textdatei auf dem Schreibtisch als sortierte Liste aus.
Der Name der Textdatei setzt sich zusammen aus dem Präfix 'fonts_of_', dem Namen der betroffenen InDesign-Datei und der Endung '.txt'.
// fonts_of_doc.jsx
//DESCRIPTION:Gibt eine Liste der verwendeten Schriften im Dokument in eine Textdatei auf dem Schreibtisch auf.
// DATE: 11-08-23
if (app.documents.length > 0)
{
var doc_fonts = app.activeDocument.fonts.everyItem().name;
doc_fonts.sort();
var _f = write_file(File('~/Desktop/fonts_of_' + app.activeDocument.name.replace(/\.indd$/i,'') + '.txt'), doc_fonts.join('\r'));
_f.execute();
}
function write_file ( _file, _data )
{
if (! Folder(_file.path).exists)
Folder(_file.path).create();
_file.open( 'w' );
_file.encoding = 'UTF-8';
_file.writeln ( _data );
_file.close();
return (_file);
}
Skript ist lauffähig ab Version CS3
Mit Zeichenformat ausgezeichneten Text als RTF exportieren
exportCollectedFormattedText2RTF.jsx
Nun bin ich auf den Geschmack gekommen, bzw. auf den Gedanken, daß mir noch Eines fehlt:
Ich hätte gerne alle Fundstellen mit Text, der mit einem bestimmten Zeichenformat ausgezeichnet ist, in einer einzigen Datei gesichert.
Das folgende Skript stellt dies zusammen.
Am Anfang jeder Fundstelle steht die Seitenzahl des ersten Zeichens der Fundstelle, sofern sie ermittelt werden kann, gefolgt von einem Doppelpunkt und einem Tabulator (so daß man bei Bedarf leicht eine Tabelle draus erzeugen kann).
Siehe auch
exportFormattedText2RTF.jsx
// exportCollectedFormattedText2RTF.jsx
DESCRIPTION: Mit Zeichenformat ausgezeichneten Text als RTF exportieren
var myStyle = prompt ('Zeichenformat: ', app.activeDocument.characterStyles[-1].name);
var myPath = (app.activeDocument.saved == true)
? app.activeDocument.filePath
: '~/Desktop';
clearFindChangeSettings();
try
{
app.findTextPreferences.appliedCharacterStyle = myStyle;
}
catch (e)
{
alert('Falsches Format angegeben!');
exit();
}
var theResult = app.activeDocument.findText();
var newFrame = app.activeDocument.pages[0].textFrames.add( {geometricBounds:[0, -150, 150, 0], label:'myTF'} ) ;
if ( theResult.length > 0 )
{
for ( var i = 0; i < theResult.length; i++ )
doCollect( theResult[i].texts[0] );
doExport(newFrame.parentStory, myStyle );
newFrame.remove();
alert( 'Fertig!\r' + theResult.length + ' Treffer.' );
}
function doCollect(aText)
{
var aPage = findPage( aText.insertionPoints[0] );
newFrame.parentStory.insertionPoints[-1].appliedCharacterStyle = app.activeDocument.characterStyles[0];
newFrame.parentStory.insertionPoints[-1].clearOverrides();
if (aPage.constructor.name == 'Page' )
newFrame.parentStory.insertionPoints[-1].contents = aPage.name;
newFrame.parentStory.insertionPoints[-1].contents = ':\t';
aText.duplicate( LocationOptions.after, newFrame.parentStory.insertionPoints[-1] );
newFrame.parentStory.insertionPoints[-1].contents = '\r\r';
}
function doExport( aText, aStyle )
{
var aFileName = myPath + '/' +app.activeDocument.name.replace(/\.indd/i, '') + '_' + aStyle + '.rtf';
try
{
aText.exportFile( ExportFormat.RTF, File( aFileName ) );
}
catch (e)
{
alert( aFile + '.rtf konnte nicht überschrieben werden.' );
}
}
function findPage(theObj)
{
var thePage = theObj;
if (thePage.hasOwnProperty("baseline"))
{
thePage = thePage.parentTextFrames[0];
if (thePage == null) {return null }
}
while (thePage.constructor.name != "Page")
{
var whatIsIt = thePage.constructor.name;
switch (whatIsIt)
{
case "Character" :
thePage = thePage.parentTextFrames[0];
break;
case "Spread" :
thePage = thePage.pages[0];
return thePage;
case "Application" :
// must be off page, so ignore
return null;
}
thePage = thePage.parent;
}
return thePage
}
function clearFindChangeSettings()
{
app.findTextPreferences = NothingEnum.nothing;
app.changeTextPreferences = NothingEnum.nothing;
}
Die RTF-Dateien wird im Ordner des Dokuments gesichert (oder auf dem Schreibtisch, falls das Dokument noch nicht gesichert wurde).
Der Dateiname setzt sich zusammen aus dem Namen des Dokuments und dem Namen des Zeichenformats.
Martin Fischer
Skript ist lauffähig ab Version CS3
Mit Zeichenformat ausgezeichneten Text als RTF exportieren
exportFormattedText2RTF.jsx
Das folgende Skript exportiert Text, der mit einem im Dialog anzugebenden Zeichenformat ausgezeichnet ist, im RTF-Format.
// exportFormattedText2RTF.jsx
//DESCRIPTION: exportiert Text, der mit einem im Dialog anzugebenden Zeichenformat ausgezeichnet ist, im RTF-Format:
var myStyle = prompt ('Absatzformat: ', app.activeDocument.characterStyles[-1].name);
var myPath = (app.activeDocument.saved == true)
? app.activeDocument.filePath
: '~/Desktop';
clearFindChangeSettings();
try
{
app.findTextPreferences.appliedCharacterStyle = myStyle;
}
catch (e)
{
alert('Falsches Format angegeben!');
exit();
}
var theResult = app.activeDocument.findText();
if ( theResult.length > 0 )
for ( var i = 0; i < theResult.length; i++ )
doExport( theResult[i].texts[0], i+1, myStyle );
alert( 'Fertig!\r' + theResult.length + ' Treffer.' );
function doExport( aText, aFile, aStyle )
{
var aFileName = myPath + '/' +app.activeDocument.name.replace(/\.indd/i, '') + '_' + aStyle + '_' + aFile + '.rtf';
try
{
aText.exportFile( ExportFormat.RTF,File( aFileName ) );
}
catch (e)
{
alert( aFile + '.rtf konnte nicht überschrieben werden.' );
}
}
function clearFindChangeSettings()
{
app.findTextPreferences = NothingEnum.nothing;
app.changeTextPreferences = NothingEnum.nothing;
}
Skript ist lauffähig ab Version CS3
Problematische Verknüpfungen suchen (-> Verpacken)
findOffendingLinks
Link zur Ursprungsdiskussion im Forum
Seit CS4 herauskam, häufen sich die Berichte, dass die früher zuverlässige Funktion "Verpacken" nicht mehr unbedingt alle Bilder sammelt.
Inoffiziellen Aussagen von Adobe zufolge ist einer der zuverlässigen Auslöser dieses Problems, dass in Bildnamen entweder ein \ oder ein / vorkommt.
Anbei ein einfaches Script, das die Verknüpfungen des aktuellen Dokuments durchsucht, ob so ein Name vorhanden ist.
Kommentare, Änderungswünsche und Bugreports bitte im oben genannten Thread.
if (app.documents.length > 0) main();
function main() {
var theDoc = app.activeDocument;
var aLinks = theDoc.links;
var bFound;
var sOffendingNames = "";
for (var n = 0; n < aLinks.length; n++) {
var sName = aLinks[n].name;
bFound = aLinks[n].name.search(/\/|\|:/);
if (bFound != -1) {
if (File.fs == "Macintosh") sName = sName.replace(":", "/");
sOffendingNames += sName+"\r";
}
}
if (sOffendingNames != "") {
alert("Problematische Linknamen:\r"+sOffendingNames);
}
}
Skript ist lauffähig ab Version CS4
Verpacken per Skript
Backup_Verpacken.jsx
Link zur Ursprungsdiskussion im Forum
Das Skript
Backup_Verpacken.jsx von Holger aka Krings verpackt InDesign-Dateien eines ausgewählten Verzeichnisses und dessen Unterverzeichnissen in namensgleiche Unterverzeichnisse.
// Backup_Verpacken.jsx
//DESCRIPTION: Verpackt InDesign-Dateien eines ausgewählten Verzeichnisses und dessen Unterverzeichnissen in namensgleiche Unterverzeichnisse.
//
// Holger aka Krings
// 9.2.2009
//
// Teil 1: Öffnen
//
fileType = "*.indd";
var topFolder = Folder.selectDialog ("Wähle einen Ordner aus");
inputFileType = prompt("input file type like '*.indd'", fileType);
if(inputFileType != null) { fileType = inputFileType; }
scanSubFolders(topFolder);
function scanSubFolders(tFolder)
{
var sFolders = new Array();
var allFiles = new Array();
sFolders[0] = tFolder;
for (var j = 0; j < sFolders.length; j++) // loop through folders
{
var procFiles = sFolders[j].getFiles();
for (var k=0;k< procFiles.length;k++) // loop through this folder contents
{
if (procFiles[k] instanceof File) allFiles.push(procFiles[k]);
else if (procFiles[k] instanceof Folder) sFolders.push(procFiles[k]);
var letzt = procFiles[k];
var myArray = letzt.name.split(".");
var myLast = myArray.pop();
if (myLast == "indd") {app.open(letzt)};
}
}
}
// Teil 2: Verpacken
do{
if(app.documents.length !=0){
// Name der aktiven Datei
var myDocFullName = app.activeDocument.fullName;
// Ordnername
var myFolderName = String(myDocFullName).replace(/\.indd/,' ');
// Ordner erstellen
var f = new Folder (myFolderName);
f.create();
// Verpacken
app.activeDocument.packageForPrint (f , true, true, true, true, true, true, true);
}
app.activeDocument.close(SaveOptions.NO);
}
while(app.documents.length !=0);
Skript ist lauffähig ab Version CS3
Vorschau Extraktor
previewExtractor.jsx
Link zur Ursprungsdiskussion im Forum
Peter Kahrel hat im Adobe Scripting-Forum das CS4-Skript
previewExtractor.jsx veröffentlicht, mit dem man das Vorschaubild des aktiven InDesign-Dokuments in die Datei 'thumb.jpg' auf dem Schreibtisch sichern kann.
Voraussetzung ist, dass die Voreinstellung 'Vorschaubilder immer mit Dokumentenspeichern' aktiv ist.
Als Autor ist Thomas Nielsen angegeben.
// previewExtractor.jsx
//DESCRIPTION: Sichert das Vorschaubild des aktiven InDesign-Dokuments in die Datei 'thumb.jpg' auf dem Schreibtisch.
/*The Base 64 decoder is from Stephen Ostermiller's site:
http://ostermiller.org/calc/encode.html
Preview extractor from Thomas Nielsen */
file_name = '~/Desktop/thumb.jpg';
var END_OF_INPUT = -1;
var base64Chars = new Array(
'A','B','C','D','E','F','G','H',
'I','J','K','L','M','N','O','P',
'Q','R','S','T','U','V','W','X',
'Y','Z','a','b','c','d','e','f',
'g','h','i','j','k','l','m','n',
'o','p','q','r','s','t','u','v',
'w','x','y','z','0','1','2','3',
'4','5','6','7','8','9','+','/' );
var reverseBase64Chars = new Array();
for (var i=0; i < base64Chars.length; i++){
reverseBase64Chars[base64Chars[i]] = i;
}
function decodeBase64(str){
setBase64Str(str);
var result = "";
var inBuffer = new Array(4);
var done = false;
while (!done && (inBuffer[0] = readReverseBase64()) != END_OF_INPUT && (inBuffer[1] = readReverseBase64()) != END_OF_INPUT){
inBuffer[2] = readReverseBase64();
inBuffer[3] = readReverseBase64();
result += ntos((((inBuffer[0] << 2) & 0xff)| inBuffer[1] >> 4));
if (inBuffer[2] != END_OF_INPUT){
result += ntos((((inBuffer[1] << 4) & 0xff)| inBuffer[2] >> 2));
if (inBuffer[3] != END_OF_INPUT){
result += ntos((((inBuffer[2] << 6) & 0xff) | inBuffer[3]));
} else {
done = true;
}
} else {
done = true;
}
}
return result;
}
function setBase64Str(str){
base64Str = str;
base64Count = 0;
}
function readReverseBase64(){
if (!base64Str) return END_OF_INPUT;
while (true){
if (base64Count >= base64Str.length) return END_OF_INPUT;
var nextCharacter = base64Str.charAt(base64Count);
base64Count++;
if (reverseBase64Chars[nextCharacter]){
return reverseBase64Chars[nextCharacter];
}
if (nextCharacter == 'A')
return 0;
}
return END_OF_INPUT;
}
function ntos(n){
n=n.toString(16);
if (n.length == 1)
n="0"+n;
n="%"+n;
return unescape(n);
}
var myString = app.activeDocument.metadataPreferences.getProperty("http://ns.adobe.com/xap/1.0/","Thumbnails/*[1]/xmpGImg:image");
myString = myString.replace("
", "\n");
jpeg_string = decodeBase64 (myString);
jpeg_file = new File (file_name);
jpeg_file.encoding = 'binary';
jpeg_file.open ('w');
jpeg_file.write (jpeg_string);
jpeg_file.close();
Skript ist lauffähig ab Version CS4
Daten importieren
Automatische Platzierung von ausgewählten Word-, PDF- und InDesign-Dateien
placeSelectedFiles.as
In
InDesign-Dok's platzieren wie automatischer Textfluss in CS3 wurde eine Möglichkeit angefragt, InDesing CS3 Dokumente automatisch zu platzieren.
Das folgende AppleScript platziert ausgewählte Word-Dateien (alle Dateien mit automatischen Textfluß), PDF-Dateien (alle Seiten) und CS3-Dateien (alle Seiten).
-- placeSelectedFiles.as
--
tell application "Adobe InDesign CS3"
set myDoc to active document
set myunsortedFiles to choose file with multiple selections allowed
set user interaction level of script preferences to never interact
tell myDoc
set myFiles to my sort(myunsortedFiles)
repeat with myCounter from 1 to length of myFiles
set oneFile to item myCounter of myFiles
tell application "Finder"
set x to file (item myCounter of myFiles)
set myExt to name extension of file oneFile
set myFileType to file type of file oneFile
end tell
set myLastPage to last page of myDoc
if (count of page item of myLastPage) > 0 then
set myLastPage to make page
end if
if myFileType is "PDF " or myExt is "PDF" then
my myPlacePDF(myDoc, myLastPage, oneFile)
else if myFileType is "IDd4" or myExt is "indd" then
my myPlaceIndd(myDoc, myLastPage, oneFile)
else if myFileType is "W8BN" or myExt is "doc" then
my myPlaceDoc(myDoc, myLastPage, oneFile)
else
my myPlaceFile(myDoc, myLastPage, oneFile)
end if
end repeat
end tell
set user interaction level of script preferences to interact with all
end tell
on sort(the_list)
set old_delims to AppleScript's text item delimiters
set AppleScript's text item delimiters to {ASCII character 10} ¬
-- always a linefeed
set list_string to (the_list as string)
set new_string to do shell script "echo " & quoted form of list_string ¬
& " | sort -f"
set new_list to (paragraphs of new_string)
set AppleScript's text item delimiters to old_delims
return new_list
end sort
on myPlaceFile(myDocument, myPage, myPfile)
tell application "Adobe InDesign CS3"
tell myDocument
try
set myPfilePage to place myPfile on myPage
on error
display dialog "Problem mit " & myPfile
end try
end tell
end tell
end myPlaceFile
on myPlaceDoc(myDocument, myPage, myDoc)
tell application "Adobe InDesign CS3"
tell myDocument
set myLeftMargin to left of (margin preferences of last page)
set myTopMargin to top of (margin preferences of last page)
place myDoc on myPage place point {myLeftMargin, myTopMargin} with autoflowing without showing options
end tell
end tell
end myPlaceDoc
on myPlaceIndd(myDocument, myPage, myINDD)
tell application "Adobe InDesign CS3"
set myDone to false
set myCounter to 1
repeat until myDone is true
tell myDocument
if myCounter > 1 then
set myPage to make page at after myPage
end if
end tell
set x to imported page attributes
set page number of imported page attributes to myCounter
get page number of imported page attributes
tell myPage
set myINDDPage to place myINDD
set myINDDPage to item 1 of myINDDPage
end tell
if myCounter = 1 then
set myFirstPage to page number of myINDDPage
else
if page number of myINDDPage = myFirstPage then
tell myPage to delete
set myDone to true
end if
end if
set myCounter to myCounter + 1
end repeat
end tell
end myPlaceIndd
on myPlacePDF(myDocument, myPage, myPDF)
tell application "Adobe InDesign CS3"
set myDone to false
set myPlacePoint to {0, 0}
set PDF crop of PDF place preferences to crop media
set myCounter to 1
repeat until myDone is true
tell myDocument
if myCounter > 1 then
set myPage to make page at after myPage
end if
end tell
set page number of PDF place preferences to myCounter
get page number of PDF place preferences
tell myPage
set myPDFPage to place myPDF place point myPlacePoint
set myPDFPage to item 1 of myPDFPage
end tell
get properties of PDF attributes of myPDFPage
if myCounter = 1 then
set myFirstPage to page number of PDF attributes of myPDFPage
else
if page number of PDF attributes of myPDFPage = myFirstPage then
tell myPage to delete
set myDone to true
end if
end if
set myCounter to myCounter + 1
end repeat
end tell
end myPlacePDF
on myGetPageNames(myDocument)
tell application "Adobe InDesign CS3"
set myPageNames to {}
repeat with myCounter from 1 to (count pages of myDocument)
copy name of page myCounter of myDocument to end of myPageNames
end repeat
return myPageNames
end tell
end myGetPageNames
Das Skript ist eine Baustelle und könnte gelegentlich auch für andere Formate ausgebaut werden.
Skript ist lauffähig ab Version CS3
Alle Seiten einer externen InDesign-Datei platzieren/importieren
PlaceMultipageINDD.jsx
Link zur Ursprungsdiskussion im Forum
Platziert alle Seiten einer ausgewählten InDesign-Datei in einem geöffneten oder einem neuen Dokument.
Bei Import in ein geöffnetes Dokument ist die Wahl der ersten Seite, ab der die importierten InDesign-Seiten platziert werden sollen, möglich.
Das Skript ist eine Modifikation des Beispielskripts
PlaceMultipagePDF.jsx von Adobe.
//PlaceMultipageINDD.jsx
//
//An InDesign CS3 JavaScript
//Based on Adobe Sample Script PlaceMultipagePDF.jsx
//
//DESCRIPTION:Places all of the pages of a multi-page INDD.
//
//
//Display a standard Open File dialog box.
var myINDDFile = File.openDialog("Choose an InDesign File");
if((myINDDFile != "")&&(myINDDFile != null)){
var myDocument, myPage;
if(app.documents.length != 0){
myDocument, myNewDocument = myChooseDocument();
}
else{
myDocument = app.documents.add();
myNewDocument = false;
}
if(myNewDocument == false){
myPage = myChoosePage(myDocument);
}
else{
myPage = myDocument.pages.item(0);
}
myPlaceINDD(myDocument, myPage, myINDDFile);
}
function myChooseDocument(){
var myDocumentNames = new Array;
myDocumentNames.push("New Document");
//Get the names of the documents
for(var myDocumentCounter = 0;myDocumentCounter < app.documents.length; myDocumentCounter++){
myDocumentNames.push(app.documents.item(myDocumentCounter).name);
}
var myChooseDocumentDialog = app.dialogs.add({name:"Choose a Document", canCancel:false});
with(myChooseDocumentDialog.dialogColumns.add()){
with(dialogRows.add()){
with(dialogColumns.add()){
staticTexts.add({staticLabel:"Place INDD in:"});
}
with(dialogColumns.add()){
var myChooseDocumentDropdown = dropdowns.add({stringList:myDocumentNames, selectedIndex:0});
}
}
}
myChooseDocumentDialog.show();
if(myChooseDocumentDropdown.selectedIndex == 0){
myDocument = app.documents.add();
myNewDocument = true;
}
else{
myDocument = app.documents.item(myChooseDocumentDropdown.selectedIndex-1);
myNewDocument = false;
}
myChooseDocumentDialog.destroy();
return myDocument, myNewDocument;
}
function myChoosePage(myDocument){
var myPageNames = new Array;
//Get the names of the pages in the document
for(var myCounter = 0; myCounter < myDocument.pages.length;myCounter++){
myPageNames.push(myDocument.pages.item(myCounter).name);
}
var myChoosePageDialog = app.dialogs.add({name:"Choose a Page", canCancel:false});
with(myChoosePageDialog.dialogColumns.add()){
with(dialogRows.add()){
with(dialogColumns.add()){
staticTexts.add({staticLabel:"Place INDD on:"});
}
with(dialogColumns.add()){
var myChoosePageDropdown = dropdowns.add({stringList:myPageNames, selectedIndex:0});
}
}
}
myChoosePageDialog.show();
var myPage = myDocument.pages.item(myChoosePageDropdown.selectedIndex);
myChoosePageDialog.destroy();
return myPage;
}
function myPlaceINDD(myDocument, myPage, myINDDFile){
var myINDDPage;
var myCounter = 1;
var myBreak = false;
while(myBreak == false){
if(myCounter > 1){
myPage = myDocument.pages.add(LocationOptions.after, myPage);
}
app.importedPageAttributes.pageNumber = myCounter;
myINDDPage = myPage.place(File(myINDDFile), [0,0])[0];
if(myCounter == 1){
var myFirstPage = myINDDPage.pageNumber;
}
else{
if(myINDDPage.pdfAttributes.pageNumber == myFirstPage){
myPage.remove();
myBreak = true;
}
}
myCounter = myCounter + 1;
}
}
Skript ist lauffähig ab Version CS3
Dokumente einrichten
Bibliotheksobjekt anhand Selektion benennen
updateNameInLibrary
Link zur Ursprungsdiskussion im Forum
Im Forum tauchte der Wunch auf, dass ein Bibliotheksobjekt automatisch den Namen eines Bildes im Layout bekommt.
Statt dass das nur beim Erstellen passiert, habe ich ein Script geschrieben, das dem markierten Bibliothekselement einen aus den markierten Bildern und Textrahmen ausgelesenen Namen geben kann.
Das funktioniert also in mindestens zwei Szenarien:
- einige Objekte wurden der Bibliothek hinzugefügt und ohne, dass die Auswahl verändert wurde, wird das Script gestartet.
- ein Bibliotheksobjekt wurde aktualisiert und ohne, dass die Auswahl verändert wurde, wird das Script gestartet.
- ein Teillayout mit Bild wird in die Bibliothek aufgenommen, dann markiert man den Textrahmen mit der Creditzeile und startet das Script.
Das Script liegt als
CS3-jsxbin im Premiumbereich.
Skript ist lauffähig ab Version CS3
Buch erstellen mit InDesign-Dateien eines ausgewählten Verzeichnisses
bookOfSelectedFolder.jsx
Link zur Ursprungsdiskussion im Forum
Das Skript erstellt ein Buch mit InDesign-Dateien eines ausgewählten Verzeichnisses.
Ist ein gesichertes Dokument geöffnet, dann gilt dessen Fundort als Voreinstellung für das auszuwählende Verzeichnis.
Standardmäßig werden nur die InDesign-Dateien im ausgewählten Verzeichnis aufgenommen (
var myScanSubfolders = false; // Unterverzeichnisse nach INDD durchsuchen).
Um auch InDesign-Dateien in Unterverzeichnissen zu berücksichtigen, kann die genannte Zeile durch folgende ersetzt werden:
var myScanSubfolders = true; // Unterverzeichnisse nach INDD durchsuchen.
// bookOfSelectedFolder.jsx
//DESCRIPTION: Erstellt ein Buch und fügt die Dateien des ausgewählten Ordners ein.
var myPrefix = ''; //'Buch_';
var myScanSubfolders = false; // Unterverzeichnisse nach INDD durchsuchen
var myErrors = new Array;
var myPreset = getPreset(myPrefix);
var myResult = getFolderAndFiles(myPrefix, myPreset);
if ( myResult.files.length > 0 )
var myBook = addBook(myResult.folder, myResult.files, myPrefix);
if (myErrors.length > 0)
alert('Fehler!\r' + myErrors.join('\r'));
// -----------------------------------------------------------------
// Vorauswahl (ggf. Pfad des aktiven Dokuments)
// -----------------------------------------------------------------
function getPreset(myPrefix)
{
if (Number(String(app.version).substr(0,1) <= 4))
errorExit('Fehler!\rDas Skript erfordert Indesign CS3 oder höher.');
var aNote = '';
var aPreset1 = null;
// Aktives Dokument vorhanden und gesichert
if (app.documents.length > 0 && app.documents.firstItem().saved == true)
{
var myDocFP = app.documents.firstItem().filePath;
aPreset1 = myDocFP;
aPreset2 = myDocFP.parent;
// Buchdatei im Pfad des aktiven Dokuments vorhanden
if ( File(myDocFP + '/' + myPrefix + aPreset2.name + '_' + aPreset1.name + '.indb').exists == true )
aNote = '\r(Buch in Pfad von ' + app.documents.firstItem().name + ' bereits vorhanden)';
}
return {path:aPreset1, note:aNote};
}
// -----------------------------------------------------------------
// Auswahl Verzeichnis und Datei
// -----------------------------------------------------------------
function getFolderAndFiles(myPrefix, myPreset)
{
// Dialog zur Auswahl des Verzeichnisses
if (myPreset.path == null) myPreset.path = undefined;
var theFolder = Folder.selectDialog( "Verzeichnis mit Dokumenten für's Buch auswählen:" + myPreset.note, myPreset.path );
if( theFolder == null )
exit(); // Abbruch
// Indesign-Dateien des Verzeichnisses
if (myScanSubfolders == true)
{
var theFiles = scanSubFolders(theFolder)[0];
}
else
var theFiles = theFolder.getFiles( "*.indd" );
return {folder: theFolder, files: theFiles};
}
function addBook (myFolder, myFiles, myPrefix)
{
var myBookFilePath = myFolder + "/"+ myPrefix + myFolder.parent.name + '_' + myFolder.name + ".indb";
var myBookFile = checkExist(File(myBookFilePath), myFolder, myPrefix);
//Buch erzeugen
aBook = app.books.add( myBookFile );
aBook.automaticPagination = false; // automatische Seitennumerierung abschalten
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.neverInteract;
// Dokumente hinzufügen
for ( var i = 0; i < myFiles.length; i++ )
try
{
aBook.bookContents.add( myFiles[i] );
}
catch(e)
{
myErrors.push( myFiles[i].name + ': Dokument lässt sich nicht hinzufügen.')
}
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;
if (aBook.bookContents.length > 0)
aBook.save( );
else
{
aBook.close(SaveOptions.NO);
myBookFile.remove();
}
return aBook;
}
// -----------------------------------------------------------------
// Buchdatei bereits vorhanden?
// -----------------------------------------------------------------
function checkExist(aFile, myFolder, myPrefix)
{
while ( aFile.exists == true )
{
var newName = prompt ('Fehler: Buchdatei bereits vorhanden.', aFile.name.replace(/%20/gi,' '));
if (newName == null)
exit();
aFile = File(myFolder + '/' + newName);
}
return aFile
}
function errorExit( aMessage )
{
myErrors.unshift(aMessage)
alert( myErrors.join('\r'));
exit();
}
// -----------------------------------------------------------------
// Unterordner durchsuchen
// -----------------------------------------------------------------
function scanSubFolders(tFolder)
{
var sFolders = new Array();
var inddFiles = new Array();
sFolders[0] = tFolder;
for (var j = 0; j < sFolders.length; j++) // loop through folders
{
var procFiles = sFolders[j].getFiles( );
for (var k=0;k< procFiles.length;k++) // loop through this folder contents
{
if (procFiles[k] instanceof File && procFiles[k].name.substr(procFiles[k].name.length-5,5) == '.indd') inddFiles.push(procFiles[k]);
else if (procFiles[k] instanceof Folder) sFolders.push(procFiles[k]);
}
}
return [inddFiles,sFolders];
}
Skript ist lauffähig ab Version CS3
Grundlinienraster einrichten
adjustGrid_CS3.jsx
Link zur Ursprungsdiskussion im Forum
Das Skript richtet die erste Grundlinie und die Einteilungen des Grundlinienrasters in Abhängigkeit von einem ausgewählten Textrahmen oder Text ein.
Bezug
Bei einem ausgewählten Textrahmen dient dessen erste Zeile als Bezugszeile.
Ist der Cursor im Text platziert oder ist Text ausgewählt, dann dient der (erste) Einfügepunkt bzw. der Anfang der Textauswahl als Bezug.
Diese Version unterstützt die Orientierung des Grundlinenrasters sowohl am
oberen Seitenrand und am
oberen Rand.
Beginn des Grundlinienrasters
Normalerweise beginnt das Grundlinienraster an der Bezugszeile (s.o.).
Ist der Bezug des Grundlinienrasters jedoch auf den
oberen Seitenrand eingestellt, erscheint bei der Ausführung des Skripts ein Dialog zur Eingabe eines Zeilenversatzes der ersten Grundlinie relativ zur Auswahl.
- Mit der Standardeinstellung von -2 Zeilen lässt sich etwa erreichen, dass das Grundlinienraster zwei Zeilen oberhalb der Auswahl beginnt (dies könnte z.B. zur Einrichtung von Kolumnentiteln, die außerhalb des Satzspiegels im Grundlinienraster liegen sollen, hilfreich sein).
- Mit der Einstellung von 0 Zeilen beginnt das Grundlinienraster an der Bezugszeile.
Einteilung
Die Einteilung des Grundlinienrasters ist abhängig von der Auswahl und entspricht im Regelfall der Höhe einer Zeile. Ausnahme: mehrere Textzeilen sind ausgewählt.
1. Ist ein Textrahmen ausgewählt, entspricht die Einteilung des Zeilenrasters der Höhe der ersten Textzeile.
2. Blinkt die Einfügemarke, entspricht die Einteilung des Zeilenrasters der Höhe der Zeile, in welcher sich die Einfügemarke befindet.
3. Sind
mehrere Textzeilen ausgewählt, so definiert die Zahl der ausgewählten Zeilen den Teiler der Einteilung:
? eine Zeile → Einteilung = eine Zeile
? zwei Zeilen → Einteilung = eine halbe Zeile
? drei Zeilen → Einteilung = eine Drittelzeile
? ?
Damit ist etwa die Einrichtung eines halbzeiligen Rasters möglich, um nach Absätzen (wie z.B. Überschriften), die
nicht im einzeiligen Zeilenraster liegen, bei entsprechenden Absatzformateigenschaften auf der nächsten halben Zeile zu landen.
//adjustGrid_CS3.jsx
//DESCRIPTION:Einrichtung des Grundlinienrasters auf der Basis des Zeilenabstands des ausgewählten Textes
//Author: Martin Fischer
Object.prototype.isText = function()
{
switch(this.constructor.name)
{
case "InsertionPoint":
case "Character":
case "Word":
case "TextStyleRange":
case "Line":
case "Paragraph":
case "TextColumn":
case "Text":
case "TextFrame":
return true;
default :
return false;
}
}
if (app.selection.length > 0 && app.selection[0].isText())
{
var myDoc = app.documents.firstItem();
var mySel = app.selection[0];
var myProps = storeProps(myDoc);
myDoc.viewPreferences.pointsPerInch = 72;
myDoc.zeroPoint = [0,0];
// Punkte als Maßeinheit
myDoc.viewPreferences.verticalMeasurementUnits
= myDoc.viewPreferences.horizontalMeasurementUnits = MeasurementUnits.POINTS;
var myFirstBaseline = mySel.insertionPoints[0].baseline;
var myFactor = (mySel.constructor.name == 'TextFrame' || mySel.lines.length == 0)
? 1
: mySel.lines.length;
// Ermittlung des Zeilenabstands
var myLeading = ( mySel.insertionPoints[0].leading == Leading.AUTO )
? mySel.insertionPoints[0].pointSize * mySel.insertionPoints[0].autoLeading / 100
: Number ( mySel.insertionPoints[0].leading );
if (myLeading)
{
// Beginn des Grundlinienrasters
if (myDoc.gridPreferences.baselineGridRelativeOption == BaselineGridRelativeOption.TOP_OF_PAGE_OF_BASELINE_GRID_RELATIVE_OPTION)
{
var myOffset = prompt('Zeilenversatz: ', -2);
if (isNaN(myOffset))
myOffset = 0;
myDoc.gridPreferences.baselineStart = myFirstBaseline + myOffset * myLeading;
}
else
{
myDoc.gridPreferences.baselineStart = myFirstBaseline - findPage(mySel.insertionPoints[0]).marginPreferences.top;
}
// Einteilung des Grundlinienrasters
myDoc.gridPreferences.baselineDivision = (myLeading / myFactor < 1)
? myLeading
: myLeading / myFactor;
}
restoreProps(myProps);
myDoc.gridPreferences.baselineGridShown = true;
}
function storeProps (myDoc)
{
return {
ppi:myDoc.viewPreferences.pointsPerInch,
zeroPoint:myDoc.zeroPoint,
verticalMeasurementUnits:myDoc.viewPreferences.verticalMeasurementUnits,
horizontalMeasurementUnits:myDoc.viewPreferences.horizontalMeasurementUnits
}
}
function restoreProps (myProps)
{
myDoc.viewPreferences.pointsPerInch = myProps.ppi;
myDoc.viewPreferences.verticalMeasurementUnits = myProps.verticalMeasurementUnits;
myDoc.viewPreferences.horizontalMeasurementUnits = myProps.horizontalMeasurementUnits;
myDoc.zeroPoint = myProps.zeroPoint;
}
function findPage(theObj)
{
var thePage = theObj;
if (thePage.hasOwnProperty("baseline"))
{
thePage = thePage.parentTextFrames[0];
if (thePage == null) {return null }
}
while (thePage.constructor.name != "Page")
{
var whatIsIt = thePage.constructor.name;
switch (whatIsIt)
{
case "Character" :
thePage = thePage.parentTextFrames[0];
break;
case "Spread" :
thePage = thePage.pages[0];
return thePage;
case "Application" :
// must be off page, so ignore
return null;
}
thePage = thePage.parent;
}
return thePage
}
Skript ist lauffähig ab Version CS3
drei kleine Helferlein beim Sichern von geöffneten Dokumenten (1/3)
saveOpenDocs.jsx
Link zur Ursprungsdiskussion im Forum
Dieses Skript sichert alle geöffneten Dokumente erneut unter ihrem aktuellen Namen (wie "Sichern unter"). Damit wird die Undo-Liste zurückgesetzt und die Dateigröße der Dokumente reduziert. Es werden nur Dokumente berücksichtigt, die bereits einmal gesichert worden sind.
// saveOpenDocs.jsx
//DESCRIPTION: Sichert alle geöffneten Dokumente und reduziert ihre Dateigröße
var myDocs = app.documents;
var unsavedDocs = 0;
for (oneDoc = 0; oneDoc < myDocs.length; oneDoc++) {
if (myDocs[oneDoc].saved == true) {
myDocs[oneDoc].save(myDocs[oneDoc].fullName);
}
else {
unsavedDocs += 1;
}
}
if (unsavedDocs > 0) alert (unsavedDocs + " Dokument(e) nicht gesichert!")
Skript ist lauffähig ab Version CS2
drei kleine Helferlein beim Sichern von geöffneten Dokumenten (2/3)
OpenDocs2INX.jsx
Link zur Ursprungsdiskussion im Forum
Dieses Skript ist eine Abwandlung von
saveOpenDocs.jsx.
Es exportiert alle geöffneten Dokumente im Austauschformat. Damit wird quasi eine Kopie der geöffneten Dokumente mit reduzierter Dateigröße erstellt. Es werden nur Dokumente berücksichtigt, die bereits einmal gesichert worden sind.
// OpenDocs2INX.jsx
//DESCRIPTION: Exportiert alle geöffneten Dokumente im InDesign Austauschformat
var myDocs = app.documents;
var unsavedDocs = 0;
for (oneDoc = 0; oneDoc < myDocs.length; oneDoc++) {
if (myDocs[oneDoc].saved == true) {
var myFileName = myDocs[oneDoc].fullName.fullName.replace(/\.indd$/i, "") + ".inx";
myDocs[oneDoc].exportFile(ExportFormat.indesignInterchange, File(myFileName));
}
else {
unsavedDocs += 1;
}
}
if (unsavedDocs > 0) alert (unsavedDocs + " Dokument(e) nicht exportiert!")
Skript ist lauffähig ab Version CS2
drei kleine Helferlein beim Sichern von geöffneten Dokumenten (3/3)
INX_Export.jsx
Link zur Ursprungsdiskussion im Forum
Dieses Skript exportiert das aktuelle Dokument unter seinem aktuellen Namen (+ ".inx") im Austauschformat, sofern es einmal gesichert wurde.
// INX_Export.jsx
if (app.activeDocument.saved == false)
exit();
var myFileName = app.activeDocument.fullName.fullName.replace(/\.indd$/i, "") + ".inx";
app.activeDocument.exportFile(ExportFormat.indesignInterchange, File(myFileName));
Skript ist lauffähig ab Version CS2
Skriptgenerator für Skripte, die Ebenen ein-/ausblenden
EbenensperrenSkriptgenerator.jsx
Hier ein abgewandelter Skriptgenerator für Skripte, die Ebenen sperren/entsperren:
// EbenensperrenSkriptgenerator.jsx
var myPath = getScriptDir();
var myLayers = app.documents[0].layers;
for (oneLayer = 0; oneLayer < myLayers.length; oneLayer++)
{
var myData = "var myLayer = \'"
+ myLayers[oneLayer].name
+ "\';\r"
+ "app.activeDocument.layers.item(myLayer).locked = "
+ "!app.activeDocument.layers.item(myLayer).locked;";
exportTXT( myData, myPath, "Ebene_" + myLayers[oneLayer].name + ".jsx");
}
function exportTXT( aData, aFolderName, aFileName )
{
aCreator = "R*ch";
aType = "UTF-8";
aPath = aFolderName + "/" + aFileName;
aFile = new File( aPath);
aFile.open( 'w', aType, aCreator );
aFile.write( aData );
aFile.close();
}
function getScriptDir() {
try {
return File( app.activeScript ).path
}
catch( e ) {
return File( e.fileName ).path
}
}
Hallo Martin,
Hab den Ebenensichtbarkeitsskriptgenerator ;-) gerade selbst gebraucht
und mal ausprobiert und wollte nur sagen: Genial! :-) Danke.
MfG,
Sacha
Skript ist lauffähig ab Version CS2
Musterseitenobjekte gezielt lösen
releaseFromMP
Link zur Ursprungsdiskussion im Forum
Was die Script machen...
Die Grundidee: Man gibt einzelnen, selektierten Objekten auf der Musterseite einen "Marker". Auf der Dokumentseite können alle Objekte, die diesen Marker tragen, von der Musterseite gelöst werden. So braucht man nicht Ebenen abzuschließen etc.
releaseFromMP-marker.jsxbin: Dieses Script geht davon aus, dass auf der Musterseite einzelne Objekte markiert sind und klebt diesen den erwähnten Marker an.
releaseFromMP-demarker.jsxbin: Falls man sich geirrt hat, nimmt dieses Script den Marker wieder weg.
releaseFromMP-showItems.jsxbin: Falls man sich nicht sicher ist, welche Objekte schon gemarkert sind, wählt dieses Script alle entsprechenden Objekt aus.
releaseFromMP-releaseOnePage.jsxbin: Dieses Script löst alle gemarkerten Musterseitenobjekte auf dem aktuellen Druckbogen.
releaseFromMP-releaseAllPages.jsxbin: Dieses Script löst alle gemarkerten Musterseitenobjekte im gesamten Dokument.
Das Script im Premiumbereich
Skript ist lauffähig ab Version CS3
Zusammenfügen mehrer Dokumente zu einem Dokument
MMS_mergeDocuments.jsxbin
Link zur Ursprungsdiskussion im Forum
Das Skript fügt mehrere Dokumente zusammen.
Was normalerweise nur über Drag&Drop (über die Seitenpalette) seitenweise gemacht werden kann, macht dieses Skript automatisch.
Wählen Sie das Zieldokument und die Quelldokumente.
Anschliessend werden alle Quelldokumente an das Zieldokument angehängt. Stile bleiben dabei erhalten und werden in das Zieldokument eingefügt.
Mit freundlichen Grüßen,
Marc Sidon
------------------------------------------
modernmediasidon
Erstellung von InDesign Scripts
Das Skript kann hier heruntergeladen werden:
MMS_mergeDocuments.jsxbin (8.28 KB)
Skript ist lauffähig ab Version CS3
Farbe
cmyk farben in cmy
cmyk2cmy.jsx
Link zur Ursprungsdiskussion im Forum
Dieses Skript versucht den Schwarz-Anteil aus CMYK-Farben herauszulöschen.
//cmyk2cmy.jsx
//DESCRIPTION:Schwarz-Anteil aus CMYK-Farben löschen.
var myCols = app.activeDocument.colors;
for ( var i = 0; i < myCols.count(); i++ )
{
if (myCols.item(i).space == ColorSpace.CMYK)
{
var oldVal = myCols.item(i).colorValue;
if (oldVal[3] != 0)
{
var newVal = [oldVal[0], oldVal[1], oldVal[2], 0];
try
{
myCols.item(i).insertLabel('oldColorValue', oldVal.join());
myCols.item(i).colorValue = newVal;
} catch(e){}
}
}
}
Skript ist lauffähig ab Version CS4
Eingebettete ICC-Profile von Bildern ermitteln
embedded_icc-profiles_of_images.jsx
Link zur Ursprungsdiskussion im Forum
Ermittelt die Namen der eingebetteten ICC-Profile und gibt sie (mit den Bildnamen) in einem Dialog aus.
Achtung!
Das Skript ist wg. einem eingebetteten AppleScript (mit shell Befehl) Mac-only
und läuft nicht unter Windows.
/*
embedded_icc-profiles_of_images.jsx
//DESCRIPTION:Ermittelt die Namen der eingebetteten ICC-Profile und gibt sie (mit den Bildnamen) in einem Dialog aus.
VERSION: 0.1
AUTHOR: Martin Fischer
EMAIL: InDesign@MartinFischer.de
DATE: 13.1.2017
© Martin Fischer 2017
*/
if (app.documents.length == 0)
error_exit('Achtung!\nBitte öffnen Sie eine InDesign-Datei.');
if ($.os.substr(0,9) != 'Macintosh')
error_exit('Achtung!\nDas Skript läuft nur auf einem Mac.');
var doc = app.documents.firstItem(), fp, i = 0, iccprofile,
grf = doc.allGraphics,
arr = new Array;
for (i = 0; i < grf.length; i++)
{
if (grf[i].hasOwnProperty('itemLink') && grf[i].itemLink != null)
{
fp = File(grf[i].itemLink.filePath);
if (fp.exists)
{
iccprofile = get_iccprofile(fp.fsName);
arr.push(grf[i].itemLink.name + ':\t' + iccprofile);
}
}
}
alert('ICC-Profile\n' + arr.join('\n'));
function get_iccprofile(fp)
{
var icc, myAppleScript = '';
myAppleScript += 'try\r';
myAppleScript += 'set pathImmagine to "' + fp + '"\r';
myAppleScript += 'set profileName to do shell script "sips -g profile " & quoted form of (POSIX path of pathImmagine) & " | fgrep profile | sed \'s/ profile: //g\'"\r';
myAppleScript += 'on error msg number errnum\r';
myAppleScript += 'set profileName to "ND"\r';
myAppleScript += 'end try\r';
icc = app.doScript(myAppleScript, ScriptLanguage.APPLESCRIPT_LANGUAGE);
return icc;
}
function error_exit(message)
{
if (arguments.length > 0)
alert(message);
exit();
}
Skript ist lauffähig ab Version CS6
Farben reduzieren / Duplikate entfernen
reduce_colors.jsx
Das Skript findet und reduziert Farben die EXAKT GLEICH sind, oder auch ÄHNLICH NACH SCHWELLENWERT sind.
Sie können den Schwellenwert eingeben, mit dem das Skript eine Farbe als ähnlich finden und diese auf eine Farbe reduzieren soll. Standard ist 1% Abweichung. Eine Farbe mit weniger als 1% Abweichung pro Farbkanal wird als Ähnlich erkannt und durch das erste Vorkommnis der Farbe ersetzt. Ein Wert von 0% findet nur exakte Farbduplikate und reduziert diese auf das erste Vorkommnis.
Ein Beispiel [C35 M46 Y57 K68] ist ähnlich wie [C34 M45 Y58 K69] und würde ersetzt, denn keiner der Kanäle unterscheidet sich mehr als ein Prozent. Hingegen [C34 M45 Y58 K70] ist als andere Farbe erkannt und würde erhalten bleiben, denn der Schwarz-Kanal weicht um 2% ab.
Das Skript ignoriert MixedInk-, Tint-, Gradient-, und die Standart-Farbfelder "Papier", "Schwarz", "Passermarken" und "[Ohne]". Es vergleicht nur Prozess- mit Prozess-, und Vollton- mit Vollton-Farben.
Selbstverständliche ist vor Anwendung des Skriptes ein Testlauf in einer Kopie des Dokumentes angeraten.
/*
reduce_colors.jsx
version: 0.1.3
by Stephan Möbius, April 2009
Tested in Indesing CS4
This InDesign JavaScript will find and delete/replace Swatches which are _NEARLY_ identical.
You can adjust the threshold percentage by which it considers a color similar. Default is 1%.
A color must differ as much as 1% IN EACH CHANNEL SEPERATLY to be considered different:
Example: [C35 M46 Y57 K68] is similar to [C34 M45 Y58 K69] and would be deleted. None
of the channels differs more then 1%. However [C34 M45 Y58 K70] is different because the
Black channel differs 2%.
The script will ignore MixedInk-, Tint-, Gradient-, and the Default-Swatches "Paper", "Black",
"Registration" and "None". It will compare Process to Process, and Spot to Spot Colors only .
*/
/* #########################################*/
/* Similarity threshold 1 = 1% */
/* Threshhold 0 will remove all exact colordupes */
var myTH = prompt("Similarity threshold (1 = 1% per channel):", 1, "Reduce Colors v013");
/* ######################################## */
var myDocument = app.activeDocument;
var myTotalSwatches = myDocument.swatches.count();
var mySs = myDocument.swatches;
var myS; /* Current Swatch */
var myC; /* Compare Swatch */
var mySErrors = new Array(); /* array of swatches that could not be removed/replaced/switched */
var myErrorReport = new String;
var myReport = new String;
var myNumDeleted = 0;
for (i = 0; i < myTotalSwatches; i++)
{
myS = mySs.item(i);
if ( myS.name == 'None' || myS.name == 'Paper' || myS.name == 'Black' || myS.name == 'Registration' ) continue; /* if it's one of the undeletable default swatches ignore */
if ( myS.hasOwnProperty('type')) continue; /* if it's a gradient swatch ignore */
if ( myS.hasOwnProperty('tintValue')) continue; /* if it's a tint swatch ignore */
if ( myS.model == ColorModel.MIXEDINKMODEL ) continue; /* if it's a mixed ink swatch ignore */
for (j = i+1; j < myTotalSwatches; j++)
{
myC = mySs.item(j);
if ( myC.name == 'None' || myC.name == 'Paper' || myC.name == 'Black' || myC.name == 'Registration' ) continue;
if ( myC.hasOwnProperty('type')) continue;
if ( myC.hasOwnProperty('tintValue')) continue;
if ( myC.model == ColorModel.MIXEDINKMODEL ) continue;
// alert(myC.properties.toSource());
// alert(i + ' ' + myS.name + ' // ' + j + ' ' + myC.name);
try {
/* Run only when colormodels match. Both need to be either PROCESS or both SPOT */
if (myS.model == myC.model) {
/* If both are CMYK */
if (myC.space == ColorSpace.cmyk && myS.space == ColorSpace.cmyk)
{
// alert('1: ' + myS.colorValue[0] + ' ' + myS.colorValue[1] + ' ' + myS.colorValue[2] + ' ' + myS.colorValue[3] + ' 2:' + myC.colorValue[0] + ' ' + myC.colorValue[1] + ' ' + myC.colorValue[2] + ' ' + myC.colorValue[3]);
if ( Math.abs(myC.colorValue[0]-myS.colorValue[0]) <= myTH && Math.abs(myC.colorValue[1]-myS.colorValue[1]) <= myTH && Math.abs(myC.colorValue[2]-myS.colorValue[2]) <= myTH && Math.abs(myC.colorValue[3]-myS.colorValue[3]) <= myTH )
{
// alert('MATCH CMYK');
/* remove compare-swatch and replace with current-swatch */
myReport += myC.name + ' [' + Math.round(myC.colorValue[0]) + ' ' + Math.round(myC.colorValue[1]) + ' ' + Math.round(myC.colorValue[2]) + ' ' + Math.round(myC.colorValue[3]) + '] > ' + myS.name + ' [' + Math.round(myS.colorValue[0]) + ' ' + Math.round(myS.colorValue[1]) + ' ' + Math.round(myS.colorValue[2]) + ' ' + Math.round(myS.colorValue[3]) +'] \n';
myC.remove(myS);
myNumDeleted += 1;
/* reset loop to start over after one swatch got deleted */
myTotalSwatches = myDocument.swatches.count();
j = j - 1;
continue;
}
} /* end if CMYK */
/* If both are RGB */
if (myC.space == ColorSpace.rgb && myS.space == ColorSpace.rgb)
{
// alert('1: ' + myS.colorValue[0] + ' ' + myS.colorValue[1] + ' ' + myS.colorValue[2] + ' 2:' + myC.colorValue[0] + ' ' + myC.colorValue[1] + ' ' + myC.colorValue[2]);
if ( Math.abs(myC.colorValue[0]-myS.colorValue[0])/2.55 <= myTH && Math.abs(myC.colorValue[1]-myS.colorValue[1])/2.55 <= myTH && Math.abs(myC.colorValue[2]-myS.colorValue[2])/2.55 <= myTH )
{
// alert('MATCH RGB');
myReport += myC.name + ' [' + Math.round(myC.colorValue[0]) + ' ' + Math.round(myC.colorValue[1]) + ' ' + Math.round(myC.colorValue[2]) + '] > ' + myS.name + ' [' + Math.round(myS.colorValue[0]) + ' ' + Math.round(myS.colorValue[1]) + ' ' + Math.round(myS.colorValue[2]) +'] \n';
myC.remove(myS);
myNumDeleted += 1;
myTotalSwatches = myDocument.swatches.count();
j = j - 1;
continue;
}
} /* end if RGB */
/* If both are LAB */
if (myC.space == ColorSpace.lab && myS.space == ColorSpace.lab)
{
// alert('1: ' + myS.colorValue[0] + ' ' + myS.colorValue[1] + ' ' + myS.colorValue[2] + ' 2:' + myC.colorValue[0] + ' ' + myC.colorValue[1] + ' ' + myC.colorValue[2]);
if ( Math.abs(myC.colorValue[0]-myS.colorValue[0]) <= myTH && Math.abs(myC.colorValue[1]-myS.colorValue[1])/2.55 <= myTH && Math.abs(myC.colorValue[2]-myS.colorValue[2])/2.55 <= myTH )
{
// alert('MATCH LAB');
myReport += myC.name + ' [' + Math.round(myC.colorValue[0]) + ' ' + Math.round(myC.colorValue[1]) + ' ' + Math.round(myC.colorValue[2]) + '] > ' + myS.name + ' [' + Math.round(myS.colorValue[0]) + ' ' + Math.round(myS.colorValue[1]) + ' ' + Math.round(myS.colorValue[2]) +'] \n';
myC.remove(myS);
myNumDeleted += 1;
myTotalSwatches = myDocument.swatches.count();
j = j - 1;
continue;
}
} /* end if LAB */
} /* end if myS.model == myC.model */
}
catch(e) {
mySErrors[i] = myC.name + ': ' + e;
}
} // end of for j
} // end of for i
if (mySErrors != "") myErrorReport = 'ERRORS: ' + mySErrors.join(" | ") + '\n\n';
myErrorReport += myNumDeleted + ' swatches removed with ' + myTH + '% similarity \n\n';
myErrorReport += myReport;
alert(myErrorReport, "Reduce_Colors.jsx - Report");
Skript ist lauffähig ab Version CS4
Farbfelder sortieren
FarbfelderSortieren_04.js
Link zur Ursprungsdiskussion im Forum
Das Script sortiert durcheinandergeratene Namen im Farbfelder-Bedienfeld alphabetisch.
Ergänzte Version: Nun wird beim Sortieren kein Unterschied mehr zwischen Gross- und Kleinbuchstaben gemacht. Credit: Die Funktion wurde bei Peter Kahrel abgeschaut.
Einsatz auf eigene Gefahr: Jedes Farbfeld und jedes Farbtonfeld wird umbenannt, mit dem alten Namen neu angelegt, das alte wird entfernt und durch das neue ersetzt.
Achtung: Verlaufsfelder sowie
Mischdruckfarben-Farbfelder und
Mischdruckfarben-Gruppen werden mit dieser Version nicht sortiert..
//FarbfelderSortieren_04.js
// das vorderste Dokument
var curDoc = app.documents[0];
// die Farbfelder des Dokuments
allSwatches = curDoc.swatches;
// die Farbtonfelder des Dokuments
allTints = curDoc.tints;
// die Verlaufsfelder des Dokuments
allGradients = curDoc.gradients;
// die Mischdruckfarben-Farbfelder
allMixedInks = curDoc.mixedInks;
// die Mischdruckfarben-Gruppen
allMixedInkGroups = curDoc.mixedInkGroups;
// die Namen der Farbfelder auflisten
colorNames = allSwatches.everyItem().name;
tintNames = allTints.everyItem().name;
gradientNames = allGradients.everyItem().name;
mixedInkNames = allMixedInks.everyItem().name;
mixedInkGroupNames = allMixedInkGroups.everyItem().name;
var nColors = colorNames.length;
// eine Schleife durch die Farbfelder, vor den Namen ein "X" einfügen
for (var i=0; i< nColors; i++) {
curName = colorNames[i];
// "None", "Paper", "Black" und "Registration" ausschliessen
if (curName != "None" && curName != "Paper" && curName != "Black" && curName != "Registration") {
try {
allSwatches[i].name = "X" + curName;
}
catch (e) {
}
}
}
// die Namensliste sortieren
colorNames.sort(ignorecase);
function ignorecase(a, b) {
return a.toLowerCase() > b.toLowerCase();
}
// eine Schleife durch die sortierte Liste
for (var i=0; i< nColors; i++) {
curName = colorNames[i];
// "None", "Paper", "Black" und "Registration" ausschliessen
if (curName != "None" && curName != "Paper" && curName != "Black" && curName != "Registration") {
try {
// die Info holen, ob "swatch" oder "tint" oder "gradient"
var curType = testName(curName);
if (curType[0] == 0) { // wenn Farbfeld ...
// ... ein Farbfeld erzeugen
var newColor = curDoc.colors.add();
// ... den entsprechenden Namen aus der Liste zuweisen ...
newColor.name = curName;
// ... und die Properties des aktuellen alten zuweisen
newColor.properties = allSwatches.itemByName("X"+curName).properties;
// das aktuelle Farbfeld entfernen und durch das neue ersetzen
curDoc.swatches.itemByName("X"+curName).remove(newColor);
}
else if (curType[0] == 1) { // wenn Farbtonfeld ...
// Basis-Farbfeld und Properties speichern
var bColor = allTints[curType[1]].baseColor;
var tProps = allTints.itemByName(curName).properties;
// ein Dummy-Farbfeld erzeugen
var newColor = curDoc.colors.add();
newColor.name = "dummy";
// das "alte" Farbtonfeld entfernen und durch "dummy" ersetzen
allTints.itemByName(curName).remove(newColor);
// das "neue" Farbtonfeld erzeugen
var newTint = curDoc.tints.add(bColor, tProps);
// "dummy" durch das neue Farbtonfeld ersetzen
newColor.remove(newTint);
}
else if (curType[0] == 2) { // wenn Verlaufsfeld ...
// ... dann geschieht (noch) nichts (nur das "X" wird entfernt)
curDoc.swatches.itemByName("X"+curName).name = curName;
}
else if (curType[0] == 3) { // wenn Mischfarben-Farbfeld ...
// ... dann geschieht (noch) nichts (nur das "X" wird entfernt)
curDoc.swatches.itemByName("X"+curName).name = curName;
}
else if (curType[0] == 4) { // wenn Mischfarben-Gruppe ...
// ... dann geschieht nichts (nur das "X" wird entfernt)
curDoc.swatches.itemByName("X"+curName).name = curName;
}
}
catch (e) {
}
}
}
// die Funktion welche prüft, ob der aktuelle Name in der Farbtonfeld-
// oder in der Verlaufsfeld-Liste vorkommt (sonst = "normaler" Swatch)
function testName(curName) {
for (var k=0; k< tintNames.length; k++) {
if (curName == tintNames[k]) {
return [1, k];
}
}
for (var k=0; k< gradientNames.length; k++) {
if (curName == gradientNames[k]) {
return [2];
}
}
for (var k=0; k< mixedInkNames.length; k++) {
if (curName == mixedInkNames[k]) {
return [3];
}
}
for (var k=0; k< mixedInkGroupNames.length; k++) {
if (curName == mixedInkGroupNames[k]) {
return [4];
}
}
return [0];
}
Skript ist lauffähig ab Version CS2
Grafisches
Alle selektierten Bilder öffnen (editieren)
EditImagesOfSelection.jsx
Link zur Ursprungsdiskussion im Forum
Öffne alle selektierten Bilder zum Editieren (in Photoshop). Gut auf einer schnellen Tastenbelegung - ich hab's sogar auf ENTER.
// EditImagesOfSelection.jsx
// by Stephan Möbius
// InDesign CS3 JavaScript
// Opens all selected images for editing (presumably in Photoshop)
var myItems = app.selection;
for (var j = myItems.length - 1; j >= 0; j--) {
var curSel = myItems[j];
var selType = curSel.constructor.name;
if (selType == "Rectangle" || selType == "Oval" || selType == "Polygon") {
if (curSel.graphics.length != 0) {
var curImage = curSel.graphics[0];
if (curImage.itemLink.status != LinkStatus.LINK_EMBEDDED && curImage.itemLink.status != LinkStatus.LINK_MISSING ) {
curImage.itemLink.editOriginal();
}
}
}
else if (selType == "Image" || selType == "EPS" || selType == "PDF") {
var curImage = curSel;
if (curImage.itemLink.status != LinkStatus.LINK_EMBEDDED && curImage.itemLink.status != LinkStatus.LINK_MISSING ) {
curImage.itemLink.editOriginal();
}
}
}
Skript ist lauffähig ab Version CS3
Alle verknüpften Abbildungen des aktiven Druckbogens öffnen
editOriginalsOfActiveSpread.jsx
Link zur Ursprungsdiskussion im Forum
In
http://www.hilfdirselbst.ch/..._P326792.html#326792 wurde nach einer Lösung gefragt, mehrere Bilder der aktuellen Seite in Photoshop zu öffnen.
Das folgende Skript öffnet alle verknüpften Abbildungen des aktiven Druckbogens mit dem ihnen zugewiesenen Programm (z.B. Photoshop, Illustrator).
// editOriginalsOfActiveSpread.jsx
var myCounter = 0;
var myGraphs = app.documents[0].layoutWindows[0].activeSpread.allGraphics;
for (var i = 0; i < myGraphs.length; i++ )
if (myGraphs[.i].itemLink.status != LinkStatus.LINK_EMBEDDED && myGraphs[.i].itemLink.status != LinkStatus.LINK_MISSING )
{
myGraphs[.i].itemLink.editOriginal();
myCounter++;
}
if (myCounter > 0)
alert( 'Es sollten nun ' + myCounter + ' von ' + myGraphs.length + ' Abbildungen geöffnet worden sein.' )
else
alert( 'Möglicherweise sind ' + myGraphs.length + ' Abbildungen eingebettet oder es fehlt deren Verknüpfung.' )
// ==============================================================
// V A R I A N T E
// ==============================================================
// Diese Modifizierung öffnet die ausgewählten Bilder:
var myItems = app.selection;
for (var j = myItems.length - 1; j >= 0; j--) {
var curSel = myItems[j];
var selType = curSel.constructor.name;
if (selType == "Rectangle" || selType == "Oval" || selType == "Polygon") {
if (curSel.graphics.length != 0) {
var curImage = curSel.graphics[0];
if (curImage.itemLink.status != LinkStatus.LINK_EMBEDDED && curImage.itemLink.status != LinkStatus.LINK_MISSING ) {
curImage.itemLink.editOriginal();
}
}
}
else if (selType == "Image" || selType == "EPS" || selType == "PDF") {
var curImage = curSel;
if (curImage.itemLink.status != LinkStatus.LINK_EMBEDDED && curImage.itemLink.status != LinkStatus.LINK_MISSING ) {
curImage.itemLink.editOriginal();
}
}
}
Skript ist lauffähig ab Version CS3
Anzeigenleistung hin- und herschalten
ToggleDisplayQuality.jsx
Link zur Ursprungsdiskussion im Forum
Skript schaltet die Anzeigenleistung zwischen HIGH und NORMAL hin und her.
Wenn Objekte selektiert sind, schaltet es die lokalen Anzeigenleistungen der einzelnen Objekte zwischen HIGH und DEFAULT hin und her.
So kann ich mit nur einer Taste, die Anzeigenqualität schnell wie gewünscht einstellen. Oder nur ein einzelnes Objekt kurz in HIGH kontrollieren und wieder zurückstellen.
(Skript entwickelt von Stephan Möbius)
//ToggleDisplayQuality.jsx
//DESCRIPTION: Schaltet die Anzeigenleistung zwischen HIGH und NORMAL hin und her.
/* if nothing is selected it will toggle the View Display Quality between HIGH and NORMAL
but if objects are selected it will toggle the objects local display quality between HIGH and VIEW DEFAULT
*/
//Author: Stephan Möbius, Oktober 2009. Tested in Indesign CS4, 6.0.4
if (app.documents.length > 0)
if (app.selection.length == 0)
(app.documents[0].layoutWindows[0].viewDisplaySetting == ViewDisplaySettings.highQuality)
? app.documents[0].layoutWindows[0].viewDisplaySetting = ViewDisplaySettings.typical
: app.documents[0].layoutWindows[0].viewDisplaySetting = ViewDisplaySettings.highQuality;
else
for (n = 0; n < app.selection.length; n++) {
var curSel = app.selection[n];
var curSelType = curSel.constructor.name;
if (curSelType == "Rectangle" || curSelType == "Oval" || curSelType == "Polygon")
if (curSel.graphics.length != 0)
curSel = curSel.graphics[0];
if (curSel.localDisplaySetting == DisplaySettingOptions.HIGH_QUALITY)
curSel.localDisplaySetting = DisplaySettingOptions.DEFAULT_VALUE;
else
curSel.localDisplaySetting = DisplaySettingOptions.HIGH_QUALITY;
}
Skript ist lauffähig ab Version CS4
Automatische Bildplatzierung
Etiketten_01d.js
Link zur Ursprungsdiskussion im Forum
Das nachfolgende Script bezieht sich auf die Anfrage im Thema
"automatische Bildplatzierung"
http://www.hilfdirselbst.ch/...zierung_P292874.html
//Etiketten_01d.js
//Ein JavaScript, welches auf jeder Seite einen Bildrahmen erzeugt
//und entsprechend dem Code auf derselben Seite die Bilddatei importiert
// testen, ob ein Dokument geöffnet ist
if (app.documents.length == 0) {
alert ("Ein Dokument öffnen.");
exit();
}
// die Bounds des Bildrahmens bestimmen
var geoBounds = new Array (20, 20, 60, 60)
// den Dialog zur Ordnerauswahl anzeigen
var folPath = Folder.selectDialog("Den Ordner wählen, welcher die zu importierenden Bilddateien enthält");
// eine Referenz zum Dokument
var curDoc = app.documents[0];
// die Seitenanzahl feststellen
var nPages = curDoc.pages.length;
// eine Schleife durch die Seiten
for (p=0; p< nPages; p++) {
var curPage = curDoc.pages[p];
try {
var tmpStr = curPage.textFrames[0].texts[0].contents;
var curNum = tmpStr.substring(0,4);
var curFile= folPath + "/Code_" + curNum + ".eps"
var curRect = curPage.rectangles.add({geometricBounds:geoBounds,
strokeWeight:0, strokeColor:curDoc.swatches.item("None")});
curRect.place(File(curFile));
curRect.fit(FitOptions.centerContent);
}
catch (e) {
}
}
alert ("Fertig.");
Gruss, Hans
Skript ist lauffähig ab Version CS2
Bilder Kopieren/Einfügen mit schwarzem Pfeil und Offset-Erhaltung
InAuswahlEinfuegenCS3_02d.js
Zwei CS3-Scripts vereint:
Ist ein Bild vorhanden, dann wird kopiert.
Ist der Rahmen leer, wird das gespeicherte Bild eingesetzt.
Der Dreh- und der Verbiegungswinkel des Bildes
und des Rahmens werden festgestellt. Wenn einer von ihnen nicht Null
ist, dann wird er auf Null gesetzt. Und erst dann werden die
Bounds des Rahmens gespeichert.
Beim (leeren) Zielrahmen werden auch die Winkel notiert,
auf Null gesetzt. Nach dem Ein- und Versetzen des Bildes
werden nur die Winkelwerte des Originalbildes übertragen.
Jene des Zielrahmens werden wiederhergeste
//InAuswahlEinfuegenCS3_02d.js
//Dieses Script dient zum Kopieren und Einsetzen eines Bildes
// testen, ob ein Dokument geöffnet ist
if (app.documents.length == 0) {
alert ("Es ist kein Dokument offen.", "Achtung");
exit();
}
// testen, ob ein Objekt ausgewählt ist
if (app.selection.length == 0) {
alert ("Bitte einen Bildrahmen auswählen.", "Achtung");
exit();
}
// die Auswahl prüfen
var curSel = app.selection[0];
var selType = curSel.constructor.name;
if (selType == "Rectangle" || selType == "Oval" || selType == "Polygon") {
if (curSel.graphics.length != 0) {
var curImage = curSel.graphics[0];
}
else {
var curImage = -1;
}
}
else if (selType == "Image" || selType == "EPS" || selType == "PDF") {
var curImage = curSel;
}
else {
alert ("Die Auswahl ist ungültig.", "Stop");
exit();
}
// je nach Auswahl kopieren oder einfügen
if (curImage != -1) {
var curFrame = curImage.parent;
var fRot = curFrame.rotationAngle;
var iRot = curImage.absoluteRotationAngle;
var fShe = curFrame.shearAngle;
var iShe = curImage.absoluteShearAngle;
if (fRot !=0) {
curFrame.rotationAngle = 0;
}
if (iRot !=0) {
curImage.absoluteRotationAngle = 0;
}
if (fShe !=0) {
curFrame.shearAngle = 0;
}
if (iShe !=0) {
curImage.absoluteShearAngle = 0;
}
var iGB = curImage.geometricBounds;
var fGB = curFrame.geometricBounds;
var shiftY = iGB[0]-fGB[0];
var shiftX = iGB[1]-fGB[1];
var moveBy = ""+iRot+"#"+iShe+"#"+shiftX+"#"+shiftY;
app.insertLabel("shiftVal", moveBy);
app.documents[0].select(curImage);
app.copy();
if (fRot !=0) {
curFrame.rotationAngle = fRot;
}
if (iRot !=0) {
curImage.absoluteRotationAngle = iRot;
}
if (fShe !=0) {
curFrame.shearAngle = fShe;
}
if (iShe !=0) {
curImage.absoluteShearAngle = iShe;
}
app.documents[0].select(curSel);
}
else {
var moveBy = app.extractLabel("shiftVal");
var params = moveBy.split("#");
var iRot = params[0]*1;
var iShe = params[1]*1;
var shiftX = params[2];
var shiftY = params[3];
var gRot = curSel.rotationAngle;
if (gRot !=0) {
curSel.rotationAngle = 0;
}
var gShe = curSel.shearAngle;
if (gShe !=0) {
curSel.shearAngle = 0;
}
var fGB = curSel.geometricBounds;
var shiftY = fGB[0]+(shiftY*1);
var shiftX = fGB[1]+(shiftX*1);
app.pasteInto();
if (curSel.graphics.length != 0) {
var curImage = curSel.graphics[0];
curImage.move([shiftX, shiftY]);
curSel.rotationAngle = gRot;
curImage.absoluteRotationAngle = iRot;
curSel.shearAngle = gShe;
curImage.absoluteShearAngle = iShe;
}
}
Hans Haesler
Skript ist lauffähig ab Version CS3
Bilder neu verknüpfen mit Daten in Unterverzeichnissen.
RelinkLinksOfDocs2NewPath_inSubfolders.jsx
Link zur Ursprungsdiskussion im Forum
Das folgende Skript verknüpft die Bilder neu mit Bilddateien in einem ausgewählten Verzeichnis und dessen Unterverzeichnissen - sofern der Verknüpfungsstatus "fehlend" ist.
// RelinkLinksOfDocs2NewPath_inSubfolders.jsx
var topFolder = Folder.selectDialog ("Topverzeichnis wählen...");
// Einfangen der Unterverzeichnisse
var myFolders = scanSubFolders(topFolder);
var myUpdates = 0;
// Schleife durch die Dokumnete
for (var d = app.documents.length-1; d >= 0; d--)
procDoc(app.documents[d]);
alert(myUpdates + " Verknüpfungen aktualisiert");
// ---------------------------------------------------
// Funktionen
// ---------------------------------------------------
function procDoc(aDoc)
{
// Schleife durch die Verknüpfungen
for (var l = aDoc.links.length-1; l >= 0; l--)
procLink(aDoc.links[l]);
}
function procLink(aLink)
{
// Verknüpfungsstatus "fehlend"
if (aLink.status == LinkStatus.linkMissing)
{
var myName = String(File.encode(aLink.name));
// Schleife durch die Unterverzeichnisse
for (var f = 0; f < myFolders.length; f++)
{
// neuer Verknüpfungspfad
var myNewLink = File(myFolders[f]+ "/" + myName);
try
{
// Verknüpfungsvorgang
aLink.relink(myNewLink);
// bei Erfolg: Aktualisierung der Verknüpfung + mitzählen
aLink.update();
myUpdates++;
break;
}
catch(e){}
}
}
}
function scanSubFolders(tFolder)
{
var sFolders = new Array();
sFolders[0] = tFolder;
for (var j = 0; j < sFolders.length; j++) // loop through folders
{
var procFiles = sFolders[j].getFiles();
for (var k = 0; k < procFiles.length; k++) // loop through this folder contents
{
if (procFiles[k] instanceof Folder)
sFolders.push(procFiles[k]);
}
}
return sFolders;
}
Skript ist lauffähig ab Version CS3
Bilder100ProzentCS2.scpt
Bilder100ProzentCS2_05d
Link zur Ursprungsdiskussion im Forum
Das folgende AppleScript geht durch alle in einem InDesign-CS2-Dokument
importierten Bilder. Wenn die Bildgrösse nicht 100% ist, wird das Bild
in Photoshop CS2 geöffnet, skaliert, geschärft und gesichert. Zuletzt
in InDesign CS2 aktualisiert und die Bildgrösse auf 100% gesetzt.
Ausführlichere Erklärungen können im Thema "
InDesign CS: Kann jemand
dieses Script zum laufen bringen???" nachgelesen werden.
*****
Disclaimer:
Nur auf eigene Gefahr verwenden. Von allen InDesign-Dokumenten und
den Bilddateien zuerst Backups erstellen, bevor das Script ausgeführt wird.
Die importierten Originaldateien der Bilder werden überschrieben.
Die Namen der Dateien werden unverändert übernommen.
*****
Den Code als normales AppleScript (nicht als Programm) sichern und die
Datei im Ordner "Scripts" (im Ordner "Presets" des Programm-Ordners von
InDesign-CS) unterbringen. Dann kann das Script bequem mit Doppelklick
ab Scriptpalette gestartet werden.
Mit dieser Version 05 werden eventuelle Spiegelungen vorübergehend aufgehoben und dann wieder zugewiesen.
Und zum Ausschliessen von Vektor- und Textdateien wird nicht mehr der File Type getestet, sondern die Information der effektiven ppi-Werte.
(*Bilder100ProzentCS2_05d
(basierend auf "ResampleImages24.as", einem Script für CS2 von Jeff Lambert)
Dieses AppleScript geht durch alle in einem InDesign-CS2-Dokument importierten Bilder.
Wenn die Bildgrösse nicht 100% ist, wird das Bild in Photoshop CS2 geöffnet, skaliert, geschärft und gesichert.
Zuletzt in InDesign CS2 aktualisiert und die Bildgrösse auf 100% gesetzt.
© 30.05.08 / Hans Häsler, Châtelard 52, CH-1018 Lausanne / E-mail: hsa@ringier.ch
*)
tell application "Adobe InDesign CS2"
activate
set processedLinks to {}
-- wenn die Transformations-Vorgaben nicht als 'transformations are totals' definiert sind,
-- müssen sie angepasst werden, damit das Script richtig funktionieren kann
if transformations are totals of transform preferences is false then
set oldTransPrefs to properties of transform preferences
set transformations are totals of transform preferences to true
set show content offset of transform preferences to true
set dimensions include stroke weight of transform preferences to true
set transform content of transform preferences to true
set resetTrans to true
else
set resetTrans to false
end if
tell layout window 1
set oldAnchor to transform reference point
set transform reference point to center anchor
end tell
tell document 1
-- falls die Masseinheiten nicht Punkte sind, müssen sie vorübergehend geändert werden
-- damit das Script korrekt ausgeführt werden kann
if horizontal measurement units of view preferences is not points or ¬
vertical measurement units of view preferences is not points then
set oldViewPrefs to properties of view preferences
set horizontal measurement units of view preferences to points
set vertical measurement units of view preferences to points
set resetUnits to true
else
set resetUnits to false
end if
-- die Liste der Links aufstellen
set linksList to every link
-- Rückwärts-Schleife durch die Elemente der Liste
repeat with i from (count linksList) to 1 by -1
set curLink to item i of linksList
set curImage to parent of curLink
-- mögliche Vektor- oder Text-Dateien ausschliessen
set okay to false
try
effective ppi of curImage
set okay to true
end try
if okay then
set imgName to name of curLink
set curFrame to parent of curImage
-- die Skalierungsprozente des Rahmens auf 100% zurücksetzen
reset scaling of curFrame
-- den Bildpfad feststellen
set imgPath to file path of item i of linksList as Unicode text
-- die Position des Bildes feststellen
set imgPos to geometric bounds of curImage
-- die Bildgrössen speichern
tell curImage
set {horVal, verVal} to {absolute horizontal scale, absolute vertical scale}
end tell
-- wenn eine Spiegelung vorhanden ist, diese vorübergehend aufheben
tell curImage
set {x, y} to {horizontal scale, vertical scale}
set rotAng to rotation angle
if y is less than 0 then
set {horizontal scale, vertical scale} to {x, y + (0 - (y * 2))}
end if
if rotAng is 180 then
set rotation angle to 0
end if
end tell
-- wenn die Bildgrösse anders als 100% ist und die Datei noch nicht in Photoshop skaliert worden ist, dann ...
if imgPath is not in processedLinks and horVal is not 100 then
if verVal is less than 0 then
set verVal to verVal + (0 - (verVal * 2))
end if
set filePath to my resizeImage(imgPath, horVal, verVal)
if filePath is not "" then
relink curLink to filePath
-- beim Updaten des Links wird das alte Link entfernt und InDesign gibt das neue zurück
set curLink to update curLink
set curImage to parent of curLink
set curFrame to parent of curImage
-- die Bildgrössen auf 100 setzen
set properties of curImage to {geometric bounds:imgPos}
resize curImage horizontal scale 100 vertical scale 100 around center anchor ¬
without considering current scale and considering parents scale
-- an die Liste den Pfad des Bildes anfügen
set end of processedLinks to imgPath
end if
else if imgPath is in processedLinks then
relink curLink to imgPath
set curLink to update curLink
set curImage to parent of curLink
set curFrame to parent of curImage
-- die Bildgrössen auf 100 setzen
set properties of curImage to {geometric bounds:imgPos}
resize curImage horizontal scale 100 vertical scale 100 around center anchor ¬
without considering current scale and considering parents scale
end if
-- eine eventuelle Spiegelung wiederherstellen
tell curImage
if rotAng is 180 then
set rotation angle of curImage to 180
end if
if y is less than 0 then
set {horizontal scale, vertical scale} to {100, -100}
end if
end tell
end if
end repeat
-- die Masseinheiten zurücksetzen
if resetUnits then
tell view preferences to set properties to oldViewPrefs
end if
end tell
-- die Transformations-Vorgaben zurücksetzen
if resetTrans then
tell transform preferences to set properties to oldTransPrefs
end if
tell layout window 1
set transform reference point to oldAnchor
end tell
display dialog "Fertig." buttons "OK" default button 1 with icon 1 giving up after 2
end tell
-- der Handler, welcher in Photoshop das aktuelle Bild skaliert und unter dem gleichen Namen sichert
on resizeImage(imgPath, horVal, verVal)
set filePath to ""
tell application "Adobe Photoshop CS2"
set bigVers to character 1 of (version as string) as integer
-- die alten Masseinheiten sichern
set oldRulerUnits to ruler units of settings
try
set ruler units of settings to point units
open file imgPath showing dialogs never
set docRef to current document
-- das Bild skalieren
if bigVers is less than 9 then
resize image docRef width percent (horVal / 100) height percent (verVal / 100) resample method bicubic
else
resize image docRef width percent horVal height percent verVal resample method bicubic
end if
-- das Bild schärfen
set artLayerList to get every art layer of docRef
repeat with layerRef in artLayerList
try
filter layerRef using custom filter with options ¬
{characteristics:{0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, -1, 10, -1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0}, scaling:6, offset:0}
end try
end repeat
-- das Bild sichern
set imgDoc to save docRef
-- der Variablen 'filePath' den Pfad zuweisen
set filePath to file path of imgDoc
-- die Masseinheiten zurücksetzen
set ruler units of settings to oldRulerUnits
close current document saving no
on error
-- die Masseinheiten zurücksetzen
set ruler units of settings to oldRulerUnits
try
close current document saving no
end try
end try
end tell
return filePath
end resizeImage
Skript ist lauffähig ab Version CS2
Bildernamen pro Seite und der Reihe nach auflisten
BilderRapport_501d.js
Link zur Ursprungsdiskussion im Forum
Erstellt eine Liste der Bildernamen, seitenweise und in der Reihenfolge
//BilderRapport_501d.js
//DESCRIPTION:Erstellt eine Liste der Bildernamen, seitenweise und in der Reihenfolge
// vorbeugenderweise das Anzeigen von Dialogen aktivieren
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;
// prüfen, ob ein Dokument geöffnet ist
if (app.documents.length == 0) {
alert ("Es ist kein Dokument offen.", "Achtung");
exit();
}
// das Dokument im Vordergrund ...
var curDoc = app.documents[0];
// ... und sein Name
var docName = curDoc.name;
// eine Schleife durch die Seiten ...
var imgReport = new Array ();
var allPages = curDoc.pages;
var nPages = allPages.length;
for (var i=0; i< nPages; i++) {
var curPage = allPages[i];
var pageNbr = curPage.name;
imgReport.push("Seite " + pageNbr + ":");
var allRects = curPage.rectangles;
var imgNames = new Array ();
var posList = new Array ();
var defList = new Array ();
// ... und durch die Bildrahmen
for (var j=0; j< allRects.length; j++) {
try {
imgNames.push(allRects[j].graphics[0].itemLink.name);
var gB = allRects[j].geometricBounds;
var y1 = gB[0];
var x1 = gB[1];
var oB = (y1*10000) + x1;
posList.push(oB);
defList.push(oB);
}
catch (e) {
}
}
// die Positionswerte der Rahmen sortieren
defList.sort(Numsort);
// eine Schleife durch die Liste und die Bildnamen zuordnen
for (var k=0; k< defList.length; k++) {
var curItem = defList[k];
for (var m=0; m< posList.length; m++) {
if (curItem == posList[m]) {
var curName = imgNames[m];
imgReport.push(curName);
break;
}
}
}
imgReport.push(" ");
}
// das Ergebnis in eine Textkette umwandeln ...
var imgString = imgReport.join("\r");
// ein InDesign-Dokument erzeugen ...
var newDoc = app.documents.add();
newDoc.viewPreferences.horizontalMeasurementUnits = MeasurementUnits.MILLIMETERS;
newDoc.viewPreferences.verticalMeasurementUnits = MeasurementUnits.MILLIMETERS;
newDoc.documentPreferences.properties = {pageWidth:210, pageHeight:297, facingPages:false};
// ... Dokumentname und Textkette in zwei Rahmen kopieren
var titFrame = newDoc.textFrames.add();
titFrame.properties = {geometricBounds:[10, 15, 18, 200], contents:docName};
var repFrame = newDoc.textFrames.add();
repFrame.properties = {geometricBounds:[20, 15, 287, 200], contents:imgString};
repFrame.textFramePreferences.properties = {textColumnCount:3, textColumnGutter:4};
// den Text formatieren
titFrame.parentStory.paragraphs[0].fontStyle = "Bold";
app.findGrepPreferences = app.changeGrepPreferences = null;
app.findGrepPreferences.findWhat = "(Seite [0-9]+:)";
app.changeGrepPreferences.fontStyle = "Bold";
app.changeGrep();
// die Zahlen-Sortierfunktion
function Numsort (a, b) {
return a - b;
}
Skript ist lauffähig ab Version CS3
Doppelte Bilder vermeiden
doppelteBilderVermeiden.jsx
Link zur Ursprungsdiskussion im Forum
Hier
http://www.hilfdirselbst.ch/...rmeiden_P374426.html wurde die Frage gestellt, ob es einen Weg gibt, das doppelte Platzieren von Bildern zu vermeiden.
Dieses Script klinkt sich in den Platzieren-Event ein. Jedesmal, wenn etwas importiert wird, werden die Pfade der Links der noch nicht platzierten Bilder (die im Ladecursor "stecken") mit den bereits platzierten verglichen.
Falls Doubletten gefunden werden, werden diese der Reihe nach selektiert und durch Alert auf sie aufmerksam gemacht.
Das Reporting ließe sich sicherlich noch ausbauen, aber da mache ich mich nicht ohne Feedback ran...
Die Performance scheint mir OK zu sein. In einem Dokument mit rund 700 Bildern braucht mein MacBookPro etwa 3 Sekunden zur Prüfung. Diese Zeit ist also der Preis für die Gewissheit der Einzigartigkeit ;)
In einem Dokument mit weniger als 100 Bildern ist es kaum spürbar.
Das Script sollte auch als StartupScript funktionieren, so dass es grundsätzlich bei jedem Platzieren automatische aufgerufen wird.
Falls ein Rahmen markiert war, als das Bild importiert wurde, landet das Bild in diesem Rahmen, sobald der Alert bestätigt wird; es bleibt aber die Doublette markiert.
#targetengine "session"
var myEventListener1 = app.addEventListener("afterImport", checkDoubles, false);
// checkDoubles();
function checkDoubles() {
//alert("check");
var aDoc = app.activeDocument;
var links = aDoc.links;
var unplaced = new Array();
var placed = new Array();
for (var n = 0; n < links.length; n++) {
try {
var tmp = links[n].parent.parent.parent.id;
placed.push(links[n]);
} catch (e) {
unplaced.push(links[n]);
}
}
var doubles = new Array();
if (unplaced.length > 0) {
for (var n = 0; n < placed.length; n++) {
var tmp = placed[n];
for (var m = 0; m < unplaced.length; m++) {
var aux = unplaced[m];
if (tmp.filePath == aux.filePath) {
doubles.push(tmp);
}
}
}
} else if (1 == 2) {
alert("test");
for (var n = 0; n < links.length; n++) {
var tmp = links[n];
for (var m = 0; m < links.length; m++) {
if (n != m) {
var aux = links[m];
if (tmp.filePath == aux.filePath) {
doubles.push(tmp);
}
}
}
}
}
if (doubles.length > 0) {
for (var n = 0; n < doubles.length; n++) {
var aux = doubles[n];
aux.parent.parent.select ();
var nr = showSpread(aux.parent);
alert("Das Bild \"" + aux.name+ "\" auf der "+ (nr+1).toString() + ". Doppelseite ist bereits vorhanden.");
}
}
function showSpread(anItem) {
while ( anItem.constructor.name != "Spread" && anItem.constructor.name != "MasterSpread") {
anItem = anItem.parent;
}
aDoc.layoutWindows[0].activeSpread = anItem;
aDoc.layoutWindows[0].zoom (ZoomOptions.ACTUAL_SIZE);
return anItem.index;
}
}
Mit freundlichem Gruß
Gerald Singelmann
--------------------------
Schulungen bei Impressed
http://www.impressed.de/...fn=termine&s=hds
Skript ist lauffähig ab Version CS3
Ein-/Ausschalten der Überprüfung von Verknüpfungen beim Öffnen von Dokumenten
checkLinksAtOpenSwitch.jsx
Link zur Ursprungsdiskussion im Forum
Mit
checkLinksAtOpenSwitch.jsx kann man die Überpfürung von Verknüpfungen beim Öffnen von Dokumenten im Wechsel ein- und ausschalten.
Wer's öfters braucht, legt sich das Skript auf eine Taste.
/*
checkLinksAtOpenSwitch.jsx
//DESCRIPTION:Ein-/Ausschalten der Überprüfung von Verknüpfungen beim Öffnen von Dokumenten.
AUTHOR: Martin Fischer
DATE: 22.10.2009
*/
app.linkingPreferences.checkLinksAtOpen = (app.linkingPreferences.checkLinksAtOpen == true)
? false
: true;
var myMessage = (app.linkingPreferences.checkLinksAtOpen == true)
? 'EIN'
: 'AUS';
alert ('Hinweis\rVerknüpfungen beim Öffnen von Dokumenten überprüfen: ' + myMessage);
Skript ist lauffähig ab Version CS4
Endungen von verknüpften Bilddateien ändern bzw. löschen
RenameSuffixOfLinks.jsx
Link zur Ursprungsdiskussion im Forum
In
Dateinamen-Endungen löschen bzw. ändern wurde die Möglichkeit, Endungen von Bilddateien zu löschen bzw. zu ändern angefragt.
Das folgende Skript ermittelt in zwei hintereinandergeschalteten Dialogen die zu ersetzende Endung und die neue Endung, benennt die Bilddateien um und verknüpft die Bilder neu.
//RenameSuffixOfLinks.jsx
//DESCRIPTION:Ändert die Endung von verknüpften Bilddateien und aktualisiert die Verknüpfung
var old_suffix = prompt( 'Alte Endung', ".jpg" );
var new_suffix = prompt( 'Neue Endung', old_suffix );
var myRegExp = new RegExp ( old_suffix + '$', 'i' );
var doc = app.documents.firstItem( );
var all_links = doc.links;
for ( i = all_links.length-1; i> -1; i-- )
{
a_link = all_links[i];
var myFile = File( a_link.filePath );
myFile.rename( a_link.name.replace( myRegExp, new_suffix ) )
var myNewLink = File( a_link.filePath.replace( myRegExp, new_suffix ) );
try
{
a_link.relink( myNewLink );
if ( Number( app.version.substr( 0,1 ) < 6 ) )
a_link.update( );
}
catch ( e )
{
alert ( e )
}
}
Skript ist lauffähig ab Version CS3
Ermittlung von Metadaten von verknüpften Bildern
metaDataOfLinks.jsx
Link zur Ursprungsdiskussion im Forum
Auf der Suche nach einer Möglichkeit, Metadaten von verknüpften Bildern zu ermitteln, meinte ich erst per Cross-Scripting auf Bridge und dessen Möglichkeiten, Metadaten auszuwerten, zurückgreifen zu müssen: <
Zugriff auf Bridge aus JavaScript für InDesign>.
Bald stellte sich heraus, dass der Zugriff auf die Metadaten auch direkt aus InDesign möglich ist.
Aus dieser Aufgabenstellung hat sich das unten stehende Skript entwickelt.
Es ermittelt diverse Metadaten (neben den Daten aus der Link-Property 'linkXmp' auch Daten nach den Schemas IPTC, Photoshop, Tiff, Exif) aus den verknüpften Bildern des aktiven Dokuments in InDesign.
Die Daten werden in eine Textdatei auf dem Schreibtisch geschrieben.
Der Name der Textdatei: 'Metadaten_' + [Name des InDesign-Dokuments] + [Suffix '.txt'] (also z.B. 'Metadaten_Unbenannt-1.txt).
Mit dem Schema CameraRaw habe ich momentan noch Schwierigkeiten.
Der Zugriff ist zwar definiert, aber ich erhalte keine Daten.
Vielleicht kann mich gelegentlich jemand auf den Haken aufmerksam machen.
// metaDataOfLinks.jsx
//DESCRIPTION: Ermittelt Metadaten von verknüpften Bildern und erstellt eine Übersicht auf dem Schreibtisch.
// Martin Fischer 10/2008
var myLinkXmpArray = ["author", "copyrightInfoURL", "copyrightNotice", "copyrightStatus ", "creationDate", "creator", "description", "documentTitle", "format", "jobName", "keywords", "modificationDate", "serverURL"];
var myIPTCArray = ["CiAdrCity", "CiAdrCtry", "CiAdrExtadr", "CiAdrPcode", "CiAdrRegion", "CiEmailWork", "CiTelWork", "City", "CiUrlWork", "CopyrightNotice", "Country", "CountryCode", "Creator", "CreatorContactInfo", "CreatorJobtitle", "DateCreated", "Description", "DescriptionWriter", "Headline", "Instructions", "IntellectualGenre", "JobID", "Keywords", "Location", "Provider", "Province-State", "RightsUsageTerms", "Scene", "Source", "SubjectCode", "Title"];
var myPSArray = ["photoshop:AuthorsPosition", "photoshop:CaptionWriter", "photoshop:Category", "photoshop:City", "photoshop:Country", "photoshop:Credit", "photoshop:DateCreated", "photoshop:Headline", "photoshop:Instructions", "photoshop:Source", "photoshop:State", "photoshop:SupplementalCategories", "photoshop:TransmissionReference", "photoshop:Urgency"];//var myPSArray = ["photoshop:AuthorsPosition", "CaptionWriter", "Category", "City", "Country", "Credit", "DateCreated", "Headline", "Instructions", "Source", "State", "SupplementalCategories", "TransmissionReference", "Urgency"];
var myTiffArray = ["tiff:ImageWidth", "tiff:ImageLength", "tiff:BitsPerSample", "tiff:Compression", "tiff:PhotometricInterpretation", "tiff:Orientation", "tiff:SamplesPerPixel", "tiff:PlanarConfiguration", "tiff:YCbCrSubSampling", "tiff:YCbCrPositioning", "tiff:XResolution", "tiff:YResolution", "tiff:ResolutionUnit", "tiff:TransferFunction", "tiff:WhitePoint", "tiff:PrimaryChromaticities", "tiff:YCbCrCoefficients", "tiff:ReferenceBlackWhite", "tiff:DateTime", "tiff:ImageDescription", "tiff:MakeProperName", "tiff:Model", "tiff:Software", "tiff:Artist", "tiff:Copyright"];
var myExifArray = ["exif:ExifVersion", "exif:FlashpixVersion", "exif:ColorSpace", "exif:ComponentsConfiguration", "exif:CompressedBitsPerPixel", "exif:PixelXDimension", "exif:PixelYDimension", "exif:UserComment", "exif:RelatedSoundFile", "exif:DateTimeOriginal", "exif:DateTimeDigitized", "exif:ExposureTime", "exif:FNumber", "exif:ExposureProgram", "exif:SpectralSensitivity", "exif:ISOSpeedRatings", "exif:OECF", "exif:ShutterSpeedValue", "exif:ApertureValue", "exif:BrightnessValue", "exif:ExposureBiasValue", "exif:MaxApertureValue", "exif:SubjectDistance", "exif:MeteringMode", "exif:LightSource", "exif:Flash", "exif:FocalLength", "exif:SubjectArea", "exif:FlashEnergy", "exif:SpatialFrequencyResponse", "exif:FocalPlaneXResolution", "exif:FocalPlaneYResolution", "exif:FocalPlaneResolutionUnit", "exif:SubjectLocation", "exif:ExposureIndex", "exif:SensingMethod", "exif:FileSource", "exif:SceneType", "exif:CFAPattern", "exif:CustomRendered", "exif:ExposureMode", "exif:WhiteBalance", "exif:DigitalZoomRatio", "exif:FocalLengthIn35mmFilm", "exif:SceneCaptureType", "exif:GainControl", "exif:Contrast", "exif:Saturation", "exif:Sharpness", "exif:DeviceSettingDescription", "exif:SubjectDistanceRange", "exif:ImageUniqueID", "exif:GPSVersionID", "exif:GPSLatitude", "exif:GPSLongitude", "exif:GPSAltitudeRef", "exif:GPSAltitude", "exif:GPSTimeStamp", "exif:DateTimeOriginal,", "exif:DateTimeDigitized.", "exif:GPSTimeStamp", "exif:GPSSatellites", "exif:GPSStatus", "exif:GPSMeasureMode", "exif:GPSDOP", "exif:GPSSpeedRef", "exif:GPSSpeed", "exif:GPSTrackRef", "exif:GPSTrack", "exif:GPSImgDirectionRef", "exif:GPSImgDirection", "exif:GPSMapDatum", "exif:GPSDestLatitude", "exif:GPSDestLongitude", "exif:GPSDestBearingRef", "exif:GPSDestBearing", "exif:GPSDestDistanceRef", "exif:GPSDestDistance", "exif:GPSProcessingMethod", "exif:GPSAreaInformation"];
var myCameraRawArray = ["crs:AutoBrightness", "crs:AutoContrast", "crs:AutoExposure", "crs:AutoShadows", "crs:BlueHue", "crs:BlueSaturation", "crs:Brightness", "crs:CameraProfile", "crs:ChromaticAberrationB", "crs:ChromaticAberrationR", "crs:ColorNoiseReduction", "crs:Contrast", "crs:CropTop", "crs:CropLeft", "crs:CropBottom", "crs:CropRight", "crs:CropAngle", "crs:CropWidth", "crs:CropHeight", "crs:CropUnits", "crs:Exposure", "crs:GreenHue", "crs:GreenSaturation", "crs:HasCrop", "crs:HasSettings", "crs:LuminanceSmoothing", "crs:RawFileName", "crs:RedHue", "crs:RedSaturation", "crs:Saturation", "crs:Shadows", "crs:ShadowTint", "crs:Sharpness", "crs:Temperature", "crs:Tint", "crs:ToneCurve", "crs:ToneCurveName", "crs:Version", "crs:VignetteAmount", "crs:VignetteMidpoint", "crs:WhiteBalance"];
var myInfo = new Array;
var myDoc = app.activeDocument;
var myLinks = app.documents[0].links;
for ( i = 0; i < myLinks.length; i++)
getMetaData ( myLinks[i] );
writeData ( 'Metadaten zu ' + myDoc.name + '\r-----------\r\r' + myInfo.join ( '\r\r'), File ('~/Desktop/Metadaten_' + myDoc.name.replace(/.indd$/, '') + '.txt'));
// ===============================================================
// Funktionen
// ===============================================================
function getMetaData ( aLink )
{
var myLinkXmp = aLink.linkXmp.properties.toSource().replace( /^\(\{/,'' ).replace (/\)\}$/,'').replace( /parent.+$/,'').replace(/:/g, ':\t').split( ', ');
var myString = aLink.name;
myString += loopLinkXmp ( aLink, myLinkXmpArray );
myString += loopArray ( aLink, "http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/", "Iptc4xmpCore:CreatorContactInfo/Iptc4xmpCore:", myIPTCArray);
myString += loopArray ( aLink, "http://ns.adobe.com/photoshop/1.0/", "", myPSArray );
myString += loopArray ( aLink, "http://ns.adobe.com/tiff/1.0/", "", myTiffArray );
myString += loopArray ( aLink, "http://ns.adobe.com/exif/1.0/", "", myExifArray );
myString += loopArray ( aLink, "http://ns.adobe.com/camera-raw-settings/1.0/", "", myCameraRawArray );
myInfo.push( myString.replace( /, $/,'') );
}
function loopArray( aLink, s1, s2, anArray )
{
var temp = '\r\t--- ' + s1 + ' ---\r\t';
for ( var a = 0; a < anArray.length; a++)
{
try {
var theEvalString = 'aLink.linkXmp.getProperty(\"' + s1 + '\", \"' + s2 + anArray[a] + '\")';
var myCode = eval( theEvalString );
if ( myCode != '' )
temp += '[' + anArray[a] + ']\t' + myCode + '\r\t';
} catch (e){ //temp +=e + '\r'
}
}
return temp;
}
function loopLinkXmp( aLink, anArray )
{
var temp = '\r\t--- LinkMetadata ---\r\t';
for ( var a = 0; a < anArray.length; a++)
{
try {
var theEvalString = 'aLink.linkXmp.' + anArray[a] ;
var myCode = eval( theEvalString );
if ( myCode != '' )
temp += '[' + anArray[a] + ']\t' + myCode + '\r\t';
} catch (e){ //temp +=e + '\r'
}
}
return temp;
}
function writeData ( aData, theFile )
{
theFile.open ( 'w', 'Text', 'R*ch' );
theFile.encoding = 'UTF-8';
theFile.write ( aData );
theFile.close ();
}
Skript ist lauffähig ab Version CS3
Fehlende Bildverknüpfungen mit Datei in angegebenem Verzeichnis/Unterverzeichnis neu verknüpfen
RelinkLinksOfDocs2NewPath_inSubfolders.jsx
Das folgende Skript
RelinkLinksOfDocs2NewPath_inSubfolders.jsx prüft den Status der Verknüpfungen aller geöffneten Dokumente.
Fehlt eine verknüpfte Datei, durchsucht das Skript ein anfangs über einen Dialog ausgewähltes Verzeichnis und dessen Unterverzeichnisse nach der Datei. Im Erfolgsfall wird die neue Verknüpfung hergestellt und aktualisiert.
Dieses hier veröffentlichte Skript baut auf dem Skript
RelinkLinksOfBookDocs2NewPath_inSubfolder2.js von SagWas auf. Jenes Skript, das alle Dokumente eines geöffneten Buchs behandelt, habe ich mir nochmals näher angesehen, etwas aufgeräumt und überarbeitet.
// RelinkLinksOfDocs2NewPath_inSubfolders.jsx
var topFolder = Folder.selectDialog ("Topverzeichnis wählen...");
// Einfangen der Unterverzeichnisse
var myFolders = scanSubFolders(topFolder);
var myUpdates = 0;
// Schleife durch die Dokumnete
for (var d = app.documents.length-1; d >= 0; d--)
procDoc(app.documents[d]);
alert(myUpdates + " Verknüpfungen aktualisiert");
// ---------------------------------------------------
// Funktionen
// ---------------------------------------------------
function procDoc(aDoc)
{
// Schleife durch die Verknüpfungen
for (var l = aDoc.links.length-1; l >= 0; l--)
procLink(aDoc.links[l]);
}
function procLink(aLink)
{
// Verknüpfungsstatus "fehlend"
if (aLink.status == LinkStatus.linkMissing)
{
var myName = String(File.encode(aLink.name));
// Schleife durch die Unterverzeichnisse
for (var f = 0; f < myFolders.length; f++)
{
// neuer Verknüpfungspfad
var myNewLink = File(myFolders[f]+ "/" + myName);
try
{
// Verknüpfungsvorgang
aLink.relink(myNewLink);
// bei Erfolg: Aktualisierung der Verknüpfung + mitzählen
aLink.update();
myUpdates++;
break;
}
catch(e){}
}
}
}
function scanSubFolders(tFolder)
{
var sFolders = new Array();
sFolders[0] = tFolder;
for (var j = 0; j < sFolders.length; j++) // loop through folders
{
var procFiles = sFolders[j].getFiles();
for (var k = 0; k < procFiles.length; k++) // loop through this folder contents
{
if (procFiles[k] instanceof Folder)
sFolders.push(procFiles[k]);
}
}
return sFolders;
}
Skript ist lauffähig ab Version CS2
Gespiegelte Bilder finden
SpiegelBilderMarkieren.js
Link zur Ursprungsdiskussion im Forum
Das Script erzeugt die Ebene "Markierung", geht durch die Bilder des aktiven Dokuments und markiert horizontal oder vertikal gespiegelte mit einem gelben Quadrat mit Magenta-Kontur.
//SpiegelBilderMarkieren.js
//DESCRIPTION:Gespiegelte Bilder werden mit einem gelben, rot umrandeten Rahmen markiert
//
// Hans Haesler
// 18.10.2012
//
// vorsichtshalber die Dialoge einschalten
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;
// testen, ob ein Dokument geöffnet ist
if (app.documents.length == 0) {
alert ("Es ist kein Dokument offen.", "Achtung");
exit();
}
// die Programmversion feststellen
var appVers = app.version[0];
// vier Variablen initialisieren
var oDiff;
if (appVers == 4) {
oDiff = 1;
}
else if (appVers > 5) {
oDiff = 0;
}
else {
alert ("Dieses Script läuft nicht mit der aktuellen Programmversion.");
exit();
}
var curDoc = app.documents[0];
var probCtr = 0;
markSet = 0;
// den Ursprung der Linealeinheiten auf "Druckbogen" setzen
var rO = curDoc.viewPreferences.rulerOrigin;
if (rO != 1380143983) {
curDoc.viewPreferences.rulerOrigin = RulerOrigin.spreadOrigin;
}
// die Masseinheiten speichern
// wenn nicht 2053991795 (= Millimeter), auf Millimeter umstellen
var vM = curDoc.viewPreferences.verticalMeasurementUnits;
var hM = curDoc.viewPreferences.horizontalMeasurementUnits;
if (vM != 2053991795) {
curDoc.viewPreferences.verticalMeasurementUnits = MeasurementUnits.millimeters;
}
if (hM != 2053991795) {
curDoc.viewPreferences.horizontalMeasurementUnits = MeasurementUnits.millimeters;
}
// prüfen, ob die Ebene "Markierung" existiert
var labelLayer = curDoc.layers.itemByName("Markierung");
try {
labelLayer.name;
// die eventuell bestehenden Markierungen entfernen
curDoc.layers.itemByName("Markierung").remove();
// und die Ebene wieder anlegen
var newLayer = curDoc.layers.add();
newLayer.name = "Markierung";
}
catch (e){
var newLayer = curDoc.layers.add();
newLayer.name = "Markierung";
}
// die aktive Ebene speichern
var oldLayer = app.layoutWindows[0].activeLayer;
// die Ebene "Markierung" sichtbar machen, aktivieren und entsperren
try {
var actLayer = curDoc.layers.item("Markierung")
app.layoutWindows[0].activeLayer = actLayer;
actLayer.properties = {visible:true, locked:false};
}
catch (e) {
}
// die Liste der Bilder aufstellen
var allImages = curDoc.links;
var nImages = allImages.length;
// eine Schleife durch die Bilderliste
var vScale, gB, fP, p;
for (var i=0; i< nImages; i++) {
if (allImages[i].needed == true) {
try {
vScale = allImages[i].parent.verticalScale;
if (vScale < 0) {
probCtr++;
try {
gB = allImages[i].parent.parent.geometricBounds;
if (appVers > 6) {
p = allImages[i].parent.parent.parentPage.name;
markFrame(p, gB);
}
else {
fP = allImages[i].parent.parent.parent;
if (fP == "[object Page]") {
p = (fP.documentOffset)-oDiff;
markFrame(p, gB);
}
else {
while (fP != "[object Page]") {
if (fP == "[object Character]") {
if (appVers == 5 || appVers == 6) {
fP = fP.parent.textContainers[0].parent;
}
else {
fP = fP.parent.textFrames[0].parent;
}
}
else {
fP = fP.parent;
}
if (fP == "[object Application]") {
break;
}
}
if (fP == "[object Page]") {
p = (fP.documentOffset)-oDiff;
markFrame(p, gB);
}
}
}
}
catch (e) {
}
}
}
catch (e) {
}
}
}
// die ursprüngliche Ebene wieder aktivieren
app.layoutWindows[0].activeLayer = oldLayer;
// die Masseinheiten zurücksetzen (falls notwendig)
if (vM != 2053991795) {
curDoc.viewPreferences.verticalMeasurementUnits = vM;
}
if (hM != 2053991795) {
curDoc.viewPreferences.horizontalMeasurementUnits = hM;
}
// den Ursprung der Linealeinheiten zurücksetzen
if (rO != 1380143983) {
try {
curDoc.viewPreferences.rulerOrigin = rO;
}
catch (e) {
}
}
if (probCtr == 0) {
alert ("Keine gespiegelten Bilder gefunden.", "Fertig");
}
else {
alert ("Gespiegelte Bilder gefunden:\t" + probCtr + "\ndavon sind markiert:\t" + markSet, "Fertig");
}
// die Funktion, welche die Markierungsrahmen erzeugt
function markFrame(p, gB) {
try {
if (appVers > 6) {
var newFrame = curDoc.pages.itemByName(p).textFrames.add();
}
else {
var newFrame = curDoc.pages[p].textFrames.add();
}
var bW = 11;
newFrame.properties = {geometricBounds:[gB[0]+1, gB[1]+1, gB[0]+bW, gB[1]+bW],
fillColor:"Yellow", fillTint:-1, strokeWeight:2, strokeColor:"Magenta"};
markSet++;
}
catch (e) {
}
}
Skript ist lauffähig ab Version CS2
Grafik an Satzspiegel anpassen
BilderAlsFormular.jsx
Link zur Ursprungsdiskussion im Forum
Jürgen Althaus:
Habe für ein Werk ein kleines Skript gebastelt, dass importierte Grafiken an den Satzspiegel der aktuellen Seite proportional anpasst und gleichzeitig ein Objektformat zuweisst.
Vielleicht kann es ja jemand gebrauchen.
Viele Grüße
Jürgen
//BilderAlsFormular.jsx
//DESCRIPTION: Formatiert alle ausgewählten Grafiken mit einem Objektformat, passt sie an den Satzspiegel der aktuellen Seite an und richtet die Grafik an der oberen linken Ecke aus
var myStylename = 'Bilder';
var myDoc = app.activeDocument;
try{
myDoc.objectStyles.item( myStylename ).name;
}
catch (myError)
{
myDoc.objectStyles.add( { name : myStylename, strokeWeight : 0.4, strokeTint : 35, fillColor : 'Paper', enableStrokeAndCornerOptions:false,
transparencySettings:{dropShadowSettings:{mode : ShadowMode.DROP, opacity : 25, angle : 135, xOffset : '2mm', yOffset : '2mm', size : '2mm', blendMode : 'MULTIPLY', knockedOut : true }},
objectEffectsEnablingSettings: {enableDropShadow:true}} );
}
if (app.selection.length > 0)
var mySel = app.selection;
else
{
alert("Fehler!\rSo geht es nicht.\rNichts ausgewählt.");
exit();
}
for (oneItem = 0; oneItem < mySel.length; oneItem++)
{
if (mySel[oneItem].constructor.name == "Rectangle")
{
var myOStyle = myDoc.objectStyles.item(myStylename); // Objektstil
//Preferences sichern
with(myDoc){
var myZeroPoint = zeroPoint;
var myRuler = viewPreferences.rulerOrigin;
zeroPoint = [0,0];
viewPreferences.rulerOrigin = RulerOrigin.pageOrigin;
}
mySel[oneItem].geometricBounds = myGetBounds (myDoc, myDoc.pages.item(mySel[oneItem].parent.name));
mySel[oneItem].fit(FitOptions.fillProportionally);
mySel[oneItem].fit(FitOptions.frameToContent);
mySel[oneItem].applyObjectStyle(myOStyle, true); // Zuweisung des Objektstils
//Preferences zurückschreiben
with(myDoc){
zeroPoint = myZeroPoint;
viewPreferences.rulerOrigin = myRuler;
}
}
else
alert("Fehler!\rDu hast einen \""+ mySel[oneItem].constructor.name + "\" ausgewählt.\rIch brauche einen Bildrahmen!");
}
alert("Fertig!")
function myGetBounds(myDocument, myPage){
var myPageWidth = myDocument.documentPreferences.pageWidth;
var myPageHeight = myDocument.documentPreferences.pageHeight;
if(myPage.side == PageSideOptions.leftHand){
var myX2 = myPage.marginPreferences.left;
var myX1 = myPage.marginPreferences.right;
}
else{
var myX1 = myPage.marginPreferences.left;
var myX2 = myPage.marginPreferences.right;
}
var myY1 = myPage.marginPreferences.top;
var myX2 = myPageWidth - myX2 - myDoc.objectStyles.item(myStylename).transparencySettings.dropShadowSettings.xOffset;
var myY2 = myY1+1;
return [myY1, myX1, myY2, myX2];
}
Skript ist lauffähig ab Version CS3
[Illustrator CS2] Texttyp umwandeln: Punkt- zu Flächentext und umgekehrt
switchTextType.jsx
Link zur Ursprungsdiskussion im Forum
Auf eine Anfrage im Illustrator Forum (
Textrahmen umwandeln?) hier eine Studie zur Konvertierung des Texttyps ausgewählter Textrahmen.
Punkttexte werden zu Flächentexten und Flächentexte werden zu Punkttexten.
Textformatierungen bleiben erhalten.
// switchTextType.jsx
if ( app.selection.length == 0 )
exit( );
for ( var i = app.selection.length-1; i >= 0; i-- )
{
if ( app.selection[i].constructor.name == "TextFrame" )
{
if ( app.selection[i].kind == TextType.POINTTEXT )
{
pointText2areaText( app.selection[i] );
}
else if ( app.selection[i].kind == TextType.AREATEXT )
{
areaText2pointText( app.selection[i] );
}
}
}
function pointText2areaText( pointTextRef )
{
var rectRef = app.documents[0].pathItems.rectangle( pointTextRef.top, pointTextRef.left, pointTextRef.width, pointTextRef.height );
var areaTextRef = app.documents[0].textFrames.areaText( rectRef );
pointTextRef.textRange.duplicate(areaTextRef);
pointTextRef.remove();
}
function areaText2pointText( areaTextRef )
{
var pointTextRef = app.documents[0].textFrames.add();
pointTextRef.top = areaTextRef.top;
pointTextRef.left = areaTextRef.left;
areaTextRef.textRange.duplicate(pointTextRef);
areaTextRef.remove();
}
Hallo Martin,
zur Textumwandlung in Illustrator gibt's hier ein paar nützliche Skripte:
http://illustrator.hilfdirselbst.ch/.../javascript/tx_tools
(u.a. auch Punkttext in Textrahmen umwandeln ...)
Matthias
Hallo Matthias,
ja, das habe ich hinterher auch gesehen.
Und da habe ich auch gleich die textRange.duplicate()-Funktion geklaut, um den Inhalt formatiert zu übernehmen.
Nichtsdestotrotz unterscheidet sich das obige Skript in zwei Merkmalen von dem Punkttextumwandler aus den tx_tools:
1. konvertiert es hin und zurück;
2. konvertiert es alle und nicht nur den ersten ausgewählten Textrahmen.
Und - last but not least - habe ich mich dabei etwas im Illustrator-Scripting Dschungel orientieren gelernt.
Martin Fischer
Skript ist lauffähig in:
Auswahl als EPS exportieren
exportSelection2EPS.jsx
Link zur Ursprungsdiskussion im Forum
Stefan fragt in
Auswahl als EPS exportieren nach einer Möglichkeit, ausgewählte Objekte eines InDesign-Dokuments als EPS zu sichern.
Hier ein Skript, das die ausgewählten Objekte in das Unterverzeichnis "EPS" (relativ zum Dokumentverzeichnis) exportiert. Ist das aktive Dokument noch nicht gesichert worden, wird die EPS-Datei auf dem Schreibtisch abgelegt.
Der Name der EPS-Datei kann in einem Dialog eingegeben werden (Standardeinstellung: Seitenzahl, dreistellig).
// exportSelection2EPS.jsx
//DESCRIPTION: Exportiert die ausgewählten Objekte als EPS (auf dem DeskTop)
if ((app.documents.length == 0) || (app.selection.length == 0))
exit();
var mySel = app.selection;
var myPage = getPage(mySel[0]);
var myPageDigit = makeDigits(myPage.name,3) + "";
var myFileName = prompt ("Dateiname:", myPageDigit + ".eps");
// Verzeichnis, in dem die EPS-Datei gesichert werden soll
// Wenn Dokument gesichert, dann im Unterverzeichnis "EPS"
if (app.activeDocument.saved == true) {
try {
Folder(app.activeDocument.filePath + "/eps").create()
}
catch (e){}
var myFilePath = app.activeDocument.filePath + "/eps"
}
// Wenn Dokument nicht gesichert, dann auf dem Schreibtisch
else {
var myFilePath = "~/Desktop";
}
// Dateiname
var myFile = File(myFilePath + "/" + myFileName);
// zu exportierender (Seiten-)Bereich
app.epsExportPreferences.pageRange = myPage.name;
var myPageItems = app.activeDocument.pages[myPage.documentOffset-1].pageItems;
var myMasterPageItems = app.activeDocument.pages[myPage.documentOffset-1].masterPageItems
// Sichere Informationen zur Druchbarkeit
for (var p = 0; p < myPageItems.length; p++)
storeNonprint (myPageItems[p]);
for (var q = 0; q < myMasterPageItems.length; q++)
storeNonprint (myMasterPageItems[q]);
// alle Objekte nicht druckbar
myPageItems.everyItem().nonprinting = true;
for (k = 0; k < myMasterPageItems.length; k++)
myMasterPageItems[k].nonprinting = true;
// ausgewähltes Objekt druckbar
for (s = 0; s < mySel.length; s++)
mySel[s].nonprinting = false;
// Export
mySel[0].exportFile(ExportFormat.epsType, myFile);
// stelle Informationen zur Druchbarkeit wieder her
for (var p = 0; p < myPageItems.length; p++)
restoreNonprint(myPageItems[p]);
//for (var r = 0; r < myMasterPageItems.length; r++)
// restoreNonprint(myMasterPageItems[r]);
//=======================================================
// ENDE
//=======================================================
function storeNonprint(theObject) {
try {
var printable = (theObject.nonprinting == true) ? "true" : "false";
theObject.insertLabel("nonPrinting", printable);
}
catch (e) {}
}
function restoreNonprint(theObject) {
var printable = (theObject.extractLabel("nonPrinting") == "true") ? true : false;
theObject.nonprinting = printable;
}
function getPage(myObject) {
if (!myObject) {
alert("Overflow!")
exit();
}
if ((myObject.constructor.name == "Page") || (myObject.constructor.name == "Spread"))
return myObject
if ((myObject.constructor.name == "Character")
|| (myObject.constructor.name == "InsertionPoint")
|| (myObject.constructor.name == "Word")
|| (myObject.constructor.name == "Line")
|| (myObject.constructor.name == "TextRange"))
{
if ((app.version +"").substr(0,1) == "4") return getPage(myObject.parentTextFrames[0])
else if ((app.version +"").substr(0,1) == "3") return getPage(myObject.parentTextFrame)
}
return getPage(myObject.parent)
}
function makeDigits(theName, theDigits) {
var theFills = theDigits - (theName + "").length;
for (oneDigit = 0; oneDigit < theFills; oneDigit++) {
theName = "0" + theName;
}
return theName;
}
Da InDesign standardmäßig alle Objekte einer Seite exportiert, werden in diesem Skript kurzfristig alle Objekte auf der aktiven Seite nicht druckbar gemacht. Die ausgewählten Objekte werden anschließend druckbar gestellt und daraufhin exportiert.
Am Ende werden die ursprünglichen druckbar-Einstellungen wieder hergestellt.
Ungelöste Musterseitenobjekte werden nicht exportiert.
Martin Fischer
Skript ist lauffähig ab Version CS2
Bilder skalieren per Skript
ScaleEveryImage2xPercent.jsx
Link zur Ursprungsdiskussion im Forum
In
Bilder skalieren per Script ist ein JavaScript (ScaleEveryImage.jsx) veröffentlicht, das alle Bilder
um einen bestimmten Prozentwert skaliert.
Hier nun ein weiteres Skript, das alle Bilder eines Dokuments
auf einen bestimmten Prozentwert skaliert:
// ScaleEveryImage2xPercent.jsx
//
var myScale = prompt("Skalierung in Prozent", 100)*1;
var myPics = app.documents[0].allGraphics;
for (onePic = 0; onePic < myPics.length; onePic++){
myPics[onePic].horizontalScale = myScale;
myPics[onePic].verticalScale = myScale;
myPics[onePic].fit(FitOptions.frameToContent); // schmiegt den Rahmen wieder an's Bild an.
}
Diese Aufgabenstellung wurde angefragt in
Automatisierte Bildgrößenberechnung aus Indesign.
Martin Fischer
Skript ist lauffähig ab Version CS2
Fehlende Verknüpfungen ausgeben
missingLinks_UmlautsInLinks.jsx
Link zur Ursprungsdiskussion im Forum
Das folgende Skript listet die Namen der fehlenden Verknüpfungen auf.
In dieser Variante werden auch Links mit Umlaute im Dateinamen berücksichtigt.
// missingLinks_UmlautsInLinks.jsx
if (app.documents.length == 0)
exit();
var missingLinks = new Array;
var umlauts = new Array;
var myLinks = app.activeDocument.links;
for ( i = 0; i < myLinks.length; i++ )
{
// missing links
if ( myLinks[i].status == LinkStatus.linkMissing )
missingLinks.push( myLinks[i].name );
// umlauts
if ( myLinks[i].name.match( /[\u0308äöüÄÖÜ]/g ) != null )
umlauts.push( myLinks[i].name );
}
var theMessage = ( ( missingLinks.length > 0 ) || ( umlauts.length > 0 ) )
? "Achtung!\rFehlende Verknüpfungen:\r=========\r" + missingLinks.join( "\r" )
+ "\r\rUmlaute in Verknüpfungen:\r=========\r" + umlauts.join( "\r" )
: "OK!";
alert( theMessage )
Skript ist lauffähig ab Version CS2
Fehlende Verknüpfungen ausgeben
missingLinks.jsx
Link zur Ursprungsdiskussion im Forum
In
InDesign CS2 Skript - Verknüfungen überprüfen wurde nach einem Skript zur Überprüfung der Verknüpfungen gefragt.
Das folgende Skript listet die Namen der fehlenden Verknüpfungen auf:
// missingLinks.jsx
if (app.documents.length == 0)
exit();
var missingLinks = new Array;
var myLinks = app.activeDocument.links;
for ( i = 0; i < myLinks.length; i++ )
{
if ( myLinks[i].status == LinkStatus.linkMissing )
{
missingLinks.push( myLinks[i].name );
}
}
var theMessage = ( missingLinks.length > 0 ) ? "Missing links:\r" + missingLinks.join( "\r" ) : "OK!"
alert( theMessage );
Skript ist lauffähig ab Version CS2
Leere Bildrahmen löschen
removeEmptyRectangles.jsx
Link zur Ursprungsdiskussion im Forum
Das folgende Skript löscht leere Bildrahmen des aktiven Dokuments.
// removeEmptyRectangles.jsx
//DESCRIPTION: löscht leere Bildrahmen im Dokument
var r = app.documents.item(0).rectangles;
for (var i = r.length-1; i>= 0; i-- )
if (r[i].graphics.length == 0)
r[i].remove();
Skript ist lauffähig ab Version CS2
Öffne Bildverknüpfung im Online Stockfoto-Katalog
openImagesInIstock.jsx
Link zur Ursprungsdiskussion im Forum
Das Skript öffnet auf Tastendruck alle selektierten Bilder in IStock oder Fotolia, basierend auf der Stockfotonummer, die im Dateinamen des Layoutbildes enthalten ist.
Der Benutzer verwendet niedrigaufgelöste Layoutbilder des Stockkataloges im Dokument (in diesem Fall IStockPhoto.com). Die Bildnummer ist im Dateinamen des Layoutbildes enthalten (z.B. "ist2_11465311-frog-on-leaf.jpg"). Nach dem Layout sollen die Bilder nun gekauft werden. Was liegt näher, als die Bilder aus InDesign heraus im Stockfotokatalog zu öffnen und kaufen zu können.
Der User selektiert die gewünschten Bilder in InDesign und löst das Skript aus (beispw. SHIFT-ENTER). Das Skript erkennt per regulärem Ausdruck die Bildnummer im Dateinamen der gewählten Verknüpfung (11465311), erzeugt daraus eine vollständige URL des Onlinekataloges zu dieser Bildnummer (http://www.istockphoto.com/file_closeup.php?id=11465311) und öffnet die URL im Browser.
Dieses Skript ist angepasst auf ISTOCK.
Wer einen anderen Bilddienst verwenden möchte, muss natürlich die Katalog-URL und den Suchausruck für die Bildnummern in den Verknüpfungen anpassen, sodass es eine korrekte URL ergibt.
var doc = app.activeDocument;
var myItems = app.selection;
for (var j = myItems.length - 1; j >= 0; j--) {
var curSel = myItems[j];
var selType = curSel.constructor.name;
var curImage = curSel;
if (curSel.graphics.length != 0) {
var curImage = curSel.graphics[0];
if (curImage.itemLink.status != LinkStatus.LINK_EMBEDDED ) {
var LinkString = curImage.itemLink.name;
var myRegExp = /.+( |_|-)(\d{5,9}).+/;
try{
if(LinkString.match(myRegExp)!=null){
myMatch = LinkString.match(myRegExp);
myURL = "http://www.istockphoto.com/file_closeup.php?id=" + myMatch[2];
myHyperlinkDestination = myMakeURLHyperlinkDestination(myURL);
try{
var myHyperlinkPageItemSource = doc.hyperlinkPageItemSources.add(curImage.parent);
var myHyperlink = doc.hyperlinks.add(myHyperlinkPageItemSource, myHyperlinkDestination);
myHyperlink.visible = false;
myHyperlink.name = "OpenInIEtemp";
}
catch (myError){alert( "1." + myError) }
var myHyperlink = doc.hyperlinks.itemByName("OpenInIEtemp");
myHyperlink.showDestination();
myHyperlinkPageItemSource.remove();
myHyperlink.remove();
myHyperlinkDestination.remove();
}
}
catch (myError){ alert( "2." + myError) }
}
}
}
function myMakeURLHyperlinkDestination(myURL){
var myDocument = app.activeDocument;
//If the hyperlink destination already exists, use it;
//if it doesn't, then create it.
try{
var myHyperlinkDestination = myDocument.hyperlinkURLDestinations.item(myURL);
myHyperlinkDestination.name;
}
catch(myError){
myHyperlinkDestination = myDocument.hyperlinkURLDestinations.add(myURL);
}
myHyperlinkDestination.name = myURL;
//Set other hyperlink properties here, if necessary.
return myHyperlinkDestination;
}
Skript ist lauffähig ab Version CS4
planePath.jsx (Pfadecken mildern per gleitendem Mittelwert)
planePath.jsx
Link zur Ursprungsdiskussion im Forum
Berechnet den
(-->wikipedia) "
Gleitenden Mittelwert" auf Pfadobjekte. Jeder Pfadpunkt wird auf den Mittelwert aus sich und seinen jeweiligen zwei Nachbarpunkten gesetzt. Das mildert Extremwerte in Pfaden und hobelt Ecken rund.
Beispielbilder siehe
Ursprungsdiskussion.
Es komplementiert folgende Pfade-Scripte, die sich alle prima im Mix und in Verbindung mit addPoints.jsx anwenden lassen:
reducePath.jsx - entfernen überflüssiger Pfadpunkte unter Beibehaltung der generelle Form = Pfad vereinfachen.
smoothPath.jsx - berechnen von "Bezier-Handles" für die Pfadpunkte, sodass die Kurve weich durch ihre Punkte fließt.
scatterPath.jsx - Pfade aufrauhen, verzerren.
planePath.jsx - Mittelwert zwischen den Pfadpunkten berechnen und so Extremwerte abmildern. Hobelt Ecken rund.
(
addPoints.jsx - von Adobe mitgeliefert. Fügt zwischen jede zwei Pfadpunkte einen Pfadpunkt in der Mitte ein.)
//***************************************************************************
// planePath.jsx v.0.1
// Doing a 3rd order "running average" transformation on the selected path objects
// Each pathpoint is moved to the average position of itself, its predecessor and successor point. Exception: First and Last Point in open paths cannot be calculated since they are missing predecessor or successor.
// An InDesign CS4 JavaScript
// Stephan Möbius, May 2010, contact [moebius@anymotion.de]
//***************************************************************************
// Can be used to smoothen a path, especially in combination with
// "add_points.jsx" [adding new point inbetween each two given points]
// by running "planePath.jsx" and "add_points.jsx" several times. Experiment.
// Also good for creative use in combination with:
// "reducePath.jsx" [removing unnescessary vertices],
// "scatterPath.jsx" [chaotically roughen a path by moving vertices up to a given random max amount]
// "smoothPath.jsx" [calculating smoother bezier handles to curve a path smoothly]
#target indesign
const planeAmount = 1.0; // 0.1 = almost no shaving off; 1 = full averaging of points
main();
function PlanePath(myPath) {
var myPathClosed = (myPath.pathType == PathType.CLOSED_PATH ? true : false);
var myPathLength = myPath.pathPoints.length;
var myPointArray = new Array();
var myPoint, myPnLast, myPnLastX, myPnLastY, myPnNext, myPnNextX, myPnNextY, myNewPnX, myNewPnY, myPnDeltaX, myPnDeltaY, myNewPnRX, myNewPnRY, myNewPnLX, myNewPnLY;
if (myPathClosed) {
/* check for simple case */
if ( myPathLength <= 3 )
return(myPath.entirePath); /* one or two points */
for (var n = 0; n <= myPathLength-1; n ++){
with (myPath.pathPoints.item(n)) {;
// left and right bezier handle of anchorpoints will _not_ be changed/smoothed. We do need them to move with their anchor point, so we need to move them the same amount as the anchor.
// in fact i have no idea what to do with the bezier handles in order to get smooth correct results. Run a "smoothPath.jsx" aftterwards.
switch(n) {
case 0:
myPnLast = myPath.pathPoints.item(myPathLength-1);
myPnNext = myPath.pathPoints.item(1);
break;
case myPathLength-1:
myPnLast = myPath.pathPoints.item(myPathLength-2);
myPnNext = myPath.pathPoints.item(0);
break;
default:
myPnLast = myPath.pathPoints.item(n-1); // the point before the current one
myPnNext = myPath.pathPoints.item(n+1); // the point after the current one
}
myPnLastX = myPnLast.anchor[0];
myPnLastY = myPnLast.anchor[1];
myPnNextX = myPnNext.anchor[0];
myPnNextY = myPnNext.anchor[1];
myNewPnX = (myPnLastX + anchor[0] + myPnNextX)/3; // we use a running average of 3rd order, so we calculate the center of 3 consecutive points
myNewPnY = (myPnLastY + anchor[1] + myPnNextY)/3;
myPnDeltaX = anchor[0] - myNewPnX; // calculating the distance between old and new position - needed to move the bezier handles
myPnDeltaY = anchor[1] - myNewPnY;
myNewPnX += (1-planeAmount)*myPnDeltaX;
myNewPnY += (1-planeAmount)*myPnDeltaY;
myNewPnRX = rightDirection[0] - myPnDeltaX + (1-planeAmount)*myPnDeltaX; // new left bezier handle position
myNewPnRY = rightDirection[1] - myPnDeltaY +(1-planeAmount)*myPnDeltaY;
myNewPnLX = leftDirection[0] - myPnDeltaX + (1-planeAmount)*myPnDeltaX; // new right bezier handle position
myNewPnLY = leftDirection[1] - myPnDeltaY+ (1-planeAmount)*myPnDeltaY;
myPoint = [[myNewPnLX, myNewPnLY], [myNewPnX, myNewPnY], [myNewPnRX, myNewPnRY]];
} // end with
myPointArray.push(myPoint); // this point-array will be returned and given to "myPath.entirePath" in main
} // end for
}
else {
/* check for simple case */
if ( myPathLength < 3 )
return(myPath.entirePath); /* one or two points */
for (var n = 0; n <= myPathLength-1; n ++){
with (myPath.pathPoints.item(n)) {;
if (n == 0 || n == myPathLength-1) {
myPoint = [[leftDirection[0], leftDirection[1]], [anchor[0], anchor[1]], [rightDirection[0], rightDirection[1]]];
}
else {
myPnLast = myPath.pathPoints.item(n-1); // the point before the current one
myPnLastX = myPnLast.anchor[0];
myPnLastY = myPnLast.anchor[1];
myPnNext = myPath.pathPoints.item(n+1); // the point after the current one
myPnNextX = myPnNext.anchor[0];
myPnNextY = myPnNext.anchor[1];
myNewPnX = (myPnLastX + anchor[0] + myPnNextX)/3; // we use a running average of 3rd order, so we calculate the center of 3 consecutive points
myNewPnY = (myPnLastY + anchor[1] + myPnNextY)/3;
myPnDeltaX = anchor[0] - myNewPnX; // calculating the distance between old and new position - needed to move the bezier handles
myPnDeltaY = anchor[1] - myNewPnY;
myNewPnRX = rightDirection[0] - myPnDeltaX; // new left bezier handle position
myNewPnRY = rightDirection[1] - myPnDeltaY;
myNewPnLX = leftDirection[0] - myPnDeltaX; // new right bezier handle position
myNewPnLY = leftDirection[1] - myPnDeltaY;
myPoint = [[myNewPnLX, myNewPnLY], [myNewPnX, myNewPnY], [myNewPnRX, myNewPnRY]];
} // end if...else
} // end with
myPointArray.push(myPoint); // this point-array will be returned and given to "myPath.entirePath" in main
} // end for
} // end if else path closed
return myPointArray;
} // function PlanePath
function main(){
//Make certain that user interaction (display of dialogs, etc.) is turned on.
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;
if (app.documents.length != 0){
if (app.selection.length != 0){
for(var n = 0; n < app.selection.length; n++){
switch (app.selection[n].constructor.name){
case "TextFrame":
case "Rectangle":
case "Oval":
case "Polygon":
case "GraphicLine":
var myPaths = app.selection[n].paths
for (var m = 0; m < myPaths.length; m++) { // for each of the paths in one selected object DO...
var myPath = myPaths[m];
myPath.entirePath = PlanePath(myPath);
}
break;
default: alert ("Please select a rectangle, oval, polygon, or graphic line and try again.");
} // end switch
} // end for
} else alert ("Please select an object and try again.");
} else alert ("Please open a document, select an object, and try again.");
}
Skript ist lauffähig ab Version CS4
reducePath.jsx (Pfade vereinfachen / Punkte reduzieren)
reducePath.jsx
Link zur Ursprungsdiskussion im Forum
Vereinfacht gewählte Pfadobjekte. Sucht form-relevante Punkte in den Pfaden und entfernt überflüssige Pfadpunkte. Die Empfindlichkeit ist einstellbar. Es funktioniert nach dem
(-->wikipedia) Douglas Peucker Algorithmus.
Beispielbilder siehe
Ursprungsdiskussion.
Es komplementiert folgende Pfade-Skripte, die sich alle prima im Mix und in Verbindung mit addPoints.jsx anwenden lassen:
reducePath.jsx - entfernen überflüssiger Pfadpunkte unter Beibehaltung der generelle Form = Pfad vereinfachen.
smoothPath.jsx - berechnen von "Bezier-Handles" für die Pfadpunkte, sodass die Kurve weich durch ihre Punkte fließt.
scatterPath.jsx - Pfade aufrauhen, verzerren.
planePath.jsx - Mittelwert zwischen den Pfadpunkten berechnen und so Extremwerte abmildern. Hobelt Ecken rund.
(
addPoints.jsx - von Adobe mitgeliefert. Fügt zwischen jede zwei Pfadpunkte einen Pfadpunkt in der Mitte ein.)
// reducePath.jsx - 0.0.1
// Removes superfluous vertices with a Douglas-Peucker algorithm, keeping the overall shape of the object.
#target indesign
//max allowed deviation, 0 will remove no vertice
var kink = prompt ("Max deviation in current units.\rZero will remove no pathpoints:" , 1 , "reducePath 0.0.1 (Douglas-Peucker)" );
// If you'd like to smooth the bezierhandles of the path use "smoothPath.jsx"
// This script works here in Adobe InDesign CS4 6.0.4 (german)(windows XP) - I can't test it anywhere else.
// KNOWN ISSUES
// - can't remove the last vertice in closed paths :(
// - doesn't work with any groups selected, because i am too lazy
// - low performance with complex paths. Issue could be dealt with with a progress bar, but i don't know how to implement a progress bar in the recursion.
// i tried a progressbar that increases the MaxValue with every step of the recursion (making the progress steps tinier as we go) but i didn't get it working properly.
// kind regards,
// Stephan Möbius
for (var n = 0; n < app.selection.length; n++) { // for each selected object DO...
var myPaths = app.selection[n].paths
for (var m = 0; m < myPaths.length; m++) { // for each of the paths in one selected object DO...
var myPath = myPaths[m];
myPath.entirePath = DouglasPeucker(myPath, kink);
}
}
function DouglasPeucker (myPath, kink) // returns Array of PathPoints
{
var myPathClosed = (myPath.pathType == PathType.CLOSED_PATH ? true : false);
var myPathLength, n_stack, destinationlength, start, end, i, sect;
var dev_sqr, max_dev_sqr;
var x12, y12, d12, x13, y13, d13, x23, y23, d23;
var myPointArray = new Array();
var myX, myY, myCLX, myCLY, myCRX, myCRY;
var index = new Array(); /* array of indexes(!) of myPath points to include in the reduced line */
var sect_start = new Array(); /* indices of start & end of working section */
var sect_end = new Array();
/* check for simple cases */
if ( myPath.pathPoints.length < 3 )
return(myPath.entirePath); /* one or two points */
/* more complex case. initialize stack */
myPathLength = myPath.pathPoints.length;
destinationLength = 0;
sect_start[0] = 0;
sect_end[0] = myPathLength-1;
n_stack = 1;
/* while the stack is not empty ... */
while ( n_stack > 0 ){
/* ... pop the top-most entries off the stacks */
start = sect_start[n_stack-1];
end = sect_end[n_stack-1];
n_stack--;
if ( (end - start) > 1 ){ /* any intermediate points ? */
/* ... yes, so find most deviant intermediate point to
either side of line joining start & end points */
x12 = (myPath.pathPoints[end].anchor[0] - myPath.pathPoints[start].anchor[0]);
y12 = (myPath.pathPoints[end].anchor[1] - myPath.pathPoints[start].anchor[1]);
d12 = (x12*x12) + (y12*y12);
for ( i = start + 1, sect = start, max_dev_sqr = -1.0; i < end; i++ ){
x13 = (myPath.pathPoints[i].anchor[0] - myPath.pathPoints[start].anchor[0]);
y13 = (myPath.pathPoints[i].anchor[1] - myPath.pathPoints[start].anchor[1]);
d13 = (x13*x13) + (y13*y13);
x23 = (myPath.pathPoints[i].anchor[0] - myPath.pathPoints[end].anchor[0]);
y23 = (myPath.pathPoints[i].anchor[1] - myPath.pathPoints[end].anchor[1]);
d23 = (x23*x23) + (y23*y23);
if ( d13 >= ( d12 + d23 ) )
dev_sqr = d23;
else if ( d23 >= ( d12 + d13 ) )
dev_sqr = d13;
else
dev_sqr = (x13 * y12 - y13 * x12) * (x13 * y12 - y13 * x12) / d12;// solve triangle
if ( dev_sqr > max_dev_sqr ){
sect = i;
max_dev_sqr = dev_sqr;
}
}
if ( max_dev_sqr < kink ){ /* is there a sect. intermediate point ? */
/* ... no, so transfer current start point */
index[destinationLength] = start;
destinationLength++;
}
else{
/* ... yes, so push two sub-sections on stack for further processing */
n_stack++;
sect_start[n_stack-1] = sect;
sect_end[n_stack-1] = end;
n_stack++;
sect_start[n_stack-1] = start;
sect_end[n_stack-1] = sect;
}
}
else{
/* ... no intermediate points, so transfer current start point */
index[destinationLength] = start;
destinationLength++;
}
}
/* transfer last point */
// TO DO
// this works fine with open paths, but on closed paths this often leaves a point that should have been removed
index[destinationLength] = myPathLength-1;
/* make return array of pointdata as .entirePath expects it to come*/
for (var i = 0; i < index.length; i ++){
with (myPath.pathPoints[index[i]])
myPointArray.push([[leftDirection[0], leftDirection[1]], [anchor[0], anchor[1]], [rightDirection[0], rightDirection[1]]]);
}
return myPointArray;
}
Skript ist lauffähig ab Version CS4
scatterPath.jsx (Pfade aufrauen)
scatterPath.jsx
Link zur Ursprungsdiskussion im Forum
Verschiebt die einzelnen Pfadpunkte gewählter Pfadobjekte per Zufall innerhalb vom User wählbaren Grenzen. Gut zum anecken und aufrauen von Pfaden.
Beispielbilder siehe
Ursprungsdiskussion.
Es komplementiert folgende Pfade-Skripte, die sich alle prima im Mix und in Verbindung mit addPoints.jsx anwenden lassen:
reducePath.jsx - entfernen überflüssiger Pfadpunkte unter Beibehaltung der generelle Form = Pfad vereinfachen.
smoothPath.jsx - berechnen von "Bezier-Handles" für die Pfadpunkte, sodass die Kurve weich durch ihre Punkte fließt.
scatterPath.jsx - Pfade aufrauhen, verzerren.
planePath.jsx - Mittelwert zwischen den Pfadpunkten berechnen und so Extremwerte abmildern. Hobelt Ecken rund.
(
addPoints.jsx - von Adobe mitgeliefert. Fügt zwischen jede zwei Pfadpunkte einen Pfadpunkt in der Mitte ein.)
// ScatterPath.jsx v.0.1
// An InDesign CS4 JavaScript
// Randomizes the position of the points of selected path objects. The bezier handles are not touched. (Too much math for my head).
// Best used with small values. Use "addPoints.jsx" from the Adobe example scripts to play around.
#target indesign
main();
function main(){
//Make certain that user interaction (display of dialogs, etc.) is turned on.
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;
var myObjectList = new Array;
if (app.documents.length != 0){
if (app.selection.length != 0){
for(var myCounter = 0;myCounter < app.selection.length; myCounter++){
switch (app.selection[myCounter].constructor.name){
case "TextFrame":
case "Rectangle":
case "Oval":
case "Polygon":
case "GraphicLine":
myObjectList.push(app.selection[myCounter]);
break;
}
}
if (myObjectList.length != 0){
myDisplayDialog(myObjectList);
}
else{
alert ("Please select a rectangle, oval, polygon, or graphic line and try again.");
}
}
else{
alert ("Please select an object and try again.");
}
}
else{
alert ("Please open a document, select an object, and try again.");
}
}
function getUnit(mu) {
var str = new String;
switch (mu) {
case MeasurementUnits.AGATES: str = "ag"; break;
case MeasurementUnits.CENTIMETERS: str = "cm"; break;
case MeasurementUnits.CICEROS: str = "ci"; break;
case MeasurementUnits.CUSTOM: str = "cstm"; break;
case MeasurementUnits.INCHES: str = "in"; break;
case MeasurementUnits.INCHES_DECIMAL: str = "in"; break;
case MeasurementUnits.MILLIMETERS: str = "mm"; break;
case MeasurementUnits.PICAS: str = "pc"; break;
case MeasurementUnits.POINTS: str = "pt"; break;
}
return str;
}
function myDisplayDialog(myObjectList){
var userHoriz = getUnit(app.documents[0].viewPreferences.horizontalMeasurementUnits);
var userVert = getUnit(app.documents[0].viewPreferences.verticalMeasurementUnits);
myDialog = app.dialogs.add({name:"ScatterPath v.0.1"});
with(myDialog){
with(dialogColumns.add()){
with(borderPanels.add()){
with (dialogColumns.add()){
staticTexts.add({staticLabel:"Scatter X:"});
staticTexts.add({staticLabel:"Scatter Y:"});
}
with (dialogColumns.add()){
var myTransXEditbox = realEditboxes.add({editValue:50});
var myTransYEditbox = realEditboxes.add({editValue:50});
}
with (dialogColumns.add()){
staticTexts.add({staticLabel:userHoriz});
staticTexts.add({staticLabel:userVert});
}
}
}
}
var myReturn = myDialog.show();
if (myReturn == true){
//Get the values from the dialog box.
var myTransX = myTransXEditbox.editValue;
var myTransY = myTransYEditbox.editValue;
myDialog.destroy();
myPathEffect(myObjectList, myTransX, myTransY);
}
else{
myDialog.destroy();
}
}
function myPathEffect(myObjectList, myTransX, myTransY){
var myPathPoint, myAnchor, myX, myY, myX1, myY1, myRX1, myRY1, myLX1, myLY1, myRndTransX, myRndTransY, myPoint, myPathPoint, myPointArray
for (var myObjectCounter = 0; myObjectCounter < myObjectList.length; myObjectCounter++){
var myObject = myObjectList[myObjectCounter];
var myBounds = myObject.geometricBounds;
var myXCenter = myBounds[1] + ((myBounds[3] - myBounds[1]) / 2);
var myYCenter = myBounds[0] + ((myBounds[2] - myBounds[0]) / 2);
for(var myPathCounter = 0; myPathCounter < myObject.paths.length; myPathCounter ++){
var myPath = myObject.paths.item(myPathCounter);
var myPointArray = new Array(myPath.pathPoints.length);
for (var myPathPointCounter = 0; myPathPointCounter < myPath.pathPoints.length; myPathPointCounter ++){
myPathPoint = myPath.pathPoints.item(myPathPointCounter);
myAnchor = myPathPoint.anchor;
myRightDirection = myPathPoint.rightDirection;
myLeftDirection = myPathPoint.leftDirection;
myX1 = myAnchor[0];
myY1 = myAnchor[1];
myRX1 = myRightDirection[0];
myRY1 = myRightDirection[1];
myLX1 = myLeftDirection[0];
myLY1 = myLeftDirection[1];
myRndTransX = 2*((Math.random()*myTransX)-0.5*myTransX);
myRndTransY = 2*((Math.random()*myTransY)-0.5*myTransY);
myX = myRndTransX + myX1;
myY = myRndTransY + myY1;
myRX = myRndTransX + myRX1;
myRY = myRndTransY + myRY1;
myLX = myRndTransX+ myLX1;
myLY = myRndTransY + myLY1;
myPoint = [[myLX, myLY], [myX, myY], [myRX, myRY]];
myPointArray[myPathPointCounter] = myPoint;
}
myPath.entirePath = myPointArray;
}
}
}
Skript ist lauffähig ab Version CS4
Sichtbarkeit der Objektebenen mit Ebenen des Dokuments synchronisieren
syncObjectLayersVisibility.jsx
Link zur Ursprungsdiskussion im Forum
Das Skript prüft bei allen verknüpften Objekten mit Objektebenen (z.B. platzierte InDesign-Dateien, AI, PSD, PDF) die Schnittmenge zwischen den Objekt- und den Dokumentebenen.
Stimmen zwei Ebenen namentlich überein und unterschiedet sich ihre Sichtbarkeit, wird die Objektebene auf die Sichtbarkeit der entsprechenden Dokumentebene eingestellt.
Beispiel
aktuelle InDesign-Datei mit den Ebenen 'Alle Sprachen', 'deutsch', 'englisch', 'französisch', 'Bilder'; wobei 'englisch' und 'französisch' ausgeblendet sind.
platzierte InDesign-Datei mit den sichtbaren Ebenen 'deutsch', 'englisch', 'französisch', 'Graphik'
Nach Ausführung des Skripts sind in die Ebenen 'englisch' und 'französisch' der platzierten InDesign-Datei ausgeblendet (analog zur Einstellung der entsprechenden Ebenen im Dokument).
Die Ebenen des Dokuments werden nicht angetastet.
Ebenfalls werden Ebenen des Objekts, die im Dokument nicht vorhanden sind, nicht angetastet.
Nur die Schnittmenge wird überprüft. Die Sichtbarkeit der Dokumentebenen steuert die Sichtbarkeit der Objektebenen.
//syncObjectLayersVisibility.jsx
//DESCRIPTION: Synchronisiert die Ebenensichtbarkeit in der Schnittmenge von Objektebenen mit Dokumentebenen
//Author: Martin Fischer
//Date: 10/2009
var myLinks = app.activeDocument.links;
for ( var i = 0; i < myLinks.length; i++ )
{
if ( myLinks[i].parent.hasOwnProperty('graphicLayerOptions') )
checkLayers( myLinks[i], app.activeDocument.layers);
}
function checkLayers( oneLink, myDocLayers )
{
var myObjectLayers = oneLink.parent.graphicLayerOptions.graphicLayers;
for ( var n = 0; n < myDocLayers.length; n++ )
{
if ( myObjectLayers.itemByName(myDocLayers[n].name).isValid
&& myObjectLayers.itemByName(myDocLayers[n].name).currentVisibility != myDocLayers[n].visible)
{
myObjectLayers.itemByName(myDocLayers[n].name).currentVisibility = myDocLayers[n].visible;
myObjectLayers = oneLink.parent.graphicLayerOptions.graphicLayers;
continue;
}
}
}
Skript ist lauffähig ab Version CS4
smoothPath.jsx (weiche Bezier-Punkte berechnen)
smoothPath.jsx
Link zur Ursprungsdiskussion im Forum
Berechnet "weiche" Bezier-Handles für die Pfadpunkte der gewählten Pfadobjekte. Die Weichheit ist einstellbar und die Kurve fliesst mehr oder minder weich durch alle Punkte.
Weichheit 0 entfernt alle Bezier-Handles, macht den Pfad eckig. Der Algorithmus ist jedoch keine Cubic Spline Interpolation und die Ergebnisse in vielen Fällen nicht so weich wie erwartet.
Beispielbilder siehe
Ursprungsdiskussion.
Es komplementiert folgende Pfade-Skripte, die sich alle prima im Mix und in Verbindung mit addPoints.jsx anwenden lassen:
reducePath.jsx - entfernen überflüssiger Pfadpunkte unter Beibehaltung der generelle Form = Pfad vereinfachen.
smoothPath.jsx - berechnen von "Bezier-Handles" für die Pfadpunkte, sodass die Kurve weich durch ihre Punkte fließt.
scatterPath.jsx - Pfade aufrauhen, verzerren.
planePath.jsx - Mittelwert zwischen den Pfadpunkten berechnen und so Extremwerte abmildern. Hobelt Ecken rund.
(
addPoints.jsx - von Adobe mitgeliefert. Fügt zwischen jede zwei Pfadpunkte einen Pfadpunkt in der Mitte ein.)
// smoothPath.jsx - 0.0.1
// Smoothes the vertices by giving them smooth bezier control handles. Note: it's _not_ a true quadratic or cubic spline interpolation.
#target indesign
var smooth = prompt ("Smooth value of 1 gives smoothest results. Smooth 1.05 on a square gives a circle. Smooth value of 0 retracts all bezier handles:" , 1 , "smoothPath 0.0.1" );
// Smoothing algorithm taken from here: http://www.antigrain.com/research/bezier_interpolation/index.html
// Smooth value of 1 gives smoothest results. Smooth 1.05 on a square gives a circle. Smooth value of 0 retracts all bezier handles.
// Often you will need to reduce the paths beforehand and remove superflous vertices - use "reducePath.jsx"
// If you'd like a user interface to enter values, with the added ability to reduce the paths, preview the smoothing, and undo smoothing try "smoothPathUI.jsx"
// This script works here in Adobe InDesign CS4 6.0.4 (german)(windows XP) - I can't test it anywhere else.
// KNOWN ISSUES
// - doesn't work with any groups selected, because i am too lazy
// - will not smooth the last vertex in open paths
// kind regards,
// Stephan Möbius
for (var n = 0; n < app.selection.length; n++) { // for each selected object DO...
var myPaths = app.selection[n].paths
for (var m = 0; m < myPaths.length; m++) { // for each of the paths in one selected object DO...
var myPath = myPaths[m];
myPath.entirePath = smoothPath(myPath, smooth);
}
}
function smoothPath(myPath, smooth_value) {
var myPathClosed = (myPath.pathType == PathType.CLOSED_PATH ? true : false);
var myPointArray = new Array;
var myLast, myThis, myNext, mySecondNext = new Number;
// put all PathPoints of this path into an array to work with
for (var i = 0; i < myPath.pathPoints.length; i ++){
with (myPath.pathPoints[i])
myPointArray.push([[leftDirection[0], leftDirection[1]], [anchor[0], anchor[1]], [rightDirection[0], rightDirection[1]]]);
}
for (var i = 0; i < myPointArray.length; i++) {
myThis = i;
myLast = (i-1) % myPointArray.length + (i-1>=0 ? 0 : myPointArray.length); // for negative results of modulo, add 1*length to be in the positive range
myNext = (i+1) % myPointArray.length;
mySecondNext = (i+2) % myPointArray.length;
xc1 = (myPointArray[myLast][1][0] + myPointArray[myThis][1][0]) / 2.0;
yc1 = (myPointArray[myLast][1][1] + myPointArray[myThis][1][1]) / 2.0;
xc2 = (myPointArray[myThis][1][0] + myPointArray[myNext][1][0]) / 2.0;
yc2 = (myPointArray[myThis][1][1] + myPointArray[myNext][1][1]) / 2.0;
xc3 = (myPointArray[myNext][1][0] + myPointArray[mySecondNext][1][0]) / 2.0;
yc3 = (myPointArray[myNext][1][1] + myPointArray[mySecondNext][1][1]) / 2.0;
len1 = Math.sqrt((myPointArray[myThis][1][0]-myPointArray[myLast][1][0]) * (myPointArray[myThis][1][0]-myPointArray[myLast][1][0]) + (myPointArray[myThis][1][1]-myPointArray[myLast][1][1]) * (myPointArray[myThis][1][1]-myPointArray[myLast][1][1]));
len2 = Math.sqrt((myPointArray[myNext][1][0]-myPointArray[myThis][1][0]) * (myPointArray[myNext][1][0]-myPointArray[myThis][1][0]) + (myPointArray[myNext][1][1]-myPointArray[myThis][1][1]) * (myPointArray[myNext][1][1]-myPointArray[myThis][1][1]));
len3 = Math.sqrt((myPointArray[mySecondNext][1][0]-myPointArray[myNext][1][0]) * (myPointArray[mySecondNext][1][0]-myPointArray[myNext][1][0]) + (myPointArray[mySecondNext][1][1]-myPointArray[myNext][1][1]) * (myPointArray[mySecondNext][1][1]-myPointArray[myNext][1][1]));
k1 = len1 / (len1 + len2);
k2 = len2 / (len2 + len3);
xm1 = xc1 + (xc2 - xc1) * k1;
ym1 = yc1 + (yc2 - yc1) * k1;
xm2 = xc2 + (xc3 - xc2) * k2;
ym2 = yc2 + (yc3 - yc2) * k2;
ctrl1_x = xm1 + (xc2 - xm1) * smooth_value + myPointArray[myThis][1][0] - xm1;
ctrl1_y = ym1 + (yc2 - ym1) * smooth_value + myPointArray[myThis][1][1] - ym1;
ctrl2_x = xm2 + (xc2 - xm2) * smooth_value + myPointArray[myNext][1][0] - xm2;
ctrl2_y = ym2 + (yc2 - ym2) * smooth_value + myPointArray[myNext][1][1] - ym2;
if (myPathClosed) {
myPointArray[myThis][2][0] = ctrl1_x;
myPointArray[myThis][2][1] = ctrl1_y;
myPointArray[myNext][0][0] = ctrl2_x;
myPointArray[myNext][0][1] = ctrl2_y;
}
else { // if path is open then don't give the start and endpoints any beziercontrols they don't have already
if (myThis != 0 && myThis != myPointArray.length-1) {
myPointArray[myThis][2][0] = ctrl1_x;
myPointArray[myThis][2][1] = ctrl1_y;
}
if (myThis != myPointArray.length-1 && myThis != myPointArray.length-2) {
myPointArray[myNext][0][0] = ctrl2_x;
myPointArray[myNext][0][1] = ctrl2_y;
}
}
} // end of FOR each point in path
return myPointArray;
}
Skript ist lauffähig ab Version CS4
Verknüpfte PDF-Dateien verschieben
MoveLinkedPDFsAndRelink.jsx
Link zur Ursprungsdiskussion im Forum
Florian Buchner hat in
[JavaScript] PDFs verschieben ... ein Skript veröffentlicht, das verknüpfte PDF-Dateien in einen voreingestellten Basisordner (hier 'Schreibtisch/PDF-Links') verschiebt und neu verknüpft.
// MoveLinkedPDFsAndRelink.jsx
//DESCRIPTION:PDF-Dateien in voreingestellten Basisordner verschieben.
// Florian Buchner 11/2009
//aktuelles Dokument
var currentDocument=app.activeDocument;
//Neuer Basisordner erzeugen
var baseFolder = new Folder("~/Desktop/PDF-Links");
if(!baseFolder.exists){
baseFolder.create();
}
for(j=0;j < currentDocument.links.length; j++){ // durchlaufe alle Links im Dokument
var aLink = currentDocument.links[j];
if(aLink.status==LinkStatus.NORMAL){ //Verknüpfung stimmt
if(aLink.linkType=="Adobe Portable Document Format (PDF)"){
var f = new File(aLink.filePath);
//Unterordner erzeugen
var subfolderName = f.path.substring(f.path.lastIndexOf("/")+1, f.path.length);
var subfolder = new Folder(baseFolder+"/"+subfolderName);
if(!subfolder.exists){
subfolder.create();
}
var newFilename = baseFolder+"/"+ subfolderName +"/"+f.name;
var newFile = new File(baseFolder+"/"+ subfolderName +"/"+f.name);
if(!newFile.exists){
f.copy(newFilename);
aLink.relink(newFile);
f.remove();
}
}
}
}
try {
currentDocument.links.everyItem().update();
} catch(e){}
Skript ist lauffähig ab Version CS3
Layout (Ausrichten, Zeichnen)
»Gehe zu Seite« ? in allen offenen Dokumenten
gotoPage_everyDoc.jsx
Link zur Ursprungsdiskussion im Forum
Dieses Skript sorgt dafür, dass in allen offenen Dokumenten die im Dialogfenster angegebene Seite angezeigt wird.
Es dient damit etwa der synchronen Navigation durch mehrere offene Dokumente z.B. beim Abgleich unterschiedlicher Dokumentversionen.
Ich empfehle, dieses Skript auf eine
Kurztaste zu legen.
Siehe auch
// gotoPage_everyDoc.jsx
//DESCRIPTION:»Gehe zu Seite« in allen offenen Dokumenten
var doc = app.documents.firstItem();
var a_page = doc.layoutWindows.firstItem().activePage;
var t_page = prompt('Gehe zu Seite: ', a_page.name);
if (t_page != null)
{
for (var i = 0; i < app.documents.length; i++)
{
if (app.documents.item(i).pages.itemByName(t_page).isValid)
app.documents.item(i).layoutWindows.everyItem().activePage = app.documents.item(i).pages.itemByName(t_page);
else
beep();
}
}
Skript ist lauffähig ab Version CS4
Hilfslinie von Druckbogen auf Seite(n) des Druckbogens bringen
selectedGuides_fitToPage.jsx
Link zur Ursprungsdiskussion im Forum
In dem Beitrag
Hilfslinie von Montagefläche auf Seite bringen fragt Bernhard Werner nach einen Knopf, der aus einer Druckbogen-Hilfslinie eine Seiten-Hilfslinie macht.
Das Skript
selectedGuides_fitToPage.jsx wandelt alle ausgewählten druckbogenorientierten Hilfslinien in seitenorientierte Hilfslinien um.
Aufgelöste Hilfslinien auf alle Seiten des Druckbogens duplizieren
Am Anfang des Skripts findet sich die Zeile
var duplicate_guides = true;.
Dort kann der Anwender Einfluss nehmen auf das Duplizieren von aufgelösten druckbogenorientierten Hilfslinien auf alle Seiten des Druckbogens.
Wenn die Druckbogenorientierung einer Hilfslinie zugunsten der Seitenorientierung aufgelöst wird, dann schrumpft die Hilfslinie standardmäßig auf die erste Seite eines Druckbogens zusammen und auf den restlichen Seiten des Druckbogens ist von dieser Hilfslinie nichts mehr zu sehen.
Deswegen ist im Skript eine entsprechende Option eingebaut, dass die ausgewählten Hilfslinien bei der Umwandlung auf Wunsch auf alle Seiten des Druckbogens dupliziert werden. Damit wird quasi eine druckbogenorientierte Hilfslinie in mehrere (voneinander unabhängige) seitenorientierte Hilfslinien zerlegt.
Ist dieses Verhalten nicht gewünscht, dann ist der Wert
true durch
false zu ersetzen:
var duplicate_guides = false;
// selectedGuides_fitToPage.jsx
//DESCRIPTION:Wandelt die ausgewählten druckbogenorientierten Hilfslinien in seitenorientierte Hilfslinien um.
var duplicate_guides = true; // seitenorientierte Hilfslinien auf allen Seiten eines Druckbogens wiederholen
if (app.selection.length > 0)
{
for (var i = 0; i < app.selection.length; i++)
{
if (app.selection[i].constructor == Guide
&& app.selection[i].parent.constructor == Page
&& app.selection[i].fitToPage != true
)
{
var old_guide = app.selection[i];
old_guide.fitToPage = true;
if (duplicate_guides == true)
{
for (var p = 1; p < old_guide.parent.parent.pages.length; p++)
{
var new_guide = old_guide.parent.parent.pages[p].guides.add()
new_guide.properties = old_guide.properties;
} // for (var p = 1
} // if (duplicate_guides == true)
} // if (app.selection[i].constructor
} // for (var i = 0
} // if (app.selection.length > 0)
Skript ist lauffähig ab Version CS3
Maße eines ausgewählten Bildrahmens, des Bildes und Versatz des Bildes
someMeasurement.jsx
Link zur Ursprungsdiskussion im Forum
Rex fragt in
Wie komme ich dran?
Ich greife auf ein Graphic-Objekt via VB zu.
(Über COM auf Indesign.)
Ich verwende VB.Net 2004 Express.
Von diesem Graphic-Object benötige ich eben die Breite vom Rahmen, ebenso dessen Höhe, dann die Breite und Höhe vom Bild darin, der X-Versatz des Bildes darin und der Y-Versatz des Bildes darin.
Gegeben ein ausgewählter Bildrahmen (mit Bild darin):
// someMeasurement.jsx
var myDoc = app.documents[0];
if ((app.selection.length == 0) || (app.selection[0].constructor.name != "Rectangle") || (app.selection[0].graphics.length < 1)) {
alert("Problem mit der Auswahl.");
exit();
}
var myRect = app.selection[0]; // ausgewählter Bildrahmen (in dem das Bild steckt)
var myGraph = myRect.graphics[0]; // das Bild im Rahmen
// Sichere aktuelle Maßeinheit
var oldVert = myDoc.viewPreferences.verticalMeasurementUnits;
var oldHori = myDoc.viewPreferences.horizontalMeasurementUnits;
// Umstellung Maßeinheit auf Zentimeter
myDoc.viewPreferences.verticalMeasurementUnits =
myDoc.viewPreferences.horizontalMeasurementUnits =
MeasurementUnits.centimeters;
// Berechnung Breite und Höhe des Rahmens
var myRectWidth = myRound( myRect.geometricBounds[3] - myRect.geometricBounds[1] );
var myRectHeight = myRound( myRect.geometricBounds[2] - myRect.geometricBounds[0] );
// Berechnung Breite und Höhe des Bilds
var myGraphWidth = myRound( myGraph.geometricBounds[3] - myGraph.geometricBounds[1] );
var myGraphHeight = myRound( myGraph.geometricBounds[2] - myGraph.geometricBounds[0] );
// Ausgabe der Daten
alert("Maße:\rRahmen:\t"+ myRectWidth + " x " + myRectHeight +
"\rBild:\t\t" + myGraphWidth + " x " + myGraphHeight +
"\rVersatz:\t" + myGraph.geometricBounds[1] + " / " + myGraph.geometricBounds[0])
// Wiederherstellen der ursprünglichen Maßeinheit
myDoc.viewPreferences.verticalMeasurementUnits = oldVert;
myDoc.viewPreferences.horizontalMeasurementUnits = oldHori;
// Rundungsfunktion
function myRound(myValue) {
return Math.round(myValue *1000)/1000;
}
Die Maßeinheit wird über die "viewPreferences" des Dokuments eingestellt (vorher aktuelle Werte sichern, um sie hinterher wieder herstellen zu können).
Martin Fischer
Skript ist lauffähig ab Version CS2
Windows-variante für image_names.scpt
imageNames.jsx
Link zur Ursprungsdiskussion im Forum
Hans-Jürgen (pixxxelschubser) fragt in
Windows-variante für image_names.scpt nach einem JavaScript für InDesign, das auf einer neuen Ebene die Namen der Bildern einfügt. Hier ein Ansatz.
// imageNames.jsx
//DESCRIPTION: Fügt die Namen der Bilder auf der Ebene "Bildnamen" an der Position der Bilder ein.
//Den Textrahmen der Bildnamen wird der Objektstil "Bildnamen" zugewiesen.
var myDoc = app.documents[0];
var myLayer = checkLayer("Bildnamen");
var myOStyle = checkObjectStyle("Bildnamen");
var myLinks = myDoc.links;
myLayer.locked = false;
for (i = 0; i < myLinks.length; i++) {
var oneImg = myLinks[i].parent.parent;
var myPage = getPage(oneImg);
var myFrame = myPage.textFrames.add({geometricBounds:oneImg.geometricBounds, layer:myLayer});
myFrame.contents = (myLinks[i].name != "") ? myLinks[i].name : "No Name auf S. " + myPage.name;
myFrame.applyObjectStyle(myOStyle, true);
}
myLayer.locked = true;
// Ebene neu anlegen oder vorhandene nutzen
function checkLayer(aLayer) {
try {
var theLayer = myDoc.layers.add({name:aLayer});
}
catch (e) {
var theLayer = myDoc.layers.item(aLayer);
}
return theLayer;
}
// Objektstil neu anlegen oder vorhandenen nutzen
function checkObjectStyle(aStyle) {
try {
var theStyle = myDoc.objectStyles.add({name:aStyle});
}
catch (e) {
var theStyle = myDoc.objectStyles.item(aStyle);
}
return theStyle;
}
// Seite einholen
function getPage(myObject)
{
if (!myObject) {
alert("Bild im Textüberlauf!")
exit();
}
if ((myObject.constructor.name == "Page") || (myObject.constructor.name == "Spread"))
return myObject
if ((myObject.constructor.name == "Character")
|| (myObject.constructor.name == "InsertionPoint")
|| (myObject.constructor.name == "Word")
|| (myObject.constructor.name == "Paragraph")
|| (myObject.constructor.name == "Text")
|| (myObject.constructor.name == "TextRange"))
{
if ((app.version +"").substr(0,1) == "4") return getPage(myObject.parentTextFrames[0])
else if ((app.version +"").substr(0,1) == "3") return getPage(myObject.parentTextFrame)
}
return getPage(myObject.parent)
}
Das Skript legt (soweit noch nicht vorhanden) die Ebene "Bildnamen" und den Objektstil "Bildnamen" an. Danach werden auf der Ebene "Bildnamen" über den Bildern Textrahmen mit dem Objektstil "Bildnamen" angelegt, in welchen die Namen der Bilder eingefügt werden.
Zur "Neubenamung" empfehle ich, die Ebene "Bildnamen" vor dem Starten des Skripts zu löschen. Das Skript sperrt die Ebene "Bildnamen", um zu verhindern, daß während der Arbeit im Dokument versehentlich andere Elemente auf dieser Ebene landen und ggf. beim Löschen der Ebene verschwinden.
Martin Fischer
Skript ist lauffähig ab Version CS2
aktive Ebene ein- oder ausblenden
switchActiveLayersVisibility.jsx
Link zur Ursprungsdiskussion im Forum
Das folgende Skript blendet die aktive Ebene ein oder aus, sofern sie nicht gesperrt ist.
Die Anregung dafür ging aus dem Thread
Ebenen per Tastatur (Shortcut) ein- und ausblenden hervor.
// switchActiveLayersVisibility.jsx
try
{
var myObject = app.activeDocument.pages[0].textFrames.add();
}
catch ( e )
{
alert("Fehler!\rDie aktive Ebene ist gesperrt.");
exit();
}
var myLayer = myObject.itemLayer;
myObject.remove();
myLayer.visible = !myLayer.visible;
Skript ist lauffähig ab Version CS2
Skriptgenerator für Skripte, die Ebenen ein-/ausblenden
EbenensichtbarkeitSkriptgenerator.jsx
Link zur Ursprungsdiskussion im Forum
Auf Anregung des Threads
Ebenen per Tastatur (Shortcut) ein- und ausblenden hier eine Skriptschleuder, die für jede Ebene des aktiven Dokuments im Verzeichnis dieses Skripts ein Skript zum Ein-/Ausblenden der einzelnen Ebene erzeugt.
Die erzeugten Skripte können anschließend auf eine Taste gelegt werden.
// EbenensichtbarkeitSkriptgenerator.jsx
//DESCRIPTION: Erzeugt für jede Ebene des aktiven Dokuments ein Skript zum Ein-/Ausblenden der einzelnen Ebene
var myPath = getScriptDir();
var myLayers = app.documents[0].layers;
for (oneLayer = 0; oneLayer < myLayers.length; oneLayer++)
{
var myData = "var myLayer = \'"
+ myLayers[oneLayer].name
+ "\';\r"
+ "app.activeDocument.layers.item(myLayer).visible = "
+ "!app.activeDocument.layers.item(myLayer).visible;";
exportTXT( myData, myPath, "Ebene_" + myLayers[oneLayer].name + ".jsx");
}
function exportTXT( aData, aFolderName, aFileName )
{
aCreator = "R*ch";
aType = "UTF-8";
aPath = aFolderName + "/" + aFileName;
aFile = new File( aPath);
aFile.open( 'w', aType, aCreator );
aFile.write( aData );
aFile.close();
}
function getScriptDir() {
try {
return File( app.activeScript ).path
}
catch( e ) {
return File( e.fileName ).path
}
}
Skript ist lauffähig ab Version CS2
CreatePageandMirrorGuides.jsx + MakeFoldMarksOnGuides.jsx
MakeFoldMarksOnGuides.jsx
Link zur Ursprungsdiskussion im Forum
Hallo,
Im neuen InDesign Magazine gibt es zwei sehr nützliche Skripts
wie ich finde. Und zwar geht es um die Gestaltung von Faltblättern.
Da in der Lizenz des Skripts drin steht, dass es frei weitergegeben
werden kann, aber nicht verkauft, gebe ich sie somit an die
InDesign-Freaks hier weiter :-)
1.
Das erste heißt »Create Page and Mirror Guides« und hilft bei der
Vorbereitung der Dokumentseiten bei z.B. einem Wickelfalz bei
dem eine Seite bspw. kürzer ist als die anderen. Das Skript erzeugt
eine 2. Seite bei der die Positionen der Hilfslinien der 1. Seite
gespiegelt werden.
2.
Das zweite heißt Make Fold Marks on Guides und vergrößert
automatisch den »Slug«-Bereich und erstellt entlang den Hilfslinien
gestrichelte Falzlinien.
#target indesign
//////////////////////////////////////////////////////////////////////
// This script is provided along with an article //
// in InDesign Magazine - October, 2007. //
// //
// Copyright ©2007 Premedia Systems, Inc. //
// You may freely use and re-distribute this script, //
// but you may not sell it. //
// //
// Please send questions, comments, suggestions //
// and improvements to: //
// peter@premediasystems.com //
//////////////////////////////////////////////////////////////////////
const minSlugDim = 36;
const minMarkOffset = 9;
main();
function main(){
//Is there a dcoument open?
if (app.documents.length != 0){
//Get a reference to our current document
var theDoc = app.activeDocument;
theDoc.viewPreferences.rulerOrigin = RulerOrigin.pageOrigin;
//Grab its pages
var thePages = theDoc.pages;
//Set a refeernce to stroke style 16 - "dashed" - which
//is what we want to use for the fold marks
var theStrokeStyle=theDoc.strokeStyles.item(16);
//Save the current origin point...
var theOldZero = theDoc.zeroPoint
//...and set the document origin to 0,0
theDoc.zeroPoint = [0,0];
//Save the current units of measure...
var theOldHUnits = theDoc.viewPreferences.horizontalMeasurementUnits;
var theOldVUnits = theDoc.viewPreferences.verticalMeasurementUnits;
//...and set UOM to points
theDoc.viewPreferences.horizontalMeasurementUnits = MeasurementUnits.POINTS;
theDoc.viewPreferences.verticalMeasurementUnits = MeasurementUnits.POINTS;
//Get the document width...
var theWidth = theDoc.documentPreferences.pageWidth;
//...and height
var theHeight = theDoc.documentPreferences.pageHeight;
//Set the slug sizes to be AT LEAST minSlugDim
if (theDoc.documentPreferences.slugBottomOffset < minSlugDim){
theDoc.documentPreferences.slugBottomOffset = minSlugDim
}
if (theDoc.documentPreferences.slugInsideOrLeftOffset < minSlugDim){
theDoc.documentPreferences.slugInsideOrLeftOffset = minSlugDim
}
if (theDoc.documentPreferences.slugRightOrOutsideOffset < minSlugDim){
theDoc.documentPreferences.slugRightOrOutsideOffset = minSlugDim
}
if (theDoc.documentPreferences.slugTopOffset < minSlugDim){
theDoc.documentPreferences.slugTopOffset = minSlugDim
}
//Go through the pages
for (var i = 0 ; i <= (thePages.length - 1); i++){
//Get a page...
var thePage = theDoc.pages[i];
//...and grab its guides
var theGuides = thePage.guides;
//Go through each guide
for (var j = 0 ; j <= (theGuides.length - 1); j++) {
//Get a reference to the guide
var aGuide = theGuides[j];
//Get its its position...
var thePos = aGuide.location;
//...and its layer - note that we assume the layer is unlocked...
var theLayer = aGuide.itemLayer;
//Ignore non-visble layers
if (theLayer.visible){
if (aGuide.orientation == HorizontalOrVertical.vertical){
//vertical
var theLine = thePage.graphicLines.add(theLayer,
{strokeColor:"Black",strokeWeight:0.5,strokeType:theStrokeStyle, geometricBounds:[-minSlugDim,thePos,-minMarkOffset, thePos]});
theLine.strokeDashAndGap = [3,3];
theLine = thePage.graphicLines.add(theLayer,
{strokeColor:"Black",strokeWeight:0.5,strokeType:theStrokeStyle, geometricBounds:[theHeight+minMarkOffset,thePos,theHeight+minSlugDim, thePos]});
theLine.strokeDashAndGap = [3,3];
}
else{
//horizontal
var theLine =thePage.graphicLines.add(theLayer,
{strokeColor:"Black",strokeWeight:0.5,strokeType:theStrokeStyle, geometricBounds:[thePos,-minSlugDim,thePos, -minMarkOffset]});
theLine.strokeDashAndGap = [3,3];
theLine =thePage.graphicLines.add(theLayer,
{strokeColor:"Black",strokeWeight:0.5,strokeType:theStrokeStyle, geometricBounds:[thePos,theWidth+minMarkOffset,thePos, theWidth+minSlugDim]});
theLine.strokeDashAndGap = [3,3];
}
}
}
}
//Return the document to its previous state-Restore the origin point...
theDoc.zeroPoint = theOldZero;
//...and the measurement units
theDoc.viewPreferences.horizontalMeasurementUnits = theOldHUnits;
theDoc.viewPreferences.verticalMeasurementUnits = theOldVUnits;
} else {
alert("No documents are open.");
}
}
Gruß,
Sacha
Skript ist lauffähig ab Version CS2
CreatePageandMirrorGuides.jsx + MakeFoldMarksOnGuides.jsx
CreatePageandMirrorGuides.jsx
Link zur Ursprungsdiskussion im Forum
Hallo,
Im neuen InDesign Magazine gibt es zwei sehr nützliche Skripts
wie ich finde. Und zwar geht es um die Gestaltung von Faltblättern.
Da in der Lizenz des Skripts drin steht, dass es frei weitergegeben
werden kann, aber nicht verkauft, gebe ich sie somit an die
InDesign-Freaks hier weiter :-)
1.
Das erste heißt »Create Page and Mirror Guides« und hilft bei der
Vorbereitung der Dokumentseiten bei z.B. einem Wickelfalz bei
dem eine Seite bspw. kürzer ist als die anderen. Das Skript erzeugt
eine 2. Seite bei der die Positionen der Hilfslinien der 1. Seite
gespiegelt werden.
2.
Das zweite heißt Make Fold Marks on Guides und vergrößert
automatisch den »Slug«-Bereich und erstellt entlang den Hilfslinien
gestrichelte Falzlinien.
// CreatePageandMirrorGuides.jsx
#target indesign
//////////////////////////////////////////////////////////////////////
// This script is provided along with an article //
// in InDesign Magazine - October, 2007. //
// //
// Copyright ©2007 Premedia Systems, Inc. //
// You may freely use and re-distribute this script, //
// but you may not sell it. //
// //
// Please send questions, comments, suggestions //
// and improvements to: //
// peter@premediasystems.com //
//////////////////////////////////////////////////////////////////////
main();
function main(){
//is there a document open?
if (app.documents.length != 0){
var myDialog = app.dialogs.add({name:"Mirror Guides", canCancel:true});
with(myDialog){
//Add a dialog column.
with(dialogColumns.add()){
//Create a border panel.
with(borderPanels.add()){
with(dialogColumns.add()){
staticTexts.add({staticLabel:"Mirror:"});
}
var myDropdown = dropdowns.add({stringList:
["Mirror Horizontally", "Mirror Vertically", "Mirror Both"], selectedIndex:0});
}
}
//Display the dialog box.
if(myDialog.show() == true){
//Get the vertical justification setting from the pop-up menu.
var myMirror = myDropdown.selectedIndex;
//Set a refernce to our current document
var theDoc = app.activeDocument;
//We'll always deal with the first page as the front side
var thePage = theDoc.pages[0];
//Set the ruler origin style
theDoc.viewPreferences.rulerOrigin = RulerOrigin.pageOrigin;
//Save the current origin point...
var theOldZero = theDoc.zeroPoint
//...and set the document origin to 0,0.
theDoc.zeroPoint = [0,0];
//Grab the current units of measure...
var theOldHUnits = theDoc.viewPreferences.horizontalMeasurementUnits;
var theOldVUnits = theDoc.viewPreferences.verticalMeasurementUnits;
//...and set them to points
theDoc.viewPreferences.horizontalMeasurementUnits = MeasurementUnits.POINTS;
theDoc.viewPreferences.verticalMeasurementUnits = MeasurementUnits.POINTS;
//Grab the page's guides
var theGuides = thePage.guides;
//Create a new page for the back of our piece
var theNewPage = theDoc.pages.add();
//Get the document width...
var theWidth = theDoc.documentPreferences.pageWidth;
//... and its height
var theHeight = theDoc.documentPreferences.pageHeight;
//Go through each guide of the first page
for (var j = 0 ; j <= (theGuides.length - 1); j++) {
//Get a reference to the guide
var aGuide = theGuides[j];
//Get its position...
var thePos = aGuide.location;
//... and its layer - note that we assume the layer is unlocked...
var theLayer = aGuide.itemLayer;
//...and whether it stops at the page edge or extends onto the pasteboard
var theFit = aGuide.fitToPage
//Finally, get its color
var theColor = aGuide.guideColor;
//Either mirror the guide onto page 2 or simply copy,
//depending on the user's mirror selection from the dialog box
if (aGuide.orientation == HorizontalOrVertical.vertical){
if (myMirror != 1) {
theNewPage.guides.add(undefined,{orientation:HorizontalOrVertical.vertical, location:theWidth - thePos, itemLayer:theLayer, guideColor:theColor, fitToPage:theFit});
}
else{
theNewPage.guides.add(undefined,{orientation:HorizontalOrVertical.vertical, location:thePos, itemLayer:theLayer, guideColor:theColor, fitToPage:theFit});
}
}
else{
if (myMirror != 0) {
theNewPage.guides.add(undefined,{orientation:HorizontalOrVertical.horizontal, location:theHeight - thePos, itemLayer:theLayer, guideColor:theColor, fitToPage:theFit});
}else{
theNewPage.guides.add(undefined,{orientation:HorizontalOrVertical.horizontal, location:thePos, itemLayer:theLayer, guideColor:theColor, fitToPage:theFit});
}
}
}
//Return the document to its previous state - restore the origin point...
theDoc.zeroPoint = theOldZero;
//...and the measurement units
theDoc.viewPreferences.horizontalMeasurementUnits = theOldHUnits;
theDoc.viewPreferences.verticalMeasurementUnits = theOldVUnits;
//Remove the dialog box from memory.
myDialog.destroy();
}
}
} else {
alert("No documents are open.");
}
}
Gruß,
Sacha
Skript ist lauffähig ab Version CS2
Maße von Objekten mit bestimmtem Objektstil ändern
setBoundsOfObjectsWithAppliedObjectStyle_2.jsx
Link zur Ursprungsdiskussion im Forum
In der Diskussion »
Hilfe zu Bedienung von Indesign« wurde nach der Möglichkeit gefragt, Bildrahmen eine bestimmte Breite und Höhe per Objektstil zuzuweisen.
Dafür gibt es in einem Objektstil direkt keine Optionen.
Folgende Skriptstudie sucht diese Lücke zu schließen, indem Objekten mit einem bestimmten Objektstil Breite und Höhe zugewiesen werden.
In einem Dialog werden zunächst die entsprechenden Parameter ermittelt:
? Objektstil
? Höhe
? Breite
? Operation
Die gewählte Operation entscheidet über die Umsetzung der ermittelten Werte:
absolut: feste neue Werte für Breite und Höhe,
addieren: die ermittelte Werte werden zur aktuellen Breite und Höhe jeweils hinzuaddiert,
multiplizieren: Breite und Höhe werden mit dem eingetragenen Faktor multipliziert (skaliert),
prozentual skalieren: wie 'multiplizieren', jedoch werden die eingegebenenWerte als Prozentwerte interpretiert.
Eine
0 (Null) im Eingabefeld bedeutet: keine Änderung (ursprünglicher Wert wird beibehalten).
Eine Eingabe, die keine Zahl ist, wird als
0 interpretiert.
Der
Dialog.
// setBoundsOfObjectsWithAppliedObjectStyle_2.jsx
//DESCRIPTION:Maße von Objekten mit bestimmtem Objektstil ändern
// 2010/02
var doc = app.documents.firstItem();
var the_operator = ['absolut', 'addieren', 'multiplizieren', 'prozentual skalieren'];
var r = get_param(doc.objectStyles.everyItem().getElements().slice(0), the_operator);
var f_objects = get_objects ( r.style);
apply_values(f_objects, r, the_operator);
function apply_values(the_objects, r)
{
for (var i = the_objects.length - 1; i >= 0; i--)
{
var gb = the_objects[i].visibleBounds;
if (r.op == the_operator[0]) //'absolut')
{
var _y2 = (r.height != 0)
? gb[0] + r.height
: gb[2];
var _x2 = (r.width != 0)
? gb[1] + r.width
: gb[3];
}
else if (r.op == the_operator[2] || r.op == the_operator[3]) //'multiplizieren' oder 'prozentual skalieren'
{
var the_div = (r.op == the_operator[2]) //'multiplizieren')
? 1
: 100;
var _y2 = (r.height != 0)
? gb[0] + (gb[2]-gb[0]) * r.height/the_div
: gb[2];
var _x2 = (r.width != 0)
? gb[1] + (gb[3]-gb[1]) * r.width/the_div
: gb[3];
}
else if (r.op == the_operator[1]) //'addieren' )
{
var _y2 = gb[2] + r.height;
var _x2 = gb[3] + r.width;
}
the_objects[i].visibleBounds = [gb[0], gb[1], _y2 , _x2];
}
}
function get_objects(a_style)
{
app.findObjectPreferences = null;
app.findChangeObjectOptions.objectType = ObjectTypes.ALL_FRAMES_TYPE;
app.findObjectPreferences.appliedObjectStyles =a_style;
var the_result = doc.findObject();
app.findObjectPreferences = null;
return the_result;
}
function get_param(_styles, the_operator)
{
var style_names = new Array;
//Ausklammern von '[Einfaches Raster]'
for (var a = 1; a < _styles.length; a++)
style_names.push(_styles[a].name);
var min_width = 140;
var field_width = 40;
var myDialog = app.dialogs.add({name:"Breite und Höhe von Objekten verändern"});
with( myDialog.dialogColumns.add())
{
with(dialogRows.add())
{
with(dialogColumns.add())
{
staticTexts.add({staticLabel:"Objektstil:", minWidth:min_width});
}
with(dialogColumns.add())
{
var myStylesDropDown = dropdowns.add({stringList:style_names, selectedIndex:style_names.length-1, minWidth:min_width});
}
}
with(dialogRows.add())
{
with(dialogRows.add())
{
with(dialogColumns.add())
{
staticTexts.add({staticLabel:"Breite:", minWidth:min_width});
}
with(dialogColumns.add())
{
var myWidthTextEditbox = textEditboxes.add({editContents:"0", minWidth:field_width});
}
}
with(dialogRows.add())
{
with(dialogColumns.add())
{
staticTexts.add({staticLabel:"Höhe:", minWidth:min_width});
}
with(dialogColumns.add())
{
var myHeightTextEditbox = textEditboxes.add({editContents:"0", minWidth:field_width});
}
}
with ( dialogRows.add () ) {
with(dialogColumns.add()) {
staticTexts.add( {staticLabel: "Operation: ", minWidth: min_width} );
}
with(dialogColumns.add())
{
var radio_buttons = radiobuttonGroups.add();
with(radio_buttons) {
radiobuttonControls.add({staticLabel: the_operator[0], checkedState: true, minWidth: min_width});
radiobuttonControls.add({staticLabel: the_operator[1], checkedState: false, minWidth: min_width});
radiobuttonControls.add({staticLabel: the_operator[2], checkedState: false, minWidth: min_width});
radiobuttonControls.add({staticLabel: the_operator[3], checkedState: false, minWidth: min_width});
}
}
}
}
}
var myResult = myDialog.show();
if(myResult == true)
{
var a_style = doc.objectStyles.item(myStylesDropDown.selectedIndex);
var a_width = Number(myWidthTextEditbox.editContents.replace(',','.'));
var a_height = Number(myHeightTextEditbox.editContents.replace(',','.'));
var a_operator = the_operator[radio_buttons.selectedButton]
if (isNaN (a_width))
a_width = 0;
if (isNaN (a_height))
a_height = 0;
myDialog.destroy();
}
else
{
myDialog.destroy();
exit();
}
return {style:a_style, width: a_width, height: a_height, op: a_operator};
}
Skript ist lauffähig ab Version CS3
"Objekte verteilen" per Script
distributeVertical.jsx
Link zur Ursprungsdiskussion im Forum
Verteilt ausgewählte Objekte vertikal auf 2 mm Abstand.
// distributeVertical.jsx
//DESCRIPTION: Verteilt ausgewählte Objekte vertikal auf 2 mm Abstand.
if (app.selection.length == 0 || !app.selection[0].hasOwnProperty("geometricBounds"))
{
alert('Keine oder schlechte Auswahl.');
exit();
}
with (app.alignDistributePreferences)
{
distributeSpaceAbsoluteMeasurement = 2;
distributeSpaceAbsolute = true;
}
app.documents[0].distribute(app.selection, DistributeOptions.VERTICAL_SPACE, AlignDistributeBounds.ITEM_BOUNDS);
Skript ist lauffähig ab Version CS3
Per Dialog ausgewählte Bilder entfernen
BilderEntfernen_02d.js
Link zur Ursprungsdiskussion im Forum
Ein Dialog bietet die Namen der im Dokument vorhandenen Bilder an. Die Bilder, welche gelöscht werden sollen, auswählen (Befehl-Klick für zusammenhängende Bereiche, Befehl-Klick zum Überspringen von Zeilen).
Per Checkbox kann bestimmt werden, ob die Rahmen ebenfalls gelöscht werden sollen.
//BilderEntfernen_02d.js
//DESCRIPTION:Bilder entfernen, deren Name im Dialog gewählt wurde
// vorbeugenderweise das Anzeigen von Dialogen aktivieren
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;
// prüfen, ob ein Dokument geöffnet ist
if (app.documents.length == 0) {
alert ("Bitte erst ein Dokument öffnen.", "Achtung");
exit();
}
// Variablen vorbereiten
var curDoc = app.documents[0];
var allNames = curDoc.links.everyItem().name;
var nGraphics = allNames.length;
var defList = new Array ();
// das Vorhandensein von Bildern prüfen
if (nGraphics == 0) {
alert ("Das Dokument enthält keine Bilder.", "Stop");
exit();
}
// mehrfache Namen herausfiltern
for (var i=0; i< nGraphics; i++) {
var foundIt = false;
curName = allNames[i];
for (var j=0; j< defList.length; j++) {
if (curName == defList[j]) {
foundIt = true;
break;
}
}
if (foundIt == false) {
defList.push(curName);
}
}
// die Plattform feststellen
if ($.os.slice(0,7) == "Windows") {
curSys = "Win";
}
else {
curSys = "Mac";
}
// die Funktion aufrufen, welche die gespeicherten Vorgaben einliest
var allPrefs = getPrefs();
if (allPrefs != "") {
var prefVal = allPrefs.split("\n");
var delFrames = prefVal[0];
var unLock = prefVal[1];
if (delFrames == "true") { delFrames = true; } else { delFrames = false; }
if (unLock == "true") { unLock = true; } else { unLock = false; }
}
else {
delFrames = true;
unLock = true;
}
// den Dialog vorbereiten
var dB = new Array (500, 200, 820, 640); // bounds = [left, top, right, bottom]
var dlg = new Window("dialog", "Bilder entfernen", dB);
var dW = dB[2]-dB[0];
var dH = dB[3]-dB[1];
// der OK-Button
okayBtn = dlg.add("button", [dW-120, dH-45, dW-20, dH-20], "OK");
// der Abbrechen-Button
closeBtn = dlg.add("button", [dW-235, dH-45, dW-135, dH-20], "Abbrechen");
// zwei Checkboxen
ckbx1 = dlg.add("checkbox", [20, dH-94, 600, dH-78], "Rahmen ebenfalls löschen");
ckbx1.value = delFrames;
ckbx2 = dlg.add("checkbox", [20, dH-74, 600, dH-58], "Gesperrte Rahmen entsperren");
ckbx2.value = unLock;
// die Listbox für die Bilder-Namen-Liste
var list = dlg.add ("listbox", [20, 20, dW-20, dH-100], "asd", {multiselect:true});
// die Liste generieren
for (var i=0; i< defList.length; i++) {
list.add ("item", defList[i]);
}
// wenn "Abbrechen" geklickt wurde
closeBtn.onClick = function () {
okay = false;
dlg.close();
}
// wenn der OK-Button betätigt wurde
okayBtn.onClick = function () {
// Checkboxen aktiviert oder nicht?
delFrames = ckbx1.value;
unLock = ckbx2.value;
// das Ergebnis speichern
writeResult(delFrames + "\n" + unLock);
// die Wahl des Anwenders
curSel = list.selection;
if (curSel != null) {
dlg.close();
}
else {
alert ("Kein Name gewählt.", "Stop");
}
}
// den Dialog anzeigen
var okay = true;
dlg.show();
if (okay == false) {
// die Ausführung abbrechen
exit();
}
// die Sperrung der Ebenen speichern und aufheben (falls notwendig)
var allLayers = curDoc.layers;
var nLayers = allLayers.length;
var layerLocks = new Array ();
for (var i=0; i< nLayers; i++) {
if (allLayers[i].locked == true) {
allLayers[i].locked = false;
layerLocks.push(true);
}
else {
layerLocks.push(false);
}
}
// eine Schleife durch die Bilder
for (var i=nGraphics-1; i>-1; i--) {
var curName = allNames[i];
for (var j=0; j< curSel.length; j++) {
var delName = curSel[j].toString();
// wenn der aktuelle Name mit einem der Liste übereinstimmt,
// den entsprechenden Bildrahmen löschen
if (curName == delName) {
try {
if (unLock) {
if (curDoc.links[i].parent.parent.locked == true) {
curDoc.links[i].parent.parent.locked = false;
}
}
if (delFrames) { // wenn auch der Rahmen gelöscht werden soll
curDoc.links[i].parent.parent.remove();
}
else { // sonst nur das Bild entfernen
curDoc.links[i].parent.remove();
}
}
catch (e) {
}
}
}
}
// die Sperrung der Ebenen wiederherstellen (falls notwendig)
for (var i=0; i<(nLayers); i++) {
allLayers[i].locked = layerLocks[i];
}
// das Ende der Aktion verkünden
var dlog = new Window("palette");
dlog.size = [320,100];
dlog.add("statictext", [80, 100, 320, 116], "Fertig.");
dlog.show();
// eine kleine Pause
$.sleep(1500);
// das Fenster schliessen
dlog.close();
////////////////////////////// die Funktionen ////////////////////////////////////////////
// die Funktion, welche die Information vorbereitet
function getPrefs() {
var allPrefs = "";
// die Datei lesen, welche die gespeicherten Werte enthält
if (curSys == "Win") {
var tempFolder = Folder.temp;
var f = File(tempFolder + "/delFrames02.txt");
}
else {
var f = new File("~/Library/Preferences/delFrames02.txt");
}
var fileIsOpen = f.open("r");
if (fileIsOpen) {
try {
allPrefs = f.read();
f.close();
}
catch (e) {
try {
f.close();
}
catch (e) {
}
}
}
return allPrefs;
}
// das Ergebnis in eine Datei schreiben
function writeResult(delFrames) {
if (curSys == "Win") {
var tempFolder = Folder.temp;
var f = File(tempFolder + "/delFrames02.txt");
}
else {
var f = new File("~/Library/Preferences/delFrames02.txt");
}
var fileIsOpen = f.open("w");
if (fileIsOpen) {
try {
f.write(delFrames);
f.close();
}
catch (e) {
try {
f.close();
}
catch (e) {
}
}
}
}
Skript ist lauffähig ab Version CS3
Rahmen an Oberkanten von Buchstaben alinieren
BildAlinieren_405d.js
Link zur Ursprungsdiskussion im Forum
Passt den oberen Rand des ausgewählten Rahmens ("Grafik", "Text" oder "Nicht zugewiesen") an die obere Kante der Buchstaben der ersten Zeile des danebenstehenden Textes an.
Mit dieser einfacheren Version (Vorläufer des Scripts
BildAlinieren_421d.js) muss der Wert der Buchstabenhöhe in der Zeile
12 des Codes geändert werden.
// BildAlinieren_405d.js
//DESCRIPTION:Passt den oberen Rand des ausgewählten Rahmens ("Grafik", "Text" oder "Nicht zugewiesen") an die obere Kante der Buchstaben der ersten Zeile des danebenstehenden Textes an.
//(Bedingungen: Die Zeile muss am Grundlinienraster ausgerichtet sein und
//der Wert von 'capHeight' muss der Höhe eines Grossbuchstabens entsprechen)
//
// Hans Haesler
// 18.2.2009
//
//*** den gewünschten Wert definieren
// Höhe eines Grossbuchstabens (in mm)
var capHeight = 2.308;
// vorbeugenderweise das Anzeigen von Dialogen aktivieren
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;
// testen, ob ein Dokument geöffnet ist
if (app.documents.length == 0) {
alert ("Es ist kein Dokument offen.", "Achtung");
exit();
}
// testen, ob ein Objekt ausgewählt ist
if (app.selection.length == 0) {
alert ("Bitte einen Bildrahmen auswählen.", "Achtung");
exit();
}
else if (app.selection.length > 1) {
alert ("Nur *einen* Rahmen auswählen.", "Stop");
exit();
}
var curDoc = app.documents[0];
// die vertikale Masseinheit speichern
// wenn nicht 2053991795 (= Millimeter), auf Millimeter umstellen
vM = curDoc.viewPreferences.verticalMeasurementUnits;
if (vM != 2053991795) {
curDoc.viewPreferences.verticalMeasurementUnits = MeasurementUnits.millimeters;
}
// "Anfang:" (in mm)
var startVal = curDoc.gridPreferences.baselineStart;
// die relative Ausrichtung prüfen
var curOpt = curDoc.gridPreferences.baselineGridRelativeOption;
if (curOpt == 1162766189) {
var topPos = app.activeWindow.activePage.marginPreferences.top;
startVal = startVal + topPos;
}
// "Einteilung alle:" (in mm)
var stepVal = curDoc.gridPreferences.baselineDivision;
// Variablen initialisieren
var curSel = app.selection[0];
var selType = curSel.constructor.name;
var lock = false;
// Abstand zwischen Oberlänge und der darüberliegenden Grundlinie
var capDiff = stepVal - capHeight;
// warnen, wenn eine Gruppe ausgewählt ist
if (selType == "Group") {
alert ("Die Gruppierung aufheben.", "Stop");
restoreVm();
exit();
}
// wenn ein rechteckiger (oder ein Text-)Rahmen ausgewählt ist ...
else if (selType == "Rectangle" || selType == "TextFrame") {
// Dreh- und Verbiegungswinkel prüfen
var curRot = curSel.rotationAngle;
var curShear = curSel.shearAngle;
if (curRot != 0 || curShear != 0) {
alert ("Der Rahmen ist gedreht oder verbogen.", "Stop");
restoreVm();
exit();
}
// eine eventuelle Sperrung aufheben
if (curSel.locked == true) {
lock = true;
curSel.locked = false;
}
// den Nullpunkt auf Null/Null setzen
var zP = curDoc.zeroPoint;
if (zP != [0,0]) {
curDoc.zeroPoint = [0,0];
}
// die Werte der sichtbaren Ränder speichern
vB = curSel.visibleBounds;
// der Restwert von ((oberer Seitenrand) modulo (Rasterbeginn))
// (= fiktiver Rasteranfang)
var rest1 = (startVal % stepVal);
// die Distanz zwischen (fiktivem) Rasteranfang und oberem Rand
var d1 = (vB[0] - rest1);
// der zweite Restwert
var rest2 = (d1 % stepVal);
// die neue obere Randposition
multFactor = Math.floor(capHeight / stepVal);
y1 = ((vB[0] - rest2) + capDiff) + (stepVal * multFactor);
// der Auswahl den neuen y1-Wert und die alten x1, y2 und x2 zuweisen
curSel.visibleBounds = [y1, vB[1], vB[2], vB[3]];
// den Nullpunkt zurücksetzen (falls notwendig)
if (zP != [0,0]) {
curDoc.zeroPoint = zP;
}
// die Sperrung wiederherstellen (falls notwendig)
if (lock) {
curSel.locked = true;
}
}
else {
restoreVm();
alert("Einen Bildrahmen auswählen.", "Achtung");
}
restoreVm();
// die Masseinheit zurücksetzen (falls notwendig)
function restoreVm() {
if (vM != 2053991795) {
curDoc.viewPreferences.verticalMeasurementUnits = vM;
}
}
Skript ist lauffähig ab Version CS2
Rahmen an Oberkanten von Buchstaben alinieren
BildAlinieren_421d.js
Link zur Ursprungsdiskussion im Forum
Das folgende Script muss nicht editiert werden, falls eine andere Buchstabenhöhe benutzt werden soll.
Beim allerersten* Ausführen erscheint ein Prompt-Dialog, bei welchem ein erster Wert eingegeben werden muss. Dieser Wert wird gespeichert und ist für die weiteren Ausführungen gültig.
(* Wer schon ein Script der Versionen 410 bis 420 ausgeführt hat, wird den Prompt-Dialog nicht sehen.)
Zum späteren Ändern des Wertes hat man die Möglichkeiten
A oder
B:
*****
A 1: In der ersten Zeile jenen Buchstaben auswählen, an dessen Oberkante später ein Bildrahmen ausgerichtet werden soll. Auch Rahmen mit Inhalt "Text" oder "Nicht zugewiesen" sind möglich.
A 2: Das Script "BildAlinieren_421d.js" starten.
A 3: Ein Dialog teilt mit: "Die neue Höhe ist gespeichert."
A 4: Den Dialog mit Klick auf "OK" schliessen, die Ausführung des Scripts wird abgebrochen.
*****
B 1: Einen Rahmen erzeugen und diesem die neue Buchstabenhöhe zuweisen (die Position dieses Musterrahmens auf der Seite ist egal).
B 2: Das Bedienfeld "Skriptbezeichnung" öffnen (Menü >Fenster >Automatisierung).
B 3: Der Musterrahmen ist ausgewählt.
B 4: Im Bedienfeld
m eintippen (oder was in Zeile 11 des Scripts definiert ist).
B 5: Mit der Entertaste bestätigen. Oder ? noch besser ? mit der Tabulatortaste. Aber auf keinen Fall mit Return.
B 6: Das Script "BildAlinieren_421d.js" starten.
B 7: Ein Dialog bestätigt: "Die neue Höhe ist gespeichert."
B 8: Den Dialog mit Klick auf "OK" schliessen, die Ausführung des Scripts wird abgebrochen.
*****
Von nun an wird beim Alinieren der neue Wert verwendet. Wenn dieser erneut geändert werden soll, wieder Methode A oder B anwenden.
Zum Abbestellen des Dialoges, welcher das Eintragen der neuen Höhe bestätigt: In der Zeile 14 des Scripts das 'true' durch 'false' ersetzen.
// BildAlinieren_421d.js
//DESCRIPTION:Passt den oberen Rand des ausgewählten Rahmens ("Grafik", "Text" oder "Nicht zugewiesen") an die obere Kante der Buchstaben der ersten Zeile des danebenstehenden Textes an.
// (Bedingungen: Die Zeile muss am Grundlinienraster ausgerichtet sein und
// der verwendete Wert muss der Höhe eines Buchstabens entsprechen)
//
// Hans Haesler
// 18.2.2009
//
// der Name des Musterrahmens
var frameName = "m";
// Dialog zeigen = true / Dialog nicht zeigen = false
var showDialog = true;
// vorbeugenderweise das Anzeigen von Dialogen aktivieren
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;
// testen, ob ein Dokument geöffnet ist
if (app.documents.length == 0) {
alert ("Es ist kein Dokument offen.", "Achtung");
exit();
}
// testen, ob ein Objekt ausgewählt ist
if (app.selection.length == 0) {
alert ("Bitte einen Bildrahmen auswählen.", "Achtung");
exit();
}
else if (app.selection.length > 1) {
alert ("Nur *einen* Rahmen auswählen.", "Stop");
exit();
}
var curDoc = app.documents[0];
// die gespeicherte Höhe des Buchstabens holen
var capHeight = 0;
try {
capHeight = (app.extractLabel("capHeight"))*1;
}
catch (e) {
}
// bei der allerersten Ausführung vom Anwender verlangen
if (capHeight == 0) {
newHeight = prompt ("Höhe des Buchstabens in mm", 2.3, "Erste Eingabe (die Auswahl wird nicht beachtet)");
if (newHeight == null) {
exit();
}
else {
if (!isNaN(newHeight)) {
capHeight = Math.floor((newHeight*1000) + 0.5) / 1000;
}
else {
alert ("Ungültige Eingabe: " + newHeight, "Nochmals");
exit();
}
}
// die neue Höhe speichern
app.insertLabel("capHeight", newHeight);
}
// die vertikale Masseinheit speichern
// wenn nicht 2053991795 (= Millimeter), auf Millimeter umstellen
vM = curDoc.viewPreferences.verticalMeasurementUnits;
if (vM != 2053991795) {
curDoc.viewPreferences.verticalMeasurementUnits = MeasurementUnits.millimeters;
}
// "Anfang:" (in mm)
var startVal = curDoc.gridPreferences.baselineStart;
// die relative Ausrichtung prüfen
var curOpt = curDoc.gridPreferences.baselineGridRelativeOption;
if (curOpt == 1162766189) {
var topPos = app.activeWindow.activePage.marginPreferences.top;
startVal = startVal + topPos;
}
// "Einteilung alle:" (in mm)
var stepVal = curDoc.gridPreferences.baselineDivision;
// Variablen initialisieren
var curSel = app.selection[0];
var selType = curSel.constructor.name;
var lock = false;
// Abstand zwischen Buchstabenhöhe und der darüberliegenden Grundlinie
var capDiff = stepVal - capHeight;
// warnen, wenn eine Gruppe ausgewählt ist
if (selType == "Group") {
alert ("Die Gruppierung aufheben.", "Stop");
restoreVm();
exit();
}
// wenn ein rechteckiger (oder ein Text-)Rahmen ausgewählt ist ...
else if (selType == "Rectangle" || selType == "TextFrame") {
// Dreh- und Verbiegungswinkel prüfen
var curRot = curSel.rotationAngle;
var curShear = curSel.shearAngle;
if (curRot != 0 || curShear != 0) {
alert ("Der Rahmen ist gedreht oder verbogen.", "Stop");
restoreVm();
exit();
}
// den Namen des Rahmens prüfen (wenn übereinstimmend mit dem zu Beginn
// des Scripts definierten, wird dessen Höhe als neue Höhe gespeichert)
if (curSel.label == frameName) {
vB = curSel.visibleBounds;
newHeight = "" + (vB[2] - vB[0]);
// die neue Höhe speichern ...
app.insertLabel("capHeight", newHeight);
// ... und bestätigen
if (showDialog) {
alert ("Die neue Höhe ist gespeichert.", "Okay");
}
// und die Ausführung abbrechen
restoreVm();
exit();
}
// eine eventuelle Sperrung aufheben
if (curSel.locked == true) {
lock = true;
curSel.locked = false;
}
// den Nullpunkt auf Null/Null setzen
var zP = curDoc.zeroPoint;
if (zP != [0,0]) {
curDoc.zeroPoint = [0,0];
}
// die Werte der sichtbaren Ränder speichern
vB = curSel.visibleBounds;
// der Restwert von ((oberer Seitenrand) modulo (Rasterbeginn))
// (= fiktiver Rasteranfang)
var rest1 = (startVal % stepVal);
// die Distanz zwischen (fiktivem) Rasteranfang und oberem Rand
var d1 = (vB[0] - rest1);
// der zweite Restwert
var rest2 = (d1 % stepVal);
// die neue obere Randposition
multFactor = Math.floor(capHeight / stepVal);
y1 = ((vB[0] - rest2) + capDiff) + (stepVal * multFactor);
// der Auswahl den neuen y1-Wert und die alten x1, y2 und x2 zuweisen
curSel.visibleBounds = [y1, vB[1], vB[2], vB[3]];
// den Nullpunkt zurücksetzen (falls notwendig)
if (zP != [0,0]) {
curDoc.zeroPoint = zP;
}
// die Sperrung wiederherstellen (falls notwendig)
if (lock) {
curSel.locked = true;
}
}
// wenn ein Buchstabe ausgewählt ist
else if (selType == "Character") {
try {
curDoc.textFrames.item("t_m_p").remove();
}
catch (e) {
}
// ein paar Properties der Auswahl speichern
var charProps = app.selection[0].properties;
var charCont = charProps.contents;
var charSize = charProps.pointSize;
var charScale = charProps.verticalScale;
var charShift = (charProps.baselineShift) * 0.352778472222;
var charFont = charProps.appliedFont;
var charCaps = charProps.capitalization;
var charStCol = charProps.strokeColor.name;
var charStWght = 0;
if (charStCol != "None") {
charStWght = (charProps.strokeWeight * 0.352778472222);
if (app.version[0] > 5) {
var charStAlig = charProps.strokeAlignment;
if (charStAlig == 1936998723) {
charStWght = (charStWght / 2);
}
}
}
// den Buchstaben in einen temporären Rahmen setzen
var tmpFrame = curDoc.textFrames.add({geometricBounds:[20,0,120,100], contents:charCont, label:"t_m_p"});
var tmpChar = tmpFrame.characters[0];
// die Attribute zuweisen
tmpChar.properties = {pointSize:charSize, verticalScale:charScale, capitalization:charCaps};
try {
tmpChar.appliedFont = charFont;
}
catch (e) {
}
// in Outline verwandeln
try {
tmpFrame.characters[0].createOutlines();
}
catch (e) {
alert ("Die Auswahl kann nicht in Pfade umgewandelt werden.");
restoreVm();
exit ();
}
// die Höhe des Rahmens errechnen
var tmpObject = tmpFrame.pageItems[0];
vB = tmpObject.visibleBounds;
var newHeight = "" + ((vB[2] - vB[0]) + charShift + charStWght);
// die neue Höhe speichern ...
app.insertLabel("capHeight", newHeight);
try {
tmpFrame.remove();
}
catch (e) {
}
// ... und bestätigen
if (showDialog) {
alert ("Die neue Höhe ist gespeichert.", "Okay");
}
// und die Ausführung abbrechen
restoreVm();
exit();
}
else {
restoreVm();
alert("Einen Bildrahmen auswählen.", "Achtung");
}
restoreVm();
// die Masseinheit zurücksetzen (falls notwendig)
function restoreVm() {
if (vM != 2053991795) {
curDoc.viewPreferences.verticalMeasurementUnits = vM;
}
try {
tmpFrame.remove();
}
catch (e) {
}
}
Skript ist lauffähig ab Version CS2
Satzspiegel anhand von ausgewählten Seitenobjekten einstellen
adjustTypeArea_with_selectedPageItems.jsx
Link zur Ursprungsdiskussion im Forum
Ziel
Satzspiegel 'graphisch' statt 'numerisch' einstellen.
Hier über die senkrechten und waagrechten Kanten eines oder mehrere Seitenobjekte.
Der gewünschte Satzspiegel wird z.B. über die Justierung von Textrahmen zunächst skizziert und über das Skript dann entsprechend umgesetzt (Randeinstellung).
Voraussetzung
Es ist mindestens ein Seitenobjekt (Textrahmen, Rechteck ...) ausgewählt, das komplett auf einer Seite liegt, d.h. das nicht über die Seitengrenzen hinausragt.
Was macht das Skript?
Das Skript passt die Ränder der Seite, auf der das ausgewählte Objekt liegt, an dessen Kanten an.
Liegt das ausgewählte Objekt auf einer
Layoutseite, dann werden nur die Ränder dieser Seite angepasst.
Liegt das ausgewählte Objekt auf einer
Musterseite, dann werden die Ränder dieser Musterseite und alle Seiten, die auf dieser Musterseite basieren, angepasst.
Ist die
Layoutanpassung deaktiviert, erfolgt eine Abfrage, ob die Layoutanpassung aktiviert werden soll, damit sich die Lage von Objekten auf Layoutseiten, die auf der entsprechenden Musterseite basieren, anpasst.
Sind
auf einer Seite mehrere Objekte ausgewählt, dann sind die Ränder am Ende an das 'letzte' Objekt (höchster Index) angepasst.
Um den Satzspiegel einer
Doppelseite einzurichten, empfiehlt es sich, zunächst auf einer Seite ein Seitenobjekt (Textrahmen, Rechteck ...) einzurichten, dieses dann auf die gegenüberliegende Seite zu kopieren und anschließend beide Objekte auszuwählen, bevor das Skript ausgeführt wird.
Anschließend können die Seitenobjekte, die als Vorlage für den Satzspiegel dienten, gelöscht werden.
/*
// adjustTypeArea_with_selectedPageItems.jsx
//DESCRIPTION:Einrichtung des Satzspiegels anhand ausgewählter Seitenobjekte (Textrahmen, Rechteck ...).
VERSION: 0.6
AUTHOR: Martin Fischer
DATE: 23.12.2011
*/
main();
function main()
{
if ( app.selection.length > 0 )
{
var doc = app.documents.firstItem();
var restoreViewPrefs = setupViewPrefs(); // Einstellungen von Lineal & co. sichern und anpassen
var ref_pi = get_refpi(); // Referenzobjekte ermitteln
if (ref_pi.length > 0)
{
// Layoutanpassung ermitteln, wenn Referenzobjekte auf Musterseite
var restore_lapref = (ref_pi[0].pg.parent.constructor.name == 'MasterSpread') ? setupLayoutPrefs( doc ) : null;
for ( var p = 0; p < ref_pi.length; p++)
{
// Ränder an Referenzobjekt anpassen
adjust_margins( ref_pi[p], doc);
}
// bei aktiver Layoutanpassung die ursprüngliche Position der Referenzobjekte wiederherstellen
if (doc.layoutAdjustmentPreferences.enableLayoutAdjustment == true)
{
restore_pos(ref_pi);
}
// Einstellungen von Lineal & co. wiederherstellen
restoreViewPrefs();
// Bei Bedarf die ursprüngliche Einstellung der Layoutanpassung wiederherstellen
//~ if (restore_lapref != null)
//~ restore_lapref();
}
}
}
// =============================================
// Funktionen
// =============================================
// ---------------------------------------------------------------------------------
// Position der Referenzobjekte wiederherstellen
// ---------------------------------------------------------------------------------
function restore_pos(pi)
{
for (var i = 0; i < pi.length; i++)
{
pi[i].pi.move(pi[i].pg);
pi[i].pi.geometricBounds = pi[i].gb;
}
}
// ---------------------------------------------------------------------------------
// Referenzobjekte ermitteln
// ---------------------------------------------------------------------------------
function get_refpi()
{
var ref_pi = new Array;
for ( var i = app.selection.length-1; i >= 0; i-- )
{
// Prüfung ob Auswahl ein Seitenelement (pageItem)
if ( app.selection[i].hasOwnProperty( 'geometricBounds' ) )
{
// Seite, auf der das Objekt liegt, ermitteln
var cur_page = findPage( app.selection[i] );
if ( cur_page != null )
{
ref_pi.push(
{
pi:app.selection[i], // das Objekt selbst
gb:app.selection[i].geometricBounds, // die ursprünglichen Koordinaten des Objekts
pg:cur_page // die Seite, auf der das Objekt liegt
} );
}
}
}
return ref_pi;
}
// ---------------------------------------------------------------------------------
// Ränder anpassen
// ---------------------------------------------------------------------------------
function adjust_margins( cur_pi, doc, restoreViewPrefs )
{
// Maße der Seite
var pb = cur_pi.pg.bounds;
var ph = _round( pb[2] - pb[0], 100 ); // Seitenhöhe
var pw = _round( pb[3] - pb[1], 100 ); // Seitenbreite
// Prüfung der Lage des Objekte (innerhalb einer Seite?)
if ( cur_pi.gb[0] >= 0 && cur_pi.gb[1] >= 0 && cur_pi.gb[2] <= ph && cur_pi.gb[3] <= pw )
{
// temporäres Zurücksetzen der Ränder auf 0
//~ var old_mp = cur_pi.pg.marginPreferences.properties;
//~ cur_pi.pg.marginPreferences.properties = {top:0, left:0, bottom:0, right:0};
// Festlegender neuen Ränder
try
{
// Dokument doppelseitig & Objekt liegt auf der linken Seite
if ( doc.documentPreferences.facingPages == true && cur_pi.pg.side == PageSideOptions.LEFT_HAND )
{
cur_pi.pg.marginPreferences.properties = {top:cur_pi.gb[0], left:pw - cur_pi.gb[3], bottom:ph - cur_pi.gb[2], right:cur_pi.gb[1]};
cur_pi.pg.marginPreferences.properties = {top:cur_pi.gb[0], left:pw - cur_pi.gb[3], bottom:ph - cur_pi.gb[2], right:cur_pi.gb[1]};
}
// Objekt liegt auf der rechten Seite
else
{
cur_pi.pg.marginPreferences.properties = {top:cur_pi.gb[0], left:cur_pi.gb[1], bottom:ph - cur_pi.gb[2], right:pw - cur_pi.gb[3]};
cur_pi.pg.marginPreferences.properties = {top:cur_pi.gb[0], left:cur_pi.gb[1], bottom:ph - cur_pi.gb[2], right:pw - cur_pi.gb[3]};
}
}
catch(e)
{
// ggf. Wiederherstellen der ursprünglichen Randeinstellungen
var result = confirm( 'Achtung!\rNicht alle Ränder konnten entsprechend den Kanten des ausgewählten Objekts eingestellt werden.\rUrsprüngliche Ränder wiederherstellen?' );
if ( result == true )
cur_pi.pg.marginPreferences.properties = {top:old_mp.top, left:old_mp.left, bottom:old_mp.bottom, right:old_mp.right};
}
}
else
{
alert( 'Achtung!\rKoordinaten des ausgewählten Objekts überprüfen.\rDas Objekt muß innerhalb der Seite liegen.' );
} //if ( cur_pi.gb[0] >= 0 && cur_pi.gb[1] >= 0 && cur_pi.gb[2] <= ph && cur_pi.gb[3] <= pw )
}
// ---------------------------------------------------------------------------------
// Runden
// ---------------------------------------------------------------------------------
function _round ( _val, _fact )
{
return Math.round( _val * _fact )/_fact;
}
// ---------------------------------------------------------------------------------
// Seite ermitteln
// ---------------------------------------------------------------------------------
// nach Gregor Fellenz
// 27.7.2010
// http://forums.adobe.com/message/3003131#3003131
function findPage( theObj )
{
if ( theObj.hasOwnProperty( "baseline" ) )
{
theObj = theObj.parentTextFrames[0];
}
while ( theObj != null )
{
if ( theObj.hasOwnProperty ( "parentPage" ) )
return theObj.parentPage;
var whatIsIt = theObj.constructor;
switch ( whatIsIt )
{
case Page : return theObj;
case Character : theObj = theObj.parentTextFrames[0]; break;
case Footnote :; // drop through
case Cell : theObj = theObj.insertionPoints[0].parentTextFrames[0]; break;
case Note : theObj = theObj.storyOffset.parentTextFrames[0]; break;
case XMLElement : if ( theObj.insertionPoints[0] != null ) { theObj = theObj.insertionPoints[0].parentTextFrames[0]; break; }
case Application : return null;
default: theObj = theObj.parent;
}
if ( theObj == null )
return null;
}
return theObj
} // end findPage
// ---------------------------------------------------------------------------------
// Abfrage Layoutanpassung
// ---------------------------------------------------------------------------------
function setupLayoutPrefs( doc )
{
var old_lapref = doc.layoutAdjustmentPreferences.enableLayoutAdjustment;
if (doc.layoutAdjustmentPreferences.enableLayoutAdjustment == false)
{
if ( confirm('Layoutanpassung aktivieren?') )
doc.layoutAdjustmentPreferences.enableLayoutAdjustment = true;
}
return function ()
{
doc.layoutAdjustmentPreferences.enableLayoutAdjustment = old_lapref;
}
}
// ---------------------------------------------------------------------------------
// Ansichtsvorgaben sichern & wiederherstellen
// ---------------------------------------------------------------------------------
// nach Dirk Becker
// http://www.hilfdirselbst.ch/foren/Ma%DFsystem_tempor%E4r_umstellen_%28WIN_CS4%29_P424011.html#424011
function setupViewPrefs()
{
var doc = app.activeDocument;
with ( doc )
{
var vp = viewPreferences.properties;
var zp = zeroPoint;
var pt = MeasurementUnits.POINTS;
viewPreferences.properties =
{
horizontalMeasurementUnits: pt,
verticalMeasurementUnits: pt,
rulerOrigin: RulerOrigin.pageOrigin
};
zeroPoint = [0,0];
}
return function ()
{
with ( doc )
{
viewPreferences.properties = vp;
zeroPoint = zp;
}
}
}
Skript ist lauffähig ab Version CS3
»Seite zurück« ? in allen offenen Dokumenten
previousPage_everyDoc.jsx
Link zur Ursprungsdiskussion im Forum
Mit diesem Skript kann man in allen offenen Dokumenten synchron
eine Seite zurückspringen.
Dabei wird in den Dokumenten im Hintergrund (nicht im vordersten Fenster) die zur entsprechenden Seite des Dokuments im Vordergrund passende Seite angezeigt.
D.h. es wird nicht unabhängig von den angezeigten Seiten jeweils um eine Seite zurück geblättert, sondern es wird im aktiven Dokument eine Seite zurück geblättert und die anderen Dokumente versuchen ebenfalls auf die entsprechende Seite (mit dem entsprechenden) Namen zu springen.
Es dient damit etwa dem synchronen Blättern durch mehrere offene Dokumente z.B. beim Abgleich unterschiedlicher Dokumentversionen.
Ich empfehle, dieses Skript auf eine
Kurztaste zu legen.
Siehe auch
// previousPage_everyDoc.jsx
//DESCRIPTION:»Seite zurück« in allen offenen Dokumenten
var doc = app.documents.firstItem();
var a_page = doc.layoutWindows.firstItem().activePage;
if (a_page.documentOffset -1 >= 0)
{
var t_page = doc.pages.item(a_page.documentOffset -1).name;
for (var i = 0; i < app.documents.length; i++)
{
if (app.documents.item(i).pages.itemByName(t_page).isValid)
app.documents.item(i).layoutWindows.everyItem().activePage = app.documents.item(i).pages.itemByName(t_page);
else
beep();
}
}
else
alert('Es geht nicht weiter zurück.');
Skript ist lauffähig ab Version CS4
»Seite vor« ? in allen offenen Dokumenten
nextPage_everyDoc.jsx
Link zur Ursprungsdiskussion im Forum
Mit diesem Skript kann man in allen offenen Dokumenten synchron
eine Seite vorspringen.
Dabei wird in den Dokumenten im Hintergrund (nicht im vordersten Fenster) die zur entsprechenden Seite des Dokuments im Vordergrund passende Seite angezeigt.
D.h. es wird nicht unabhängig von den angezeigten Seiten jeweils um eine Seite nach vorn geblättert, sondern es wird im aktiven Dokument eine Seite vorgeblättert und die anderen Dokumente versuchen ebenfalls auf die entsprechende Seite (mit dem entsprechenden) Namen zu springen.
Es dient damit etwa dem synchronen Blättern durch mehrere offene Dokumente z.B. beim Abgleich unterschiedlicher Dokumentversionen.
Ich empfehle, dieses Skript auf eine
Kurztaste zu legen.
Siehe auch
// nextPage_everyDoc.jsx
//DESCRIPTION:»Seite vor« in allen offenen Dokumenten
var doc = app.documents.firstItem();
var a_page = doc.layoutWindows.firstItem().activePage;
if (a_page.documentOffset +1 < doc.pages.length)
{
var t_page = doc.pages.item(a_page.documentOffset +1).name;
for (var i = 0; i < app.documents.length; i++)
{
if (app.documents.item(i).pages.itemByName(t_page).isValid)
app.documents.item(i).layoutWindows.everyItem().activePage = app.documents.item(i).pages.itemByName(t_page);
else
beep();
}
}
else
alert('Es geht nicht weiter vor.');
Skript ist lauffähig ab Version CS4
Seiten-Eigenschaften platzierter PDF-, AI- und INDD-Dateien ändern
pdfPageOptions.jsx
Link zur Ursprungsdiskussion im Forum
Mithilfe des Skripts
»pdfPageOptions_startup.jsx« können die Seiteneigenschaften von platzierten PDF-, AI- oder INDD-Dateien mittels Kontextmenü geändert werden. Nach Aufruf erscheint der Indesign-Dialog für Importoptionen.
Das Script muss dazu im Startup-Order von Indesign abgelegt werden. (Programmordner von InDesign > Scripts > Startup Scripts)
Das Skripts
»pdfPageOptions.jsx« besitzt die gleiche Funktion, wird jedoch im
»normalen« Script-Ordner abgelegt und über das Indesign-Script-Bedienfeld oder - wenn zugewiesen - via Tastenkombination aufgerufen.
Hier ein
kurzes Video (1,6 MB) dazu, was das Script macht.
Downloadlinks:
#target InDesign
#targetengine "pageOptionsSession"
//DESCRIPTION: Change PDF, AI and INDD page options
/*
+ Indesign Version: CS5.5 und 6
+ Autor: Roland Dreger
+ Datum: 9. Dezember 2013
Put the script in InDesign startup folder
*/
__addItemToContextMenu();
function __addItemToContextMenu() {
var _menuItemName = { en: "PDF Page Options ...", de: "PDF Seitenoptionen ..." };
var _pageOptionsAction = app.scriptMenuActions.item(localize(_menuItemName));
if (!_pageOptionsAction.isValid) {
var _pageOptionsAction = app.scriptMenuActions.add(localize(_menuItemName));
}
_pageOptionsAction.eventListeners.add("onInvoke", __main);
_pageOptionsAction.eventListeners.add("beforeDisplay", __checkContent);
var _contextMenu = app.menus.item("$ID/RtMouseLayout");
_contextMenu.menuItems.add(_pageOptionsAction,LocationOptions.AFTER,_contextMenu.menuItems.itemByName("$ID/kObjectLayerOptionsDots"));
} // END function __addItemToContextMenu
function __checkContent(_event) {
var _pageOptionsAction = _event.parent;
if( (app.selection.length == 1) &&
( (app.selection[0].hasOwnProperty("graphics") && (app.selection[0].graphics.length != 0))&&((app.selection[0].allGraphics[0] instanceof PDF)||(app.selection[0].allGraphics[0] instanceof ImportedPage) ) ) ||
( (app.selection[0] instanceof PDF)||(app.selection[0] instanceof ImportedPage) )
) {
_pageOptionsAction.enabled = true;
} else {
_pageOptionsAction.enabled = false;
}
} // END function __checkContent
function __main() {
if (app.documents.length == 0) {
alert ("No document opened!\rTo run the script at least one document must be open.", "Error", true);
return;
}
var _curFile,
_filePath,
_fileToPlace;
if ((app.selection.length == 1) && app.selection[0].hasOwnProperty("graphics") && (app.selection[0].graphics.length != 0)) {
var _frame = app.selection[0];
__contentSwitch(_frame);
} else if ((app.selection.length == 1) && ((app.selection[0] instanceof PDF)||(app.selection[0] instanceof ImportedPage))) {
var _frame = app.selection[0].parent;
__contentSwitch(_frame);
} else {
alert ("Please select a frame with placed PDF, AI or INDD file!");
}
function __contentSwitch(_frame) {
switch (_frame.allGraphics[0].constructor.name) {
case "PDF":
_curFile = _frame.pdfs[0];
__placeFile (_curFile);
break;
case "ImportedPage":
_curFile = _frame.importedPages[0];
__placeFile (_curFile);
break;
default :
alert("No PDF, AI or INDD file in selected frame!");
}
} // END function __contentSwitch
function __placeFile (_file) {
_filePath = _file.itemLink.filePath;
try {
_fileToPlace = File(_filePath);
_frame.place(_fileToPlace,true);
} catch (e) {
if(_file.itemLink.status == LinkStatus.LINK_MISSING || _file.itemLink.status == LinkStatus.LINK_INACCESSIBLE) {
alert("Missing link:\r" + _filePath + "\r\rNo changes have been made!");
}
}
} // END function __placeFile
} // END function __main
Skript ist lauffähig ab Version CS5
Seiteninhalte austauschen
SeitenTauschen.js
Link zur Ursprungsdiskussion im Forum
Tauscht die Objekte von zwei ausgewählten Seiten aus
//SeitenTauschen.js
//DESCRIPTION:Der Inhalt zweier Seiten wird ausgetauscht
// vorbeugenderweise das Anzeigen von Dialogen aktivieren
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;
// prüfen, ob ein Dokument geöffnet ist
if (app.documents.length == 0) {
alert ("Es ist kein Dokument offen.", "Achtung");
exit();
}
// die Version speichern
var appVers = (app.version[0])*1;
// das Dokument im Vordergrund
var docName = app.documents[0].name;
// per 'prompt' die zu tauschenden Seiten erfragen
if (appVers > 6) {
var pagesString = prompt ("Seiten tauschen\n(Nummer Leerschlag Nummer)", "");
}
else {
var pagesString = prompt ("(Nummer Leerschlag Nummer)", "", "SeitenTauschen");
}
if (pagesString != null) {
if (pagesString != "") {
// die Eingabe in eine Liste verwandeln
var pagesList = pagesString.split(" ");
var pageOne = pagesList[0];
var pageTwo = pagesList[1];
if (pageTwo == undefined) {
alert ("Bitte eine zweite Seite angeben.", "Stop");
exit();
}
// die Eingabe prüfen
for (i=0; i< pageOne.length; i++) {
var curNum = pageOne[i];
if (isNaN(curNum)) {
alert ("Die erste Seite ist keine Zahl.", "Stop");
exit();
}
}
for (i=0; i< pageTwo.length; i++) {
var curNum = pageTwo[i];
if (isNaN(curNum)) {
alert ("Die zweite Seite ist keine Zahl.", "Stop");
exit();
}
}
}
else {
alert ("Die Eingabe ist leer.", "Stop");
exit();
}
}
else {
exit();
}
// prüfen, ob die Seiten vorhanden sind
if (appVers > 5) {
if (!app.documents.itemByName(docName).pages.itemByName(pageOne).isValid) {
alert ("Die Seite " + pageOne + " existiert nicht.", "Stop");
exit();
}
if (!app.documents.itemByName(docName).pages.itemByName(pageTwo).isValid) {
alert ("Die Seite " + pageTwo + " existiert nicht.", "Stop");
exit();
}
}
else {
var allPageNames = app.documents.itemByName(docName).pages.everyItem().name;
var okay = false;
for (var k=0; k< allPageNames.length; k++) {
if (pageOne == allPageNames[k]) {
okay = true;
break;
}
}
if (okay == false) {
alert ("Die Seite " + pageOne + " ist nicht vorhanden.", "Stop");
exit();
}
var okay = false;
for (var k=0; k< allPageNames.length; k++) {
if (pageTwo == allPageNames[k]) {
okay = true;
break;
}
}
if (okay == false) {
alert ("Die Seite " + pageTwo + " ist nicht vorhanden.", "Stop");
exit();
}
}
// die zugewiesenen Mustervorlagen speichern
var masterOne = app.documents.itemByName(docName).pages.itemByName(pageOne).appliedMaster;
var maNameOne = masterOne.name;
var masterTwo = app.documents.itemByName(docName).pages.itemByName(pageTwo).appliedMaster;
var maNameTwo = masterTwo.name;
// die Masseinheiten speichern
hM = (app.documents.itemByName(docName).viewPreferences.horizontalMeasurementUnits);
vM = (app.documents.itemByName(docName).viewPreferences.verticalMeasurementUnits);
// Seitenformat und Einzel- oder Doppelseite speichern
var pW = Math.round(app.documents.itemByName(docName).documentPreferences.pageWidth);
var pH = Math.round(app.documents.itemByName(docName).documentPreferences.pageHeight);
var fP = app.documents.itemByName(docName).documentPreferences.facingPages;
// die beiden Zieldruckbogen speichern
var targetSpreadOne = app.documents.itemByName(docName).pages.itemByName(pageOne).parent;
var targetSpreadTwo = app.documents.itemByName(docName).pages.itemByName(pageTwo).parent;
// die Vorgabe "Ebenen beim Einfügen erhalten speichern"
resetPrefs = false;
var remLayer = app.clipboardPreferences.pasteRemembersLayers;
if (remLayer == false) {
app.clipboardPreferences.pasteRemembersLayers = true;
resetPrefs = true;
}
// sicherstellen, dass die Objekte der ersten Seite entsperrt sind
if (appVers > 5) {
app.documents.itemByName(docName).pages.itemByName(pageOne).pageItems.everyItem().locked = false;
}
else {
var allItems = app.documents.itemByName(docName).pages.itemByName(pageOne).pageItems;
for (var p=0; p< allItems.length; p++) {
allItems[p].locked = false;
}
}
// die Objekte der ersten Seite auswählen und ausschneiden
app.selection = app.documents.itemByName(docName).pages.itemByName(pageOne).pageItems;
app.cut();
// ein temporäres Dokument erzeugen
var tmpDoc = app.documents.add();
with (tmpDoc.viewPreferences) {
horizontalMeasurementUnits = hM;
verticalMeasurementUnits = vM;
}
with (tmpDoc.documentPreferences) {
facingPages = fP;
pageWidth = pW;
pageHeight = pH;
}
// wenn Doppelseiten
if (fP == true) {
// eine zweite Seite anfügen
tmpDoc.pages.add();
// die fortgesetzte Nummerierung deaktivieren
tmpDoc.sections[0].continueNumbering = false;
// dem Abschnittsanfang die Seitennummer zuweisen
tmpDoc.sections[0].pageNumberStart = 2;
}
// die kopierte Auswahl ins temporäre Dokument einsetzen
app.pasteInPlace();
// prüfen, ob Quell- und Zielseite beide linke oder rechte Seiten sind
var doMove = "not";
if (fP == true) {
sourceSide = pageOne%2;
targetSide = pageTwo%2;
if (sourceSide != targetSide) {
if (sourceSide == 1) {
tmpDoc.pageItems.everyItem().move(undefined, [-pW, 0]);
doMove = "right";
}
else {
tmpDoc.pageItems.everyItem().move(undefined, [pW, 0]);
doMove = "left";
}
}
}
// das ursprüngliche Dokument in den Vordergrund holen
app.activeDocument = app.documents.itemByName(docName);
// sicherstellen, dass die Objekte der zweiten Seite entsperrt sind
if (appVers > 5) {
app.documents.itemByName(docName).pages.itemByName(pageTwo).pageItems.everyItem().locked = false;
}
else {
var allItems = app.documents.itemByName(docName).pages.itemByName(pageTwo).pageItems;
for (var p=0; p< allItems.length; p++) {
allItems[p].locked = false;
}
}
// die Objekte der zweiten Seite auswählen und ausschneiden ...
app.selection = app.documents.itemByName(docName).pages.itemByName(pageTwo).pageItems;
app.cut();
// ... und auf dem Zieldruckbogen einsetzen
app.activeWindow.activeSpread = targetSpreadOne;
app.pasteInPlace();
// falls notwendig verschieben
if (doMove != "not") {
var nItems = app.selection.length;
if (doMove == "left") {
for (var i=0; i< nItems; i++) {
app.selection[i].move(undefined, [-pW, 0]);
}
}
else {
for (var i=0; i< nItems; i++) {
app.selection[i].move(undefined, [pW, 0]);
}
}
}
// das temporäre Dokument wieder in den Vordergrund holen
app.activeDocument = tmpDoc;
// die Objekte ausschneiden ...
app.cut();
// ... das Dokument schliessen ...
tmpDoc.close(SaveOptions.NO);
// ... und die Objekte auf dem Zieldruckbogen einsetzen
app.activeWindow.activeSpread = targetSpreadTwo;
app.pasteInPlace();
// falls notwendig, die Mustervorlagen zuweisen
if (maNameOne != maNameTwo) {
app.documents.itemByName(docName).pages.itemByName(pageOne).appliedMaster = masterTwo;
app.documents.itemByName(docName).pages.itemByName(pageTwo).appliedMaster = masterOne;
}
// die Vorgabe "Ebenen beim Einfügen erhalten speichern" zurücksetzen
if (resetPrefs == true) {
app.clipboardPreferences.pasteRemembersLayers = false;
}
// das Ende der Aktion verkünden
if (appVers > 4) {
var dlog = new Window("palette");
dlog.size = [320,100];
dlog.add("statictext", [80, 100, 320, 116], "Fertig.");
dlog.show();
// eine kleine Pause
$.sleep(999);
// das Fenster schliessen
dlog.close();
}
else {
alert ("Fertig.", " ");
}
Skript ist lauffähig ab Version CS2
Selektierte Objekte auf nächst höhere Ebene bewegen
MoveToPrevLayer.jsx
Link zur Ursprungsdiskussion im Forum
Schiebt die selektierten Objekte eine Ebene rauf, auf die nächst höhere, unabgeschlossene Ebene.
Wunderbar auf Tastenkürzeln. Vorschlag: ALT-SHIFT-Ä
// InDesign CS3/CS4 JavaScript
// by Stephan Möbius
// Moves the selected objects to the next higher unlocked layer.
// updated Febr.2009
myScriptIDC = "No InDesign documents are open or nothing is selected!";
noSel = "Nothing is selected. \nPlease select object and try again.";
if ((app.name != "Adobe InDesign") || ((app.name == "Adobe InDesign") && (app.documents.length == 0))) {
alert(myScriptIDC);
}
else if (app.selection.length != 0) {
(app.version[0] < "4") ? (app.userInteractionLevel = UserInteractionLevels.interactWithAll) : (app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll);
myObjects = new Array;
for(myCounter = 0; myCounter < app.selection.length; myCounter++) {
switch(app.selection[myCounter].constructor.name) {
case "Rectangle":
case "Polygon":
case "GraphicLine":
case "Oval":
case "TextFrame":
case "Group":
myObjects.push(app.selection[myCounter]);
}
}
if (myObjects.length > 0) {
for (i=0; i < myObjects.length; i++) {
myObject = myObjects[i];
var myOBject_currentLayer = myObject.itemLayer;
if (myOBject_currentLayer != app.activeDocument.layers.firstItem() ) {
var myOBject_prevLayer = app.activeDocument.layers.previousItem(myOBject_currentLayer);
while (myOBject_prevLayer.locked && myOBject_prevLayer != app.activeDocument.layers.firstItem() ) {
myOBject_prevLayer = app.activeDocument.layers.previousItem(myOBject_prevLayer);
}
if (!myOBject_prevLayer.locked) myObject.itemLayer = myOBject_prevLayer;
}
else {
myObject.bringToFront();
}
}
}
}
else {
alert(noSel);
} //end of MoveToLayer Script
Skript ist lauffähig ab Version CS3
Selektierte Objekte auf nächst niedrigere Ebene bewegen
MoveToNextLayer.jsx
Link zur Ursprungsdiskussion im Forum
Schiebt die selektierten Objekte eine Ebene runter, auf die nächst niedrigere, unabgeschlossene Ebene.
Wunderbar auf Tastenkürzeln. Vorschlag: ALT-SHIFT-Ö
// InDesign CS3/CS4 JavaScript
// by Stephan Möbius
// Moves the selected objects to the next lower unlocked layer.
// updated Febr.2009
myScriptIDC = "No InDesign documents are open or nothing is selected!";
noSel = "Nothing is selected. \nPlease select object and try again.";
if ((app.name != "Adobe InDesign") || ((app.name == "Adobe InDesign") && (app.documents.length == 0))) {
alert(myScriptIDC);
}
else if (app.selection.length != 0) {
(app.version[0] < "4") ? (app.userInteractionLevel = UserInteractionLevels.interactWithAll) : (app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll);
myObjects = new Array;
for(myCounter = 0; myCounter < app.selection.length; myCounter++) {
switch(app.selection[myCounter].constructor.name) {
case "Rectangle":
case "Polygon":
case "GraphicLine":
case "Oval":
case "TextFrame":
case "Group":
myObjects.push(app.selection[myCounter]);
}
}
if (myObjects.length > 0) {
for (i=0; i < myObjects.length; i++) {
myObject = myObjects[i];
var myOBject_currentLayer = myObject.itemLayer;
if (myOBject_currentLayer != app.activeDocument.layers.lastItem() ) {
var myOBject_nextLayer = app.activeDocument.layers.nextItem(myOBject_currentLayer);
while (myOBject_nextLayer.locked && myOBject_nextLayer != app.activeDocument.layers.lastItem() ) {
myOBject_nextLayer = app.activeDocument.layers.nextItem(myOBject_nextLayer);
}
if (!myOBject_nextLayer.locked) myObject.itemLayer = myOBject_nextLayer;
}
else {
myObject.sendToBack();
}
}
}
}
else {
alert(noSel);
} //end of MoveToLayer Script
Skript ist lauffähig ab Version CS3
Zoomen auf feste Größe und Zentrieren des Druckbogens
zoomSpread.jsx
Link zur Ursprungsdiskussion im Forum
Dieses Skript zoomt den Inhalt des aktiven Layoutfensters auf einen definierten Wert (hier 131%) und zentriert den Druckbogen im Layoutfenster.
Der Zoomfaktor kann in folgender Zeile den eigenen Bedürfnissen angepasst werden:
var myFactor = 131;
//zoomSpread.jsx
var myFactor = 131;
// =======================================
var mySelection = null;
if (app.layoutWindows.count() > 0)
{
if (app.layoutWindows.firstItem().selection.length > 0)
{
var mySelection =app.layoutWindows.firstItem().selection;
app.layoutWindows.firstItem().selection = null;
}
app.layoutWindows.firstItem().zoom(ZoomOptions.FIT_SPREAD);
app.layoutWindows.firstItem().zoomPercentage = myFactor;
if (mySelection != null)
app.layoutWindows.firstItem().select( mySelection);
}
Skript ist lauffähig ab Version CS3
Neu / Öffnen
Alle Dateien im InDesign Buch öffnen oder schließen
BookOpenAll_mod1.jsx
Link zur Ursprungsdiskussion im Forum
Fügt dem "Buchbedienfeldmenü" (Flyout des Buch-Panels) folgende Einträge hinzu
- Open Book Documents
alle Dokumente des Buchs ggf. mit Fehlermeldungen öffnen
- Open Book Documents silent
alle Dokumente des Buchs ohne Fehlermeldungen öffnen
- Close and Save Book Documents
alle Dokumente des Buchs schließen und ohne Rückfrage sichern
- Close Book Documents without saving
alle Dokumente des Buchs ungesichert schließen
- Close Book Documents ask for saving
alle Dokumente des Buchs schließen und ggf. auf Rückfrage sichern
Bei regelmäßiger Nutzung empfiehlt sich die Ablage des Skripts im "startup scripts"-Ordner.
Das
Originalskript BookOpenAll.jsx stammt von
Jongware, der sich selbst wiederum auf ein Skript
File Close All.jsx von
Marc Autret bezieht.
In der hier veröffentllichten Version wurden folgende Anpassungen vorgenommen:
- Bezeichnung des Buchbedienfeldmenüs in "$ID/BookPanelPopup" geändert
(statt "$ID/Book Panel Menu")
- weitere Menüeinträge zum Öffnen mit unterdrückter Fehlermeldung und
Schließen mit oder ohne Sicherung.
/****************************************************************************************/
/* */
/* BookOpenAll :: Add an "open All" feature in the Book Menu */
/* */
/* [Ver: 1.00] [Author: Jongware] [Creat: 01-May-2012] */
/* [Lang: EN] [Req: InDesign CS4] */
/* */
/* Installation: */
/* */
/* 1) Place the current file into Scripts/Startup Scripts/ */
/* (if the folder Startup Scripts doesn't exist, create it) */
/* */
/* Modified from Marc Autret's "File Close All" script at */
/* http://www.indiscripts.com/post/2010/02/how-to-create-your-own-indesign-menus */
/* */
/* 17-01-18 modified (by Martin Fischer and Oliver, Funkturm Mitte) */
/* 1) "$ID/BookPanelPopup" instead of "$ID/Book Panel Menu" */
/* 2) additional menues: "Open Book Documents silent" */
/* "Close Book Documents without saving" */
/* "Close Book Documents ask for saving" */
/* */
/****************************************************************************************/
#targetengine "BookOpenAll"
// THE MAIN PROCESS
// -----------------------------------------------
var fcaTitle1 = "Open Book Documents";
var fcaHandlers1 =
{
'beforeDisplay' : function(ev)
{
ev.target.enabled = (app.books.length>=1);
},
'onInvoke' : function()
{
for( var i = app.activeBook.bookContents.length-1 ; i>=0 ; i-- )
{
app.open (app.activeBook.bookContents[i].fullName, true)
}
}
};
var fcaTitle2 = "Open Book Documents silent";
var fcaHandlers2 =
{
'beforeDisplay' : function(ev)
{
ev.target.enabled = (app.books.length>=1);
},
'onInvoke' : function()
{
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.NEVER_INTERACT;
for( var i = app.activeBook.bookContents.length-1 ; i>=0 ; i-- )
{
app.open (app.activeBook.bookContents[i].fullName, true)
}
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.INTERACT_WITH_ALL;
}
};
var fcaTitle3 = "Close and Save Book Documents";
var fcaHandlers3 =
{
'beforeDisplay' : function(ev)
{
ev.target.enabled = (app.books.length>=1);
},
'onInvoke' : function()
{
for( var i = app.activeBook.bookContents.length-1 ; i>=0 ; i-- )
{
app.open (app.activeBook.bookContents[i].fullName, false).close(SaveOptions.YES);
}
}
};
var fcaTitle4 = "Close Book Documents without saving";
var fcaHandlers4 =
{
'beforeDisplay' : function(ev)
{
ev.target.enabled = (app.books.length>=1);
},
'onInvoke' : function()
{
var conf = confirm('Achtung!\nTatsächlich alle Dokumente des Buchs \nschließen, ohne zu speichen?', true);
if (conf)
{
for( var i = app.activeBook.bookContents.length-1 ; i>=0 ; i-- )
{
app.open (app.activeBook.bookContents[i].fullName, false).close(SaveOptions.NO);
}
}
}
};
var fcaTitle5 = "Close Book Documents ask for saving";
var fcaHandlers5 =
{
'beforeDisplay' : function(ev)
{
ev.target.enabled = (app.books.length>=1);
},
'onInvoke' : function()
{
for( var i = app.activeBook.bookContents.length-1 ; i>=0 ; i-- )
{
app.open (app.activeBook.bookContents[i].fullName, false).close(SaveOptions.ASK);
}
}
};
// THE MENU INSTALLER
// -----------------------------------------------
var fcaMenuInstaller = fcaMenuInstaller||
(function(items)
{
var allIt;
for (allIt=0; allIt< items.length; allIt++)
{
// 1. Create the script menu action
var mnuAction = app.scriptMenuActions.add(items[allIt].title);
// 2. Attach the event listener
var ev;
for( ev in items[allIt].handler )
{
mnuAction.eventListeners.add(ev,items[allIt].handler[ev]);
}
// 3. Create the menu item
var mainMenu = app.menus.item("$ID/BookPanelPopup"); //"$ID/Book Panel Menu");
var refItem = mainMenu.menuItems.item("$ID/Close Book");
mainMenu.menuItems.add(mnuAction,LocationOptions.BEFORE, refItem);
}
return true;
})( [
{title:fcaTitle1, handler:fcaHandlers1},
{title:fcaTitle2, handler:fcaHandlers2},
{title:fcaTitle3, handler:fcaHandlers3},
{title:fcaTitle4, handler:fcaHandlers4},
{title:fcaTitle5, handler:fcaHandlers5}
]);
Skript ist lauffähig ab Version CS6
Dateien mit unterdrückten Fehlermeldungen öffnen.
openFiles_without_interact.jsx
Link zur Ursprungsdiskussion im Forum
Offnet über einen Dialog ausgewählte InDesign-Dateien mit unterdrückten Fehlermeldungen.
/*
openFiles_without_interact.jsx
//DESCRIPTION:Dateien mit unterdrückten Fehlermeldungen öffnen.
VERSION: 0.1
AUTHOR: Martin Fischer
EMAIL: InDesign[at]MartinFischer.de
DATE: 23.5.2016
© Martin Fischer 2016
*/
main();
function main()
{
var files = File.openDialog ('Dateien öffnen', 'INDD:*.indd;Alle Dateien:*.*', true);
if (files != null)
{
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.NEVER_INTERACT;
app.open(files);
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.INTERACT_WITH_ALL;
}
}
Skript ist lauffähig ab Version CS4
Menüeintrag "Öffnen ohne Fehlermeldung" im Datei-Menü
oeffnen_ohne_Fehlermeldung.jsx
Link zur Ursprungsdiskussion im Forum
Dieses Event-Skript ergänzt im Datei-Menü einen Menüeintrag "Öffnen ohne Fehlermeldung".
Der Aufruf dieses Menüeintrags öffnet einen "Datei öffnen"-Dialog zur Auswahl von zu öffnenden Dateien. Beim Öffnen der ausgewählten Dateien werden Fehlermeldungen (fehlende Schriften, fehlende Verknüpfungen, Farbprofile ...) unterdrückt.
Bei regelmäßiger Nutzung empfiehlt sich die Ablage des Skripts im "startup scripts"-Ordner.
/*
oeffnen_ohne_Fehlermeldung.jsx
//DESCRIPTION:Erzeugt im Datei-Menü einen Menüeintrag 'Öffnen ohne Fehlermeldung'.
VERSION: 0.1
AUTHOR: Martin Fischer
EMAIL: InDesign[at]MartinFischer.de
DATE: 18.1.2017
© Martin Fischer 2017
*/
#targetengine "session"
main();
function main(){
var actionname = "Öffnen ohne Fehlermeldung";
var action = app.scriptMenuActions.item(actionname);
if(action == null)
var action = app.scriptMenuActions.add(actionname);
action.addEventListener("onInvoke", open_files);
var fileMenu = app.menus.item('$ID/Main').submenus.item('$ID/FileDestinationPanel');
if (!fileMenu.menuItems.itemByName(actionname).isValid)
fileMenu.menuItems.add(action, LocationOptions.AFTER, fileMenu.menuItems.itemByName('$ID/kPMOpenDocTextKey'));
function open_files()
{
var files = File.openDialog ('Dateien öffnen', 'INDD:*.indd;Alle Dateien:*.*', true);
if (files != null)
{
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.NEVER_INTERACT;
app.open(files);
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.INTERACT_WITH_ALL;
}
}
}
Skript ist lauffähig ab Version CS4
Oberfläche
afterOpen EventHandler in CS4
afterOpen_event Fragment
Link zur Ursprungsdiskussion im Forum
Aus gegebenem Anlass:
Der afterOpen Event in CS4 wird nur einmal gefeuert, nachdem das Dokument geöffnet, aber bevor das Fenster des Dokuments angelegt wurde. Ein Zugriff auf document.layoutWindows oder auch nur app.activeDocument ist damit nicht möglich.
Was trotzdem geht, wird in diesem Fragment skizziert:
#targetengine "event_test"
main();
function main() {
try {
app.removeEventListener("afterOpen", listen);
alert("Listener removed");
} catch(e) {}
app.addEventListener( "afterOpen", listen);
alert("Listener installed");
}
function listen( event ) {
var t = "";
t += "Bubbles: " + event.bubbles + "\r";
t += "Cancelable: " + event.cancelable + "\r";
t += "captures: " + event.captures + "\r";
t += "currentTarget: " + event.currentTarget.constructor.name + "\r";
t += "defaultPrevented: " + event.defaultPrevented + "\r";
t += "eventPhase: " + event.eventPhase + "\r";
t += "eventType: " + event.eventType + "\r";
t += "target: " + event.target.constructor.name + "\r";
if (event.target.constructor.name == "Document") {
t += "target: " + event.target.name + "\r";
t += "links: " + event.target.links.length + "\r";
var links = event.target.links;
var fail = false;
for (var n = 0; n < links.length; n++) {
t += "link: " + links[n].name + "\r";
try {
if (links[n].parent.effectivePpi[0] < 200) fail = true;
} catch(e) {}
}
}
if (fail == true) {
alert("Bilderproblem\r" + t);
} else {
alert ("afterOpen\r" + t);
}
}
Skript ist lauffähig ab Version CS4
Alle offenen Dokumente schließen, ohne sie zu sichern
closeDocs_withoutSaving.jsx
Das Skript schließt alle geöffneten Dokumente, ohne sie zu sichern.
// closeDocs_withoutSaving.jsx
//DESCRIPTION:Schließt alle geöffneten Dokumente ohne zu sichern,
app.documents.everyItem().close(SaveOptions.NO);
Skript ist lauffähig ab Version CS2
Dialoge wiederherstellen
interactWithAll.jsx
Link zur Ursprungsdiskussion im Forum
Sorgt dafür, dass Dialoge, die möglicherweise in einem Skript unterdrückt und nicht mehr aktiviert wurden (z.B. weil das Skript unterbrochen worden ist) wieder erscheinen.
Wer dieses Skript in den 'Startup Scripts'-Ordner legt, hat die Chance, zumindest nach einem Neustart von InDesign die Dialoge wieder zu Gesicht zu bekommen.
//interactWithAll.jsx
//DESCRIPTION:Reaktiviert Dialoge.
(Number((app.version +"").substr(0,1)) >= 4)
? app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll
: app.userInteractionLevel = UserInteractionLevels.interactWithAll;
Skript ist lauffähig ab Version CS2
Selektion zwischenspeichern (Laden)
memSelectLoad.jsx
Link zur Ursprungsdiskussion im Forum
"memSelectSave.jsx" and "memSelectLoad.jsx" speichert und läd eine _Auswahl_ von Objekten. In anderen Worten das Skript merkt sich die Auswahl der Objekte, und kann diese immer wieder selektieren.
Dies ist besonders Praktisch wenn man Objekte in Ebenen über- und untereinander gestapelt hat und eine Wiederauswahl von tiefer liegenden Objekten nicht einfach ist. Oder wenn man eine bestimmte Auswahl von Objekte immer wieder anfassen muss, ohne diese Gruppieren zu wollen.
Es speichert auch Textmarkiereungen. Und es wieder-selektiert sogar Objekte die inzwischen innerhalb von Gruppierungen liegen.
/*
memSelectLoad.jsx
version: 0.1
by Stephan Möbius, April 2009
Tested in Indesign CS4
With "memSelectSave" and "memSelectLoad" you can save and load a selection
like you're used to from Photoshop. The script is best used with key shortcuts.
Two unhoped for features: You can save text-selections with it, too. Also you can
save a selection _then_ group objects from the selection regardless. If you load the
selection the objects will be selected from out of the group just fine.
ToDo: Integrate in Menu and context menues.
ToDo: Save bezier point selections
*/
#targetengine "session"
#target indesign
if (app.documents.length > 0) {
var theDoc = app.activeDocument;
main();
}
else alert("Es muss ein Dokument offen sein");
function main() {
try {
var evaluated = eval(theDoc.extractLabel("MemSelectLabel"));
if (evaluated) {
if (evaluated.length > 0) {
app.select(evaluated);
} else {
alert("Es wurden keine markierten Objekte gefunden");
}
}
} catch (e) {}
}
Skript ist lauffähig ab Version CS4
Selektion zwischenspeichern (Merken)
memSelectSave.jsx
Link zur Ursprungsdiskussion im Forum
"memSelectSave.jsx" and "memSelectLoad.jsx" speichert und läd eine _Auswahl_ von Objekten. In anderen Worten das Skript merkt sich die Auswahl der Objekte, und kann diese immer wieder selektieren.
Dies ist besonders Praktisch wenn man Objekte in Ebenen über- und untereinander gestapelt hat und eine Wiederauswahl von tiefer liegenden Objekten nicht einfach ist. Oder wenn man eine bestimmte Auswahl von Objekte immer wieder anfassen muss, ohne diese Gruppieren zu wollen.
Es speichert auch Textmarkierungen. Und es wieder-selektiert sogar Objekte die inzwischen innerhalb von Gruppierungen liegen.
/*
memSelectSave.jsx
version: 0.1
by Stephan Möbius, April 2009
Tested in Indesign CS4
With "memSelectSave" and "memSelectLoad" you can save and load a selection
like you're used to from Photoshop. The script is best used with key shortcuts.
Two unhoped for features: You can save text-selections with it, too. Also you can
save a selection _then_ group objects from the selection regardless. If you load the
selection the objects will be selected from out of the group just fine.
ToDo: Integrate in Menu and context menues.
ToDo: Save bezier point selections
*/
#targetengine "session"
#target indesign
if (app.documents.length > 0) {
var theDoc = app.activeDocument;
main();
}
else alert("Es muss ein Dokument offen sein");
function main() {
var SelectedPageItems = app.selection;
if (SelectedPageItems.length > 0) {
if (hasMemSelectLabel()) removeMemSelectLabel();
try {
theDoc.insertLabel("MemSelectLabel", SelectedPageItems.toSource());
} catch(e) {alert('Add Error: ' + e)}
} else {
alert("Es muss was markiert sein");
}
}
function hasMemSelectLabel() {
try {
var evaluated = eval(theDoc.extractLabel("MemSelectLabel"));
if (evaluated) return true;
else return false;
} catch (e) {}
}
function removeMemSelectLabel() {
try {theDoc.insertLabel("MemSelectLabel", "");} // labels can be removed by writing an empty string
catch(e) {alert('Remove Error: ' + e)}
}
Skript ist lauffähig ab Version CS4
Skript in allen Dokumenten der geöffneten Büchern ausführen
doScriptWithDocsOfBooks.jsx
Ab und an wird im InDesign Forum die Möglichkeit angefragt, ein Skript über alle Dokumente eines Buchs auszuführen.
Das folgende Skript fragt in einem Dialog nach dem auszuführenden Skript und führt dieses über alle Dokumente aller geöffneten Bücher hinweg aus.
Weiterführender Link 1:
Uwe Laubender hat dieses Skript dahingehend modifiziert, dass falls mehrere Bücher geöffnet sind, zu Beginn ein einzelnes Buch ausgewählt werden kann, über dessen Dokumente das ausgewählte Skript ausgeführt wird:
DOSCRIPT_with_Docs_of_Book_WITH_save_close.jsx.
Weiterführender Link 2:
Ein verwandtes Skript:
doScriptWithDocsOfSelectedFolderAndSubfolders.jsx.
Damit wird ein ausgewähltes Skript in allen Dokumenten eines ausgewählten Verzeichnisses und dessen Unterverzeichnisse ausgeführt.
//doScriptWithDocsOfBooks.jsx
//DESCRIPTION: fragt in einem Dialog nach dem auszuführenden Skript und führt dieses über alle Dokumente aller geöffneten Bücher hinweg aus.
if ( app.books.length < 1 )
errorExit( 'Fehler\rMindestens ein Buch muß geöffnet sein.' );
var myScript = File.openDialog( "Skript ausführen" );
if ( myScript != null )
{
var mySuffix = myScript.name.split(".").pop();
if (mySuffix == "js" || mySuffix == "jsx")
for ( var b = 0; b < app.books.length; b++ )
doBook( app.books[b] );
}
function doBook( aBook )
{
for ( var i = 0; i < aBook.bookContents.length; i++ )
doDoc ( aBook.bookContents[i] );
}
function doDoc ( aDoc )
{
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.neverInteract;
try
{
var myDoc = app.open( File( aDoc.fullName ) );
app.doScript( myScript, ScriptLanguage.javascript);
}
catch (e)
{
alert( aDoc.fullName + '\r' + e );
}
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;
}
function errorExit( aMessage )
{
alert( aMessage );
exit();
}
edit: Wie ich gerade sehe, habe ich praktisch dasselbe Skript im letzten Frühjahr schon mal erfunden:
doScriptForBooks.jsx. Ich konnte sogar zwei kleine Erweiterungen entdecken, die ich in dieser Überarbeitung nun übernommen habe.
Skript ist lauffähig ab Version CS2
Skript in allen Dokumenten eines ausgewählten Buchs ausführen
DOSCRIPT_with_Docs_of_Book_WITH_save_close.jsx
Link zur Ursprungsdiskussion im Forum
Die von
Uwe Laubender modifizierte Version des Skripts
doScriptWithDocsOfBooks.jsx führt ein ausgewähltes Skript nur über die Dokumente eines
ausgewählten geöffneten Buchs (und
nicht aller geöffneten Bücher) aus.
Am Ende werden die geänderten Dokumente gesichert und geschlossen.
//DOSCRIPT_with_Docs_of_Book_WITH_save_close.jsx
//Uwe Laubender
/**
* @@@BUILDINFO@@@ DOSCRIPT_with_Docs_of_Book_WITH_save_close.jsx !Version! Wed Feb 03 2010 17:46:45 GMT+0100
*/
//BEGIN PART 1 ********************************************************************************************
//DIALOG_ShowAllOpenBooks.jsx
//Uwe Laubender
//******* DIALOG BEGIN for choosing a book:
//Script should not run when files are open:
if(app.documents.length!=0){
alert("Please, close all open documents and try again.");
exit();
};
//Generates the list of books opened:
if(app.books.length!=0){
var booksList=app.books.everyItem().name;
};
//If no books are open, back to square one:
else{
alert("There is no book open. Please open a book and try again.");
exit();
};
//Basic Dialog:
var myDialog=app.dialogs.add({name:"Choose one Book to work with:", canCancel:true});
with(myDialog){
with(dialogColumns.add()) {
with (dialogRows.add()) {
with(dialogColumns.add()){
with(dialogColumns.add()){
staticTexts.add({staticLabel:"Books: "});
};
with(dialogColumns.add()){
var libraryDropDown = dropdowns.add({stringList: booksList, selectedIndex:0});
};
};
};
};
};
var result=myDialog.show();
//Variable to trigger the next part of the script:
if(result){
var booksName = booksList[libraryDropDown.selectedIndex];
var contentsLength = app.books.itemByName(booksName).bookContents.length;
//To prevent the script running on an empty book:
if(contentsLength==0){
alert("You have chosen a book without contents. Try again with a book that has contents.");
exit();
};
//Message to show how many docs are dealt with:
alert("You are working with "+contentsLength+" InDesign documents from now on:");
myDialog.destroy();
};
else{
myDialog.destroy();
};
//DIALOG END for choosing a book *******
//END PART 1 **********************************************************************************************
//BEGIN PART 2 ********************************************************************************************
//doScriptWithDocsOfBooksAndSaveClose2.jsx
//Martin Fischer
//Modified by Uwe Laubender
//See also:
//http://www.hilfdirselbst.ch/gforum/gforum.cgi?post=328861#328861
//AB HIER Martin Fischers Script, modifiziert von Uwe Laubender:
var myScript = File.openDialog( "CHOOSE JAVASCRIPT TO WORK WITH (suffixes allowed only: *.js and *.jsx");
//Uwe: Die nächste ergänzende Zeile ist notwendig, weil ich weiter unten eine Ergänzung zum Sichern und Schließen der geöffneten Dateien eingebaut habe.
//Uwe: Falls der Dialog mit Abbrechen quittiert wird, wird das Script beendet.
/*Ergänzung Uwe:*/
if (myScript == null) exit();
if ( myScript != null )
{
var mySuffix = myScript.name.split(".").pop(); //Uwe: Script darf nur einen "." im Namen haben!!
if (mySuffix == "js" || mySuffix == "jsx") //Uwe: Die Endung des Scripts darf nur js oder jsx sein.
doBook(app.books.itemByName(booksName));
}
function doBook( aBook )
{
for ( var n = 0; n< aBook.bookContents.length; n++ )
doDoc ( aBook.bookContents[n] );
}
function doDoc ( aDoc )
{
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.neverInteract;
try
{
var myDoc = app.open( File( aDoc.fullName ) );
app.doScript( myScript, ScriptLanguage.javascript );
}
catch (e)
{
alert( aDoc.fullName + '\r' + e );
}
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;
}
function errorExit( aMessage )
{
alert( aMessage );
exit();
}
try{
//Uwe: Zusatz, um die geänderten Dateien zu sichern und zu schließen:
/*Ergänzung Uwe:*/ var firstDoc = app.documents[0].index;
/*Ergänzung Uwe:*/ var lastDoc = app.documents.length -1;
/*Ergänzung Uwe:*/ app.documents.itemByRange(firstDoc,lastDoc).save();
/*Ergänzung Uwe:*/ app.documents.itemByRange(firstDoc,lastDoc).close();
}catch(e){};
//END PART 2 **********************************************************************************************
Skript ist lauffähig ab Version CS3
Skript in allen Dokumenten eines ausgewählten Verzeichnisses und dessen Unterverzeichnisse ausführen
doScriptWithDocsOfSelectedFolderAndSubfolders.jsx
Link zur Ursprungsdiskussion im Forum
Mit Hilfe von
doScriptWithDocsOfSelectedFolderAndSubfolders.jsx ist es möglich, ein ausgewähltes Skript in allen INDD-Dokumenten eines ausgewählten Verzeichnisses und dessen Unterverzeichnissen auszuführen.
In einem ersten Dialog wird das auszuführende Skript ermittelt.
In einem zweiten Dialog wird das Basisverzeichnis für die zu bearbeitenden INDD-Dokumente und die abzuarbeitenden Unterverzeichnisse ermittelt.
Die ermittelten Dokumente bleiben nach Ausführung des ausgewählten Skripts geöffnet und werden von
doScriptWithDocsOfSelectedFolderAndSubfolders.jsx nicht gesichert.
Dies sollte dem Anwender ermöglichen, die Änderungen zu überprüfen, bevor alle alten Dokumente überschrieben werden.
Bei Bedarf kann das Sichern und Schließen scharf gestellt werden.
Dazu ist die folgende Zeile zu entkommentieren (die beiden
// am Anfang der Zeile entfernen):
// o_doc.close(SaveOptions.YES);
Ein verwandtes Skript:
doScriptWithDocsOfBooks.jsx.
Damit wird ein ausgewähltes Skript in allen Dokumenten von allen geöffneten Büchern ausgeführt.
/*
doScriptWithDocsOfSelectedFolderAndSubfolders.jsx
//DESCRIPTION:Führt ein auszuwählendes Skript in allen INDD-Dokumenten eines ausgewählten Verzeichnisses und dessen Unterverzeichnisse aus.
VERSION: 0.1
AUTHOR: Martin Fischer
EMAIL: InDesign@MartinFischer.de
DATE: 17.2.2012
*/
main();
function main()
{
var errors = new Array();
var ex_script = get_script();
var base_folder = Folder.selectDialog ( "Ein Basisverzeichnis wählen ..." );
var scan_result = scan_subfolders( base_folder, "indd" );
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.neverInteract;
for (var i = 0; i < scan_result.files.length; i++)
{
var result = do_doc(scan_result.files[i], ex_script );
if (result != null)
errors.push(result);
}
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;
if (errors.length > 0)
alert('Achtung!\r' + errors.join('\n'));
}
function get_script()
{
var _script = File.openDialog( "Skript ausführen" );
if ( _script != null )
{
var _suffix = _script.name.match(/\.jsx?$/gi);
if (_suffix != null)
return _script;
else
error_exit('Bitte ein Javascript wählen');
}
}
function do_doc ( doc, ex_script )
{
try
{
var o_doc = app.open( doc );
app.doScript( ex_script, ScriptLanguage.javascript);
// o_doc.close(SaveOptions.YES);
return null
}
catch (e)
{
return doc.fullName + ': ' + e;
}
}
function error_exit( a_message )
{
alert( a_message );
exit();
}
function scan_subfolders(_folder, _ext)
{
var reg_exp = new RegExp ('\.' + _ext + '$', 'gi');
var s_folders = new Array();
var all_files = new Array();
s_folders[0] = _folder;
for ( var j = 0; j < s_folders.length; j++ )
{
var proc_files = s_folders[j].getFiles();
for ( var k = 0; k < proc_files.length; k++ )
{
if ( proc_files[k] instanceof File && proc_files[k].name.match(reg_exp) )
all_files.push( proc_files[k] );
else if ( proc_files[k] instanceof Folder )
s_folders.push( proc_files[k] );
}
}
return {files:all_files, folders:s_folders};
}
Skript ist lauffähig ab Version CS3
Tabellen
Allen Tabellen eines Dokuments ein Tabellenformat zuweisen
applyTableStyles.jsx
Link zur Ursprungsdiskussion im Forum
In
Allen Tabellen ein Zellenformat zuweisen ? per Script wurde angefragt, ob es möglich sei, allen Zellen von allen Tabellen eines Dokuments per Script ein bestimmtes Zellenformat zuzuweisen.
Das ist möglich.
Das folgende Skript weist allen Tabellen ein per Dialog ausgewähltes Tabellenformat zu und sorgt explizit dafür, dass die Tabellenzellen die im Tabellenformat definierten Zellenformate zugewiesen bekommen, denn diese Zellenformate werden nach meinen Beobachtungen nicht konsequent bereits mit der Zuweisung des Tabellenformats übergeben:
- Tabellenkörperzeilen
- Linke Spalte
- Rechte Spalte
- Kopfzeilen
- Fußzeilen
Das Skript sorgt nach der Zuweisung der Formate dafür, dass Abweichungen von den Tabellen- und Zellenformaten gelöscht werden.
------
31.12.2011: Uwe Laubender hat in »
Allen Tabellen ein Tabellenformat zuweisen, Zellenformate anwenden, Abweichungen löschen« auf Probleme im Zusammenhang mit der Formatierung von Fußzeilen hingewiesen. Diese sollten in der aktuellen Fassung behoben sein.
// applyTableStyles.jsx
//DESCRIPTION: Weist allen Tabellen eines Dokuments ein ausgewähltes Tabellenformat zu und übernimmt aus dem Tabellenformat die Formate für die Körperzellen.
// Martin Fischer
// 10/2008; erweitert 11/2009; Fußzeilen korrigiert 12/2011; 'Wie Tabellenkörperzeilen' korrigiert 1/2012
var d = app.activeDocument;
var myTableStyle = myDisplayDialog ();
// --------------------------------------------------------
// Tabellenformat zuweisen
// --------------------------------------------------------
d.stories.everyItem().tables.everyItem().appliedTableStyle = myTableStyle;
// Abweichungen vom Tabellenformat löschen
d.stories.everyItem().tables.everyItem().clearTableStyleOverrides( true );
// --------------------------------------------------------
// Zellenformate aus Tabellenformat zuweisen
// --------------------------------------------------------
// 1. Tabellenkörperzeilen
d.stories.everyItem().tables.everyItem().cells.everyItem().appliedCellStyle = myTableStyle.bodyRegionCellStyle;
// 2. Linke Spalte
if (myTableStyle.leftColumnRegionCellStyle != null)
d.stories.everyItem().tables.everyItem().columns[0].cells.everyItem().appliedCellStyle = myTableStyle.leftColumnRegionCellStyle;
// 3. Rechte Spalte
if (myTableStyle.rightColumnRegionCellStyle != null)
d.stories.everyItem().tables.everyItem().columns[-1].cells.everyItem().appliedCellStyle = myTableStyle.rightColumnRegionCellStyle;
// 4. Kopf- und Fußzeilen
for ( var s = 0; s < d.stories.count(); s++ )
{
for ( var t = 0; t < d.stories.item(s).tables.count(); t++ )
{
if (myTableStyle.headerRegionCellStyle != null && d.stories.item(s).tables.item(t).headerRowCount > 0)
d.stories.item(s).tables.item(t).rows.itemByRange(0, d.stories.item(s).tables.item(t).headerRowCount-1).cells.everyItem().appliedCellStyle = myTableStyle.headerRegionCellStyle;
if (myTableStyle.footerRegionCellStyle != null && d.stories.item(s).tables.item(t).footerRowCount > 0)
{
var r_len = d.stories.item(s).tables.item(t).rows.length;
d.stories.item(s).tables.item(t).rows.itemByRange(r_len - d.stories.item(s).tables.item(t).footerRowCount, r_len -1).cells.everyItem().appliedCellStyle = myTableStyle.footerRegionCellStyle;
}
}
}
// Abweichungen vom Zellenformat löschen
d.stories.everyItem().tables.everyItem().cells.everyItem().clearCellStyleOverrides( true );
// Dialog zum Erfassen des Tabellenstils
function myDisplayDialog(){
var myDialog = app.dialogs.add({name:"Auswahl Tabellenstil"});
with(myDialog.dialogColumns.add()){
var myTsDropDown = dropdowns.add({stringList: d.tableStyles.everyItem().name, selectedIndex:d.tableStyles.length-1});
}
var myResult = myDialog.show();
if(myResult == true){
var tS = d.tableStyles[myTsDropDown.selectedIndex];
myDialog.destroy();
}
else{
myDialog.destroy();
exit()
}
return tS;
}
Skript ist lauffähig ab Version CS3
Bring waagerechte Tabellenkonturen nach vorn
bringHorzStrokesToFront
Link zur Ursprungsdiskussion im Forum
Ich habe hier ein kurzes Script gepostet, das die senkrechten Konturen einer Tabelle nach vorn holt.
Nun bin ich mal wieder gefragt worden, ob es das auch für die waagerechten Striche gibt, und es ergab sich, dass ich ne halbe Stunde Zeit hatte.
//***********************************************************************
//
// bringHorizontalStrokesToFront.jsx
//Description:Weist den horizontalen Konturen in einer Tabelle ihre bestehenden Konturstärken erneut zu und bringt damit die horizontalen Konturen nach vorn
//
// [Ver: 0.5] [Author: Gerald Singelmann] [Modif: 10-12-15]
// [Lang: DE] [Req: InDesign CS4/CS5] [Creat: 10-12-15]
//
// Bugs & Feedback : gerald{at}cuppascript{dot}com
// www.cuppascript.com
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
//*********************************************************************
if (app.documents.length> 0) {
main();
}
function main() {
var doc = app.activeDocument;
var alle = confirm("Alle oder nur eine?\rSie können alle Tabellen des Dokuments oder nur die aktuelle Tabelle bearbeiten. Klciken Sie auf \"Ja\" für alle und \"Nein\" für die aktuelle.");
if (alle) {
var tables = doc.stories.everyItem().tables.everyItem().getElements();
for (var n = 0 ; n < tables.length; n++) {
doTable( tables[n] );
}
} else {
var theTable = getTable();
if (theTable == undefined) {
alert("Ich kann keine Tabelle finden.\rSetzen Sie den Cursor in die Tabelle, markieren eine Zelle oder die gesamte Tabelle oder markieren Sie den Textrahmen, wenn er nur diese eine Tabelle enthält.");
exit();
}
doTable( theTable );
}
}
function doTable( theTable ) {
var theCells = theTable.cells;
for (var n = 0; n < theCells.length; n++) {
var c = theCells[n];
var t = c.topEdgeStrokeWeight;
var b = c.bottomEdgeStrokeWeight;
c.topEdgeStrokeWeight = t;
c.bottomEdgeStrokeWeight = b;
}
}
function getTable() {
if (app.selection.length == 0) return undefined;
var a = app.selection[0].constructor.name;
switch (app.selection[0].constructor.name) {
case "Table":
var aTable = app.selection[0];
var bGoon = true;
break;
case "Cell":
case "Row":
case "Column":
var aTable = app.selection[0].parent;
if (aTable.constructor.name != "Table") {
aTable = app.selection[0].parent.parent;
if (aTable.constructor.name != "Table") {var bGoon = false; } else {var bGoon = true }
} else {
var bGoon = true;
}
break;
case "TextFrame":
case "Story":
if (app.selection[0].tables.length == 1) {
var aTable = app.selection[0].tables[0];
var bGoon = true;
} else {
var bGoon = false;
}
break;
case "InsertionPoint":
case "Character":
case "Word":
case "Line":
case "Paragraph":
case "TextStyleRange":
var aParent = app.selection[0].parent.parent;
if (aParent.constructor.name == "Table") {
var aTable = aParent;
var bGoon = true;
} else {
var bGoon = false;
}
break;
default:
var bGoon = false;
break;
}
if (bGoon) {
return aTable;
} else {
return undefined;
}
}
Skript ist lauffähig ab Version CS4
Höhe von Tabellenzellen global zuweisen
heightOfCells.jsx
Link zur Ursprungsdiskussion im Forum
Mit dem Skript lassen sich über's aktive Dokument hinweg die Höhen von Tabellenzellen zuweisen.
Wahlweise werden alle Tabellen oder nur Tabellen mit einem bestimmten
Tabellenformat berücksichtigt.
Und ebenso wahlweise werden alle Zellen oder nur welche mit einem bestimmten
Zellenformat berücksichtig.
Der Anwender entscheidet, ob die Zellen eine feste Höhe zugewiesen bekommen sollen (dann ist der Wert im Feld
feste Höhe relevant) oder ob die Höhe innerhalb einer bestimmten Spanne variieren soll (dann sind die Werte in den Feldern
minimale Höhe und
maximale Höhe relevant.
Das Skript befindet sich noch in der
Erprobungsphase ? wie fast alle meine Skripte. ;-)
Anregungen, Fehlermeldungen oder anderes Feedback sind willkommen.
// heightOfCells.jsx
//DESCRIPTION:Weist den Zellen der Tabellen im Dokument bestimmte Einstellungen für die Höhe zu.
// Author: Martin Fischer
var params = display_dialog();
var restoreViewPrefs = setupViewPrefs();
if (params.t_style == null)
mod_table(app.documents.firstItem().stories.everyItem().tables.everyItem());
else
{
var all_tables = CollectionToArray(app.documents.firstItem().stories.everyItem().tables);
for (var i = 0; i < all_tables.length; i++)
{
var a = all_tables[i]
if (all_tables[i].appliedTableStyle == params.t_style)
mod_table(all_tables[i]);
}
}
restoreViewPrefs();
// ===============================================================
// Funktionen
// ===============================================================
// -------------------------------------------------------------------------------
// Prozess auf Tabellenebene
// -------------------------------------------------------------------------------
function mod_table (t)
{
if (params.c_style == null)
mod_cell(t.cells.everyItem())
else
{
var all_cells = CollectionToArray(t.cells);
for (var i = 0; i < all_cells.length; i++)
{
var a = all_cells[i]
if (all_cells[i].appliedCellStyle == params.c_style)
mod_cell(all_cells[i]);
}
}
}
// -------------------------------------------------------------------------------
// Prozess auf Zellenebene
// -------------------------------------------------------------------------------
function mod_cell (c)
{
c.autoGrow = params.grow;
if (params.grow == false)
{
// genaue Höhe - Zellen wachsen nicht mit
c.height = params.fix; // Höhe
}
else
{
// variable Höhe ? Zellen wachsen mit
c.minimumHeight = params.min; // minimale Höhe
c.maximumHeight = params.max; // maximale Höhe
}
}
// -------------------------------------------------------------------------------
// Konverter: Sammlung in Array
// -------------------------------------------------------------------------------
function CollectionToArray(theCollection)
{
return theCollection.everyItem().getElements().slice(0);
//http://www.niemannross.com/developer/wiki/index.php?title=Converting_a_collection_into_an_array
}
// -------------------------------------------------------------------------------
// Dialog zur Ermittlung div. Parameter
// -------------------------------------------------------------------------------
function display_dialog()
{
var myDialog = app.dialogs.add( {name:"Einstellung der Zellenhöhe von Tabellen",canCancel:true} );
var myWidth = 120;
var b_width = 100;
var v_list = ('5,10,20,50').split(',');
var sp_h = app.activeDocument.documentPreferences.pageHeight - app.activeDocument.marginPreferences.top - app.activeDocument.marginPreferences.bottom;
var lim_max = 1000;
var ts_list = app.activeDocument.tableStyles.everyItem().name;
ts_list.push('[Alle]');
var cs_list = app.activeDocument.cellStyles.everyItem().name;
cs_list.push('[Alle]');
with( myDialog )
{
with( dialogColumns.add() )
{
with( dialogRows.add() )
{
with( dialogColumns.add() )
{
staticTexts.add( {staticLabel:"Tabellenformat:",minWidth:myWidth} );
}
with( dialogColumns.add() )
{
var ts_dropdown = dropdowns.add( {stringList: ts_list, selectedIndex:ts_list.length-1} );
}
}
with( dialogRows.add() )
{
with( dialogColumns.add() )
{
staticTexts.add( {staticLabel:"Zellenformat:",minWidth:myWidth} );
}
with( dialogColumns.add() )
{
var cs_dropdown = dropdowns.add( {stringList: cs_list, selectedIndex:cs_list.length-1} );
}
}
with( dialogRows.add() )
{
with (borderPanels.add() )
{
with( dialogColumns.add() )
{
var myRangeButtons = radiobuttonGroups.add();
with(myRangeButtons){
radiobuttonControls.add({staticLabel:"Zellhöhe fest", checkedState:true});
radiobuttonControls.add({staticLabel:"Zellhöhe mitwachsend"});
}
}
}
}
with( dialogRows.add() )
{
with( dialogColumns.add() )
{
staticTexts.add( {staticLabel:"feste Höhe:",minWidth:myWidth} );
}
with( dialogColumns.add() )
{
var h_fix_icbox = measurementEditboxes.add({
editContents:'10',
editUnits:app.activeDocument.viewPreferences.verticalMeasurementUnits,
minWidth:b_width,
smallNudge:1,
largeNudge:1,
minimumValue:3,
maximumValue:lim_max
});
}
}
with( dialogRows.add() )
{
with( dialogColumns.add() )
{
staticTexts.add( {staticLabel:"minimale Höhe:",minWidth:myWidth} );
}
with( dialogColumns.add() )
{
var h_min_icbox = measurementEditboxes.add({
editContents:'5',
editUnits:app.activeDocument.viewPreferences.verticalMeasurementUnits,
minWidth:b_width,
smallNudge:1,
largeNudge:1,
minimumValue:3,
maximumValue:lim_max
});
}
}
with( dialogRows.add() )
{
with( dialogColumns.add() )
{
staticTexts.add( {staticLabel:"maximale Höhe:",minWidth:myWidth} );
}
with( dialogColumns.add() )
{
var h_max_icbox = measurementEditboxes.add({
editContents:String(sp_h),
editUnits:app.activeDocument.viewPreferences.verticalMeasurementUnits,
minWidth:b_width,
smallNudge:1,
largeNudge:1,
minimumValue:4,
maximumValue:lim_max
});
}
}
}
}
//display the dialog box
var myResult = myDialog.show();
if ( myResult == true )
{
//get the values from the dialog box controls
var ts = (ts_dropdown.selectedIndex== ts_list.length-1)
? null
: app.activeDocument.tableStyles[ts_dropdown.selectedIndex]
var cs = (cs_dropdown.selectedIndex== cs_list.length-1)
? null
: app.activeDocument.cellStyles[cs_dropdown.selectedIndex]
var c_grow = (myRangeButtons.selectedButton == 1)
? true
: false;
var h_fix = h_fix_icbox.editValue;
var h_min = h_min_icbox.editValue;
var h_max = h_max_icbox.editValue;
myDialog.destroy();
return {t_style:ts, c_style:cs, fix:h_fix, min:h_min, max:h_max, grow:c_grow};
}
else {
myDialog.destroy();
exit();
}
}
// -------------------------------------------------------------------------------
// Ansichteinstellungen sichern und wiederherstellen
// -------------------------------------------------------------------------------
function setupViewPrefs()
{
var doc = app.activeDocument;
with ( doc ) {
var vp = viewPreferences.properties;
var zp = zeroPoint;
var pt = MeasurementUnits.POINTS;
viewPreferences.properties = {
horizontalMeasurementUnits: pt,
verticalMeasurementUnits: pt,
rulerOrigin: RulerOrigin.pageOrigin
};
zeroPoint = [0,0];
}
return function ( )
{
with ( doc ) {
viewPreferences.properties = vp;
zeroPoint = zp;
} }
}
Skript ist lauffähig ab Version CS3
Ausgewählten Zellen einer Tabelle eine definierte Abfolge von Flächenfarben zuweisen]
applyFillColor2SelectedTableCells.jsx
Link zur Ursprungsdiskussion im Forum
Das Skript
applyFillColor2SelectedTableRows.jsx weist den gesamten ausgewählten Reihen eine definierte Abfolge von Flächenfarben zu.
Als Erweiterung dieses Skripts weist das folgende Skript
applyFillColor2SelectedTableCells.jsx diese Abfolge nur den ausgewählten Zellen zu (also nicht der ganze Reihe, sondern nur dem ausgewählten Bereich).
Die gewünschte Abfolge der Flächenfarben wird in der Zeile
Das Skript
applyFillColor2SelectedTableRows.jsx weist den gesamten ausgewählten Reihen eine definierte Abfolge von Flächenfarben zu.
Als Erweiterung dieses Skripts weist das folgende Skript
applyFillColor2SelectedTableCells.jsx diese Abfolge nur den ausgewählten Zellen zu (also nicht der ganze Reihe, sondern nur dem ausgewählten Bereich).
Die gewünschte Abfolge der Flächenfarben wird in der Zeile
Code
var mySwatches = ["Green", "Green", "Blue", "Red"];
definiert.
Ist die Abfolge erschöpft (hier nach "Red"), beginnt die Serie wieder von vorn (hier bei "Green").
// applyFillColor2SelectedTableCells.jsx
var myDoc = app.documents[0];
var mySel = app.selection[0];
var myCounter = 0;
// Bedingung für die Ausführung des Skripts:
// Es müssen entweder eine Tabelle oder Zellen (Zeilen) ausgewählt sein
if ((mySel.constructor.name == "Cell") || (mySel.constructor.name == "Table")) {
(mySel.constructor.name == "Table") ? myTable = mySel : myTable = mySel.parent
// *****************************************************************************
// Definition der Farbabfolge
// *****************************************************************************
var Farbabfolge = prompt ("Farbabfolge", "Green, Green, Blue, Red");
// *****************************************************************************
var mySwatches = Farbabfolge.replace(/,\s+/g, ",").split(",");
var myStartCol = mySel.cells[0].name.split(":")[0]*1;
var myEndCol = mySel.cells[-1].name.split(":")[0]*1;
var myStartRow = mySel.cells[0].name.split(":")[1]*1;
var myEndRow = mySel.cells[-1].name.split(":")[1]*1;
// Farbfelder auf Existenz prüfen
for (i = 0; i < mySwatches.length; i++)
checkColor(mySwatches[i]);
// Funktionsaufruf zur Zuweisung der Hintergrundfarbe
for (oneRow = myStartRow; oneRow <= myEndRow; oneRow++)
assignFillColor(oneRow)
}
else {
alert("Bitte Zeilen in einer Tabelle auswählen.")
}
// Zuweisung der Flächenfarbe
function assignFillColor(theRow) {
for (theCol = myStartCol; theCol <= myEndCol; theCol++)
myTable.cells.item(theCol + ":" + theRow).fillColor = myDoc.swatches.item(mySwatches[myCounter]);
(myCounter < mySwatches.length-1) ? myCounter++ : myCounter = 0
}
// Prüfung, ob die angegebene Farbe im Dokument vorhanden
// wenn nicht vorhanden, dann wird sie angelegt
function checkColor(theCol) {
try {
myDoc.swatches.item(theCol).name;
}
catch (e) {
try {
myDoc.colors.add({name:theCol})
}
catch(error) {
alert("Fehler!\rDas Farbfeld \"" + theCol + "\" kann nicht angelegt werden.");
exit();
}
}
}
Skript ist lauffähig ab Version CS2
Leere Tabellenzellen befüllen
fillEmptyCells.jsx
Link zur Ursprungsdiskussion im Forum
In
Leere Tabellenzellen "automatisch" befüllen fragte Ralf nach einer Skriptlösung zum Befüllen von leeren Tabellenzellen mit einem Halbgeviertstrich.
Das Skript
fillEmptyCells.jsx fülle leere Zellen in den Tabellen eines Dokuments mit einem angegebenen Zeichen.
Es ignoriert verschachtelte Tabellen (Tabellen in Tabellen).
// fillEmptyCells.jsx
//DESCRIPTION:Füllt leere Zellen in den Tabellen eines Dokuments mit einem angegebenen Zeichen.
var _str = prompt( 'Füllzeichen', '\u2014' );
if ( _str != null && _str != '' )
{
var ct = app.documents.firstItem().stories.everyItem().tables.everyItem().cells.everyItem().texts.firstItem().getElements();
for ( var i = 0; i < ct.length; i++ )
if ( ct[i].contents.replace(/\s+/g,'' ) == '' )
ct[i].contents = _str;
}
Skript ist lauffähig ab Version CS3
Senkrechte Tabellenkonturen nach vorn holen
bringVertStrokesToFront.jsx
Link zur Ursprungsdiskussion im Forum
Da immer jene Tabellenkonturen vorn liegen, die zuletzt geändert wurden, kann es passieren, dass sich waagerechte Linien in den Vordergrund drängeln, obwohl man in den Tabelleneinstellungen definiert hat, dass die senkrechten vorn sein sollen.
Hier hilft der Trick, einfach allen Zellen die senkrechte Strichstärke erneut zuzuweisen.
Manuell ein Albtraum, ist das mit diesem Script schnell gemacht.
Variationen des Scripts, die das gleiche für die horizontalen oder nur für den markierten Bereich tun, gibt es auf Anfrage ;)
// bringVertStrokesToFront.jsx
// ©CuppaScripts 20.5.2009
//DESCRIPTION: Weist den senkrechten Konturen in einer Tabelle ihre bestehenden Konturstärken erneut zu und bringt damit die senkrechten Konturen nach vorn
if (app.selection.length> 0) {
main();
}
function main() {
var theTable = getTable();
var theCells = theTable.cells;
if (theTable == undefined) {
alert("Ich kann keine Tabelle finden.\rSetzen Sie den Cursor in die Tabelle, markieren eine Zelle oder die gesamte Tabelle oder markieren Sie den Textrahmen, wenn er nur diese eine Tabelle enthält.");
exit();
}
for (var n = 0; n < theCells.length; n++) {
var c = theCells[n];
var l = c.leftEdgeStrokeWeight;
var r = c.rightEdgeStrokeWeight;
c.leftEdgeStrokeWeight = l;
c.rightEdgeStrokeWeight = r;
}
}
function getTable() {
var a = app.selection[0].constructor.name;
switch (app.selection[0].constructor.name) {
case "Table":
var aTable = app.selection[0];
var bGoon = true;
break;
case "Cell":
case "Row":
case "Column":
var aTable = app.selection[0].parent;
if (aTable.constructor.name != "Table") {
aTable = app.selection[0].parent.parent;
if (aTable.constructor.name != "Table") {var bGoon = false; } else {var bGoon = true }
} else {
var bGoon = true;
}
break;
case "TextFrame":
case "Story":
if (app.selection[0].tables.length == 1) {
var aTable = app.selection[0].tables[0];
var bGoon = true;
} else {
var bGoon = false;
}
break;
case "InsertionPoint":
case "Character":
case "Word":
case "Line":
case "Paragraph":
case "TextStyleRange":
var aParent = app.selection[0].parent.parent;
if (aParent.constructor.name == "Table") {
var aTable = aParent;
var bGoon = true;
} else {
var bGoon = false;
}
break;
default:
var bGoon = false;
break;
}
if (bGoon) {
return aTable;
} else {
return undefined;
}
}
Skript ist lauffähig ab Version CS3
Tabellenzeile duplizieren
duplicateOneTableRow.jsx
Link zur Ursprungsdiskussion im Forum
Das folgende Skript dupliziert eine ausgewählte Tabellenzeile unter die ausgewählte Zeile.
Es ist darauf zu achten, daß die ausgewählte Tabellenzeile keine verbundenen Zellen enthält.
// duplicateOneTableRow.jsx
//DESCRIPTION: Verdoppelt eine ausgewählte Tabellenzelle
if (app.selection.length == 0) {
alert('Bitte eine Zeile auswählen');
exit();
}
if (app.selection[0].constructor.name == 'Cell')
var myRow = app.selection[0].parentRow;
else if (app.selection[0].parent.constructor.name == 'Cell')
var myRow = app.selection[0].parent.parentRow;
else
var myRow = null;
if (myRow != null) {
var myNewRow = myRow.parent.rows.add(LocationOptions.AFTER, myRow);
for (var i = 0; i < myRow.cells.length; i++)
myNewRow.cells.item(i).properties = myRow.cells.item(i).properties;
}
Soll das Duplikat der ausgewählten Tabellenzeile am Ende der Tabelle eingefügt werden, ist die Zeile
var myNewRow = myRow.parent.rows.add(LocationOptions.AFTER, myRow);
durch folgende Zeile zu ersetzen:
var myNewRow = myRow.parent.rows.add(LocationOptions.AFTER, myRow.parent.rows.lastItem());
Hier ist darauf zu achten, daß weder die ausgewählte Tabellenzeile noch die letzte Zeile verbundenen Zellen enthalten.
Skript ist lauffähig ab Version CS3
Tabellenzeile in nächster Spalte beginnen oder zurück
switchRowStart.jsx
Link zur Ursprungsdiskussion im Forum
Mit switchRowStart.jsx kann man den Start der aktuellen Tabellenzeile wechseln zwischen 'Beliebige Position' und 'In nächster Textspalte'.
Zur Ausführung des Skripts ist es erforderlich, dass der Cursor in einer Tabellenzelle steht oder eine Tabellenzelle oder eine Tabellenreihe ausgewählt ist.
// switchRowStart.jsx
//DESCRIPTION:Wechselt den Start der aktuellen Tabellenzeile zwischen 'Beliebige Position' und 'In nächster Textspalte'.
if (app.selection.length == 0 && (app.selection[0].constructor.name != 'Cell' || app.selection[0].constructor.name != 'Row' || app.selection[0].parent.constructor.name != 'Cell'))
exit();
var s = (app.selection[0].parent.constructor.name == 'Cell')
? app.selection[0].parent
: app.selection[0];
s.startRow = (s.startRow == StartParagraph.ANYWHERE)
? StartParagraph.NEXT_COLUMN
: StartParagraph.ANYWHERE;
Skript ist lauffähig ab Version CS3
Text
Absätze farbig hinterlegen
para filled by rules.jsx
Link zur Ursprungsdiskussion im Forum
Da die Frage regelmäßig einmal im Vierteljahr auftaucht, habe ich mal einen Skript-Ansatz geschrieben, der die Absatzlinien eines Absatzes in der Höhe so anpasst, dass der Absatz farbig hinterlegt ist.
Dadurch, dass das Skript die Linie oben und unten verwendet, darf der Absatz auch einen Spaltenumbruch mitmachen, aber nicht zwei Spaltenumbrüche.
Ansonsten können Konturenführungen das Skript durcheinander bringen.
Beispiel-Datei und readme sind dabei.
para_fill_colour.zip (36.8 KB)
Mit freundlichem Gruß
Gerald Singelmann
----
Hier nun ein Udate mit folgenden Änderungen:
- einige Bugs wurden behoben. Vor allem kam die erste Version nicht mit einem Einzug erste Zeile klar, wenn der Absatz über die Spaltengrenze geht. Das sollte jetzt gehen.
- in JavaScript. Diese Version läuft also auch unter Windows.
- die interne Struktur ist jetzt so, dass es nicht mehr schwer sein sollte, das Script so zu erweitern, dass alle Absätze eines bestimmten Absatzformats aktualisiert werden. Dazu habe ich aber heute keine Zeit mehr.
Beispieldatei und ReadMe sind wieder dabei.
Ohne Feedback keine Updates ;)
para_fill_colour.zip (41.6 KB)
Mit freundlichem Gruß
Gerald Singelmann
main();
function main() {
if (app.selection.length > 0) {
var aDoc = app.activeDocument;
var aSel = app.selection[0];
if (aSel.constructor.name == "InsertionPoint") {
var nC = aSel.index;
} else {
try {
var nC = aSel.insertionPoints[0].index;
} catch (e) {
alert ("Es muss Text markiert sein");
return -1;
}
}
var aStory = aSel.parentStory;
var nP = getParaByIx(nC, aStory);
paintPara(nP, aStory);
}
}
function paintPara( nPara, aStory) {
var aPara = aStory.paragraphs[nPara];
var fstIndex = aPara.characters[0].index;
var lstIndex = aPara.lines[-1].characters[0].index;
var nLines = aPara.lines.length;
var oldUnits = app.activeDocument.viewPreferences.verticalMeasurementUnits;
app.activeDocument.viewPreferences.verticalMeasurementUnits = MeasurementUnits.POINTS;
var aStyle = aPara.appliedParagraphStyle;
with (aStyle) {
var rao = ruleAboveOffset;
var ralw = ruleAboveLineWeight;
var rbo = ruleBelowOffset;
var rblw = ruleBelowLineWeight;
if (leading == Leading.AUTO) {
var ZA = autoLeading * pointSize/100;
} else {
var ZA = leading;
}
}
if (nLines > 2) {
var fli = aPara.firstLineIndent;
if ( aStory.insertionPoints[fstIndex].horizontalOffset - fli != aStory.insertionPoints[lstIndex].horizontalOffset) {
try {
for (var n=1; aPara.lines[n].insertionPoints[0].horizontalOffset == aPara.lines[n+1].insertionPoints[0].horizontalOffset; n++) {}
var nLinesLeft = n;
var nLinesRight = nLines - n -2;
} catch (e) {
// Das kann eigentlich nur schiefgehen, wenn links nur eine Zeile ist.
var nLinesLeft = 0;
var nLinesRight = nLines - 2;
}
} else {
var nLinesLeft = 0;
var nLinesRight = nLines - 2;
}
with (aPara) {
ruleBelowLineWeight = rblw + (nLinesRight * ZA);
ruleBelowOffset = rbo - (nLinesRight * ZA);
ruleAboveLineWeight = ralw + (nLinesLeft * ZA);
ruleAboveOffset = rao - (nLinesLeft * ZA);
}
app.activeDocument.viewPreferences.verticalMeasurementUnits = oldUnits;
} else {
with (aPara) {
ruleBelowLineWeight = rblw;
ruleBelowOffset = rbo;
ruleAboveLineWeight = ralw;
ruleAboveOffset = rao;
}
}
}
function getParaByIx( ix, aStory ) {
try {
for (var n = 0; aStory.paragraphs[n].insertionPoints[0].index <= ix; n++) {
var test = aStory.paragraphs[n].insertionPoints[0].index ;
var test = aStory.paragraphs[n+1].insertionPoints[0].index ;
}
return n-1;
} catch (e) {
return -1;
}
}
Skript ist lauffähig ab Version CS3
Alle Abweichungen löschen
clearOverrides.jsx
Link zur Ursprungsdiskussion im Forum
Löscht alle Abweichungen von Absatz- und Zeichenformaten im Text (inklusive Tabellen und Fußnoten). Zugewiesene Zeichenformate bleiben erhalten.
Ist nichts ausgewählt, werden alle Textabschnitte behandelt.
Steht der Cursor in einem Textrahmen oder ist ein Textrahmen ausgewählt ist, dann wird nur der ausgewählte Textabschnitt behandelt.
// clearOverrides.jsx
//DESCRIPTION:Alle Abweichungen von Absatz- und Zeichenformaten im Text löschen.
if (app.selection.length > 0)
{
var myObject = app.selection[0].parentStory;
}
else
{
var myObject = app.activeDocument.stories.everyItem();
}
// clear overrides in text
myObject.clearOverrides(OverrideType.all);
// clear overrides in footnotes
try
{
myObject.footnotes.everyItem().texts[0].clearOverrides();
}
catch(e) {}
// clear overrides in tables
try
{
myObject.tables.everyItem().cells.everyItem().texts[0].clearOverrides(OverrideType.all);
}
catch(e) {}
Skript ist lauffähig ab Version CS3
Alle Textflüsse exportieren und mit dem Export verlinken
exportAllStoriesAndRelink
Link zur Ursprungsdiskussion im Forum
Siehe die Diskussion zur Aufgabenstellung.
Dieses Script sollte das Problem lösen.
Anleitung - Öffnen Sie die Scriptbezeichnungspalette und geben dem ersten Textrahmen jeder Story eine Bezeichnung. Die Eingabe in dieser Palette bestätigt man mit Tab.
- Lassen Sie das Script laufen.
- Das Script fragt nach dem Format.
- Die Voreinstellung "Beim Import von Text Verknüpfung erstellen" wird eingeschaltet.
- Jeder Textfluss, dessen erster Rahmen ein Label hat, wird exportiert, gelöscht und neu importiert.
//ExportAllStoriesAndRelink.jsx
//An InDesign CS4 JavaScript
/*
@@@BUILDINFO@@@ "ExportAllStories.jsx" 2.0.0 5-December-2007
*/
//DESCRIPTION:Exports all stories in an InDesign document in a specified text format, reimports and links the stories.
// Adaptaion by Gerald Singelmann, CuppaScripts, August 2009
//
//For more on InDesign scripting, go to http://www.adobe.com/products/indesign/scripting/index.html
//or visit the InDesign Scripting User to User forum at http://www.adobeforums.com
//
main();
function main(){
//Make certain that user interaction (display of dialogs, etc.) is turned on.
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;
if(app.documents.length != 0){
if (app.activeDocument.stories.length != 0){
myDisplayDialog();
}
else{
alert("The document does not contain any text. Please open a document containing text and try again.");
}
}
else{
alert("No documents are open. Please open a document and try again.");
}
}
function myDisplayDialog(){
with(myDialog = app.dialogs.add({name:"ExportAllStories"})){
//Add a dialog column.
myDialogColumn = dialogColumns.add()
with(myDialogColumn){
with(borderPanels.add()){
staticTexts.add({staticLabel:"Export as:"});
with(myExportFormatButtons = radiobuttonGroups.add()){
radiobuttonControls.add({staticLabel:"Text Only", checkedState:true});
radiobuttonControls.add({staticLabel:"RTF"});
radiobuttonControls.add({staticLabel:"InDesign Tagged Text"});
}
}
}
var myReturn = myDialog.show();
if (myReturn == true){
//Get the values from the dialog box.
var myExportFormat = myExportFormatButtons.selectedButton;
myDialog.destroy;
var myFolder= Folder.selectDialog ("Choose a Folder");
if((myFolder != null)&&(app.activeDocument.stories.length !=0)){
myExportAllStories(myExportFormat, myFolder);
}
}
else{
myDialog.destroy();s
}
}
}
//myExportStories function takes care of exporting the stories.
//myExportFormat is a number from 0-2, where 0 = text only, 1 = rtf, and 3 = tagged text.
//myFolder is a reference to the folder in which you want to save your files.
function myExportAllStories(myExportFormat, myFolder){
app.activeDocument.textPreferences.linkTextFilesWhenImporting = true;
for(myCounter = 0; myCounter < app.activeDocument.stories.length; myCounter++){
var myStory = app.activeDocument.stories.item(myCounter);
var myName = myStory.textContainers[0].label;
if (myName != "") {
var myID = myStory.id;
switch(myExportFormat){
case 0:
var myFormat = ExportFormat.textType;
var myExtension = ".txt"
break;
case 1:
var myFormat = ExportFormat.RTF;
var myExtension = ".rtf"
break;
case 2:
var myFormat = ExportFormat.taggedText;
var myExtension = ".txt"
break;
}
var myFileName = myName + "-" + myID + myExtension;
var myFilePath = myFolder + "/" + myFileName;
var myFile = new File(myFilePath);
myStory.exportFile(myFormat, myFile);
myStory.contents = "";
myStory.textContainers[0].place(myFile);
}
}
}
Skript ist lauffähig ab Version CS3
An Trennstellen bedingte Trennungen einfügen
trennstellenInBedingte.jsx
Link zur Ursprungsdiskussion im Forum
Eine automatische Trennung hat die gleiche Formatierung wie der letzte Buchstabe. Eine bedingte Trennung (also vom Anwender mit Apfel/STRG-Shift-Minus) nicht unbedingt.
Dieses Script gibt also an jeder Trennstelle eine bedingte Trennung ein.
Am Umbruch
sollte das nichts ändern. In meinen Tests tut es das auch nicht.
Bedingte Trennungen können mit Suchern/Ersetzen bearbeitet werden.
Falls an einem Zeilenende bereits eine bedingte Trennung vorhanden ist, wird eine weitere eingefügt.
Ggf. müssen Sie also ^-^- durch ^- ersetzen, obwohl zwei bedingte hintereinander im Normalfall auch kein Problem sind.
// trennstellenInBedingte.jsx
// ©CuppaScripts 7.4.2009
//DESCRIPTION: Fügt an jedem Zeilenende, über das ein Wort rüberragt, eine bedingte Trennung ein
// Falls das letztes Wort von Zeile = erstes Wort von Zeile+1 und letztes Wort von Zeile != letzte Buchstaben von Zeile...
// ...liegt wohl eine Trennung vor und es wird eine bedingte Trennung eingefügt
if (app.documents.length != 0){
if (app.selection.length == 1){
var s = app.selection[0].constructor.name;
switch (app.selection[0].constructor.name){
case "Text":
case "InsertionPoint":
case "Character":
case "Word":
case "Line":
case "TextStyleRange":
case "TextColumn":
case "Paragraph":
case "TextFrame":
main(app.selection[0].parentStory);
break;
default:
alert("Es ist kein Text markiert.");
break;
}
}
else{
alert("Es ist nichts markiert.");
}
}
else{
alert("Es ist kein Dokument offen.");
}
function main(theStory) {
var nLines = theStory.lines.length;
if (nLines > 100) {
var bPBar = true;
var p = initPPanel(nLines, 400, "Silbentrennungen fixieren");
} else {
var bPBar = false;
}
for (var n = nLines-2; n >= 0; n--) {
var lastWord = theStory.lines[n].words.lastItem();
if (theStory.lines[n+1].words.firstItem() == lastWord ) {
var thisLine = theStory.lines[n].contents;
if (thisLine.substr(thisLine.length - lastWord.length-1, lastWord.length) != lastWord) {
theStory.lines[n].insertionPoints.lastItem().contents = SpecialCharacters.DISCRETIONARY_HYPHEN;
}
}
if (bPBar ) {
updatePPanel((nLines-n), p.panel, p.inc);
}
}
if(bPBar) killPPanel(p.panel);
}
function initPPanel(max, w, t) {
#targetengine "session";
var pPanelInc = 100/max;
// alert("init panel\r max: "+max+"\r pPanelInc: "+pPanelInc);
var pPanel = new Window('window', t);
pPanel.pBar = pPanel.add('progressbar');
with(pPanel.pBar) {
value = 50;
bounds = [12,12,w,24];
}
pPanel.show();
var p = new Object();
p.inc = pPanelInc;
p.panel = pPanel;
return p;
}
function updatePPanel(v, p, i) {
#targetengine "session";
p.pBar.value = v * i;
// $.writeln(v);
}
function killPPanel(p){
#targetengine "session";
p.pBar.value = 0;
p.close();
}
Skript ist lauffähig ab Version CS3
Aus einer Fußnote hinter deren Referenz im Text springen
upToFootnoteMarker.jsx
Mit dem Skript
upToFootnoteMarker.jsx 'springt' der Cursor aus einer Fußnote hinter die Fußnotenreferenz im Text.
Damit ist es etwa möglich, nach dem Einfügen einer Fußnote schnell wieder an die ursprüngliche Position des Texts zu springen.
// upToFootnoteMarker.jsx
//DESCRIPTION:Springt aus einer Fußnote hinter das Fußnotenreferenzzeichen im Text
if (app.selection.length > 0 && app.selection[0].hasOwnProperty ('baseline') && app.selection[0].parent.constructor == Footnote)
{
app.select( app.selection[0].parentStory.insertionPoints.item( app.selection[0].parent.storyOffset.index +1 ), SelectionOptions.replaceWith );
app.activeWindow.zoomPercentage = app.activeWindow.zoomPercentage;
}
Skript ist lauffähig ab Version CS3
Ausgewählten Text über Kontextmenü googeln
googleSelection_context.jsx
Link zur Ursprungsdiskussion im Forum
Das Skript googleSelection_context.jsx recherchiert den in InDesign ausgewählten Text über das Kontextmenü (rechte Maustaste) über den Standardbrowser in Google.
Damit es in jeder Sitzung von InDesign aktiv ist, empfiehlt sich die Ablage des Skripts im Startup Scripts-Ordner.
Ist im ausgewählten Text ein Hyperlink enthalten, bricht das Skript mit einem Hinweis ab.
Sonderzeichen werden u.U. nicht als Zeichen, sondern als hexadezimaler Unicodewert in spitzen Klammern übergeben (Beispiel: 'Naz<014D>raîos').
Der kleine Bruder dieses Skripts
googleSelection.jsx kann über die Skriptpalette oder eine Kurztaste gestartet werden.
// googleSelection_context.jsx
//DESCRIPTION:Recherchiert den ausgewählten Text in Google über das Kontextmenü (rechte Maustaste)
//Autor: Martin Fischer
//Datum: Oktober 2010
#targetengine "session"
google_menu();
function google_menu(){
var _text_context_menu = app.menus.item("$ID/RtMouseText");
var g_action = null;
g_action = app.scriptMenuActions.item("Auswahl googeln");
if (g_action == null)
g_action = app.scriptMenuActions.add("Auswahl googeln");
var _event_listener = g_action.eventListeners.add("onInvoke", google_text, false);
var _sep = _text_context_menu.menuSeparators.add();
var _google_menu_item = _text_context_menu.menuItems.add(g_action);
function google_text(myEvent)
{
if (app.selection[0].characters.length > 0)
{
// Hyperlink-String aus Auswahl ermitteln
var _sel = app.selection[0];
var _str = 'http://www.google.de/search?q=\"' + _sel.contents + '\"&ie=UTF-8&oe=UTF-8';
// Hyperlink vorbereiten und anlegen
try
{
var _source = app.documents.firstItem().hyperlinkTextSources.add({sourceText: _sel});
}
catch(e)
{
alert ('Aktive Hyperlinkquelle ausgewählt.');
exit();
}
var _dest = app.documents.firstItem().hyperlinkURLDestinations.add({destinationURL:_str});
var _hyper = app.documents.firstItem().hyperlinks.add({destination:_dest, source: _source})
// Hyperlink anzeigen
_hyper.showDestination ();
// aufräumen
_hyper.remove();
_dest.remove();
_source.remove();
}
else
{
alert ('Kein Text ausgewählt.');
}
}
}
Skript ist lauffähig ab Version CS3
Ausgewählten Text über Tastendruck googeln
googleSelection.jsx
Link zur Ursprungsdiskussion im Forum
Das Skript googleSelection.jsx recherchiert den in InDesign ausgewählten Text nach Auslösung über die Skriptpalette oder Kurztaste über den Standardbrowser in Google.
Ist im ausgewählten Text ein Hyperlink enthalten, bricht das Skript mit einem Hinweis ab.
Sonderzeichen werden u.U. nicht als Zeichen, sondern als hexadezimaler Unicodewert in spitzen Klammern übergeben (Beispiel: 'Naz<014D>raîos').
Dieses Skript gibt es auch noch in einer Version für das Kontextmenü:
googleSelection_context.jsx .
//googleSelection.jsx
//DESCRIPTION:Recherchiert den ausgewählten Text in Google
//Autor: Martin Fischer
//Datum: Oktober 2010
if (app.selection.length > 0 && app.selection[0].hasOwnProperty ('baseline') && app.selection[0].characters.length > 0)
{
// Hyperlink-String aus Auswahl ermitteln
var _sel = app.selection[0];
var _str = 'http://www.google.de/search?q=\"' + _sel.contents + '\"&ie=UTF-8&oe=UTF-8';
// Hyperlink vorbereiten und anlegen
try
{
var _source = app.documents.firstItem().hyperlinkTextSources.add({sourceText: _sel});
}
catch(e)
{
alert ('Aktive Hyperlinkquelle ausgewählt.');
exit();
}
var _dest = app.documents.firstItem().hyperlinkURLDestinations.add({destinationURL:_str});
var _hyper = app.documents.firstItem().hyperlinks.add({destination:_dest, source: _source})
// Hyperlink anzeigen
_hyper.showDestination ();
// aufräumen
_hyper.remove();
_dest.remove();
_source.remove();
}
Skript ist lauffähig ab Version CS3
Austausch von Absatzformaten einer Formatgruppe durch Formate einer anderen Formatgruppe (im ausgewählten Textabschnitt)
change_psGroup.jsx
Link zur Ursprungsdiskussion im Forum
In Dokumenten mit Beiträgen in unterschiedlichen Sprachen ist es von Vorteil, für jede Sprache ein Set mit Absatzformaten, die sich nur in der Sprache unterscheiden, bereitzuhalten (siehe
Zweisprachige Absatzformate).
Das folgende Skript unterstützt beim Austausch der zugewiesenen Absatzformate eines ausgewählten Textabschnitts durch die Absatzformate einer anderen Gruppe.
In einem Dialog werden Ausgangsformatgruppe und Zielformatgruppe ausgewählt (siehe
Bildschirmfoto). Anschließend werden alle Absatzformate im ausgewählten Textabschnitt durch den gleichnamigen Partner in der Zielformatgruppe ersetzt ? so weit vorhanden.
Fehlt der entsprechende Partner in der Zielformatgruppe, dann bleibt die ursprüngliche Formatierung der damit ausgezeichneten Absatzformate erhalten.
In der aktuellen Version wird der Austausch auch in Fußnoten unterstützt.
Tabellen und Texte in verankerten Textrahmen sind noch nicht berücksichtigt.
Bei Bedarf kann das auf Anfrage nachgereicht werden.
/*
change_psGroup.jsx
//DESCRIPTION:Ersetzt im ausgewählten Textabschnitt die Absatzformate einer ausgewählten Absatzformatgruppe durch die einer anderen ausgewählten Absatzformatgruppe.
VERSION: 0.1
AUTHOR: Martin Fischer
EMAIL: InDesign@MartinFischer.de
DATE: 8.5.2012
*/
if (app.selection.length > 0 && app.selection[0].hasOwnProperty ('parentStory'))
{
var d = app.documents.firstItem();
var ps_groups = get_psgroups(d);
if (ps_groups.source == ps_groups.target)
error_exit ('Achtung!\nQuell- und Zielgruppe sind gleich.');
change_psGroup( app.selection[0].parentStory, ps_groups.source, ps_groups.target);
change_psGroup_footnotes(app.selection[0].parentStory, ps_groups.source, ps_groups.target);
}
else
error_exit ('Achtung!\nBitte zuerst Textabschnitt auswählen.');
function change_psGroup( s, old_psg, new_psg )
{
if (!d.paragraphStyleGroups.itemByName(old_psg).isValid || !d.paragraphStyleGroups.itemByName(new_psg).isValid)
error_exit('Eine der beiden Absatzformatgruppen \'' + old_psg + '\' oder \'' + new_psg + '\' ist nicht vorhanden.');
for (var i = 0; i < s.paragraphs.length; i++)
{
var ps = s.paragraphs[i].appliedParagraphStyle;
if (ps.parent.constructor.name == 'ParagraphStyleGroup' && ps.parent.name == old_psg)
{
var new_ps = d.paragraphStyleGroups.itemByName(new_psg).paragraphStyles.itemByName(ps.name);
if (new_ps.isValid)
{
s.paragraphs[i].appliedParagraphStyle = new_ps;
}
}
}
}
function change_psGroup_footnotes( s, old_psg, new_psg )
{
if (s.footnotes.length > 0)
{
var fn_pstyle = d.footnoteOptions.footnoteTextStyle;
if (fn_pstyle.parent.constructor == ParagraphStyleGroup && fn_pstyle.parent.name == old_psg)
{
var new_ps = d.paragraphStyleGroups.itemByName(new_psg).paragraphStyles.itemByName(fn_pstyle.name);
if (new_ps.isValid)
{
app.findTextPreferences = app.changeTextPreferences = NothingEnum.nothing;
app.findTextPreferences.appliedParagraphStyle = fn_pstyle;
app.changeTextPreferences.appliedParagraphStyle = new_ps;
s.changeText();
app.findTextPreferences = app.changeTextPreferences = NothingEnum.nothing;
} // if (new_ps.isValid)
} // if (fn_pstyle.parent.constructor == ParagraphStyleGroup && fn_pstyle.parent.name == old_psg)
}// if (s.footnotes.length > 0)
}
function get_psgroups(d)
{
var w = new Window ("dialog", 'Wechsle Absatzformatgruppe' );
w.minimumSize.width = 225;
var array = d.paragraphStyleGroups.everyItem().name;
w.alignChildren = "left";
var g1 = w.add('group');
var stat1 = g1.add ("statictext", undefined, 'Quelle:');
stat1.minimumSize.width = 50;
var myDropDown1 = g1.add ("dropdownlist", undefined, array);
var g2 = w.add('group');
var stat2 = g2.add ("statictext", undefined, 'Ziel:');
stat2.minimumSize.width = stat1.minimumSize.width;
var myDropDown2 = g2.add ("dropdownlist", undefined, array);
myDropDown1.selection = 0;
if (array.length >= 2)
myDropDown2.selection = 1;
else
myDropDown2.selection = array.length-1;
var btn_gr = w.add ("group");
btn_gr.alignment = "right";
btn_gr.add ("button", undefined, "Cancel");
btn_gr.add ("button", undefined, "OK");
if (w.show () == 1)
return {source:myDropDown1.selection.text, target:myDropDown2.selection.text};
else
exit ();
}
function error_exit( aMessage )
{
alert( aMessage );
exit();
}
Skript ist lauffähig ab Version CS4
Bestimmten Worten automatisch Zeichenformat zuweisen
CSofWords2Words.jsx
In
http://www.hilfdirselbst.ch/...i?post=333858#333858 kam heute die Frage nach der Möglichkeit, von definierten Wörtern eine bestimmte Stilvorlage zuzuweisen.
Das Skript
CSofWords2Words.jsx liest die Worte einer Textauswahl und verwendet sie zunächst, um Zeichenformate mit entsprechenden Namen zu erzeugen, und danach allen diesen Worten im Dokument das entsprechende Zeichenformat zuzuweisen.
Beispiel:
Im Dokument sind die Worte "Wurm" und "Schwalbe" ausgewählt (hintereinander oder durch Absatzschaltung getrennt).
Das Skript erzeugt nun (falls noch nicht vorhanden) zwei neue ZF "Wurm" und "Schwalbe" und weist diese ZF allen Wörtern "Wurm" und "Schwalbe" zu.
// CSofWords2Words.jsx
//DESCRIPTION: liest die Worte einer Textauswahl und verwendet sie zunächst, um Zeichenformate mit entsprechenden Namen zu erzeugen, und danach allen diesen Worten im Dokument das entsprechende Zeichenformat zuzuweisen.
Object.prototype.isText = function()
{
switch(this.constructor.name)
{
case "InsertionPoint":
case "Character":
case "Word":
case "TextStyleRange":
case "Line":
case "Paragraph":
case "TextColumn":
case "Text":
case "TextFrame":
return true;
default :
return false;
}
}
if (app.selection.length == 0 || !app.selection[0].isText())
exit();
d = app.activeDocument;
s = app.selection[0];
w = s.contents.replace( / /g, '\r' ).split( '\r' );
prepareFindChangeSettings();
for ( i = 0; i < w.length; i++ )
if ( w[i] != '' )
doTheJob( w[i] );
function doTheJob( aWord )
{
app.findTextPreferences.findWhat = aWord;
app.changeTextPreferences.appliedCharacterStyle = checkStyle ( aWord );
d.changeText();
}
function checkStyle( aName )
{
if ( d.characterStyles.item( aName ) == null )
d.characterStyles.add( { name : aName } );
return d.characterStyles.item( aName );
}
function prepareFindChangeSettings()
{
app.findTextPreferences = NothingEnum.nothing;
app.changeTextPreferences = NothingEnum.nothing;
app.findChangeTextOptions.wholeWord = true;
app.findChangeTextOptions.caseSensitive = true;
}
Skript ist lauffähig ab Version CS3
Datum im Text aktualisieren
updateDate.jsx
Link zur Ursprungsdiskussion im Forum
Anpassung eines Skripts von Dave Saunders an InDesign CS3/CS4.
Dieses Skript setzt ein Zeichenformat »Datum« voraus.
Beim Ausführen des Skripts wird bei allen Instanzen, die mit diesem ZF formatiert sind, das aktuelle Datum eingefügt.
Siehe auch
refresh_date-CS3.jsx.
//updateDate.jsx
//DESCRIPTION: Update Date in Active Document
/*
Updates all instances of current date in a document to reflect the
actual date when the script is run. Depends on character style named
"Datum" -- does nothing if document lacks said style.
20.03.2009 update for CS3/CS4
*/
if (app.documents.length == 0)
exit();
var myDoc = app.activeDocument;
var myStyle = myDoc.characterStyles.item("Datum");
if (myStyle == null)
exit ();
// If we get here, we have work to do
var myDate = getDateString();
// Use Find/Change across document to update date:
app.findTextPreferences = app.changeTextPreferences = null;
app.findTextPreferences.appliedCharacterStyle = myStyle;
app.changeTextPreferences.changeTo = myDate;
myDoc.changeText();
function getDateString() {
var today = new Date();
var myDateString = today.toLocaleDateString();
myParts = myDateString.split(" 0");
if (myParts.length != 1) {
myDateString = myParts[0] + " " + myParts[1];
}
return myDateString.slice(0,-5) + "," + myDateString.slice(-5);
}
Skript ist lauffähig ab Version CS3
Didot-Punkt einstellen
DidotPunkt_ein.jsx
Link zur Ursprungsdiskussion im Forum
Das folgende Skript stellt in
/Voreinstellungen/Einheiten und Einstellungen/Punkt-/PicaGröße den Umrechnungsfaktor 67,553 PT/Zoll für den Didot-Punkt ein.
Ist ein Dokument geöffnet, wird die Einheit nur dort umgestellt.
Ist kein Dokument geöffnet, wird die Einheit in den Voreinstellungen des Programms umgestellt und gilt von da ab als Standard für alle neu erstellten Dokumente.
In der genannten Ursprungsdiskussion
Eingabe der Versalhöhe in mm bei Indesign? findet sich außerdem ein Link auf Geralds Skript
Versalhöhe3.jsxbin, mit dem man die Versalhöhe in Milllimetern eingeben kann.
// DidotPunkt_ein.jsx
var aValue = 67.553;
if (app.documents.length > 0)
{
app.documents.firstItem().viewPreferences.pointsPerInch = aValue;
}
else
{
app.viewPreferences.pointsPerInch = aValue;
}
Der PostScript-Punkt lässt sich mit folgendem Skript wieder herstellen:
// DidotPunkt_aus.jsx
var aValue = 72;
if (app.documents.length > 0)
{
app.documents.firstItem().viewPreferences.pointsPerInch = aValue;
}
else
{
app.viewPreferences.pointsPerInch = aValue;
}
Skript ist lauffähig ab Version CS2
Einstellungen des Suchen/Ersetzen-Dialogs in Textdatei speichern / RecordFindChange_CS3-CS5.jsx
RecordFindChange_CS3-CS5.jsx
Link zur Ursprungsdiskussion im Forum
RecordFindChange_CS3-CS5.jsx erfasst die aktuellen Einstellungen der Suche/Ersetze-Palette (Text und GREP) und sichert sie wahlweise in einer Textdatei "findChangeStrings.txt" auf dem Schreibtisch oder an einem selbst gewählten Ort.
In einem Dialog kann festgelegt werden, ob die Eigenschaften
a. in einer Liste untereinander oder
b. als Befehlszeilen für
findChangeByList.jsx
dargestellt werden sollen.
In diesem Dialog kann auch festgelegt werden, ob am Ende eine Bestätigung des Skripts eingeblendet werden soll ("Fertig!") oder nicht.
Gegenüber der Vorgängerversion
RecordFindChange_CS3.jsx unterscheidet sich dieses Skript durch das Herausfiltern von störenden, überflüssigen, da leeren Sucheigenschaften in InDesign CS5 (
Reklamation von Ralf Hobirk). Ferner können nun verschiedene Einstellungen, die in der älteren Version nur im Skript selbst verändert werden konnten, in einem Dialog angepasst werden.
Das Skript ist eine Erweiterung/Anpassung von
Olav Kvern's CS2-Skript RecordFindChange.jsx auf CS3-CS5.
//RecordFindChange_CS3-CS5.jsx
//
//An InDesign CS3--CS5 JavaScript
//Writes the current find/change preferences to a text file so that you can copy/paste
//them into a find/change list file.
String.prototype.cleanProps = function ()
{
var s = this;
// split parameters
s = s.replace( /, /g, '\r' );
// delete breaks at start and end
s = s.replace( /^\({/, '' );
s = s.replace( /\}\)$/, '' );
// delete undefined
s = s.replace( /[\w]+:1851876449\r/g, '' );
s = s.replace( /[\w]+:\"\"\r/g, '' );
s = s.replace( /[\w]+:null\r/g, '' );
// delete some dirty or useless parameters
s = s.replace( /[^\r]+\/@find-[^\r]+\r+/g, '' );
s = s.replace( /[^\r]+\/@change-[^\r]+\r+/g, '' );
s = s.replace( /parent:resolve\(\"\/\"\)/g, '' );
s = s.replace(/\b\w+\b\:\(\{\}\)/g,'');
// column or single line
if ( _param.single_line == true )
{
s = s.replace( /\r\r*/g, ', ' );
s = '{' + s + '}';
s = s.replace( /, }/g, '}' );
}
else
s = s.replace( /\r\r+/g, '\r' );
return s;
}
// =================== Preferences / Voreinstellungen ================
var _param = get_param();
app.documents.firstItem().insertLabel('FindChangeByList', _param.toSource());
// ===============================================================
// ===============================================================
// main / Hauptprogramm
// ===============================================================
var myResult;
var myFindTextProperties = app.findTextPreferences.properties.toSource().cleanProps();
var myChangeTextProperties = app.changeTextPreferences.properties.toSource().cleanProps();
var myFindChangeTextOptions = ( _param.catch_options == true )
? app.findChangeTextOptions.properties.toSource().cleanProps()
: '{}';
var myFindGrepProperties = app.findGrepPreferences.properties.toSource().cleanProps();
var myChangeGrepProperties = app.changeGrepPreferences.properties.toSource().cleanProps();
var myFindChangeGrepOptions = ( _param.catch_options == true )
? app.findChangeGrepOptions.properties.toSource().cleanProps()
: '{}';
var myFile = myGetFileName();
var myData = collectData();
writeData ( myData );
if ( _param.final_message == true )
alert('Fertig!');
// ===============================================================
// functions / Funktionen
// ===============================================================
function myGetFileName()
{
if ( _param.file_2desk == true )
{
var myFile = new File( '~/Desktop/findChangeStrings.txt' )
}
else
{
if( File.fs != 'Macintosh' )
{
//Filter files by extension.
var myFile = File.saveDialog( 'Save Text File As:', 'Text Files:*.txt;All Files:*' )
}
else
{
var myFile = File.saveDialog( 'Save Text File As:' )
}
if ( myFile == null )
exit();
}
return myFile;
}
function collectData()
{
if ( _param.single_line == true )
{
if ( myFindTextProperties == '{}' && myChangeTextProperties == '{}' )
{
var myText = '';
}
else
{
var myText = 'text' + '\t' +
myFindTextProperties + '\t' +
myChangeTextProperties + '\t' +
myFindChangeTextOptions +
'\t//' + _param._comment + '\r';
}
if ( myFindGrepProperties != '{}' || myChangeGrepProperties != '{}' )
{
myText += 'grep' + '\t' +
myFindGrepProperties + '\t' +
myChangeGrepProperties + '\t' +
myFindChangeGrepOptions +
'\t//' + _param._comment + '\r';
}
}
else
{
var myText = '//' + _param._comment + '\r\r';
if ( myFindTextProperties != '' )
{
myText += '//FindTextProperties\r' +
myFindTextProperties + '\r\r' +
'//ChangeTextProperties\r' +
myChangeTextProperties + '\r\r' +
'//FindChangeTextOptions\r' +
myFindChangeTextOptions + '\r\r';
}
if ( myFindGrepProperties != '' || myChangeGrepProperties != '' )
{
myText += '//FindGrepProperties\r' +
myFindGrepProperties + '\r\r' +
'//ChangeGrepProperties\r' +
myChangeGrepProperties + '\r\r' +
'//FindChangeGrepOptions\r' +
myFindChangeGrepOptions;
}
}
return myText;
}
function writeData ( aData )
{
if( myFile!='' )
{
//Open the file for writing.
myResult = myFile.open( 'w', undefined, undefined );
}
if( myResult != false )
{
myFile.writeln( aData );
myFile.close();
if ( _param.file_open == true )
myFile.execute();
}
}
function get_param()
{
var _pref_string = app.documents.firstItem().extractLabel('FindChangeByList');
if (_pref_string == '')
_pref_string ="({single_line:true, catch_options:true, file_2desk:true, file_open:true, _comment:'Kommentar', final_message:true})";
var _pref = eval(_pref_string);
var _pref_rc = (_pref.single_line == true)
? true
: false;
var myDialog = app.dialogs.add({name:"Record FindChange Properties"});
var min_width = 300;
with(myDialog.dialogColumns.add()){
with(dialogRows.add()){
staticTexts.add( {staticLabel: "Ausgabe:"} );
}
with(dialogRows.add()){
var single_multi = radiobuttonGroups.add();
with(single_multi) {
radiobuttonControls.add({staticLabel: "einzeilig (für FindChangeByList.jsx)", checkedState: _pref_rc, minWidth: min_width});
radiobuttonControls.add({staticLabel: "mehrzeilig (Listendarstellung)", checkedState: !_pref_rc, minWidth: min_width});
}
}
with(dialogRows.add()){
staticTexts.add( {staticLabel: "-----"} );
}
with(dialogRows.add()){
staticTexts.add( {staticLabel: "Weitere Optionen:"} );
}
with(dialogRows.add()){
var the_cb_options = checkboxControls.add({staticLabel: "findChangeTextOptions und findChangeGrepOptions aufzeichnen", checkedState: _pref.catch_options, minWidth: min_width});
}
with(dialogRows.add()){
var the_cb_file2desk = checkboxControls.add({staticLabel: "Ergebnis auf Schreibtisch (findChangeStrings.txt)", checkedState: _pref.file_2desk, minWidth: min_width});
}
with(dialogRows.add()){
var the_cb_open = checkboxControls.add({staticLabel: "TXT-Datei nach Ausführung des Skripts öffnen", checkedState: _pref.file_open, minWidth: min_width});
}
with(dialogRows.add()){
var the_cb_final = checkboxControls.add({staticLabel: "Schlussmeldung ausgeben", checkedState: _pref.final_message, minWidth: min_width});
}
with(dialogRows.add()){
staticTexts.add( {staticLabel: "Kommentar: "} );
var x = _pref._comment;
var the_cb_comment = textEditboxes.add({staticLabel: "Kommentar", editContents: x, minWidth: min_width});
}
}
var myResult = myDialog.show();
var mySingleLine = (single_multi.selectedButton == 0)
? true
: false;
var myCatchOptions = the_cb_options.checkedState;
var myFile2Desk = the_cb_file2desk.checkedState;
var myFileOpen = the_cb_open.checkedState;
var myComment = the_cb_comment.editContents;
var myFinalMessage = the_cb_final.checkedState;
myDialog.destroy();
if(myResult == false)
exit();
else
return {single_line: mySingleLine, catch_options: myCatchOptions, file_2desk: myFile2Desk, file_open: myFileOpen, _comment: myComment, final_message: myFinalMessage};
}
Skript ist lauffähig ab Version CS3
Einstellungen des Suchen/Ersetzen-Dialogs in Textdatei speichern / RecordFindChange_CS3.jsx
RecordFindChange_CS3-CS5.jsx
Link zur Ursprungsdiskussion im Forum
Rübi fragt in
RecordFindChange.jsx unter CS3 nach einem Recorder für Suche/Ersetze-Einstellungen in CS3.
Auf der Basis von Olav Kverns RecordFindChange.jsx für CS2 hier eine erweiterte Version für CS3 bis CS5, welche die Text- und die Grep-Suche unterstützt.
Das Skript ermittelt die aktuellen Suche-/Ersetze-Einstellungen und sichert sie in eine Text-Datei für den Gebrauch im Skript FindChangeByList.jsx.
//RecordFindChange_CS3-CS5.jsx
//
//An InDesign CS3--CS5 JavaScript
//Writes the current find/change preferences to a text file so that you can copy/paste
//them into a find/change list file.
String.prototype.cleanProps = function ()
{
var s = this;
// split parameters
s = s.replace( /, /g, '\r' );
// delete breaks at start and end
s = s.replace( /^\({/, '' );
s = s.replace( /\}\)$/, '' );
// delete undefined
s = s.replace( /[\w]+:1851876449\r/g, '' );
s = s.replace( /[\w]+:\"\"\r/g, '' );
s = s.replace( /[\w]+:null\r/g, '' );
// delete some dirty or useless parameters
s = s.replace( /[^\r]+\/@find-[^\r]+\r+/g, '' );
s = s.replace( /[^\r]+\/@change-[^\r]+\r+/g, '' );
s = s.replace( /parent:resolve\(\"\/\"\)/g, '' );
s = s.replace(/\b\w+\b\:\(\{\}\)/g,'');
// column or single line
if ( _param.single_line == true )
{
s = s.replace( /\r\r*/g, ', ' );
s = '{' + s + '}';
s = s.replace( /, }/g, '}' );
}
else
s = s.replace( /\r\r+/g, '\r' );
return s;
}
// =================== Preferences / Voreinstellungen ================
var _param = get_param();
app.documents.firstItem().insertLabel('FindChangeByList', _param.toSource());
// ===============================================================
// ===============================================================
// main / Hauptprogramm
// ===============================================================
var myResult;
var myFindTextProperties = app.findTextPreferences.properties.toSource().cleanProps();
var myChangeTextProperties = app.changeTextPreferences.properties.toSource().cleanProps();
var myFindChangeTextOptions = ( _param.catch_options == true )
? app.findChangeTextOptions.properties.toSource().cleanProps()
: '{}';
var myFindGrepProperties = app.findGrepPreferences.properties.toSource().cleanProps();
var myChangeGrepProperties = app.changeGrepPreferences.properties.toSource().cleanProps();
var myFindChangeGrepOptions = ( _param.catch_options == true )
? app.findChangeGrepOptions.properties.toSource().cleanProps()
: '{}';
var myFile = myGetFileName();
var myData = collectData();
writeData ( myData );
if ( _param.final_message == true )
alert('Fertig!');
// ===============================================================
// functions / Funktionen
// ===============================================================
function myGetFileName()
{
if ( _param.file_2desk == true )
{
var myFile = new File( '~/Desktop/findChangeStrings.txt' )
}
else
{
if( File.fs != 'Macintosh' )
{
//Filter files by extension.
var myFile = File.saveDialog( 'Save Text File As:', 'Text Files:*.txt;All Files:*' )
}
else
{
var myFile = File.saveDialog( 'Save Text File As:' )
}
if ( myFile == null )
exit();
}
return myFile;
}
function collectData()
{
if ( _param.single_line == true )
{
if ( myFindTextProperties == '{}' && myChangeTextProperties == '{}' )
{
var myText = '';
}
else
{
var myText = 'text' + '\t' +
myFindTextProperties + '\t' +
myChangeTextProperties + '\t' +
myFindChangeTextOptions +
'\t//' + _param._comment + '\r';
}
if ( myFindGrepProperties != '{}' || myChangeGrepProperties != '{}' )
{
myText += 'grep' + '\t' +
myFindGrepProperties + '\t' +
myChangeGrepProperties + '\t' +
myFindChangeGrepOptions +
'\t//' + _param._comment + '\r';
}
}
else
{
var myText = '//' + _param._comment + '\r\r';
if ( myFindTextProperties != '' )
{
myText += '//FindTextProperties\r' +
myFindTextProperties + '\r\r' +
'//ChangeTextProperties\r' +
myChangeTextProperties + '\r\r' +
'//FindChangeTextOptions\r' +
myFindChangeTextOptions + '\r\r';
}
if ( myFindGrepProperties != '' || myChangeGrepProperties != '' )
{
myText += '//FindGrepProperties\r' +
myFindGrepProperties + '\r\r' +
'//ChangeGrepProperties\r' +
myChangeGrepProperties + '\r\r' +
'//FindChangeGrepOptions\r' +
myFindChangeGrepOptions;
}
}
return myText;
}
function writeData ( aData )
{
if( myFile!='' )
{
//Open the file for writing.
myResult = myFile.open( 'w', undefined, undefined );
}
if( myResult != false )
{
myFile.writeln( aData );
myFile.close();
if ( _param.file_open == true )
myFile.execute();
}
}
function get_param()
{
var _pref_string = app.documents.firstItem().extractLabel('FindChangeByList');
if (_pref_string == '')
_pref_string ="({single_line:true, catch_options:true, file_2desk:true, file_open:true, _comment:'Kommentar', final_message:true})";
var _pref = eval(_pref_string);
var _pref_rc = (_pref.single_line == true)
? true
: false;
var myDialog = app.dialogs.add({name:"Record FindChange Properties"});
var min_width = 300;
with(myDialog.dialogColumns.add()){
with(dialogRows.add()){
staticTexts.add( {staticLabel: "Ausgabe:"} );
}
with(dialogRows.add()){
var single_multi = radiobuttonGroups.add();
with(single_multi) {
radiobuttonControls.add({staticLabel: "einzeilig (für FindChangeByList.jsx)", checkedState: _pref_rc, minWidth: min_width});
radiobuttonControls.add({staticLabel: "mehrzeilig (Listendarstellung)", checkedState: !_pref_rc, minWidth: min_width});
}
}
with(dialogRows.add()){
staticTexts.add( {staticLabel: "-----"} );
}
with(dialogRows.add()){
staticTexts.add( {staticLabel: "Weitere Optionen:"} );
}
with(dialogRows.add()){
var the_cb_options = checkboxControls.add({staticLabel: "findChangeTextOptions und findChangeGrepOptions aufzeichnen", checkedState: _pref.catch_options, minWidth: min_width});
}
with(dialogRows.add()){
var the_cb_file2desk = checkboxControls.add({staticLabel: "Ergebnis auf Schreibtisch (findChangeStrings.txt)", checkedState: _pref.file_2desk, minWidth: min_width});
}
with(dialogRows.add()){
var the_cb_open = checkboxControls.add({staticLabel: "TXT-Datei nach Ausführung des Skripts öffnen", checkedState: _pref.file_open, minWidth: min_width});
}
with(dialogRows.add()){
var the_cb_final = checkboxControls.add({staticLabel: "Schlussmeldung ausgeben", checkedState: _pref.final_message, minWidth: min_width});
}
with(dialogRows.add()){
staticTexts.add( {staticLabel: "Kommentar: "} );
var x = _pref._comment;
var the_cb_comment = textEditboxes.add({staticLabel: "Kommentar", editContents: x, minWidth: min_width});
}
}
var myResult = myDialog.show();
var mySingleLine = (single_multi.selectedButton == 0)
? true
: false;
var myCatchOptions = the_cb_options.checkedState;
var myFile2Desk = the_cb_file2desk.checkedState;
var myFileOpen = the_cb_open.checkedState;
var myComment = the_cb_comment.editContents;
var myFinalMessage = the_cb_final.checkedState;
myDialog.destroy();
if(myResult == false)
exit();
else
return {single_line: mySingleLine, catch_options: myCatchOptions, file_2desk: myFile2Desk, file_open: myFileOpen, _comment: myComment, final_message: myFinalMessage};
}
Das Skript zeichnet die aktuellen Einstellungen im Suchen/Ersetzen Dialog auf und schreibt sie in eine TXT-Datei.
Dabei sind zwei Darstellungen möglich:
1. Befehlszeilen für findChangeByList.jsx
2. Listendarstellung
In einem Voreinstellungsbereich können diese und andere Parameter den eigenen Bedürfnissen angepasst werden:
// =================== Preferences / Voreinstellungen ================
// singleLine = true -> Befehlszeilen für findChangeByList.jsx
// singleLine = false -> Listendarstellung
var singleLine = true;
// fileSelect = true -> Ausgabedatei selbst bestimmen
// fileSelect = false -> Ausgabedatei: 'Schreibtisch/findChangeStrings.txt'
var fileSelect = false;
// TXT-Datei nach Ausführung des Skripts öffnen
var fileOpen = true;
// Schlussmeldung ausgeben
var finalMessage = true;
// findChangeTextOptions und findChangeGrepOptions aufzeichnen
var catchOptions = true;
// ===============================================================
Es ist möglich, dass manche 'exotischen' Suche/Ersetze-Einstellungen nicht korrekt ausgegeben werden. Ich denke dabei z.B. an Listendefinitionen und Aufzählungszeichen.
Wer entsprechende Entdeckungen macht, der möge dies bitte hier dokumentieren.
Martin Fischer
Skript ist lauffähig ab Version CS3
Ersetzen von Sonderzeichen in Indexeinträgen
IndexSonderzeichenUmwandlung_3.jsx
Link zur Ursprungsdiskussion im Forum
Hier das Skript IndexSonderzeichenUmwandlung_3.jsx zur Umwandlung von Sonderzeichen im Index.
Die Ausgangszeichen stehen in der Liste (Array) oldChars.
Die Zielzeichen stehen in der Liste newChars.
Das erste Zeichen aus oldChars wird ersetzt durch das erste Zeichen von newChars.
Das zweite ... du wirst es schon rausgefunden haben.
Du mußt die Zeichen eventuell ändern bzw. erweitern.
// IndexSonderzeichenUmwandlung_3.jsx
// DESCRIPTION: Ersetzt im Index die Buchstaben aus der Liste oldChars durch die Buchstaben newChars.
//
var oldChars = ["Ä", "Ö", "Ü", "ä", "ö", "ü"];
var newChars = ["Ae", "Oe", "Ue", "ae", "oe", "ue"];
var myIndex = app.activeDocument.indexes.firstItem();
var myTopics = myIndex.topics;
do{
var myChanges= 0;
for (var theTopicNr = 0; theTopicNr < myTopics.length; theTopicNr++){
mySubTopics=myTopics[theTopicNr].topics;
for (var theCharNr = 0; theCharNr < oldChars.length; theCharNr++){
myTopics[theTopicNr].name = changeChars(myTopics[theTopicNr].name, oldChars[theCharNr], newChars[theCharNr]);
try {
for (var theSubTopicNr = 0; theSubTopicNr < mySubTopics.length; theSubTopicNr++){
mySubTopics[theSubTopicNr].name = changeChars(mySubTopics[theSubTopicNr].name, oldChars[theCharNr], newChars[theCharNr]);
}
}
catch(e) {
//$.writeln(e);
}
}
}
//alert(myChanges+ " changes done");
} while (myChanges != 0);
alert('Fertig!');
function changeChars(oneWord, oneOldChar, oneNewChar){
var myRegExp = new RegExp(oneOldChar, 'g');
var myTemp = oneWord.replace(myRegExp, oneNewChar);
if (myTemp != oneWord){
myChanges++;
}
return myTemp;
}
Skript ist lauffähig ab Version CS2
Erweiterung der Textauswahl auf den Bereich der aktuellen Zeichenformatierung
extendSelectedText2firstTextStyleRange.jsx
Das Skript erweitert die aktuelle Textauswahl auf den Bereich der aktuellen Zeichenformatierung (Umgebung mit gleichbleibender Formatierung).
Beispiele:
1. Die Einfügemarke (Cursor) steht in einem kursiv geschriebenen Wort.
Nach Ausführung des Skripts ist der Text vom Anfang der aktuellen Kursiv-Formatierung bis zum Ende ausgewählt, hier also das kursiv geschriebene Wort.
2. Die Einfügemarke (Cursor) steht in einem Satz mit zugewiesener englischer Sprache (oder es sind ein oder mehrere Zeichen oder Wörter ausgewählt) ? drumherum ist die Sprache Deutsch.
Nach Ausführung des Skripts ist der Text vom Anfang der aktuellen Sprach-Formatierung bis zum Ende ausgewählt, hier also der englisch formatierte Satz.
Das gilt auch für andere Formatierungen (Schriftgröße, -art, Laufweite).
Ausgewählt wird stets der Textbereich mit der aktuellen Zeichenformatierung (alles, was in der Umgebung gleich formatiert ist).
Sind in der Textauswahl mehrere unterschiedliche Formatierungen vorhanden, bestimmt der Anfang der Auswahl den auszuwählenden Bereich.
Sinn und Zweck:
Auf eine Taste gelegt erspart es möglicherweise mühsames Herumgefummle mit der Maus, um den Anfang einer Formatierung bis zu dessen Ende auszuwählen.
// extendSelection2firstTextStyleRange.jsx
//DESCRIPTION:Erweitert die Textauswahl auf den Bereich der (ersten) Textformatierung
// Autor: Martin Fischer
// September 2009
if (app.selection.length > 0 &&
app.selection[0].hasOwnProperty('baseline'))
selectTextStyleRange (app.selection[0].insertionPoints[0]);
function selectTextStyleRange(p) {
var myIndex = ( p.index != 0 )
? p.index
: p.index + 1;
var myRange = p.parent.insertionPoints.itemByRange(0, myIndex);
var myTextStyleRange = p.parent.textStyleRanges[myRange.textStyleRanges.length-1];
myTextStyleRange.select();
}
Skript ist lauffähig ab Version CS3
erzwungener Blocksatz, wenn Länge der letzten Zeile ein Limit überschreitet
conditionedFullyJustification.jsx
Link zur Ursprungsdiskussion im Forum
Angeregt durch die Diskussion in
Problem mit Blocksatz in InDesign ist das folgende Skript 'conditionedFullyJustification.jsx' als Studie entstanden.
Es prüft ob bei den ausgewählten Absätzen mit Blocksatz (letzte Zeile linksbündig), die aus mehr als einer Zeile bestehen, die Länge der letzten Zeile ein definiertes Limit (hier 80%) relativ zur Länge der ersten Zeile (als Referenz) überschreitet.
Ist dies der Fall, wird den betreffenden Absätzen entweder das Attribut 'erzwungener Blocksatz' zugewiesen oder - falls die entsprechende Skriptzeile var myPStyle = checkPS( 'erzwungener Blocksatz' ); auskommentiert ist, das definierte Absatzformat (welches bei Bedarf mit der Ausrichtung 'erzwungener Blocksatz' neu angelegt wird).
Nachteile bei der Zuweisung der Attribute:
- Ersteres (Zuweisung 'erzwungener Blocksatz') erzeugt eine Abweichung der Formatierung gegenüber dem zugewiesenen Absatzformat.
- Letzteres (Zuweisung eines best. Absatzformats) weist stets nur ein ganz bestimmtes AF zu; unabhängig davon, ob dem Absatz Kleindruck o.ä. zugewiesen ist. Andere Abweichungen des Absatzes gebenüber dem zugewiesenen AF können dabei verloren gehen.
// conditionedFullyJustification.jsx
Object.prototype.isText = function()
{
switch( this.constructor.name )
{
case "InsertionPoint":
case "Character":
case "Word":
case "TextStyleRange":
case "Line":
case "Paragraph":
case "TextColumn":
case "Text":
case "TextFrame":
return true;
default :
return false;
}
}
if ( app.selection.length > 0 && app.selection[0].isText() )
{
// Grenzwert zur Justage der letzten Zeile (ab myLimit % wird Blocksatz erzwungen)
var myLimit = 80;
// bei Bedarf zuzuweisendes Absatzformat definieren
//var myPStyle = checkPS( 'erzwungener Blocksatz' );
for ( var s = 0; s < app.selection.length; s++ )
for ( var p = 0; p < app.selection[s].paragraphs.length; p++ )
doParagraph( app.selection[s].paragraphs[p] );
}
function doParagraph( aPar )
{
if ( aPar.lines.length > 1 && aPar.justification == Justification.LEFT_JUSTIFIED)
{
var myFirstLineWidth = aPar.lines[0].insertionPoints[-2].horizontalOffset - aPar.lines[0].insertionPoints[0].horizontalOffset;
var myLastLineWidth = aPar.lines[-1].insertionPoints[-2].horizontalOffset - aPar.lines[-1].insertionPoints[0].horizontalOffset;
var myPart = myLastLineWidth * 100 / myFirstLineWidth;
if ( myPart > myLimit )
try
{
aPar.appliedParagraphStyle = myPStyle;
}
catch (e)
{
aPar.justification = Justification.FULLY_JUSTIFIED;
}
}
}
// prüft AF auf Existenz
// bei Bedarf Neuanlegen des AF
function checkPS( oneStyle )
{
try
{
var myPS = app.activeDocument.paragraphStyles.item(oneStyle);
myPS.name;
}
catch (e)
{
var myPS = app.activeDocument.paragraphStyles.add({name:oneStyle, justification:Justification.FULLY_JUSTIFIED});
// AF basiert auf dem ersten AF der Palette nach '[Einfacher Absatz]'
if ( app.activeDocument.paragraphStyles.length > 2 )
myPS.basedOn = app.activeDocument.paragraphStyles[2];
}
return app.activeDocument.paragraphStyles.item(oneStyle);
}
Skript ist lauffähig ab Version CS2
Externe Liste von Textvariablen mit benutzerdefiniertem Text einarbeiten
Textvariablen_benutzerdefiniert.jsx
Link zur Ursprungsdiskussion im Forum
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.
Variablenname:Variableninhalt[Absatzschaltung]
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):
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.
Erweiterungsmöglichkeiten:
Zur Erweiterung könnte man sich etwa die Verwaltung verschiedener Listen, die in einem Auswahldialog angeboten werden vorstellen.
Oder den Gegenpart zu obigem Skript: das Schreiben einer Listendatei mit allen Variablen mit benutzerdefiniertem Text:
TextvariablenExport.jsx
---
Siehe auch das Skript
variables.jsx von
Peter Kahrel, mit dem sich benutzerdefinierte Textvariablen des aktiven Dokuments über einen Dialog einfach bearbeiten lassen.
// 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 ();
}
Skript ist lauffähig ab Version CS4
Finde nächste Trennung
FindeNaechsteTrennung.jsx
Link zur Ursprungsdiskussion im Forum
Diese simplere Version des
Hyphen-Skriptes von Martin Fischer springt einfach von der jetzigen Cursorposition zur nächsten Trennstelle im Text und markiert das Wort. Auf ein Tastenkürzel gelegt kann man so _klick_klick_klick_ im Text Trennung für Trennung inspizieren und gleich vor Ort korrigieren.
Siehe auch "FindeVorherigeTrennung.jsx"
// Vorschlag für Tastenkürzel: STRG-BildAb (in Text)
// FindeNaechsteTrennung.jsx
// Springt von der jetzigen Cursorposition zum nächsten getrennten Wort im Text.
// Stephan Möbius mit grundlegender Hilfe von Martin Fischer, 18. September 2009
// http://www.hilfdirselbst.ch/foren/GREP_-_Trennstriche_kontrollieren_P408629.html
// Vorschlag Tastenkürzel STRG-BildAb (in Text)
// TODO: Unterscheiden ob nächster Treffer auf hiesigem oder auf nächstem Druckbogen liegt. Wenn die Trennung auf der nächsten Seite liege, dann müsste man zur Selektion noch hinzoomen.
if (app.selection.length == 0 || !app.selection[0].hasOwnProperty('baseline')) // wenn Auswahl leer oder nicht im Text dann Ende
exit();
var s = app.selection[0];
var myStory = s.parentStory;
var curPos = app.selection[0].index;
if (s.characters.length != 0) var curPos = app.selection[0].characters.lastItem().index; // wenn schon ein Wort ausgewählt ist (z.B. wenn das Skript schon mal lief und ein Wort ausgewählt hat) dann schau erst ab hinter der Auswahl
var myRange = myStory.characters.itemByRange (curPos, myStory.characters.length - 1) // Text von der Cursorstelle aus bis zum Ende, denn wir wollen nur vorwärts nach Trennungen schauen
for ( var i = 0; i < myRange.lines.count(); i++ ) {
if (myRange.lines[i].insertionPoints.lastItem().words.length == 1) { // wenn die letze Stelle in der Zeile in einem Wort liegt, dann ist da wahrscheinlich eine Trennung...)
app.layoutWindows.firstItem().select(myRange.lines[i].insertionPoints.lastItem().words.firstItem());
if (s.parentTextFrames[0].parent.parent != app.selection[0].parentTextFrames[0].parent.parent )
app.activeWindow.zoomPercentage = app.activeWindow.zoomPercentage;
exit();
}
}
Skript ist lauffähig ab Version CS4
Finde vorherige Trennung
FindeVorherigeTrennung.jsx
Link zur Ursprungsdiskussion im Forum
Diese simplere Version des
Hyphen-Skriptes von Martin Fischer springt einfach von der jetzigen Cursorposition zur vorherigen Trennstelle im Text und markiert das Wort. Auf ein Tastenkürzel gelegt kann man so _klick_klick_klick_ im Text Trennung für Trennung inspizieren und gleich vor Ort korrigieren.
Siehe auch "FindeNaechsteTrennung.jsx"
// Vorschlag für Tastenkürzel: STRG-BildAuf (in Text)
// FindeVorherigeTrennung.jsx
// Springt von der jetzigen Cursorposition zum nächsten getrennten Wort im Text.
// Stephan Möbius mit grundlegender Hilfe von Martin Fischer, 18. September 2009
// http://www.hilfdirselbst.ch/foren/GREP_-_Trennstriche_kontrollieren_P408629.html
// Vorschlag Tastenkürzel STRG-BildAuf (in Text)
// TODO: Unterscheiden ob vorheriger Treffer auf hiesigem oder auf vorherigem Druckbogen liegt. Wenn die Trennung auf der vorherigen Seite liege, dann müsste man zur Selektion noch hinzoomen.
if (app.selection.length == 0 || !app.selection[0].hasOwnProperty('baseline')) // wenn Auswahl leer oder nicht im Text dann Ende
exit();
var s = app.selection[0];
var myStory = s.parentStory;
var curPos = app.selection[0].index;
if (s.characters.length != 0) var curPos = app.selection[0].characters.firstItem().index;
var myRange = myStory.characters.itemByRange (myStory.characters[0].index, curPos); // Der Text vom Anfang des Textes bis zur Cursorstelle, und nichts dahinter, denn wir wollen nur Rückwärts nach Trennungen suchen
for (i = myRange.lines.count()-2; i >= 0; i--) { // Gehe alle Zeilen Rückwärts von der Cursorstelle bis zur ersten Zeile des Textes
if (myRange.lines[i].insertionPoints.lastItem().words.length == 1) { // wenn die letze Stelle in der Zeile in einem Wort liegt, dann ist da wahrscheinlich eine Trennung...)
app.layoutWindows.firstItem().select(myRange.lines[i].insertionPoints.lastItem().words.firstItem());
if (s.parentTextFrames[0].parent.parent != app.selection[0].parentTextFrames[0].parent.parent )
app.activeWindow.zoomPercentage = app.activeWindow.zoomPercentage;
exit();
}
}
Skript ist lauffähig ab Version CS4
Formaten und Text einige Absatzattribute zuweisen
TextSettings_v03.js
Link zur Ursprungsdiskussion im Forum
Der Zweck des Scripts: Formaten, Text und Tabellen des vordersten Dokuments einige Absatzattribute zuweisen.
//TextSettings_v03.js
//DESCRIPTION:Formaten, Text und Tabellen einige Absatzattribute zuweisen
// vorbeugenderweise das Anzeigen von Dialogen aktivieren
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;
// testen, ob ein Dokument geöffnet ist
if (app.documents.length == 0) {
alert ("Ein Dokument öffnen.", "Achtung");
exit();
}
// eine Referenz zum vordersten Dokument
var curDoc = app.documents[0];
//*** EINSTELLUNGEN (BEGINN) //***///***///***///***///***///***///***///***
// Silbentrennung ////////////////////
var hyph = true; // Silbentrennung ein
//var hyph = false; // Silbentrennung aus
//var hyph = "ignore"; // Silbentrennung belassen
var hwlt = 8; // Wörter mit mindestens n Buchstaben
var hyaf = 4; // Kürzeste Vorsilbe
var hybl = 4; // Kürzeste Nachsilbe
var hyll = 3; // Max. Trennstriche
var hypz = "10mm"; // Trennbereich
var hypw = 0; // von 0 (= Abstände optimieren) bis 10 (= Weniger Trennstriche)
var hycw = true; // Großgeschriebene Wörter trennen
//var hycw = false; // Großgeschriebene Wörter nicht trennen
//var hylw = true; // Letztes Wort trennen
var hylw = false; // Letztes Wort nicht trennen
//var hyac = true; // Silben über Spalte hinweg trennen
var hyac = false; // Silben über Spalte hinweg nicht trennen
// Abstände //////////////////////////
// Wortabstand
var miws = 90; // Minimal
var ddws = 100; // Optimal
var mxws = 110; // Maximal
// Zeichenabstand
var mics = 0; // Minimal
var ddcs = 0; // Optimal
var mxcs = 0; // Maximal
// Glyphenskalierung
var migs = 97; // Minimal
var ddgs = 100; // Optimal
var mxgs = 103; // Maximal
// Autom. Zeilenabstand //////////////
var aled = 120;
// Einzelnes Wort ausrichten ////////
//var swjt = SingleWordJustification.LEFT_ALIGN;
//var swjt = SingleWordJustification.CENTER_ALIGN;
//var swjt = SingleWordJustification.RIGHT_ALIGN;
var swjt = SingleWordJustification.FULLY_JUSTIFIED;
// Setzer ////////////////////////////
var comp = "Adobe Ein-Zeilen-Setzer"; // deutsch
//var comp = "Adobe-Absatzsetzer"; // deutsch
//var comp = "Adobe Single-line Composer"; // englisch
//var comp = "Adobe Paragraph Composer"; // englisch
// Ligaturen /////////////////////////
//var ligt = true;
var ligt = false;
//var ligt = "ignore";
//*** EINSTELLUNGEN (ENDE) //***///***///***///***///***///***///***///***///
///////////////////////////////////////////////////////////////
// Absatzformate
var allStyles = curDoc.allParagraphStyles;
var nStyles = allStyles.length;
for (p=1; p< nStyles; p++) {
with (allStyles[p]) {
if (hyph != false) {
if (hyph == true) {
hyphenation = true;
}
hyphenateWordsLongerThan = hwlt;
hyphenateAfterFirst = hyaf;
hyphenateBeforeLast = hybl;
hyphenateLadderLimit = hyll;
hyphenationZone = hypz;
hyphenWeight = hypw;
hyphenateCapitalizedWords = hycw;
hyphenateLastWord = hylw;
hyphenateAcrossColumns = hyac;
}
else {
hyphenation = false;
}
minimumWordSpacing = miws;
desiredWordSpacing = ddws;
maximumWordSpacing = mxws;
minimumLetterSpacing = mics;
desiredLetterSpacing = ddcs;
maximumLetterSpacing = mxcs;
minimumGlyphScaling = migs;
desiredGlyphScaling = ddgs;
maximumGlyphScaling = mxgs;
autoLeading = aled;
singleWordJustification = swjt;
composer = comp;
if (ligt != "ignore") {
ligatures = ligt;
}
}
}
///////////////////////////////////////////////////////////////
// Text
try {
with (curDoc.stories.everyItem().paragraphs.everyItem()) {
if (hyph != false) {
if (hyph == true) {
hyphenation = true;
}
hyphenateWordsLongerThan = hwlt;
hyphenateAfterFirst = hyaf;
hyphenateBeforeLast = hybl;
hyphenateLadderLimit = hyll;
hyphenationZone = hypz;
hyphenWeight = hypw;
hyphenateCapitalizedWords = hycw;
hyphenateLastWord = hylw;
hyphenateAcrossColumns = hyac;
}
else {
hyphenation = false;
}
minimumWordSpacing = miws;
desiredWordSpacing = ddws;
maximumWordSpacing = mxws;
minimumLetterSpacing = mics;
desiredLetterSpacing = ddcs;
maximumLetterSpacing = mxcs;
minimumGlyphScaling = migs;
desiredGlyphScaling = ddgs;
maximumGlyphScaling = mxgs;
autoLeading = aled;
singleWordJustification = swjt;
composer = comp;
if (ligt != "ignore") {
ligatures = ligt;
}
}
}
catch (e) {
}
///////////////////////////////////////////////////////////////
// Tabellen
try {
with (curDoc.stories.everyItem().tables.everyItem().cells.everyItem().paragraphs.everyItem()) {
if (hyph != false) {
if (hyph == true) {
hyphenation = true;
}
hyphenateWordsLongerThan = hwlt;
hyphenateAfterFirst = hyaf;
hyphenateBeforeLast = hybl;
hyphenateLadderLimit = hyll;
hyphenationZone = hypz;
hyphenWeight = hypw;
hyphenateCapitalizedWords = hycw;
hyphenateLastWord = hylw;
hyphenateAcrossColumns = hyac;
}
else {
hyphenation = false;
}
minimumWordSpacing = miws;
desiredWordSpacing = ddws;
maximumWordSpacing = mxws;
minimumLetterSpacing = mics;
desiredLetterSpacing = ddcs;
maximumLetterSpacing = mxcs;
minimumGlyphScaling = migs;
desiredGlyphScaling = ddgs;
maximumGlyphScaling = mxgs;
autoLeading = aled;
singleWordJustification = swjt;
composer = comp;
if (ligt != "ignore") {
ligatures = ligt;
}
}
}
catch (e) {
}
// das Ende der Aktion verkünden
var dlog = new Window("palette");
dlog.size = [320,100];
dlog.add("statictext", [80, 100, 320, 116], "Fertig.");
dlog.show();
// eine kleine Pause
$.sleep(1500);
// das Fenster schliessen
dlog.close();
Vorgeschichte: Die erste Version dieses Scripts wurde von Yves Apel entwickelt. Kräftig unterstützt durch Martin Fischer.
Die vorliegende Version beruht auf dem Gerüst der ersten. Neu ist, dass Variablen definiert sind. Dadurch muss eine eventuelle Änderung nur einmal gemacht werden.
Die Werte sind im Code festgeschrieben. Bei Änderungen muss dieser editiert werden. Zum Teil sind es Zahlen (z.B. für "Max. Trennstriche"). Aber auch das Aktivieren/Deaktivieren von Checkboxen, wobei den Variablen entweder 'true' (= aktivieren) oder 'false' (= deaktivieren) zugewiesen wird. Die entsprechenden Zeilen sind vorbereitet und müssen ebenfalls aktiviert oder deaktiviert werden. Das geschieht durch das Entfernen der beiden führenden Bruchstriche (= die Zeile ist aktiviert) oder das Einsetzen zweier Bruchstriche zu Beginn (= die Zeile ist deaktiviert).
Dasselbe gilt für den Adobe-Setzer. Aber bei diesem muss die gewählte Zeile der Programmsprache entsprechen. Im Code vorhanden sind deutsch und englisch.
Bei der Silbentrennung ist nebst 'true' und 'false' auch noch "ignore" vorgesehen. Wenn man diese Zeile aktiviert, dann wird die Einstellung "ein" oder "aus" belassen. Aber die definierten Werte werden geändert.
Bei den Ligaturen ist es ähnlich. Mit "ignore" wird die Einstellung belassen.
Wer das Script mit CS2 einsetzen möchte, muss die letzten acht Zeilen des Codes durch diese ersetzen:
---
alert ("Fertig.", " ");
---
Skript ist lauffähig ab Version CS3
Fußnote mit Formaten aus den Fußnotenoptionen und ggf. mit ausgewähltem Text erstellen
addFootnote.jsx
Das Skript
addFootnote.jsx fügt am Einfügepunkt eine Fußnote hinzu und formatiert die Fußnotennummer mit der in den Fußnotenoptionen eingestellten Position und dem dort angegebenen Zeichenformat.
Ist vor der Ausführung des Skripts Text ausgewählt, wird dieser in die Fußnote verschoben und mit dem für die Fußnoten definierten Absatzformat ausgezeichnet.
Achtung: Die in den Fußnotenoptionen angegebene Position sorgt eventuell für eine Abweichung von der im Zeichenformat definierten Position.
// addFootnote.jsx
//DESCRIPTION:Fügt am Einfügepunkt eine Fußnote hinzu und formatiert die Fußnotennummer mit der in den Fußnotenoptionen eingestellten Position und Zeichenformat; eventuell zuvor ausgewählter Text wird in die Fußnote verschoben und mit dem für die Fußnoten definierten Absatzformat ausgezeichnet.
var clear_overrides = true;
if (app.selection.length > 0 && app.selection[0].hasOwnProperty('baseline'))
main();
else
alert('Bitte wählen Sie Text aus.')
function main()
{
if ( app.selection[0].parent.constructor != Footnote && app.selection[0].parent.constructor != Cell)
{
var sel_text = null;
// ausgewählten Text referenzieren
if ( app.selection[0].constructor != InsertionPoint )
{
sel_text = app.selection[0].texts.firstItem();
}
var f = app.selection[0].footnotes.add();
if ( sel_text != null)
{
sel_text.move( LocationOptions.AFTER, f.insertionPoints.lastItem() );
f.texts.firstItem().applyParagraphStyle( app.activeDocument.footnoteOptions.footnoteTextStyle, clear_overrides);
}
// Zuweisung des Zeichenformats an die Fußnotennummer
f.characters.firstItem().appliedCharacterStyle = app.activeDocument.footnoteOptions.footnoteMarkerStyle;
// Ermittlung und Zuweisung der Position
f.characters.firstItem().position = get_marker_pos(app.activeDocument.footnoteOptions.markerPositioning);
app.select( f.insertionPoints.lastItem(), SelectionOptions.replaceWith);
app.activeWindow.zoomPercentage = app.activeWindow.zoomPercentage;;
}
else
{
alert ('In \"' + app.selection[0].parent.constructor.name + '\" kann keine Fußnote eingefügt werden.')
}
}
function get_marker_pos (en)
{
var r = null;
switch(en)
{
case FootnoteMarkerPositioning.NORMAL_MARKER :
r = Position.NORMAL;
break;
case FootnoteMarkerPositioning.SUBSCRIPT_MARKER :
r = Position.SUBSCRIPT;
break;
case FootnoteMarkerPositioning.SUPERSCRIPT_MARKER :
r = Position.SUPERSCRIPT;
break;
}
return r;
}
Skript ist lauffähig ab Version CS3
Fußnotenoptionen: Synchronisation der Linie über Fußnoten
continuingRule_Sync.jsx
Link zur Ursprungsdiskussion im Forum
Synchronisiert die Einstellungen der
Linie über fortgesetzten Fußnoten mit der
Linie über der ersten Fußnote in der Spalte.
Siehe auch
footnoteOptionsSet.jsx
//continuingRule_Sync.jsx
//DESCRIPTION:Synchronisiert die Einstellungen der Linie über fortgesetzten Fußnoten mit der Linie über der ersten Fußnote in der Spalte.
with ( app.activeDocument.footnoteOptions )
{
continuingRuleColor = ruleColor;
continuingRuleGapColor = ruleGapColor;
continuingRuleGapOverprint = ruleGapOverprint;
continuingRuleGapTint = ruleGapTint;
continuingRuleLeftIndent = ruleLeftIndent;
continuingRuleLineWeight = ruleLineWeight;
continuingRuleOffset = ruleOffset;
continuingRuleOn = ruleOn;
continuingRuleOverprint = ruleOverprint;
continuingRuleTint = ruleTint;
continuingRuleType = ruleType;
continuingRuleWidth = ruleWidth;
}
Skript ist lauffähig ab Version CS3
Fußnotentexte in ausgewähltem Text hoch- oder herunterschieben
fnText_UpOrDown.jsx
Link zur Ursprungsdiskussion im Forum
Es kommt vor, dass beim Import von Word-Daten die Zuordnung der Texte zu den Fußnoten durcheinandergerät. Sind die Texte lediglich um eine (Fußnoten-)Position verschoben, dann kann dieses Skript helfen, die Texte der Fußnoten wieder in die richtige Position zu verschieben.
Ist
vor Ausführung des Skripts kein Text ausgewählt, sondern lediglich der Cursor im Text platziert, dann wird die Auswahl von diesem Punkt bis zum Ende des Textabschnitts erweitert.
Beim
Hochschieben wird am Ende der Auswahl eine leere Fußnote eingefügt.
In diese neue Fußnote wird der Text der ursprünglich letzten Fußnote verschoben.
Und so fort bis zur ersten Fußnote in der Textauswahl.
Beim
Herunterschieben wird zu Beginn der Skriptausführung der Text der zweiten Fußnote in der Auswahl ans Ende des Texts der ersten Fußnote verschoben; dann der Text der dritten in die leer gewordene zweite usw.
Die letzte Fußnote bleibt am Ende leer stehen, damit deren Position auch nach Ausführung des Skripts noch erkennbar bleibt.
// fnText_UpOrDown.jsx
//DESCRIPTION:Verschiebt den Text der Fußnoten innerhalb der Auswahl um eine Fußnote hoch oder herunter.
//AUTHOR: Martin Fischer
//DATE: 5.8.2011
main();
function main()
{
if (app.selection.length > 0 && app.selection[0].hasOwnProperty('parentStory'))
{
// Dialog zur Eingabe der Verschieberichtung
var _window = new Window ('dialog', 'Fußnotentexte verschieben');
_window.alignChildren = 'left';
var _r1 = _window.add ('radiobutton', undefined, 'jeweils eine Fußnote hoch');
var _r2 = _window.add ('radiobutton', undefined, 'jeweils eine Fußnote herunter');
var _buttongroup = _window.add ('group');
_buttongroup.alignment = 'right';
_buttongroup.add ('button', undefined, 'OK');
_buttongroup.add ('button', undefined, 'Cancel');
_r1.value = true;
// Skript abbrechen, wenn nicht OK geklickt wurde
if (_window.show () != 1)
exit ();
// Auswahl erweitern, wenn Auswahl = Einfügepunkt
var _sel = app.selection[0];
if (app.selection[0].constructor.name == 'InsertionPoint')
_sel.parentStory.characters.itemByRange(_sel.insertionPoints.firstItem().index, _sel.parentStory.characters.lastItem().index - 1).select();
if (_r1.value == true)
move_fn_up();
else
move_fn_down();
}
else
alert('Bitte Text auswählen.')
}
// Fußnotentexte je eine Fußnote hochschieben
function move_fn_up()
{
var _step = 1;
// am Ende der Auswahl eine leere Fußnote einfügen
var new_fn = app.selection[0].insertionPoints.lastItem().footnotes.add( {contents:''} );
var _fn = app.selection[0].footnotes;
for( var i = _fn.length - 2; i >= 0; i-- )
_fn[i].texts.firstItem().move(LocationOptions.after, _fn[i + _step].insertionPoints.lastItem() );
}
// Fußnotentexte je eine Fußnote hochschieben
function move_fn_down()
{
var _step = -1;
var _fn = app.selection[0].footnotes;
for( var k = 1; k < _fn.length; k++ )
_fn[k].texts.firstItem().move(LocationOptions.after, _fn[k + _step].insertionPoints.lastItem() );
}
Skript ist lauffähig ab Version CS2
Getrennte Worte in Übersichtsliste mit Verknüpfung darstellen
listHyphenedWords.jsx
Link zur Ursprungsdiskussion im Forum
Das Skript sucht getrennte Worte am Zeilenende und listet diese mit der Trennstelle '-' in einer Palette auf. Die aufgelisteten Worte sind mit ihrer Quelle im Text verknüpft.
Ist Text ausgewählt, wird nur der entsprechende Textabschnitt untersucht.
Ist kein Text ausgewählt, wird das gesamte Dokument durchforstet.
Per Klick auf einen Begriff in der Palette wird die Stelle herangezoomt, so dass dort bei Bedarf direkt eingegriffen werden kann. Alternativ kann die nächste/vorherige Stelle durch Pfeilnavigation in der aktiven Palette (hoch oder runter) angesprungen werden, so dass man sich etwa durch alle getrennten Worte navigieren kann.
Begriffe in Text und Fußnoten werden in getrennten Spalten dargestellt.
Text in Tabellen wird (noch) nicht berücksichtigt.
Trennungen im Übersatz werden ausdrücklich ignoriert.
Die Palette aktualisiert sich nicht bei Textänderungen. Das heißt:
- Ein im Text korrigierter Begriff wird in der Palette nicht in seiner geänderten Form gespiegelt.
- Neue Silbentrennungen infolge von Trennkorrekturen oder Textänderungen werden nicht automatisch aufgenommen.
- Bei Text(mengen)änderungen (Löschen oder Hinzufügen von Text) passen die Verknüpfungen zum nachfolgenden Text nicht mehr.
Bei Text(mengen)änderungen sollte das Skript also erneut ausgeführt werden.
Die Palette lässt sich auf dem Monitor verschieben und über den Schließen-Button links oben schließen.
// listHyphenedWords.jsx
//DESCRIPTION:Erstellt eine Liste mit getrennten Worten in einer Palette.
//Author: Martin Fischer
//September 2009
#targetengine "session"
// ----------------------------------------------------------------------------------------
// Voreinstellungen
// ----------------------------------------------------------------------------------------
var d = app.activeDocument;
// ausgewählter Textabschnitt oder alle Textabschnitte
var myStories = (app.selection.length == 0 || !(app.selection[0].hasOwnProperty('baseline') || app.selection[0] instanceof TextFrame))
? d.stories.everyItem().getElements()
: [app.selection[0].parentStory];
var myZoom = 200;
// Arrays für die Liste in der Palette (mit verknüpftem Objekt)
var myTextObjArray = new Array;
var myTextContentArray = new Array;
var myFnObjArray = new Array;
var myFnContentArray = new Array;
// Fortschrittsbalkeneinstellungen
var myMaximumValue = myProgressBarWidth = 400;
myCreateProgressPanel(myMaximumValue,myProgressBarWidth);
myProgressPanel.show();
var myMax = myStories.length ;
var myIncStories = myProgressBarWidth/myMax;
var myMax2 = 0;
// ----------------------------------------------------------------------------------------
// Marsch durch die Textabschnitte
// ----------------------------------------------------------------------------------------
for ( var s = 0; s < myStories.length; s++ )
{
// Vorbereitung für den Zeilenfortschrittsbalken
var sLines = (myStories[s].lines.count()- myStories[s].paragraphs.count() );
var fLines = (myStories[s].footnotes.count() > 0)
? summArray(myStories[s].footnotes.everyItem().lines.count() ) - summArray(myStories[s].footnotes.everyItem().paragraphs.count() )
: 0;
myMax2 = sLines + fLines;
var myIncLines = myProgressBarWidth/myMax2;
myProgressPanel.myProgBarStories.value += myIncStories;
myProgressPanel.myProgBarLines.value = myIncLines;
myProgressPanel.myStaticText.text= 'Textabschnitt ' + (s + 1) + '/' + myMax;
// Erfassen der getrennten Worte im Text
var myResult = checkText(myStories[s]);
for ( var i = 0; i < myResult.objects.length; i++ )
{
myTextObjArray.push(myResult.objects[i]);
myTextContentArray.push(myResult.contents[i]);
}
// Erfassen der getrennten Worte in den Fußnoten
if (myStories[s].footnotes.count() > 0)
{
for ( var f = 0; f < myStories[s].footnotes.count(); f++ )
{
var myResult = checkText(myStories[s].footnotes.item(f));
for ( var i = 0; i < myResult.objects.length; i++ )
{
myFnObjArray.push(myResult.objects[i]);
myFnContentArray.push(myResult.contents[i]);
}
}
}
}
// ----------------------------------------------------------------------------------------
// Ausgabe/Darstellung in der Palette
// ----------------------------------------------------------------------------------------
if (myTextObjArray.length > 0 || myFnObjArray.length > 0)
var myPalette = myResultPanel ( );
else
alert('Keine getrennten Wörter gefunden!');
myProgressPanel.close();
// ===============================================================
// Funktionen
// ===============================================================
// ----------------------------------------------------------------------------------------
// Summieren der Elemente eines Arrays
// ----------------------------------------------------------------------------------------
function summArray(anArray)
{
var temp = 0;
for ( var i = 0; i < anArray.length; i++ )
{
temp += anArray[i]
}
return temp;
}
// ----------------------------------------------------------------------------------------
// Fortschrittsbalken
// ----------------------------------------------------------------------------------------
function myCreateProgressPanel(myMaximumValue, myProgressBarWidth)
{
myProgressPanel = new Window('window', 'Fortschritt');
myProgressPanel.myProgBarLines = myProgressPanel.add('progressbar', [12, 0, myProgressBarWidth, 12], 0, myMaximumValue);
myProgressPanel.myProgBarStories = myProgressPanel.add('progressbar', [12, 0, myProgressBarWidth, 12], 0, myMaximumValue);
myProgressPanel.myStaticText = myProgressPanel.add('statictext', [12, 0, myProgressBarWidth, 20], '');
}
// ----------------------------------------------------------------------------------------
// Erforschung eines Bereichs nach getrennten Worten
// ----------------------------------------------------------------------------------------
function checkText(myRange)
{
var tempObjects = new Array;
var tempContents = new Array;
for ( var p = 0; p < myRange.paragraphs.count(); p++ )
{
for ( var l = 0; l < myRange.paragraphs.item(p).lines.count()-1; l++ )
{
myProgressPanel.myProgBarLines.value += myIncLines;
if (myRange.paragraphs.item(p).lines[l].insertionPoints.lastItem().parentTextFrames.length != 0 && myRange.paragraphs.item(p).lines[l].insertionPoints.lastItem().words.length == 1)
{
var wordStart = myRange.paragraphs.item(p).lines[l].insertionPoints.lastItem().words.firstItem().characters.firstItem().index;
var wordEnd = myRange.paragraphs.item(p).lines[l].insertionPoints.lastItem().words.firstItem().characters.lastItem().index;
var hyphenPos = myRange.paragraphs.item(p).lines[l].insertionPoints.lastItem().index;
var myHWord = myRange.characters.itemByRange(wordStart, hyphenPos-1).contents + '-' + myRange.characters.itemByRange(hyphenPos, wordEnd).contents
tempObjects.push(myRange.paragraphs.item(p).lines[l].insertionPoints.lastItem().words.firstItem()); //, contents:myHWord})
tempContents.push(myHWord);
}
}
}
return ({objects:tempObjects, contents:tempContents})
}
// ----------------------------------------------------------------------------------------
// Objekt auswählen und heranzoomen
// ----------------------------------------------------------------------------------------
function selectIt ( theObj )
{
// Selects object, turns to page and zooms in on it
if (theObj != null)
{
app.select ( theObj,SelectionOptions.replaceWith ) ;
app.activeWindow.zoomPercentage = myZoom;
//app.activeWindow.zoom ( ZoomOptions.fitPage ) ;
}
else // Verabschiedung
{
alert('Wort mehr greifbar!');
myPalette.close();
}
}
// ----------------------------------------------------------------------------------------
// Ergebnispalette
// ----------------------------------------------------------------------------------------
function myResultPanel ( )
{
// Maße für die Listenboxen
var myHeight = app.activeDocument.layoutWindows.firstItem().bounds[2] - 250; //500;
var myWidth = 200;
// erzeuge Palette mit Titel
var myPalette = new Window ( 'palette {properties:{ closeOnKey:?OSCmnd+W?, resizeable:false, maximizeButton:false, minimizeButton:false , closeButton:true}}', 'Silbentrennungen' ) ;
with ( myPalette )
{
window.orientation = 'row';
window.alignment = 'top';
location = [app.activeDocument.layoutWindows.firstItem().bounds[3]-2*myWidth-50, app.activeDocument.layoutWindows.firstItem().bounds[0] +17];
// Gruppe 1 ? Text
gr1 = add ( 'group' ) ;
gr1.orientation = 'column';
gr1.myStaticText1 = gr1.add ( 'statictext', undefined, 'Text' ) ;
gr1.myListBoxText = gr1.add ( 'listbox', [0, 0, myWidth, myHeight], '', {items : myTextContentArray } ) ;
// Reaktion auf Wechsel der Auswahl in der Liste
gr1.myListBoxText.onChange = function ()
{
if ( this.selection != null )
selectIt ( myTextObjArray [ this.selection.index] ) ;
}
if (myFnContentArray.length > 0)
{
// Gruppe 2 ? Fussnoten
gr2= add ( 'group' ) ;
gr2.orientation = 'column';
gr2.myStaticText2 = gr2.add ( 'statictext', undefined, 'Fußnoten' ) ;
gr2.myListBoxFussnoten = gr2.add ( 'listbox', [0, 0, myWidth, myHeight], '', {items : myFnContentArray } ) ;
gr2.myListBoxFussnoten.onChange = function ()
{
if ( this.selection != null )
{
selectIt ( myFnObjArray [ this.selection.index] ) ;
}
}
}
// zeige die Palette an
show () ;
}
return myPalette;
}
Skript ist lauffähig ab Version CS4
Gleiche Silbentrennung für alle Absatzformate
setHyphenpropertiesOfParagraphstyles.jsx
Link zur Ursprungsdiskussion im Forum
Folgendes Skript hilft, bei allen Absatzformaten eines Dokuments dieselben Silbentrennungsoptionen zu setzen.
Als Referenz gilt das Absatzformat '[Einfacher Absatz]'.
Die dort eingestellten Werte der Silbentrennung werden an alle übrigen Absatzformate verteilt.
// setHyphenpropertiesOfParagraphstyles.jsx
//DESCRIPTION:Weist allen Absatzformaten die Silbentrennungsattribute des Referenzformats '[Einfacher Absatz]' zu.
var d = app.activeDocument;
if (d.paragraphStyles.length < 2) exit();
var myRef = d.paragraphStyles.item(1);
for (i = 2; i < d.paragraphStyles.count(); i++)
with (d.paragraphStyles.item(i)) {
hyphenWeight = myRef.hyphenWeight;
hyphenateAcrossColumns = myRef.hyphenateAcrossColumns;
hyphenateAfterFirst = myRef.hyphenateAfterFirst;
hyphenateBeforeLast = myRef.hyphenateBeforeLast;
hyphenateCapitalizedWords = myRef.hyphenateCapitalizedWords;
hyphenateLadderLimit = myRef.hyphenateLadderLimit;
hyphenateLastWord = myRef.hyphenateLastWord;
hyphenateWordsLongerThan = myRef.hyphenateWordsLongerThan;
hyphenation = myRef.hyphenation;
hyphenationZone= myRef.hyphenationZone;
}
Skript ist lauffähig ab Version CS2
GREP-Fundstellen auflisten
listGrepFounds.jsx
Link zur Ursprungsdiskussion im Forum
In
[CS4 Javascript] Silbentrennungen kontrollieren wurden Skriptstudien zum Auflisten von Trennstellen in einer Palette vorgestellt und diskutiert.
Gerd fragte in
seinem Beitrag nach der Einlösung des Versprechens, etwas Ähnliches für die Treffer von GREP-Suchvorgängen zu entwickeln.
Auf der Basis von
listHyphenedWords.jsx hier nun eine Studie zum Auflisten von GREP-Fundstellen.
Vorbereitung
Das Skript greift auf die Suchkriterien in der
GREP-Suchen Palette zurück (ich wollte das Rad mit all seinen Einstellungsmöglichkeiten nicht für einen komplexen Dialog neu erfinden).
Dort sind die zu suchenden Eigenschaften (z.B.
\<\w*f[li]\w*\> (Format suchen: + Ligatur) für die Suche nach Wörtern mit fl- und fi-Ligaturen)
vor dem Start des Skripts einzutragen.
Der für die Suche angegebene GREP-Ausdruck wird in der Palette in einem editierbaren Textfeld angezeigt.
Dort kann der GREP-Ausdruck geändert werden.
Nach Bestätigung der Änderung mit Return wird die Suche mit diesem (veränderten) GREP ausgeführt.
Beim Start des Skripts wird ein Suchbereich ermittelt.
? Nichts ausgewählt: durchsuche das gesamte Dokument
? Text oder Textrahmen ausgewählt: nach Betätigung Suche beschränken auf ausgewählten Text bzw. Textrahmen
? Einfügemarke platziert: nach Bestätigung Suche beschränken auf ausgewählten Textabschnitt.
Dieser Suchbereich wird in der Palette oben eingeblendet.
Solange die Palette geöffnet ist und das Skript nicht neu gestartet wurde, bleibt dieser Suchbereich gültig, auch wenn sich inzwischen ? etwa durch Sprung zu einem Treffer ? die Auswahl verändert hat!
Das Skript listet die Treffer (mit vorangestellter Angabe der Seite) auf.
Ein Mausklick auf einen Treffer in der Palette zoomt die Fundstelle heran.
Es ist möglich, dass sich Änderungen im Text (z.B. an der Fundstelle) störend auf die Adressierung der Fundstelle aus der Palette heraus auswirken können. Das wird sich in der Praxis zeigen. ;-)
// listGrepFounds.jsx
//DESCRIPTION:Listet die Ergebnisse einer GREP-Suche mit den Einstellungen in der GREP-Palette in einer Palette auf
//Author: Martin Fischer
//Mai 2010
//März 2011 geringfügige Änderung bzgl. des Verhaltens auf eine Auswahl (Bestätigung eingebunden)
#targetengine "session"
// ----------------------------------------------------------------------------------------
// Voreinstellungen
// ----------------------------------------------------------------------------------------
try
{
a_palette.close();
} catch(e) {}
var a_palette = main();
function main()
{
var doc = app.activeDocument;
// ausgewählter Textabschnitt oder alle Textabschnitte
var the_stories = (app.selection.length == 0 || !(app.selection[0].hasOwnProperty('baseline') || app.selection[0] instanceof TextFrame) )
? doc.stories.everyItem().getElements()
: confirm_sel(doc);
var the_zoom = 200;
// Arrays für die Liste in der Palette (mit verknüpftem Objekt)
var obj_array = new Array;
var content_array = new Array;
var data = walk_trough(the_stories, obj_array, content_array);
// ----------------------------------------------------------------------------------------
// Ausgabe/Darstellung in der Palette
// ----------------------------------------------------------------------------------------
if (obj_array.length > 0)
{
var a_palette = the_result_panel ( data.obj, data.content );
writeTXT(data.content.join('\r'));
}
else
alert('Nix gefunden!');
return a_palette;
}
// ===============================================================
// Funktionen
// ===============================================================
function confirm_sel(doc)
{
var the_stories = (confirm('Nur ausgewählter Textabschnitt?') == true)
? [app.selection[0].parentStory]
: doc.stories.everyItem().getElements();
return the_stories;
}
// ----------------------------------------------------------------------------------------
// Marsch durch die Textabschnitte
// ----------------------------------------------------------------------------------------
function walk_trough(the_stories, obj_array, content_array)
{
for ( var s = 0; s < the_stories.length; s++ )
{
var the_result = checkText(the_stories[s]);
for ( var i = 0; i < the_result.objects.length; i++ )
{
obj_array.push(the_result.objects[i]);
content_array.push(the_result.contents[i]);
}
}
return {obj:obj_array, content: content_array};
}
// ----------------------------------------------------------------------------------------
// Erforschung eines Bereichs nach Treffern
// ----------------------------------------------------------------------------------------
function checkText(the_range)
{
var temp_contents = new Array;
var temp_tobj = new Array;
// Prüfen, ob Suchkriterien gegeben sind
try
{
var result = the_range.findGrep();
}
catch (e)
{
alert('Bitte Suchkriterien in der GREP-Suchpalette eintragen!');
exit();
}
for ( var p = 0; p < result.length; p++ )
{
var my_page = find_page(result[p]);
// Fundstellen in Überlauf rausfiltern
if (my_page != null)
{
temp_tobj.push(result[p]);
temp_contents.push('S. ' + my_page.name + ': ' + result[p].contents);
}
}
return ({objects:temp_tobj, contents:temp_contents})
}
// ----------------------------------------------------------------------------------------
// Objekt auswählen und heranzoomen
// ----------------------------------------------------------------------------------------
function selectIt ( the_obj )
{
// Selects object, turns to page and zooms in on it
var the_zoom = app.activeWindow.zoomPercentage;
if (the_obj != null)
{
app.select ( the_obj,SelectionOptions.replaceWith ) ;
app.activeWindow.zoomPercentage = the_zoom;
}
else // Verabschiedung
{
alert('Wort mehr greifbar!');
a_palette.close();
}
}
// ----------------------------------------------------------------------------------------
// Ergebnispalette
// ----------------------------------------------------------------------------------------
function the_result_panel ( obj_array, content_array)
{
// Maße für die Listenboxen
var p_height = 900;
var p_width = 350;
// erzeuge Palette mit Titel
if (a_palette == undefined)
var a_palette = new Window ( 'palette {properties:{ closeOnKey:?OSCmnd+W?, resizeable:false, maximizeButton:false, minimizeButton:false , closeButton:true}}', 'Fundstellen' ) ;
with ( a_palette )
{
window.orientation = 'row';
window.alignment = 'top';
location = [app.activeDocument.layoutWindows.firstItem().bounds[3]-p_width-50, app.activeDocument.layoutWindows.firstItem().bounds[0] +17];
gr = add ( 'group' ) ;
gr.orientation = 'column';
gr.edit_text = gr.add ( 'editText', [0,0,p_width,25], app.findGrepPreferences.findWhat , {enterKeySignalsOnChange:true}) ;
gr.lb_text = gr.add ( 'listbox', [0, 0, p_width, p_height], '', {items : content_array } ) ;
// Reaktion auf Änderung im editText-Feld
gr.edit_text.onChange = function ()
{
app.findGrepPreferences.findWhat = gr.edit_text.text;
close();
main();
}
// Reaktion auf Wechsel der Auswahl in der Liste
gr.lb_text.onChange = function ()
{
if ( this.selection != null )
selectIt ( obj_array [ this.selection.index] ) ;
}
// zeige die Palette an
show () ;
}
return a_palette;
}
function find_page(theObj)
{
var thePage = theObj;
if (thePage.hasOwnProperty("baseline"))
{
thePage = thePage.parentTextFrames[0];
if (thePage == null) {return null }
}
while (thePage.constructor.name != "Page")
{
var whatIsIt = thePage.constructor.name;
switch (whatIsIt)
{
case "Character" :
thePage = thePage.parentTextFrames[0];
break;
case "Spread" :
thePage = thePage.pages[0];
return thePage;
case "Application" :
// must be off page, so ignore
return null;
}
thePage = thePage.parent;
}
return thePage
}
// -----------------------------------------------------------------------------------------------------------------
// config.txt schreiben
// -----------------------------------------------------------------------------------------------------------------
function writeTXT ( myData )
{
var theDir = '~/Desktop';
var f = new File( theDir + '/GREP.txt' );
f.open( 'w' );
f.encoding = 'UTF-8';
f.writeln ( myData );
f.close();
f.execute();
}
Skript ist lauffähig ab Version CS4
Griechischen Unicode-Zeichen ein schriftschnittspezifisches Zeichenformat zuweisen
Greek_unicode2style.jsx
Link zur Ursprungsdiskussion im Forum
In
unicode2characterstyle (CS6, WIN 7) fragt Christoph nach einer Möglichkeit, allen griechischen Unicode-Zeichen ein Zeichenformat abhängig vom Schriftschnitt zuzuweisen.
In der Diskussion entwickelt er eine eigene Lösung.
Hier eine komprimierte Lösung.
// Greek_unicode2style.jsx
//DESCRIPTION:Weist griechischen Zeichen (Unicode) Zeichenformate mit den Schriftschnitten 'Bold', 'Bold Italic', 'Italic', 'Regular' zu.
main()
function main()
{
//var _pattern = '[\x{0374}-\x{1FFE}]+[[:punct:]]*\s*';
var _pattern = '[\x{0374}-\x{1FFE}]+\s*';
var _styles = ['Bold', 'Bold Italic', 'Italic', 'Regular'];
app.findGrepPreferences = app.changeGrepPreferences = NothingEnum.nothing;
for (var i = 0; i < _styles.length; i++)
{
var cs_name = 'Greek_' + _styles[i].replace(/ /gi, '_');
var cs = (app.activeDocument.characterStyles.itemByName(cs_name).isValid)
? app.activeDocument.characterStyles.itemByName(cs_name)
: app.activeDocument.characterStyles.add({name: cs_name, fontStyle:_styles[i], appliedFont: 'Minion Pro'});
app.findGrepPreferences.findWhat = _pattern;
app.findGrepPreferences.fontStyle = _styles[i];
app.changeGrepPreferences.appliedCharacterStyle = cs;
app.activeDocument.changeGrep();
}
app.findGrepPreferences = app.changeGrepPreferences = NothingEnum.nothing;
}
Skript ist lauffähig ab Version CS3
Gruppierung von aufeinanderfolgenden Zahlen durch f. und ff.
groupSequentiellNumFF.jsx
Link zur Ursprungsdiskussion im Forum
Gruppiert in einem ausgewählten Textabschnitt (z.B. in einem Register) aufeinanderfolgende, durch Komma (und Leerzeichen) getrennte Zahlen durch Erweiterung der ersten Zahl mit f. (bei genau zwei aufeinanderfolgenden Zahlen) oder ff. (bei drei und mehr aufeinanderfolgenden Zahlen).
aus 1, 2, 4, 5, 6
wird 1f., 4ff.
Siehe auch
Verbindung von aufeinanderfolgenden Zahlen durch Bis-Strich
// groupSequentiellNumFF.jsx
//DESCRIPTION: 1, 2, 4, 5, 6 -> 1f., 4ff.
if (app.selection.length > 0 && app.selection[0].hasOwnProperty ('baseline'))
{
var s = app.selection[0].parentStory;
app.findGrepPreferences = app.changeGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences.findWhat = '\d+, ([\d+, ])+';
var r = s.findGrep();
var myMax = r.length;
for ( aLine = r.length-1; aLine >= 0; aLine-- )
r[aLine].contents= checkOneLine ( r[aLine].contents );
}
else
alert('Achtung!\nBitte einen Textabschnitt auswählen.');
function checkOneLine ( aString )
{
var a = aString.split( ', ');
for ( var i = 0; i < aString.length-1; i++ )
{
var k = i;
var k = i +1;
while ( k < aString.length && a[k] == Number( a[k-1] ) + 1)
{
k++;
}
if ( Number(a[k-1]) >= Number( a[i] )+2 )
{
a[i] = a[i] + '\u2009ff.';
a.splice( i+1, k-1-i );
}
else if ( Number(a[k-1]) == Number( a[i] )+1 )
{
a[i] = a[i] + '\u2009f.';
a.splice( i+1, 1 );
}
}
return a.join( ', ');
}
Skript ist lauffähig ab Version CS3
Hängender Einzug
haengenderEinzug.jsx
Um für ausgewählten Text einen hängenden Einzug einzurichten, muss man zwei Werte aufeinander abstimmen:
1. den Absatzeinzug und
2. den Einzug der ersten Zeile.
In der Regel entspricht dabei der Einzug der ersten Zeile dem negativen Wert des Absatzeinzugs. Will man den hängenden Einzug nach oben oder unten korrigieren, muss man wieder zwei Werte ändern.
Mit dem folgenden Skript kann man sich die doppelte Eingabe sparen.
Darüberhinaus schlägt es von sich aus einen Wert vor, der dem linken Absatzeinzug des ersten ausgewählten Absatzes zuzüglich einem definierten (und im Skript änderbaren) Schritt entspricht.
Auf eine Taste gelegt, kann man sich damit manchen notwendigen Tastenanschlag zur Definition eines hängenden Einzugs sparen.
// haengenderEinzug.jsx
//DESCRIPTION: Weist ausgewähltem Text einen hängenden Einzug zu.
// standardmäßige Erhöhung des Vorschlags für den hängenden Einzug gegenüber dem aktuellen linken Absatzeinzug des ersten ausgewählten Absatzes
var myStep = 1;
if (app.documents.length > 0 &&
app.selection.length == 1 &&
app.selection[0].hasOwnProperty("baseline"))
makeIndent(app.selection[0]);
function makeIndent ( s )
{
var oldIndent = s.paragraphs[0].leftIndent;
var newIndent = prompt ('hängender Einzug: ', oldIndent + myStep);
newIndent = newIndent.replace( /,/g, '.' );
s.properties = { leftIndent:newIndent, firstLineIndent:-newIndent };
}
Skript ist lauffähig ab Version CS2
Hebräischen Unicode-Zeichen ein schriftschnittspezifisches Zeichenformat zuweisen
Hebrew_unicode2style.jsx
Link zur Ursprungsdiskussion im Forum
In
unicode2characterstyle (CS6, WIN 7) fragt Christoph nach einer Möglichkeit, allen griechischen Unicode-Zeichen ein Zeichenformat abhängig vom Schriftschnitt zuzuweisen.
In der Diskussion entwickelt er eine eigene Lösung.
Hier eine komprimierte Lösung für den hebräischen Zeichenbereich.
// Hebrew_unicode2style.jsx
//DESCRIPTION:Weist hebräischen Zeichen (Unicode) Zeichenformate mit den Schriftschnitten 'Bold', 'Bold Italic', 'Italic', 'Regular' zu.
main()
function main()
{
// var _pattern = '[\x{0590}-\x{05FF}\x{FB00}-\x{FB4F}]+[[:punct:]]*\s*';
var _pattern = '[\x{0590}-\x{05FF}\x{FB00}-\x{FB4F}]+\s*';
var _styles = ['Bold', 'Bold Italic', 'Italic', 'Regular'];
app.findGrepPreferences = app.changeGrepPreferences = NothingEnum.nothing;
for (var i = 0; i < _styles.length; i++)
{
var cs_name = 'Hebrew_' + _styles[i].replace(/ /gi, '_');
var cs = (app.activeDocument.characterStyles.itemByName(cs_name).isValid)
? app.activeDocument.characterStyles.itemByName(cs_name)
: app.activeDocument.characterStyles.add({name: cs_name, fontStyle:_styles[i], appliedFont: 'FrankRuhlMFO'});
app.findGrepPreferences.findWhat = _pattern;
app.findGrepPreferences.fontStyle = _styles[i];
app.changeGrepPreferences.appliedCharacterStyle = cs;
app.activeDocument.changeGrep();
}
app.findGrepPreferences = app.changeGrepPreferences = NothingEnum.nothing;
}
Skript ist lauffähig ab Version CS3
Hyperlinks bei Text mit Zeichenformat
charStyle2Hyperlink.jsx
Link zur Ursprungsdiskussion im Forum
Fügt im aktiven InDesign-Dokument Text, der mit einem ausgewählten Zeichenformat ausgezeichnet ist, Hyperlinks hinzu.
In einem Dialog werden zunächst ein Präfix und ein Postfix für den Hyperlink nebst einem Zeichenformat für den zu verlinkenden Text ermittelt. Danach ermittelt das Skript den Text mit dem ausgewählten Zeichenformat und fügt diesem Hyperlinks nach folgendem Schema zu:
Präfix +
[Text der Fundstelle] +
Postfix
Beispiel:
1. Präfix = 'http://www.nummer.de/'
2. Postfix = '/mt.cgi?_mode=view'
3. Textquelle mit Zeichenformat: 'blablabla'
Hier wird dem Text 'blablabla' (mit dem gewählten Zeichenformat) ein Hyperlink mit dem Ziel
http://www.nummer.de/blablabla/mt.cgi?_mode=view hinzugefügt.
Im Dialog kann zudem ausgewählt werden, ob der Hyperlink mit einem sichtbaren Rahmen versehen werden soll oder nicht.
// charStyle2Hyperlink.jsx
//DESCRIPTION:Ermittelt Text mit ausgewähltem Zeichenformat und fügt Hyperlink mit optionalem Präfix und Postfix hinzu.
//AUTHOR:Martin Fischer
//DATE:2010-01-15
var pre_prefix = 'http://www.nummer.de/';
var pre_postfix = '/mt.cgi?_mode=view';
var doc = app.activeDocument;
var got_data = myDisplayDialog ( doc );
var got_sources = get_sources ( got_data.cs, doc );
make_hyperlinks ( got_data.pre, got_data.post, got_data.vis, got_sources, doc );
alert ( 'Fertig' );
function get_sources ( my_cs, doc )
{
with ( app.findChangeTextOptions )
{
includeFootnotes = true;
includeHiddenLayers = false;
includeLockedLayersForFind = false;
includeLockedStoriesForFind = false;
includeMasterPages = true;
}
app.findTextPreferences = app.changeTextPreferences = null;
app.findTextPreferences.appliedCharacterStyle = my_cs;
var my_result = doc.findText ();
app.findTextPreferences = app.changeTextPreferences = null;
return my_result;
}
function make_hyperlinks ( the_pref, the_post, the_vis, the_sources, doc )
{
for ( var i = the_sources.length-1; i >= 0; i-- )
{
try
{
var the_string = the_pref + the_sources[i].contents.replace('%20', ' ' ) + the_post;
var hl_textSource = doc.hyperlinkTextSources.add ( the_sources[i] );
var hl_destination = doc.hyperlinkURLDestinations.add ( {destinationURL:the_string} );
var hl_hyperlink = doc.hyperlinks.add ( {source:hl_textSource, destination:hl_destination} );
hl_hyperlink.visible = the_vis;
}
catch ( e ){}
}
}
function myDisplayDialog ( doc )
{
var myFieldWidth = 130;
var my_visible = ['nein', 'ja'];
var my_charStyles = doc.characterStyles.everyItem ().name;
my_charStyles.shift ();
if ( my_charStyles.length == 0 )
{
alert ( 'Kein Zeichenformat zur Auswahl vorhanden.' );
exit ();
}
var myDialog = app.dialogs.add ( {name:"Hyperlinks bei Text mit Zeichenformat"} );
with ( myDialog.dialogColumns.add () )
{
with ( dialogRows.add () )
{
with ( dialogColumns.add () )
{
staticTexts.add ( {staticLabel:"Präfix:", minWidth:myFieldWidth} );
}
with ( dialogColumns.add () )
{
var pre_value = textEditboxes.add ( {editContents: pre_prefix, minWidth:250} );
}
}
with ( dialogRows.add () )
{
with ( dialogColumns.add () )
{
staticTexts.add ( {staticLabel:"Postfix", minWidth:myFieldWidth} );
}
with ( dialogColumns.add () )
{
var post_value = textEditboxes.add ( {editContents: pre_postfix, minWidth:250} );
}
}
with ( dialogRows.add () )
{
with ( dialogColumns.add () )
{
staticTexts.add ( {staticLabel:"Zeichenformat:", minWidth:myFieldWidth} );
}
with ( dialogColumns.add () )
{
var mySourceDropdown = dropdowns.add ( {stringList:my_charStyles, selectedIndex:my_charStyles.length-1} );
}
}
with ( dialogRows.add () )
{
with ( dialogColumns.add () )
{
staticTexts.add ( {staticLabel:"Hyperlinks sichtbar:", minWidth:myFieldWidth} );
}
with ( dialogColumns.add () )
{
var myVisibleDropdown = dropdowns.add ( {stringList:my_visible, selectedIndex:0} );
}
}
}
var myResult = myDialog.show ();
if ( myResult == true )
{
var the_charStyle =my_charStyles[mySourceDropdown.selectedIndex];
var the_pre = pre_value.editContents;
var the_post = post_value.editContents;
var the_vis = (my_visible[myVisibleDropdown.selectedIndex] == 'ja')
? true
: false;
myDialog.destroy ();
}
else
{
myDialog.destroy ()
exit ();
}
return {cs:the_charStyle, pre:the_pre, post:the_post, vis:the_vis};
}
Skript ist lauffähig ab Version CS3
InDesign C3 5.0.2 Mac Absatzformate komplett umbenennen
addDocname2Styles.jsx
Link zur Ursprungsdiskussion im Forum
Quick & dirty vielleicht mit folgendem Skript:
// addDocname2Styles.jsx
var d = app.activeDocument;
renamePS(d.name + '_');
renameCS(d.name + '_');
function renamePS(s) {
for (var i = 2; i < d.paragraphStyles.length; i++ ) {
if (d.paragraphStyles[i].name.match(s) == null)
try {
d.paragraphStyles[i].name = s + d.paragraphStyles[i].name;
} catch(e){}
}
}
function renameCS(s) {
for (var i = 1; i < d.characterStyles.length; i++ ) {
if (d.characterStyles[i].name.match(s) == null)
d.characterStyles[i].name = s + d.characterStyles[i].name;
}
}
xx
Skript ist lauffähig ab Version CS3
InDesign C3 5.0.2 Mac Absatzformate komplett umbenennen
moveStyles2Group.jsx
Link zur Ursprungsdiskussion im Forum
Stefan,
es gibt in CS3 einen Bug, der dazu führt, dass bei einer bestimmten Operation das AF '[Einfacher Absatz]' unter der Hand in '
NormalParagraphStyle' umbenannt und danach wie die anderen AF beliebig bearbeitbar wird. Diesen Bug und den Weg dorthin habe ich irgendwo im Forum dokumentiert. Aber mein Gedächtnis lässt mich gerade im Stich.
Martin
// moveStyles2Group.jsx
Object.prototype.get = function( )
{
try {
var myObject = this.item( arguments[0].name );
myObject.name;
}
catch (e) {
var myObject = this.add( arguments[0] );
}
return myObject;
}
var d = app.activeDocument;
groupPS(d.name);
groupCS(d.name);
function groupPS(s) {
var myGroup = d.paragraphStyleGroups.get( { name:s } );
for (var i = d.paragraphStyles.length-1; i > 1 ; i-- ) {
try {
d.paragraphStyles[i].move( LocationOptions.AT_BEGINNING, myGroup );
} catch(e){}
}
}
function groupCS(s) {
var myGroup = d.characterStyleGroups.get( { name:s } );
for (var i = d.characterStyles.length-1; i > 0 ; i-- ) {
try {
d.characterStyles[i].move( LocationOptions.AT_BEGINNING, myGroup );
} catch(e){}
}
}
Hier noch ein Skript, das ggf. je eine AF-Formatgruppe und eine ZF-Formatgruppe mit dem Namen des Dokuments anlegt und alle AF und ZF der obersten Ebene (also die, die in keiner Gruppe liegen) da hinein verschiebt (siehe erweiterter Text).
Skript ist lauffähig ab Version CS3
Reihenfolge der ausgewählten Zeichen umkehren
ReverseCharacters.as
Link zur Ursprungsdiskussion im Forum
zenocosini fragt in
Laufrichtung von Text nach einem Skript zur Umkehrung der Laufrichtung von Text. Das angegebene JS läuft vermutlich deswegen nicht, weil sich die Auswahl in einer Fußnote befindet. Hier ein AppleScript, das nicht vom JS-Bug in Fußnoten betroffen ist:
--ReverseCharacters.as
--by move
tell application "Adobe InDesign CS2"
set myLength to count of characters of selection
repeat with myCounter from 1 to myLength - 1
move character 1 of selection to after character -(myCounter) of selection
end repeat
end tell
Martin Fischer
Skript ist lauffähig ab Version CS2
Namen von Absatz- und Zeichenformaten säubern
cleanUpStyleNames.jsx
Hier ein Skript zur Bereinigung der Namen von Absatz- und Zeichenformate:
//cleanUpStyleNames.jsx
var myPStyles = app.activeDocument.paragraphStyles;
var myCStyles = app.activeDocument.characterStyles;
// ================================================
// Reinigungsaufrufe
// ================================================
cleanUpName(".", "_");
cleanUpName("ä", "ae");
cleanUpName("ö", "oe");
cleanUpName("ü", "ue");
// ================================================
function cleanUpName(oldChar, newChar)
{
// Absatzformate
if (myPStyles.length > 2)
for (i = 2; i < myPStyles.length; i++)
myPStyles[i].name = myPStyles[i].name.split(oldChar).join(newChar);
// Zeichenformate
if (myCStyles.length > 2)
for (k = 2; k < myCStyles.length; k++)
myCStyles[k].name = myCStyles[k].name.split(oldChar).join(newChar);
}
Die auszutauschenden Zeichen werden im Funktionsaufruf angegeben:
cleanUpName(alt, neu);
Diese Funktionsaufrufe können beliebig erweitert werden.
Martin Fischer
Skript ist lauffähig ab Version CS2
URLs mit einem Zeichenformat auszeichnen
URL_withCharStyle.jsx
Link zur Ursprungsdiskussion im Forum
In
Suchen und Ersetzen mit Platzhalter möglich kam die Frage auf, ob GREP auch mit CS2 möglich sei.
Die Antwort: Ja, mit Unterstützung von JavaScript.
Hier ein Beispiel, in dem URLs nach dem Schema "
" im Text mit dem Zeichenformat "URL" ausgezeichnet werden. Das Zeichenformat "URL" wird bei Bedarf neu angelegt mit dem Attribut Sprache: [Keine]. Damit soll die Trennung von URLs unterdrückt werden.
// URL_withCharStyle.jsx
var myDoc = app.activeDocument;
var myCharStyle = getCharStyle("URL");
var myContent = documentContents( myDoc )
app.findPreferences = app.changePreferences = null;
// Suche nach URLs per RegExp
if (myArray = myContent.match(/\< http:\/\/\S+\>/g))
stylizeUrl(myArray);
// ---------------------------------------------------------------------------
// Beginn Funktionenbereich
// ---------------------------------------------------------------------------
// Formatierung
function stylizeUrl(theArray) {
if (theArray != null) {
var theArray = arrayCompress(theArray);
for (i = theArray.length -1; i >= 0; i--)
var myResult = myDoc.search(theArray[i], false, true, undefined, {}, {appliedCharacterStyle:myCharStyle});
}
}
// Komprimierung des Arrays
function arrayCompress(array) {
var str = array.sort().join('\r')+'\r'
str = str.replace(/([^\r]+\r)()+/g,'')
str = str.replace(/\r$/,'')
return str.split('\r')
}
// Definition des Inhalts des Dokuments
function documentContents(doc) {
// Inhalt der Textabschnitte
var temp = doc.stories.everyItem().contents.join(' ');
// Inhalt der Tabellen
temp += doc.stories.everyItem().tables.everyItem().contents.join(' ');
// Inhalt der Fußnoten
temp += doc.stories.everyItem().footnotes.everyItem().contents;
return temp;
}
// Ermittlung des Zeichenformats
function getCharStyle(aName){
try {
var aCharStyle = app.documents[0].characterStyles.item(aName);
aCharStyle.name;
}
catch (e) {
var aCharStyle = app.documents[0].characterStyles.add({name:aName, appliedLanguage:"[No Language]"});
}
return aCharStyle;
}
In diesem Skript habe ich nützliche Funktionen von Peter Kahrel verwendet: arrayCompress(), documentContents(). Sie sind in seinem ShortCut Automating InDesign with Regular Expressions dokumentiert.
Martin Fischer
Skript ist lauffähig ab Version CS2
aus Text in Klammern [] Fußnoten erzeugen
textEnclosedInBrackets2Footnotes.jsx
Link zur Ursprungsdiskussion im Forum
Das folgende JavaScript für InDesign CS3 (funktioniert wegen GREP nicht in niedrigeren Versionen) erzeugt aus Text in Klammern [] Fußnoten. Es berücksichtigt alle Vorkommen von [] im Dokument.
// textEnclosedInBrackets2Footnotes.jsx
//DESCRIPTION: aus Text, der in Klammern [] steht, werden Fußnoten erzeugt
//JavaScript für InDesing CS3
app.changeGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences.findWhat = '(?x) \[ [^\]]+ \]';
var myResult = app.documents[0].findGrep();
for (i = myResult.length -1; i >= 0; i--)
makeNote(myResult[i]);
function makeNote(theText)
{
var theStory = theText.parentStory;
var theIndex = theText.insertionPoints[-1].index;
// Hinzufügen einer Fußnote vor der öffnenden eckigen Klammer
var theNote = theStory.insertionPoints[theIndex].footnotes.add();
// Verschieben des Textes innerhalb der eckigen Klammern
theText.characters.itemByRange(1, -2).move( LocationOptions.after, theNote.insertionPoints[-1] )
// Löschen der überflüssig gewordenen eckigen Klammern
theText.characters.itemByRange(0,1).remove();
}
Das Skript ist in Automatisch eingeklammerte Sätze in Fußnoten verwandeln lassen? angefragt worden.
Ihm und einem Hinweis von Olav Kvern verdanke ich die Erkenntnis, besser die Finger von der Rückstellung der Grep-Suchoptionen zu lassen:
// app.findChangeGrepOptions = NothingEnum.nothing;
Siehe auch CS3 Find/Change Correction.
Skript ist lauffähig ab Version CS3
Indexeinträge auf der Basis von Zeichenformaten
IndexFromCharacterStyle.jsx
Link zur Ursprungsdiskussion im Forum
Das Skript sucht nach Text, der mit einem bestimmten Zeichenformat ausgezeichnet ist, und erstellt daraus Indexeinträge.
Von diesem Skript kursieren im InDesign-Forum von HilfDirSelbst verschiedene Versionen.
Es hat verschiedene Eltern, aber ich vermute, der Stammvater ist Peter Kahrel.
// IndexFromCharacterStyle_z_CS4.jsx
//
// ggf. mit Zoom auf fehlerhafte Fundstelle
//
var myErr = mySucc = 0;
var myList = "";
var doc = app.activeDocument
var myCharacterStyle = myDisplayDialog(doc);
app.changeTextPreferences = NothingEnum.nothing;
app.findTextPreferences = NothingEnum.nothing;
app.findTextPreferences.appliedCharacterStyle = myCharacterStyle;
var _index = ( doc.indexes.length == 0 )
? doc.indexes.add()
: doc.indexes.firstItem();
f = doc.findText()
for( oneEntry = f.length-1; oneEntry > -1; oneEntry-- ) {
var _topic = null;
_topic = _index.topics.itemByName( f[oneEntry].contents );
if (_topic == null) {
try {
_topic = _index.topics.add( f[oneEntry].contents );
}
catch(e) {
selectIt(f[oneEntry]);
}
}
try {
_topic.pageReferences.add( f[oneEntry], PageReferenceType.currentPage ) ;
mySucc++;
}
catch(e) {
myList += f[oneEntry].contents + "\r" ;
myErr++;
}
}
alert( "Das Ergebnis:\r" + mySucc + " x erfolgreich\r" + myErr + " x versagt:\r-----------\r" + myList );
function myDisplayDialog(doc){
var myFieldWidth = 120;
var myCharStyles = doc.characterStyles.everyItem().name;
var myDialog = app.dialogs.add({name:"Index-Begriffe"});
with(myDialog.dialogColumns.add()){
with(dialogRows.add()){
with(dialogColumns.add()){
staticTexts.add({staticLabel:"Zeichenformat:", minWidth:myFieldWidth});
}
with(dialogColumns.add()){
var mySourceDropdown = dropdowns.add({stringList:myCharStyles, selectedIndex:myCharStyles.length-1});
}
}
}
var myResult = myDialog.show();
if(myResult == true){
var theCharStyle =myCharStyles[mySourceDropdown.selectedIndex];
myDialog.destroy();
}
else{
myDialog.destroy()
exit();
}
return theCharStyle;
}
function selectIt( theObj )
{
var myZoom = 400;
app.select(theObj,SelectionOptions.replaceWith);
app.activeWindow.zoomPercentage = myZoom;
// Option zum Abbruch, falls innerhalb einer Schleife aufgerufen
var myChoice = confirm ('Fundstelle fehlerhaft!\rWeiter?' );
if (myChoice == false)
exit();
return app.selection[0];
}
Skript ist lauffähig ab Version CS3
Indexeinträge mit Unterstichworten über eine Konkordanzdatei erzeugen.
IndexFromList_withSubtopics.jsx
Link zur Ursprungsdiskussion im Forum
Mit dem Skript IndexFromList_withOneSubtopic_CS3.jsx können über eine Konkordanzdatei Indexeinträge mit einem Hauptstichwort und maximal einem Unterstichwort erzeugt werden.
Hier eine erweiterte Version, die neben einem Hautstichwort bis zu max. 3 Unterstichworte zuläßt.
Die Indexliste könnte etwa so aufgebaut sein:
Meilenstein
Mineral | Stein | Steinwall
Mineral | Stein | Steinbeißer | Zahnarzt
Beim ersten Begriff werden alle Vorkommen von 'Meilenstein' im Dokument gesucht. Im Index wird ein Eintrag 'Meilenstein' erzeugt mit Referenzen zu den Vorkommen von 'Meilenstein' im Dokument.
Bei den nächsten beiden Einträgen ('Mineral | Stein | Steinwall' und 'Mineral | Stein | Steinbeißer') wird ein Hauptstichwort 'Mineral' angelegt. Darunter wird ein Unterstichwort 'Stein' und darunter 'Steinwall' mit Referenzen zu den Vorkommen von 'Steinwall' und ein Unterstichwort 'Steinbeißer' mit Referenzen zu den Vorkommen von 'Steinbeißer' angelegt.
Die erwartete Strukur ist also folgende:
Hauptstichwort
Hauptstichwort | Unterstichwort 1 | Unterstichwort 2 | Unterstichwort 3
Hauptstichwort | Unterstichwort 1
...
Also entweder ein Hauptstichwort allein oder ein Hauptstichwort, kombiniert mit einem oder mehreren Unterstichworten. Als Trennzeichen dient ' | ' (also senkrechter Strich mit Leerzeichen davor und danach!).
// IndexFromList_withSubtopics.jsx
//DESCRIPTION: Erzeugt Indexeinträge mit mehreren Gliederungsstufen anhand einer externen Konkordanzdatei, die über einen Dialog ausgewählt wird.
var myDoc = app.activeDocument;
var myList = File.openDialog ("Liste mit Indexbegriffen");
if (!myList) exit();
app.findTextPreferences = app.changeTextPreferences = NothingEnum.nothing;
app.findChangeTextOptions.wholeWord = true;
app.findChangeTextOptions.caseSensitive = true;
app.findChangeTextOptions.includeFootnotes = true;
var myEntries = getWords(myList);
proceedWithList(myEntries);
alert("Erledigt!");
// ===============================================================
// Funktionen
// ===============================================================
// Konkordanzliste einlesen
function getWords (aFile) {
if (aFile.exists) {
aFile.open ('r', undefined, undefined);
var aText = aFile.read()+'\n';
// löschen von Leerzeichen am Ende der Zeile + löschen von leeren Zeilen
aText = aText.replace(/[ \t]+\n/g, '\n').replace(/\n+/g, '\n');
// ersetzen von mehrfach aufeinander folgende Leerzeichen aller Art durch ein Leerzeichen
aText = aText.replace(/ {2,}/g, ' ');
var words = aText.split('\n');
var myElements = getElements( words );
aFile.close();
return myElements;
}
else {
exit();
}
}
function getElements( w )
{
var theElements = new Array;
for (i = 0; i < w.length; i++ )
theElements.push( w[i].split(' | ') );
return theElements;
}
function proceedWithList (w) {
if (myDoc.indexes.length == 0)
myDoc.indexes.add();
for (var i = 0; i < w.length; i++)
if (w[i] != "" && w[i].length <= 4 )
proceedEntry(w[i]);
myDoc.indexes[0].update();
}
function proceedEntry( oneEntry ) {
app.findTextPreferences.findWhat = oneEntry[ oneEntry.length-1];
var myResult = myDoc.findText();
var myTopic = myDoc.indexes[0];
for (var t = 0; t < oneEntry.length; t++ )
myTopic = myTopic.topics.add(oneEntry[t] );
for (var i = myResult.length-1; i >=0; i--)
myTopic.pageReferences.add(myResult[i], PageReferenceType.currentPage);
}
Das Skript verarbeitet so bis zu vier Indexstufen (das Maximum an Stufen, die InDesign verarbeiten kann).
Bei Gelegenheit könnte es noch auf eine tiefere Untergliederung ausgebaut werden.
Tipp:
Mit der obigen Version könnten nun auch mehrere unterschiedliche Register verwaltet werden: Namenregister, Sachregister. Verwende 'Namen' und 'Sachen' als ersten Eintrag und die eigentlichen Indexeinträge als weiterer Eintrag:
Namen | Kafka
Namen | Peirce
Namen | Beck
Sachen | Finanzen | Geldbörse
Sachen | Finanzen | Gulden
Sachen | Medizin | Augentropfen
Sachen | Unbehagen
Martin Fischer
Skript ist lauffähig ab Version CS3
Indexthemen aus einer externen Liste importieren
TopicsFromList.jsx
Importiert Indexthemen aus einer externen Liste, die über einen Dialog ausgewählt wird.
// TopicsFromList.jsx
//DESCRIPTION: Importiert Indexthemen aus einer externen Liste, die über einen Dialog ausgewählt wird.
//Date: 07/2009
//Author: Martin Fischer
if (app.documents.length == 0)
exit();
var myList = File.openDialog ("Liste mit Indexbegriffen");
if (!myList)
exit();
var myDoc = app.documents.firstItem();
var myWords = getWords(myList);
proceedWithList(myWords);
alert("Erledigt!");
// Konkordanzliste einlesen
function getWords (aFile) {
if (aFile.exists) {
aFile.open ('r', undefined, undefined);
var aText = aFile.read()+'\n';
aText = aText.replace(/\s+\n/g, '\n');
aText = aText.replace(/\n+/g, '\n');
aText = aText.replace(/([ \t])[ \t]+/g, '');
aText = aText.replace(/^\s+/g,'');
aText = aText.replace(/\n\s+/g,'\n');
var words = aText.split('\n');
aFile.close();
return words;
}
else {
exit();
}
}
// Begriffsliste abarbeiten
function proceedWithList (w) {
if (myDoc.indexes.length == 0)
myDoc.indexes.add();
for (var i = 0; i < w.length; i++)
if (w[i] != "")
{
var myTopic = null;
myTopic = myDoc.indexes[0].topics.item(w[i]);
if (myTopic == null)
myTopic = myDoc.indexes[0].topics.add(w[i]);
}
}
Skript ist lauffähig ab Version CS3
Inhaltsverzeichnisse aktualisieren
updateTOCs.jsx
Das Skript updateTOCs.jsx aktualisiert alle bereits angelegte Inhaltsverzeichnisse in allen geöffneten Dokumenten.
Für diese Aktualisierung konnte ich keinen direkten Weg/Befehl finden.
Deswegen wird ggf. auch von einem Inhaltsverzeichnisformat (mit Einträgen), für das noch kein Inhaltsverzeichnis angelegt worden ist, temporär ein Inhaltsverzeichnis angelegt und sogleich wieder gelöscht.
Alle anderen (angelegten) Inhaltsverzeichnisse werden aktualisiert (überschrieben).
// updateTOCs.jsx
// 5.5.2010
// InDesign@MartinFischer.de
//DESCRIPTION:Aktualisiert alle bereits angelegten Inhaltverzeichnisse in allen geöffneten Dokumenten.
if (app.documents.length > 0)
{
for ( var d = 0; d < app.documents.length; d++ )
update_tocs( app.documents.item(d) );
}
function update_tocs( doc )
{
var sl = doc.stories.length;
for ( var i = 0; i < doc.tocStyles.length; i++ )
{
if ( doc.tocStyles.item(i).tocStyleEntries.length > 0 )
{
var toc_story = doc.createTOC( doc.tocStyles.item(i), true, undefined );
if ( doc.stories.length > sl )
toc_story[0].textContainers[0].remove();
}
}
}
Skript ist lauffähig ab Version CS4
Kleine Erweiterung des Standardskripts FindChangeByList.jsx
FindChangeByList_mod1.jsx
Link zur Ursprungsdiskussion im Forum
Quarz hat in http://www.hilfdirselbst.ch/...i?post=293725#293725 gezeigt, wie sie mehrere unterschiedliche Listen für das Skript FindChangeByList.jsx verwaltet.
Die folgende Skriptvariante 'FindChangeByList_mod1.jsx', die ich mit der Funktion 'chooseMyOwnList()' erweitert habe, erledigt dies über eine entsprechende Bestückung des Unterverzeichnisses 'FindChangeSupport':
Liegt im Unterverzeichnis 'FindChangeSupport' (relativ zum Verzeichnis des Skripts) keine Datei namens 'FindChangeList.txt' vor, schaut sich das Skript in diesem Unterverzeichnsi nach anderen Dateien mit der Endung '.txt' um und stellt diese in einem DrowDown-Menü zur Auswahl.
Findet das Skript im angegebenen Unterverzeichnis keine txt-Dateien, dann erscheint wie beim Ausgangsskript ein Dialog zur Auswahl einer Datei mit Definitionen zum Ersetze-Vorgang (über den man dann wie gehabt andere Verzeichnisse durchsuchen kann).
Kurzanleitung:
1. Unterverzeichnis 'FindChangeSupport' relativ zum Skriptverzeichnis (dem Verzeichnis, in dem 'FindChangeByList_mod1.jsx' liegt) anlegen.
2. 'FindChangeList.txt' im Unterverzeichnis 'FindChangeSupport' ggf. umbenennen.
3. Weitere Listen als TXT-Dateien im Unterverzeichnis 'FindChangeSupport' ablegen.
//FindChangeByList_mod1.jsx
//An InDesign CS3 JavaScript
//
// A variaton von FindChangeByList.jsx
// New function 'chooseMyOwnList()' to choose an own list located in
// [scriptDir]/FindChangeSupport if FindChangeList.txt does not exist
// added by Martin Fischer.
//
//Loads a series of tab-delimited strings from a text file, then performs a series
//of find/change operations based on the strings read from the file.
//
//The data file is tab-delimited, with carriage returns separating records.
//
//The format of each record in the file is:
//findType< tab>findProperties< tab>changeProperties< tab>findChangeOptions< tab>description
//
//Where:
//< tab> is a tab character
//findType is "text", "grep", or "glyph" (this sets the type of find/change operation to use).
//findProperties is a properties record (as text) of the find preferences.
//changeProperties is a properties record (as text) of the change preferences.
//findChangeOptions is a properties record (as text) of the find/change options.
//description is a description of the find/change operation
//
//Very simple example:
//text {findWhat:"--"} {changeTo:"^_"} {includeFootnotes:true, includeMasterPages:true, includeHiddenLayers:true, wholeWord:false} Find all double dashes and replace with an em dash.
//
//More complex example:
//text {findWhat:"^9^9.^9^9"} {appliedCharacterStyle:"price"} {include footnotes:true, include master pages:true, include hidden layers:true, whole word:false} Find .00 to .99 and apply the character style "price".
//
//All InDesign search metacharacters are allowed in the "findWhat" and "changeTo" properties for findTextPreferences and changeTextPreferences.
//
//If you enter backslashes in the findWhat property of the findGrepPreferences object, they must be "escaped"
//as shown in the example below:
//
//{findWhat:"\s+"}
//
//For more on InDesign scripting, go to http://www.adobe.com/products/indesign/scripting.html
//or visit the InDesign Scripting User to User forum at http://www.adobeforums.com
//
main();
function main(){
var myObject;
var myCheckSelection = false;
if(app.documents.length > 0){
if(app.selection.length > 0){
switch(app.selection[0].constructor.name){
case "InsertionPoint":
case "Character":
case "Word":
case "TextStyleRange":
case "Line":
case "Paragraph":
case "TextColumn":
case "Text":
myObject = myDisplayDialog();
myCheckSelection = myObject[1];
myObject = myObject[0];
if(myObject != "None"){
myFindChangeByList(myObject, myCheckSelection);
}
break;
default:
myFindChangeByList(app.documents.item(0), false);
}
}
else{
//Nothing was selected, so simply search the document.
myFindChangeByList(app.documents.item(0), false);
}
}
else{
alert("No documents are open. Please open a document and try again.");
}
}
function myDisplayDialog(){
var myObject;
var myCheckSelection = false;
var myDialog = app.dialogs.add({name:"FindChangeByList"});
with(myDialog.dialogColumns.add()){
with(dialogRows.add()){
with(dialogColumns.add()){
staticTexts.add({staticLabel:"Search Range:"});
}
var myRangeButtons = radiobuttonGroups.add();
with(myRangeButtons){
radiobuttonControls.add({staticLabel:"Selection", checkedState:true});
radiobuttonControls.add({staticLabel:"Selected Story"});
radiobuttonControls.add({staticLabel:"Document"});
}
}
}
var myResult = myDialog.show();
if(myResult == true){
switch(myRangeButtons.selectedButton){
case 0:
myObject = app.selection[0];
myCheckSelection = true;
break;
case 1:
myObject = app.selection[0].parentStory;
myCheckSelection = false;
break;
case 2:
myObject = app.documents.item(0);
myCheckSelection = false;
break;
}
}
else{
myObject = "None";
}
myDialog.destroy();
return [myObject, myCheckSelection];
}
function myFindChangeByList(myObject, myCheckSelection){
var myScriptFileName, myFindChangeFile, myFindChangeFileName, myScriptFile, myResult;
var myFindChangeArray, myFindPreferences, myChangePreferences, myFindLimit;
var myStartCharacter, myEndCharacter;
var myFindChangeFile = myFindFile("/FindChangeSupport/FindChangeList.txt")
if(myFindChangeFile != null){
// Because the selection will change as we add/remove characters,
// we'll need to reset the selection after each pass if we are
// checking the selection. We'll get the index of the first character
// in the selection (relative to the start of its parent story) and
// the index of the last character in the selection (relative to the
// *end* of the story, and we'll use them later in the script to
// keep the ends of the selection in place.
if(myCheckSelection == true){
var myStart = myObject.characters.item(0).index;
var myEnd = myObject.characters.item(-1).index;
var myStory = myObject.parentStory;
var myStoryEnd = myStory.characters.item(-1).index;
myEnd = (myStoryEnd - myEnd)+1;
}
myFindChangeFile = File(myFindChangeFile);
var myResult = myFindChangeFile.open("r", undefined, undefined);
if(myResult == true){
//Loop through the find/change operations.
do{
myLine = myFindChangeFile.readln();
//Ignore comment lines and blank lines.
if((myLine.substring(0,4)=="text")||(myLine.substring(0, 4)=="grep")||(myLine.substring(0,5)=="glyph")){
myFindChangeArray = myLine.split("\t");
//The first field in the line is the findType string.
myFindType = myFindChangeArray[0];
//The second field in the line is the FindPreferences string.
myFindPreferences = myFindChangeArray[1];
//The second field in the line is the ChangePreferences string.
myChangePreferences = myFindChangeArray[2];
//The fourth field is the range--used only by text find/change.
myFindChangeOptions = myFindChangeArray[3];
switch(myFindType){
case "text":
myFindText(myObject, myFindPreferences, myChangePreferences, myFindChangeOptions);
break;
case "grep":
myFindGrep(myObject, myFindPreferences, myChangePreferences, myFindChangeOptions);
break;
case "glyph":
myFindGlyph(myObject, myFindPreferences, myChangePreferences, myFindChangeOptions);
break;
}
if(myCheckSelection == true){
myStartCharacter = myStory.characters.item(myStart);
myEndCharacter = myStory.characters.item(-myEnd);
myObject = myStory.texts.itemByRange(myStartCharacter, myEndCharacter);
app.select (myObject);
}
}
} while(myFindChangeFile.eof == false);
myFindChangeFile.close();
}
}
}
function myFindText(myObject, myFindPreferences, myChangePreferences, myFindChangeOptions){
//Reset the find/change preferences before each search.
app.changeTextPreferences = NothingEnum.nothing;
app.findTextPreferences = NothingEnum.nothing;
var myString = "app.findTextPreferences.properties = "+ myFindPreferences + ";";
myString += "app.changeTextPreferences.properties = " + myChangePreferences + ";";
myString += "app.findChangeTextOptions.properties = " + myFindChangeOptions + ";";
app.doScript(myString, ScriptLanguage.javascript);
myFoundItems = myObject.changeText();
//Reset the find/change preferences after each search.
app.changeTextPreferences = NothingEnum.nothing;
app.findTextPreferences = NothingEnum.nothing;
}
function myFindGrep(myObject, myFindPreferences, myChangePreferences, myFindChangeOptions){
//Reset the find/change grep preferences before each search.
app.changeGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences = NothingEnum.nothing;
var myString = "app.findGrepPreferences.properties = "+ myFindPreferences + ";";
myString += "app.changeGrepPreferences.properties = " + myChangePreferences + ";";
myString += "app.findChangeGrepOptions.properties = " + myFindChangeOptions + ";";
app.doScript(myString, ScriptLanguage.javascript);
var myFoundItems = myObject.changeGrep();
//Reset the find/change grep preferences after each search.
app.changeGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences = NothingEnum.nothing;
}
function myFindGlyph(myObject, myFindPreferences, myChangePreferences, myFindChangeOptions){
//Reset the find/change glyph preferences before each search.
app.changeGlyphPreferences = NothingEnum.nothing;
app.findGlyphPreferences = NothingEnum.nothing;
var myString = "app.findGlyphPreferences.properties = "+ myFindPreferences + ";";
myString += "app.changeGlyphPreferences.properties = " + myChangePreferences + ";";
myString += "app.findChangeGlyphOptions.properties = " + myFindChangeOptions + ";";
app.doScript(myString, ScriptLanguage.javascript);
var myFoundItems = myObject.changeGlyph();
//Reset the find/change glyph preferences after each search.
app.changeGlyphPreferences = NothingEnum.nothing;
app.findGlyphPreferences = NothingEnum.nothing;
}
function myFindFile(myFilePath){
var myScriptFile = myGetScriptPath();
var myScriptFile = File(myScriptFile);
var myScriptFolder = myScriptFile.path;
myFilePath = myScriptFolder + myFilePath;
if(File(myFilePath).exists == false){
//Display a dialog to choose own list
var aResult = chooseMyOwnList( myScriptFile.path + '/FindChangeSupport');
if ( aResult != 'None' )
myFilePath = File( aResult );
else
myFilePath = File.openDialog("Choose the file containing your find/change list");
}
return myFilePath;
}
function myGetScriptPath(){
try{
myFile = app.activeScript;
}
catch(myError){
myFile = myError.fileName;
}
return myFile;
}
function chooseMyOwnList( aPath )
{
var myChoosedList = "None";
var myListFiles = Folder( aPath ).getFiles( '*.txt' )
var myLists = new Array;
for ( var f = 0; f < myListFiles.length; f++ )
myLists.push( myListFiles[f].name );
if (myLists.length > 0 ) {
var myDialog = app.dialogs.add({name:"FindChangeByList"});
with(myDialog.dialogColumns.add()){
with(dialogRows.add()){
with(dialogColumns.add()){
staticTexts.add({staticLabel:"Liste:"});
}
with(dialogColumns.add()){
var myListsDropdown = dropdowns.add({stringList:myLists, selectedIndex:0});
}
}
}
var myResult = myDialog.show();
if(myResult == true)
var myChoosedList = aPath + '/' + myLists[myListsDropdown.selectedIndex];
myDialog.destroy();
}
return myChoosedList;
}
Skript ist lauffähig in:
Leere Textrahmen löschen
removeEmptyTextFrames.jsx
Link zur Ursprungsdiskussion im Forum
Das folgende Skript löscht leere Textrahmen des aktiven Dokuments.
// removeEmptyTextFrames.jsx
//DESCRIPTION: löscht leere Textrahmen im Dokument
var f = app.documents.item(0).textFrames;
for (var i = f.length-1; i>= 0; i-- )
if (f[i].contents.replace(/\s+/g, '') == '')
f[i].remove();
Skript ist lauffähig ab Version CS2
Mehrspaltige Textrahmen an Inhalt anpassen
fitMultiColumnTextFrames
Link zur Ursprungsdiskussion im Forum
Es kam mal wieder die Frage auf, ob mehrspaltige Textrahmen an den Inhalt anzupassen sind.
Ich hatte damals ein Scriptfragment veröffentlicht, das aber nur einen markierten Textrahmen verarbeitet und auch nicht, wenn der Rahmen im Überlauf steht.
Das sollte im Wesentlichen mit diesem Script behoben sein. Das Vorgehen ist folgendermaßen: - Falls der Rahmen einspaltig ist, wird der normale Befehl Apfel-Alt-C aufgerufen
- Falls der Rahmen mehrspaltig ist und nicht mit anderen Rahmen verkettet...
- Falls der Rahmen im Übersatz steht
- Der Rahmen wird solange um 10mm vergrößert, bis er entweder nicht mehr im Übersatz ist, oder höher als 5000mm
Das sollte in den meisten Fällen OK sein, anderenfalls brauche ich Feedback
- Der Rahmen wird solange verkleinert, bis sich zwischen zwei Verkleinerungsschritten die Höhe (fast) nicht mehr ändert. Kriterium für "zu viel verkleinert" ist, ob der Rahmen in den Überlauf geht.
- In meinen Tests führt das mit vertretbarer Performance zu einem kleinstmöglichen Rahmen.
- Ich habe nur wenige "abgefahrene" Situationen (z.B. nicht-rechteckige Textrahmen, die von Konturenführung betroffen sind und zweihundert verschiedene Formatierungen enthalten) getestet. Falls jemand eine Situation entdeckt, in der das Script nicht zum Ergebnis führt, freue ich mich über ein Snippet oder inx von dem entsprechenden Textrahmen.
// © CuppaScripts 2009
//version 1.0.1: Neigungs- und Drehwinkel werden ggf. auf 0 gesetzt und nach dem Anpassen wieder auf den ursprünglichen Wert
// DESCRIPTION: Passt mehrspaltige Textrahmen in der Höhe an, dass möglichst wenig Leerraum in der letzten Zeile ist. Läuft nicht bei verketteten Textrahmen.
if (app.selection.length > 0) {
main();
}
function main() {
var myOldXUnits = app.documents.item(0).viewPreferences.horizontalMeasurementUnits;
var myOldYUnits = app.documents.item(0).viewPreferences.verticalMeasurementUnits;
app.documents.item(0).viewPreferences.horizontalMeasurementUnits = MeasurementUnits.millimeters;
app.documents.item(0).viewPreferences.verticalMeasurementUnits = MeasurementUnits.millimeters;
var myRefPoint = app.layoutWindows[0].transformReferencePoint;
app.layoutWindows[0].transformReferencePoint = AnchorPoint.TOP_LEFT_ANCHOR;
for (var s = 0; s < app.selection.length; s++) {
var aSel = app.selection[s];
if (aSel.constructor.name == "TextFrame") {
if(aSel.nextTextFrame == NothingEnum.NOTHING || aSel.nextTextFrame == null){
if (aSel.textColumns.length > 1) {
var theShearAngle = aSel.shearAngle;
var theRotAngle = aSel.rotationAngle;
if (theShearAngle != 0 || theRotAngle != 0) {
aSel.shearAngle = 0;
aSel.rotationAngle = 0;
}
var t = aSel.geometricBounds[0];
var l = aSel.geometricBounds[1];
var b = aSel.geometricBounds[2];
var r = aSel.geometricBounds[3];
while (aSel.overflows && b < 5000) {
aSel.geometricBounds = [t,l,b+10,r];
b = aSel.geometricBounds[2];
}
var bDone = false;
var bBefore = aSel.geometricBounds[2];
while (!bDone) {
var cols = getLastLines(aSel);
var diff = (cols.longest - cols.shortest);
if (diff < 0.5) {
diff = lineHeight(aSel);
bDone = shrink(aSel, diff);
if (Math.abs(aSel.geometricBounds[2] - bBefore) < 0.02) { bDone = true; }
bBefore = aSel.geometricBounds[2];
} else {
bDone = shrink( aSel, diff );
if (aSel.geometricBounds[2] == bBefore) { bDone = true; }
bBefore = aSel.geometricBounds[2];
} // diff < 0.5
} // while
if (theShearAngle != 0 || theRotAngle != 0) {
aSel.shearAngle = theShearAngle;
aSel.rotationAngle = theRotAngle;
}
} else {
aSel.fit(FitOptions.FRAME_TO_CONTENT);
} // columns
} // unlinked
} // tFrame
} // for
app.layoutWindows[0].transformReferencePoint = myRefPoint;
app.documents.item(0).viewPreferences.horizontalMeasurementUnits = myOldXUnits;
app.documents.item(0).viewPreferences.verticalMeasurementUnits = myOldYUnits;
}
function shrink ( aSel, diff) {
var bDone = false;
var t = aSel.geometricBounds[0];
var l = aSel.geometricBounds[1];
var b = aSel.geometricBounds[2];
var r = aSel.geometricBounds[3];
aSel.geometricBounds = [t, l, b-diff, r];
var n = 0;
while (aSel.overflows && n < 10) {
diff = diff/2
aSel.geometricBounds = [t, l, b-diff, r];
n++;
}
if (n == 10) {
bDone = true;
aSel.geometricBounds = [t, l, b, r];;
}
return bDone
}
function lineHeight(aSel) {
try {
var h = aSel.textColumns[0].lines[-1].baseline - aSel.textColumns[0].lines[-2].baseline;
} catch (e) {
var h = aSel.geometricBounds[2] - aSel.geometricBounds[0] / 2;
}
for (var n = 1; n < aSel.textColumns.length; n++) {
try{
h = Math.min( h, aSel.textColumns[n].lines[-1].baseline - aSel.textColumns[n].lines[-2].baseline);
} catch(e) {}
}
return h;
}
function getLastLines(aSel) {
var cols = new Object ();
cols.shortest = cols.longest = aSel.textColumns[0].lines[-1].baseline;
for (var n = 1; n < aSel.textColumns.length; n++) {
cols.shortest = Math.min( cols.shortest, aSel.textColumns[n].lines[-1].baseline);
cols.longest = Math.max( cols.longest, aSel.textColumns[n].lines[-1].baseline);
}
return cols;
}
Skript ist lauffähig ab Version CS2
Mehrspaltigen Textrahmen in einzelne Rahmen trennen
Textrahmen_trennen.jsx
Link zur Ursprungsdiskussion im Forum
Dieses Skript wurde von redbull entwickelt.
Peter schreibt dazu:
Für den Zeitschriftenumbruch ist es ja sehr angenehm mit mehrspaltigen Textrahmen zu arbeiten.
Es kommt aber oft vor, dass man aus irgendeinem Grund diesen mehrspaltigen Rahmen in einzelne Rahmen aufteilen möchte (z.B. damit wenn eine Spalte höher werden soll als die anderen).
Da ich für diesen Zweck keine Funktion bzw. noch kein Skript gefunden habe, habe ich folgendes programmiert:
//Textrahmen_trennen.jsx
//
//
// Dokument geöffnet?
if (app.documents.length == 0) {
alert("Kein Dokument geöffnet");
exit();
}
if (app.selection.length > 0) {
var myDoc = app.documents[0];
var myTextFrames;
var myNewTextFrame;
var myOldTextFrame;
var myGB;
var myWidth;
var myColumns;
var myInterval;
var i;
var j;
// Markierte Textrahmen abfragen
switch(app.selection[0].constructor.name){
case "Text":
case "InsertionPoint":
case "Character":
case "Word":
case "Line":
case "Paragraph": myTextFrames = app.selection[0].parentTextFrames; break;
case "TextFrame": myTextFrames =app.selection; break;
default:
alert("Fehler \nKeinen Textrahmen erwischt, \nsondern (in english) \"" + app.selection[0].constructor.name + "\"!");
exit();
}
//alert ("Anzahl: "+ myTextFrames.length);
for (i=0; i< myTextFrames.length; i++) {
myWidth = myTextFrames[i].textFramePreferences.textColumnFixedWidth;
myColumns = myTextFrames[i].textFramePreferences.textColumnCount;
myInterval = myWidth + myTextFrames[i].textFramePreferences.textColumnGutter;
// Spaltenzahl auf 1 zurücksetzen, Neue Rahmenbreite = Alte Spaltenbreite
myTextFrames[i].textFramePreferences.textColumnCount = 1;
myTextFrames[i].textFramePreferences.textColumnFixedWidth = myWidth;
myTextFrames[i].textFramePreferences.useFixedColumnWidth = true;
myTextFrames[i].textFramePreferences.useFixedColumnWidth = false;
myOldTextFrame = myTextFrames[i];
// Textrahmen duplizieren und versetzt einfügen, Inhalt entfernen und Textfluss weiterführen
for (j=1; j< myColumns; j++) {
myNewTextFrame = myOldTextFrame.duplicate(undefined, [myInterval,0]);
myNewTextFrame.parentStory.texts[0].contents ="";
myNewTextFrame.previousTextFrame = myOldTextFrame;
myOldTextFrame = myNewTextFrame;
}
}
}
else {
alert("Es ist nichts markiert! Bitte den/die Textrahmen auswählen.");
}
Skript ist lauffähig ab Version CS3
Monatsnamen bei Datumsangaben in Zahlen wandeln
Monatsnamen bei Datumsangaben in Zahl wandeln
Das Script wandelt in Datumsangaben, wie z. B. 12. September 2008, den Monatsnamen in Zahlen um und fügt gleichzeitig nach den Punkten 1/8-Gevierte ein 12. 9. 2008.
var myMonth = new Array ('', 'Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'); //Monatsnamen
for (i=0; i < myMonth.length; i++)
{
mySearch = ['(\d{1,2}\.)\s', myMonth[i], '\s(\d{4})'];
myChangeTo = ['\u2009', i, '.\u2009'];
// Zurückstellen der Suche-Ersetze-Einstellungen
app.findGrepPreferences = app.changeGrepPreferences = null;
// gesuchter Text
app.findGrepPreferences.findWhat = mySearch.join('');
// Ersatztext
app.changeGrepPreferences.changeTo = myChangeTo.join('');
// Ersetze-Befehl
app.activeDocument.changeGrep();
}
Skript ist lauffähig ab Version CS4
Reihenfolge von Segmenten eines ausgewählten Texts umkehren
ReverseByDiv.jsx
Das Skript kehrt die Reihenfolge von Segmenten eines ausgewählten Texts um angegebene Trennzeichen um.
Beispiel:
Das Datum '2.7.2005' soll an den Punkten umgekehrt werden: '2005.7.2'.
(Trennzeichen: Punkt).
In einer Bibliographie soll die Reihenfolge von mehreren Herausgebern umgekehrt werden:
Wurtz, St./Freundlich, M./Ansman, Chr./Albert, F. -> Albert, F./Ansman, Chr./Freundlich, M./Wurtz, St.
(Trennzeichen: Slash)
Oder die Reihenfolge einer durch Komma separierten Zahlenkolonne soll umgekehrt werden:
5, 6, 8, 9 -> 9, 8, 6, 5
(Trennzeichen: Komma, gefolgt von Leerzeichen)
Oder bei einer Quellenangabe soll die Reihenfolge von Ort und Verlag, die durch Doppelpunkt (und Leerzeichen) getrennt sind, umgekehrt werden:
Klirr: Stuttgart -> Stuttgart: Klirr
(Trennzeichen: Doppelpunkt, gefolgt von Leerzeichen)
Ein einfaches Leerzeichen als Trennzeichen reicht, um die Reihenfolge von ausgewählten Wörtern umzukehren.
Das Skript merkt sich das/die zuletzt verwendete(n) Trennzeichen (schreibt sie in eine Textdatei im Verzeichnis des Skripts) und verwendet es als Vorauswahl.
Achtung:
Das Skript arbeitet ausschließlich textbezogen und ignoriert die Formatierung.
D.h. wenn im ausgewählten Text unterschiedliche Formatierungen gegeben sind, wandert die Formatierung nicht mit den Zeichen mit. Deswegen erscheint in diesem Fall vor der Ausführung ein entsprechender Hinweis mit der Möglichkeit, die Ausführung abzubrechen.
// ReverseByDiv.jsx
//DESCRIPTION:Kehrt die Reihenfolge von ausgewähltem Text an einem angegebenen Trennzeichen um.
Object.prototype.isText = function()
{
switch(this.constructor.name)
{
case "InsertionPoint":
case "Character":
case "Word":
case "TextStyleRange":
case "Line":
case "Paragraph":
case "TextColumn":
case "Text":
case "TextFrame":
return true;
default :
return false;
}
}
if (app.selection.length > 0 && app.selection[0].isText())
{
if (app.selection[0].textStyleRanges.length > 1)
var r = confirm('Uneinheitliche Formatierung.\rFortsetzen?')
? null
: exit();
var script_file = get_scriptfile ().fullName;
var config_file = script_file.replace(/.jsx?$/i, '.txt');
var div = prompt('Trennzeichen', get_div (config_file) );
write_div (config_file, div );
var c = app.selection[0].contents;
var w = c.split(div);
if (w.length > 1)
app.selection[0].contents = w.reverse().join(div);
}
function get_div ( f_path )
{
var f = new File( f_path );
if ( f.exists )
{
f.open ('r', undefined, undefined);
f.encoding = 'UTF-8';
var result = f.readln();
f.close ();
return result
}
else
{
return '/';
}
}
function write_div ( f_path, myData )
{
var f = new File( f_path );
f.open( 'w' );
f.encoding = 'UTF-8';
f.writeln ( myData );
f.close();
}
function get_scriptfile() {
try {
return File( app.activeScript );
}
catch( e ) {
return File( e.fileName );
}
}
Skript ist lauffähig ab Version CS3
Schrift-Eigenschaften auflisten
appliedFont
Link zur Ursprungsdiskussion im Forum
Das Skript »appliedFont.jsx« listet bis zu 15 Eigenschaften einer Schrift auf ? wahlweise in den Textabschnitten, Absätzen, Formatbereichen oder der aktuellen Einfügemarke des aktiven Dokuments. Diese Eigenschaften werden in einem neuen Textrahmen auf einer eigenen Ebene eingefügt. Die jeweilige Anfangsposition ist mit einer Pfeilspitze markiert.
Was das Skript macht, hier (mov, ca. 2MB) kurz zusammengefasst.
Textrahmen / Hintergrund- und Konturfarbe:
Die Farben der eingefügten Textrahmen können vor Programmausführung geändert werden. Dazu in der InDesign-Farbpalette des aktiven Dokumentes die gewünschten Farben an die 3. Position (Hintergrund) bzw. 4. Position (Kontur) ziehen.
Textrahmen / Absatzformat:
Den Absätzen im eingefügten Textrahmen wird jeweils das Standardformat [Einf. Absatz] zugewiesen.
#target InDesign
#targetengine "appliedFontsSession";
//DESCRIPTION: Which font is it?
/*
+ Indesign Version: CS5.5 und 6
+ Autor: Roland Dreger
+ Datum: 21. November 2012
+ Das vorliegende Skript listet auswaehlte Eigenschaften der Textabschnitte/Absaetze/Formatbereiche/Einfuegemarke
im aktiven Dokument auf. Diese Eigenschaften werden in einem Textrahmen auf einer neuen Ebene eingefügt.
Die jeweilige Stelle wird mit einem Pfeil markiert.
Hinweis zu Hintergrundfarbe und Kontur:
Die Farben der eingefuegten Textrahmen koennen geaendert werden.
Dazu in der InDesign-Farbpalette des aktiven Dokumentes die gewuenschten Farben
an die 3. Position (Hintergrund) bzw. 4. Position (Kontur) ziehen.
Hinweis zum Absatzformat:
Den Absaetzen im eingefuegten Textrahmen wird jeweils das Standardformat [Einf. Absatz] zugewiesen.
*/
app.doScript(main, ScriptLanguage.JAVASCRIPT , [], UndoModes.ENTIRE_SCRIPT, "Which font is it?");
function main () {
app.scriptPreferences.enableRedraw = true;
var _ui = appliedFontPalette ();
_ui.show();
function appliedFontPalette () {
var _w = Window.find("palette", "Properties of fonts"); /* refresh UI */
if (_w===null) { /* refresh UI */
var _w = new Window ("palette", "Properties of fonts", undefined, {borderless: false, closeButton: true});
with (_w) {
margins = [8,8,8,15];
var _rangesAndProps = add ("group");
with (_rangesAndProps) {
orientation = "column";
spacing = 5;
margins = [0,0,0,0];
alignChildren = ["fill","fill"];
var _look = add ("statictext", undefined, "Look for:");
with (_look) {
graphics.font = "dialog:10";
}
var _ranges = add ("panel");
with (_ranges) {
alignChildren = "left";
spacing = 3;
margins = [10,10,15,13];
var _radioTSR = add ("radiobutton", undefined, "Style Ranges");
with (_radioTSR) {
value = true;
graphics.font = "dialog:13";
helpTip = "Formatbereiche";
}
var _radioParagraph = add ("radiobutton", undefined, "Paragraphs");
with (_radioParagraph) {
graphics.font = "dialog:13";
helpTip = "Absätze";
}
var _radioStory = add ("radiobutton", undefined, "Storys");
with (_radioStory) {
graphics.font = "dialog:13";
helpTip = "Textabschnitte";
}
var _radioIP = add ("radiobutton", undefined, "Insertion Point");
with (_radioIP) {
graphics.font = "dialog:13";
helpTip = "Einfügemarke";
}
} // END _ranges panel
var _properties = add ("statictext", undefined, "Listed Properties:");
with (_properties) {
graphics.font = "dialog:10";
}
var _props = add ("panel");
with (_props) {
alignChildren = "left";
spacing = 2;
margins = [10,10,15,13];
var _checkName = add ("checkbox", undefined, "Font Name");
with (_checkName) {
value = true;
graphics.font = "dialog:11";
helpTip = "Schriftname";
}
var _checkStyle = add ("checkbox", undefined, "Style");
with (_checkStyle) {
graphics.font = "dialog:11";
helpTip = "Schriftschnitt";
}
var _checkType = add ("checkbox", undefined, "Type");
with (_checkType) {
graphics.font = "dialog:11";
helpTip = "Schrifttype";
}
var _checkSize = add ("checkbox", undefined, "Size");
with (_checkSize) {
graphics.font = "dialog:11";
helpTip = "Schriftgröße";
}
var _checkLeading = add ("checkbox", undefined, "Leading");
with (_checkLeading) {
graphics.font = "dialog:11";
helpTip = "Zeilenabstand";
}
var _checkCaps = add ("checkbox", undefined, "Capitalization");
with (_checkCaps) {
graphics.font = "dialog:11";
helpTip = "Kapitälchen";
}
var _checkKerning = add ("checkbox", undefined, "Kerning Method");
with (_checkKerning) {
graphics.font = "dialog:11";
helpTip = "Kerning Methode";
}
var _checkTracking = add ("checkbox", undefined, "Tracking");
with (_checkTracking) {
graphics.font = "dialog:11";
helpTip = "Laufweite";
}
var _checkHScale = add ("checkbox", undefined, "Horizontal Scale");
with (_checkHScale) {
graphics.font = "dialog:11";
helpTip = "Horizontale Skalierung";
}
var _checkVScale = add ("checkbox", undefined, "Vertical Scale");
with (_checkVScale) {
graphics.font = "dialog:11";
helpTip = "Vertikale Skalierung";
}
var _checkSkew = add ("checkbox", undefined, "Skew");
with (_checkSkew) {
graphics.font = "dialog:11";
helpTip = "Neigung (Pseudo-Kursiv)";
}
var _checkNoBreak = add ("checkbox", undefined, "No Break");
with (_checkNoBreak) {
graphics.font = "dialog:11";
helpTip = "Kein Umbruch";
}
var _checkPStyle = add ("checkbox", undefined, "Paragraph Style");
with (_checkPStyle) {
graphics.font = "dialog:11";
helpTip = "Absatzformat";
}
var _checkCStyle = add ("checkbox", undefined, "Character Style");
with (_checkCStyle) {
graphics.font = "dialog:11";
helpTip = "Zeichenformat";
}
var _checkLanguage = add ("checkbox", undefined, "Language");
with (_checkLanguage) {
graphics.font = "dialog:11";
helpTip = "Sprache";
}
} // END _props panel
} // END _rangesAndProps group
var _startButton = add ("button", undefined, "Start", {name: "ok"});
} // END _w window
// Callbacks +++
_startButton.onClick = function() {
if (app.documents.length > 0) {
var _doc = app.activeDocument;
var _selectedRange = 0;
_selectedRange = selectedRange (_ranges);
function selectedRange (_ranges) {
for (var m = 0; m < _ranges.children.length; m++)
if (_ranges.children[m].value == true)
return m;
} // END function selectedRange
var _selectedProps = new Array();
_selectedProps = selectedProps (_props,_selectedProps);
function selectedProps (_props,_selectedProps) {
for (var n = 0; n < _props.children.length; n++) {
_selectedProps[_props.children[n].text]=_props.children[n].value;
}
return _selectedProps;
} // END function selectedProps
var _horizontalMeasurementUnitsUser = _doc.viewPreferences.horizontalMeasurementUnits;
var _verticalMeasurementUnitsUser = _doc.viewPreferences.verticalMeasurementUnits;
_doc.viewPreferences.horizontalMeasurementUnits = MeasurementUnits.MILLIMETERS;
_doc.viewPreferences.verticalMeasurementUnits = MeasurementUnits.MILLIMETERS;
try {
insertFontProps (_doc, _selectedRange,_selectedProps);
} catch (e) {
alert("Leider ist ein Fehler aufgetreten!\n" + e + "\nZeile: " + e.line + "\nSkript: " + e.fileName );
}
var _paletteProgressbarAlive = Window.find("palette", "Progress");
if (_paletteProgressbarAlive != null) {
_paletteProgressbarAlive.close();
}
_doc.viewPreferences.horizontalMeasurementUnits = _horizontalMeasurementUnitsUser;
_doc.viewPreferences.verticalMeasurementUnits = _verticalMeasurementUnitsUser;
} else {
alert ("Kein Dokument geöffnet!");
}
} // END _startButton.onClick
// END Callbacks +++
} // END if _w===null /* refresh UI */
return _w;
} // END function appliedFontPalette
function insertFontProps (_doc, _selectedRange,_selectedProps) {
var _TSR = [];
switch (_selectedRange) {
case 1 : /* Paragraphs */
if (_doc.stories.firstItem().isValid == true) {
var _TSR = _doc.stories.everyItem().paragraphs.everyItem().getElements();
if (_doc.stories.everyItem().tables.firstItem().isValid == true) {
var _TSRInTables = _doc.stories.everyItem().tables.everyItem().cells.everyItem().paragraphs.everyItem().getElements();
_TSR = _TSR.concat(_TSRInTables);
}
if (_doc.stories.everyItem().footnotes.firstItem().isValid == true) {
var _TSRInFootnotes = _doc.stories.everyItem().footnotes.everyItem().paragraphs.everyItem().getElements();
_TSR = _TSR.concat(_TSRInFootnotes);
}
} else {
alert("No paragraph in the Document!");
}
break;
case 2 : /* Stories */
if (_doc.stories.firstItem().isValid == true)
var _TSR = _doc.stories.everyItem().getElements();
else
alert("No story in the Document!");
break;
case 3 : /* Insertion point */
if ((app.selection.length > 0) && (app.selection[0].constructor.name == "InsertionPoint"))
if (app.selection[0].getElements()[0].textStyleRanges[0]!=null)
_TSR.push(app.selection[0].getElements()[0].textStyleRanges[0]);
else
alert ("No text style range at selected insertion point!");
else
alert ("No insertion point selected!");
break;
default : /* Text Style Ranges */
if ((_doc.stories.firstItem().isValid == true)&&(_doc.stories.everyItem().paragraphs.everyItem().textStyleRanges[0]!=null)) {
_TSR = _doc.stories.everyItem().paragraphs.everyItem().textStyleRanges.everyItem().getElements();
if (_doc.stories.everyItem().tables.firstItem().isValid == true) {
var _TSRInTables = _doc.stories.everyItem().tables.everyItem().cells.everyItem().textStyleRanges.everyItem().getElements();
_TSR = _TSR.concat(_TSRInTables);
}
if (_doc.stories.everyItem().footnotes.firstItem().isValid == true) {
var _TSRInFootnotes = _doc.stories.everyItem().footnotes.everyItem().textStyleRanges.everyItem().getElements();
_TSR = _TSR.concat(_TSRInFootnotes);
}
} else {
alert("No style ranges in the Document!");
}
}
var _fontFamily, _fontStyle, _fontType, _pointSize, _leading, _kerning, _tracking, _horizontalScale, _verticalScale;
var _capitalization, _noBreak, _skew, _appliedLanguage, _appliedPS, appliedCS;
var _parentTF;
var _parentP;
var _TFi;
var _baselineTSRi;
var _y1TFi, _x1TFi, _y2TFi, _x2TFi;
var _y1Arrowi,_x1Arrowi,_y2Arrowi,_x2Arrowi;
var _arrowi;
var _widthTFi = 70; // Breite eingefuegter Textrahmen
var _heightTFi = 85; // Hoehe eingefuegter Textrahmen (vor der Anpassung durch das Skript)
var _pStyle = _doc.paragraphStyles.item(1); // Absatzformat für eingefuegten Textrahmen
if (_doc.layers.itemByName("Which font is it?").isValid == false) {
_fontDescriptionLayer = _doc.layers.add({name:"Which font is it?"});
_fontDescriptionLayer.move(LocationOptions.AT_BEGINNING);
_fontDescriptionLayer.layerColor = UIColors.RED;
} else {
_fontDescriptionLayer = _doc.layers.itemByName("Which font is it?");
}
// Progressbar
var _paletteProgressbar = new Window ("palette","Progress", undefined);
var _progress = progressbar (_paletteProgressbar, _TSR.length);
function progressbar (w, stop) {
var _pb = w.add ("progressbar", undefined, 1, stop);
_pb.preferredSize = [300,15];
w.add ("statictext", undefined, "Just a moment please ...");
w.show ();
return _pb;
} // END function progressbar
// Loop durch Formatbereiche
for (i=0; i< _TSR.length; i++) {
_progress.value = i+1;
var _output = [];
// Props *************
//Family
if (_selectedProps["Font Name"]) {
if (_TSR[i].appliedFont.constructor.name == "Font")
_fontFamily = "Name: " + _TSR[i].appliedFont.fontFamily;
else
_fontFamily = "Name: " + _TSR[i].appliedFont;
_output.push (_fontFamily);
}
//Style
if (_selectedProps["Style"]) {
_fontStyle = "Style: " + _TSR[i].fontStyle;
_output.push (_fontStyle);
}
//Type
if (_selectedProps["Type"]) {
try {
switch (_TSR[i].appliedFont.fontType) {
case FontTypes.ATC :
_fontType = "Type: ATC";
break;
case FontTypes.BITMAP :
_fontType = "Type: Bitmap";
break;
case FontTypes.CID :
_fontType = "Type: CID";
break;
case FontTypes.OCF :
_fontType = "Type: OCF";
break;
case FontTypes.OPENTYPE_CFF :
_fontType = "Type: OpenType CFF";
break;
case FontTypes.OPENTYPE_CID :
_fontType = "Type: OpenType CID";
break;
case FontTypes.OPENTYPE_TT :
_fontType = "Type: OpenType TT";
break;
case FontTypes.TRUETYPE :
_fontType = "Type: TrueType";
break;
case FontTypes.TYPE_1 :
_fontType = "Type: Type 1";
break;
default :
_fontType = "Type: unknown";
}
} catch (e) {
_fontType = "Type: unknown";
}
_output.push (_fontType);
}
// Size
if (_selectedProps["Size"]) {
_pointSize = "Size: " + _TSR[i].pointSize.toFixed(2) + " pt";
_output.push (_pointSize);
}
// Leading
if (_selectedProps["Leading"]) {
if (_TSR[i].leading == Leading.AUTO) {
_leading = _TSR[i].pointSize*(_TSR[i].autoLeading/100)
_leading = "Leading: " + _leading.toFixed(2) + " pt";
}
else {
_leading = "Leading: " + _TSR[i].leading.toFixed(2) + " pt";
}
_output.push (_leading);
}
// Capitalization
if (_selectedProps["Capitalization"]) {
switch (_TSR[i].capitalization) {
case Capitalization.ALL_CAPS :
_capitalization = "Caps: all uppercase";
break;
case Capitalization.CAP_TO_SMALL_CAP :
_capitalization = "Caps: OpenType small caps";
break;
case Capitalization.SMALL_CAPS :
_capitalization = "Caps: small caps for lowercase";
break;
default :
_capitalization = "Caps: Normal";
}
_output.push (_capitalization);
}
// Kerning
if (_selectedProps["Kerning Method"]) {
_kerning = "Kerning: " + _TSR[i].kerningMethod;
_output.push (_kerning);
}
// Tracking
if (_selectedProps["Tracking"]) {
_tracking = "Tracking: " + _TSR[i].tracking;
_output.push (_tracking);
}
// Scale
if (_selectedProps["Horizontal Scale"]) {
_horizontalScale = "Horizontal Scale: " + _TSR[i].horizontalScale;
_output.push (_horizontalScale);
}
if (_selectedProps["Vertical Scale"]) {
_verticalScale = "Vertical Scale: " + _TSR[i].verticalScale;
_output.push (_verticalScale);
}
// Skew
if (_selectedProps["Skew"]) {
_skew = "Skew: " + _TSR[i].skew;
_output.push (_skew);
}
// No Break
if (_selectedProps["No Break"]) {
_noBreak = "No Break: " + _TSR[i].noBreak;
_output.push (_noBreak);
}
// Applied Style
if (_selectedProps["Paragraph Style"]) {
_appliedPS = "PS: " + _TSR[i].appliedParagraphStyle.name;
_output.push (_appliedPS);
}
if (_selectedProps["Character Style"]) {
_appliedCS = "CS: " + _TSR[i].appliedCharacterStyle.name;
_output.push (_appliedCS);
}
// Applied Language
if (_selectedProps["Language"]) {
_appliedLanguage = "Language: " + _TSR[i].appliedLanguage.name;
_output.push (_appliedLanguage);
}
// END Props *************
// Abfrage Textueberlauf oder Objekt auf der Montageflaeache
// Wenn nicht, Zuweisung parentPage und parentTextFrame
switch (_TSR[i].constructor.name) {
case "TextStyleRange" :
// TF Overflow
if ((_TSR[i].parentTextFrames[0]!=null)&&(_TSR[i].parentTextFrames[0].constructor.name != "TextPath")) {
// Items on Pasteboard
if (_TSR[i].parentTextFrames[0].parentPage != null) {
_parentP = _TSR[i].parentTextFrames[0].parentPage;
_parentTF = _TSR[i].parentTextFrames[0];
_noOverflow = true;
} else {
_noOverflow = false;
}
} else {
_noOverflow = false;
}
break;
case "Paragraph" :
// TF Overflow
if ((_TSR[i].parentTextFrames[0]!=null)&&(_TSR[i].parentTextFrames[0].constructor.name != "TextPath")) {
// Items on Pasteboard
if (_TSR[i].parentTextFrames[0].parentPage != null) {
_parentP = _TSR[i].parentTextFrames[0].parentPage;
_parentTF = _TSR[i].parentTextFrames[0];
_noOverflow = true;
} else {
_noOverflow = false;
}
} else {
_noOverflow = false;
}
break;
case "Story" :
// TF Overflow
if ((_TSR[i].insertionPoints[0].parentTextFrames[0]!=null)&&(_TSR[i].insertionPoints[0].parentTextFrames[0].constructor.name != "TextPath")) {
// Items on Pasteboard
if (_TSR[i].insertionPoints[0].parentTextFrames[0].parentPage != null) {
_parentP = _TSR[i].insertionPoints[0].parentTextFrames[0].parentPage;
_parentTF = _TSR[i].insertionPoints[0].parentTextFrames[0];
_noOverflow = true;
} else {
_noOverflow = false;
}
} else {
_noOverflow = false;
}
break;
default :
_noOverflow = false;
}
if (_noOverflow) {
_TFi = _parentP.textFrames.add(_fontDescriptionLayer, {name:"Description "+i});
_TFi.fillColor = _doc.swatches[2];
_TFi.strokeColor = _doc.swatches[3];
_TFi.strokeWeight = 2;
_baselineTSRi = _TSR[i].lines[0].baseline;
_y1TFi = _baselineTSRi;
_x1TFi = _parentTF.geometricBounds[1]-_widthTFi;
_y2TFi = _baselineTSRi+_heightTFi;
_x2TFi = _parentTF.geometricBounds[1]-10;
_TFi.geometricBounds = [_y1TFi,_x1TFi,_y2TFi,_x2TFi];
_TFi.textFramePreferences.insetSpacing = [4,4,4,4];
for (var j=0; j< _output.length; j++) {
_TFi.insertionPoints[-1].contents = _output[j] + "\r";
if (_TFi.paragraphs.item(j).isValid)
_TFi.paragraphs.item(j).applyParagraphStyle(_pStyle);
}
_TFi.geometricBounds = [_y1TFi,_x1TFi,_TFi.lines[-1].baseline+_TFi.textFramePreferences.insetSpacing[2]+_TFi.strokeWeight,_x2TFi];
_y1Arrowi = _baselineTSRi;
_x1Arrowi = _TFi.geometricBounds[3];
_y2Arrowi = _baselineTSRi;
_x2Arrowi = _TSR[i].insertionPoints[0].horizontalOffset;
_arrowi = _parentP.graphicLines.add(_fontDescriptionLayer, {name:"Arrow "+i, strokeWeight:2, strokeColor: _doc.swatches[3], rightLineEnd: ArrowHead.TRIANGLE_ARROW_HEAD, geometricBounds: [_y1Arrowi, _x1Arrowi, _y2Arrowi, _x2Arrowi]});
_parentP.groups.add([_TFi,_arrowi],_fontDescriptionLayer, {name:"Group "+i});
} /*else {
alert("Uebersatztext in einem der Textrahmen oder Text auf Montageflaeche!");
} */
} // END loop TSR-Array
_progress.parent.close();
}// END insertFontProps
} // END main
Skript ist lauffähig ab Version CS5
Schriftschnitte in Zeichenformaten einfrieren (nur bei Abweichungen zum Absatzformat)
TextStyle2charStyle_mod.jsx
Link zur Ursprungsdiskussion im Forum
Das Skript sucht im Dokument nach bestimmten Textformatierungen (Schriftschnitte, Position), denen bislang noch kein Zeichenformat zugewiesen ist.
Abhängig von den jeweiligen Attributen wird ein passendes Zeichenformat erstellt und dem entsprechenden Text zugewiesen, und zwar nur wenn dieses vom Absatzformat abweicht. Überflüssige Zeichenformate werden gelöscht.
Unten werden folgende Zeichenformate berücksichtigt: - SuperScript-Italic (hochgestellt, kursiv)
- SubScript-Italic (tiefgestellt, kursiv)
- SuperScript-Bold (hochgestellt, fett)
- SubScript-Bold (tiefgestellt, fett)
- SuperScript-Bold Italic (hochgestellt, fett, kursiv)
- SubScript-Bold Italic (tiefgestellt, fett, kursiv)
- SmallCaps (Kapitälchen, fett)
- Bold Italic (fett, kursiv)
- Bold (fett)
- Italic (kursiv)
- SuperScript (hochgestellt)
- SubScript (tiefgestellt)
- SmallCaps (Kapitälchen)
- AllCaps (Großbuchstaben)
- Underline (unterstrichen)
- StrikeThru (durchgestrichen)
Das Basisskript stammt von Peter Kahrel mit Anpassungen durch Martin Fischer.
Siehe auch TextStyle2charStyle.jsx und die Anmerkungen zum Oblique-Schnitt dort und in Italic, das kein Italic ist ... (Martin Fischer, 30.1.2013)
#target indesign
// TextStyle2charStyle_mod.jsx
// Peter Kahrel, mod. by Martin Fischer and Jürgen Althaus
var _dok = app.activeDocument;
// attr2style takes two arguments: (1) a string to set the search
// and the attribute value in the style, and (2) a name for the character style.
attr2style( 'position = Position.superscript;\rapp.findTextPreferences.fontStyle = "Italic"' , 'SuperScript-Italic' );
attr2style( 'position = Position.subscript;\rapp.findTextPreferences.fontStyle = "Italic"' , 'SubScript-Italic' );
attr2style( 'position = Position.superscript;\rapp.findTextPreferences.fontStyle = "Bold"' , 'SuperScript-Bold' );
attr2style( 'position = Position.subscript;\rapp.findTextPreferences.fontStyle = "Bold"' , 'SubScript-Bold' );
attr2style( 'position = Position.superscript;\rapp.findTextPreferences.fontStyle = "Bold Italic"' , 'SuperScript-Bold Italic' );
attr2style( 'position = Position.subscript;\rapp.findTextPreferences.fontStyle = "Bold Italic"' , 'SubScript-Bold Italic' );
attr2style( 'capitalization = Capitalization.smallCaps;\rapp.findTextPreferences.fontStyle = "Bold"' , 'SmallCaps-Bold' );
attr2style( 'fontStyle = "Regular"' , 'Regular' );
attr2style( 'fontStyle = "Bold"' , 'Bold' );
attr2style( 'fontStyle = "Bold Italic"' , 'Bold Italic' );
attr2style( 'fontStyle = "Italic"' , 'Italic' );
attr2style( 'position = Position.superscript' , 'SuperScript' );
attr2style( 'position = Position.subscript' , 'SubScript' );
attr2style( 'capitalization = Capitalization.smallCaps' , 'SmallCaps' );
attr2style( 'capitalization = Capitalization.allCaps' , 'AllCaps' );
attr2style( 'underline = true' , 'Underline' );
attr2style( 'strikeThru = true' , 'StrikeThru' );
function attr2style( attr, st )
{
app.findTextPreferences = app.changeTextPreferences = null;
eval( 'app.findTextPreferences.' + attr );
// comment the following line to look for text with applied character style too (MF)
app.findTextPreferences.appliedCharacterStyle = _dok.characterStyles[0];
var _style = checkStyle( attr, st );
// app.changeTextPreferences.appliedCharacterStyle = _style;
var _allFind = _dok.findText(true);
for (i=0; i < _allFind.length; i++)
{
var _find = _allFind[i];
if(_find.fontStyle != _find.appliedParagraphStyle.fontStyle ||
_find.underline == true ||
_find.strikeThru == true ||
_find.capitalization != Capitalization.NORMAL ||
_find.position != Position.NORMAL)
{
_find.appliedCharacterStyle = st;
}
else
{
_find.appliedCharacterStyle = '[No character style]';
}
}
// löschen der überschüssigen Zeichenformate
app.findTextPreferences = app.changeTextPreferences = null;
app.findTextPreferences.appliedCharacterStyle = _style;
var _allFind = _dok.findText(true);
if (_allFind.length == 0)
{
_style.remove()
}
app.findTextPreferences = app.changeTextPreferences = null;
}
function checkStyle( attr, stylename )
{
if( _dok.characterStyles.item( stylename ) == null )
{
_dok.characterStyles.add( { name : stylename } );
eval( '_dok.characterStyles.item( stylename ).' + attr );
}
return _dok.characterStyles.item( stylename );
}
Skript ist lauffähig ab Version CS3
Schriftschnitte in Zeichenformaten einfrieren
TextStyle2charStyle.jsx
Link zur Ursprungsdiskussion im Forum
Das Skript sucht im Dokument nach bestimmten Textformatierungen (Schriftschnitte, Position), denen bislang noch kein Zeichenformat zugewiesen ist.
Abhängig von den jeweiligen Attributen wird ein passendes Zeichenformat erstellt und dem entsprechenden Text zugewiesen.
Unten werden folgende Zeichenformate berücksichtigt: - SuperScript-Italic (hochgestellt, kursiv)
- SubScript-Italic (tiefgestellt, kursiv)
- Bold Italic (fett, kursiv)
- Bold (fett)
- Italic (kursiv)
- SuperScript (hochgestellt)
- SubScript (tiefgestellt)
- SmallCaps (Kapitälchen)
- Underline (unterstrichen)
- StrikeThru (durchgestrichen)
Das Basisskript stammt von Peter Kahrel.
30.1.2013 (Nachtrag): Aufgrund den in Italic, das kein Italic ist ... ausgeführten Beobachtungen im Zusammenhang mit dem Import eines Oblique-Schnitts ist im Code unten eine Abfrage eingebaut, ob 'Oblique' durch 'Italic' ersetzt (und anschließend in eine ZF eingefroren) werden soll.
//TextStyle2charStyle.jsx
// Peter Kahrel, mod. by Martin Fischer
// Ersetze, sofern vorhanden, 'Oblique'-Schnitt durch 'Italic' auf Nachfrage
oblique2italic();
// attr2style takes two arguments: (1) a string to set the search
// and the attribute value in the style, and (2) a name for the character style.
attr2style( 'position = Position.superscript;\rapp.findTextPreferences.fontStyle = "Italic"' , 'SuperScript-Italic' );
attr2style( 'position = Position.subscript;\rapp.findTextPreferences.fontStyle = "Italic"' , 'SubScript-Italic' );
attr2style( 'fontStyle = "Bold Italic"' , 'Bold Italic' );
attr2style( 'fontStyle = "Bold"' , 'Bold' );
attr2style( 'fontStyle = "Italic"' , 'Italic' );
attr2style( 'position = Position.superscript' , 'SuperScript' );
attr2style( 'position = Position.subscript' , 'SubScript' );
attr2style( 'capitalization = Capitalization.smallCaps' , 'SmallCaps' );
attr2style( 'underline = true' , 'Underline' );
attr2style( 'strikeThru = true' , 'StrikeThru' );
app.findTextPreferences = app.changeTextPreferences = NothingEnum.nothing;
function oblique2italic()
{
app.findTextPreferences = app.changeTextPreferences = NothingEnum.nothing;
app.findTextPreferences.fontStyle = 'Oblique';
var result = app.activeDocument.findText();
if (result.length > 0)
{
var choice = confirm('Achtung!\rSchriftschnitt "Oblique" durch "Italic" ersetzen?');
if (choice == true)
{
app.changeTextPreferences.fontStyle = 'Italic';
app.activeDocument.changeText();
}
}
}
function attr2style( attr, st )
{
app.findTextPreferences = app.changeTextPreferences = NothingEnum.nothing;
eval( 'app.findTextPreferences.' + attr );
// comment the following line to look for text with applied character style too (MF)
app.findTextPreferences.appliedCharacterStyle = app.activeDocument.characterStyles[0];
app.changeTextPreferences.appliedCharacterStyle = checkStyle( attr, st );
app.activeDocument.changeText();
}
function checkStyle( attr, stylename )
{
if( app.activeDocument.characterStyles.item( stylename ) == null )
{
app.activeDocument.characterStyles.add( { name : stylename } );
eval( 'app.activeDocument.characterStyles.item( stylename ).' + attr );
}
return app.activeDocument.characterStyles.item( stylename );
}
Skript ist lauffähig ab Version CS3
Set mit Fußnotenoptionen
footnoteOptionsSet.jsx
Link zur Ursprungsdiskussion im Forum
Mit dem Skript lassen sich bestimmte Fußnotenoptionen auf einen Schlag setzen.
U.a. werden dabei auch die Einstellungen der Linie über fortgesetzten Fußnoten mit der Linie über der ersten Fußnote in der Spalte synchronisiert.
Siehe auch continuingRule_Sync.jsx.
//footnoteOptionsSet.jsx
//DESCRIPTION:Setzt die Fußnotenoptionen mit bestimmten Eigenschaften. Synchronisiert dabei die Einstellungen der Linie über fortgesetzten Fußnoten mit der Linie über der ersten Fußnote in der Spalte.
Object.prototype.get = function( )
{
var myObject = null;
if (arguments[0] != null)
myObject = this.item( arguments[0].name );
if (myObject == null)
myObject = this.add( arguments[0] );
return myObject;
}
var colBlack = app.activeDocument.swatches.itemByName('Black');
with ( app.activeDocument.footnoteOptions )
{
eosPlacement = false;
footnoteFirstBaselineOffset = FootnoteFirstBaseline.LEADING_OFFSET;
footnoteMarkerStyle = app.activeDocument.characterStyles.get( { name: 'Fußnotenzeichen', position: Position.SUPERSCRIPT } );
footnoteMinimumFirstBaselineOffset = 0;
footnoteNumberingStyle = FootnoteNumberingStyle.ARABIC;
footnoteTextStyle = app.activeDocument.paragraphStyles.get( { name: '08 FN', pointSize:8, leading:9 } );
markerPositioning = FootnoteMarkerPositioning.SUPERSCRIPT_MARKER;
noSplitting = false;
prefix = "";
restartNumbering = FootnoteRestarting.SECTION_RESTART;
ruleColor = colBlack;
ruleGapColor = colBlack;
ruleGapOverprint = false;
ruleGapTint = 100;
ruleLeftIndent = 0;
ruleLineWeight = 0.4;
ruleOffset = 0.2;
ruleOn = true;
ruleOverprint = false;
ruleTint = 100;
ruleType = 'Durchgezogen';
ruleWidth = 18;
separatorText = "^s";
showPrefixSuffix = FootnotePrefixSuffix.NO_PREFIX_SUFFIX;
spaceBetween = 0;
spacer = 3;
startAt = 1;
suffix = "";
}
with ( app.activeDocument.footnoteOptions )
{
continuingRuleColor = ruleColor;
continuingRuleGapColor = ruleGapColor;
continuingRuleGapOverprint = ruleGapOverprint;
continuingRuleGapTint = ruleGapTint;
continuingRuleLeftIndent = ruleLeftIndent;
continuingRuleLineWeight = ruleLineWeight;
continuingRuleOffset = ruleOffset;
continuingRuleOn = ruleOn;
continuingRuleOverprint = ruleOverprint;
continuingRuleTint = ruleTint;
continuingRuleType = ruleType;
continuingRuleWidth = ruleWidth;
}
Skript ist lauffähig ab Version CS3
Sonderzeichen '∞' (unendlich) einfügen
unendlich.jsx
Link zur Ursprungsdiskussion im Forum
Fügt an der Einfügemarke das Sonderzeichen '∞' (unendlich) ein.
Geht auf dem Mac auch ohne Skript mit der Tastenkombination 'Alt-Komma' (Tipp von Gerald Singelmann).
// unendlich.jsx
//DESCRIPTION:Sonderzeichen unendlich einfügen.
if (app.selection.length > 0 && app.selection[0].hasOwnProperty('baseline'))
app.selection[0].contents = String.fromCharCode(8734);
Skript ist lauffähig ab Version CS2
Text durch Bild ersetzen (z.B. Barcodes)
TextDurchBarcodeErsetzen.jsx
Link zur Ursprungsdiskussion im Forum
Es gab schon häufiger Fragen im Forum, wie ein Text durch eine entsprechende Bilddatei ersetzt werden kann. (z.B. hier:http://www.hilfdirselbst.ch/...orum.cgi?post=292874
Ich habe für diesen Zweck verschiedene Skripte "im Einsatz", wenn der Bilddateiname schon im Text mit erfasst worden ist.
Anbei ein Beispiel, wie man per Skript einen "Barcode-Text" durch ein entsprechendes Barcode-EPS ersetzen kann. (Hatte diesen Fall bei einer Katalogproduktion, bei der kurz vor Druck ca. 500 verschiedene Barcodes, die zuvor mit einer Barcode-Schrift gesetzt worden sind durch ein Barcode-EPS ersetzt werden sollten).
In diesem Beispiel wurde im gelieferten Text der Barcode-Text bereits erfasst (mit einem eigenen AF; Absatzumbruchoption: Absatzbeginn in nächstem Rahmen). Der Barcode-Text wurden in verkettete Textrahmen geladen. Die verketteten Barcode-Textrahmen wurden mit dem Skript "SplitStory" getrennt.
Das Skript sucht nach dem AF und positioniert das zugehörige Barcode-EPS im Textrahmen. Ist die Barcode-Datei nicht vorhanden, wird eine Fehlermeldung ausgegeben und der ursprüngliche "Barcode-Text" wieder in den Rahmen gesetzt. Ist der Rahmen des "Barcode-Texts" noch verkettet, wird eine Fehlermeldung ausgegeben und das Skript beendet.
//TextDurchBarcodeErsetzen.jsx
// Autor: zaphodbeeblebroxx
if (app.documents.length != 1){
alert("Bitte [nur] ein Dokument öffnen!");
exit();
}
var myDoc = app.documents[0];
var myParaStyle = "Barcode"; // Hier das Absatzformat der codierten Bilder eintragen
var myCounter = 0;
// Suche nach dem Absatzformat
app.findPreferences = app.changePreferences = null;
app.findPreferences.appliedParagraphStyle = myParaStyle;
myFound = myDoc.search();
// Schleife durch gefundene Elemente
for (oneItem = myFound.length-1; oneItem >= 0; oneItem--){
myFoundPara = myFound[oneItem].paragraphs.item(0);
myFrame = myFoundPara.parentTextFrames[0];
try{
if ((myFrame.nextTextFrame != null) || (myFrame.peviousTextFrame != null)){
alert("Mindestens einer der Rahmen, in den ein Bild geladen werden soll ist noch verkettet. Skript wird beendet");
exit();
}
}
catch(e){}
myContent = myFrame.contents;
myFileName = myContent.replace(/\u000D/g, '');
myFullPath = "~/Desktop/barcodes/"; // Hier Pfad zu den Bildern angeben
myFileExt = ".eps"; // Dateiendung der Bilder
myPath = myFullPath + myFileName + myFileExt;
myFrame.contents = "";
// Text durch Bild ersetzen mit Prüfung, ob Bilddatei vorhanden
try{
myFrame.place(File(myPath));
var myFitImage = true;
}
catch(e){
alert(myFileName + myFileExt + " konnte nicht importiert werden. Bitte Dateinamen/Pfad/Text prüfen");
var myFitImage = false;
myFrame.contents = "" + myFileName;
myCounter += 1;
}
// Hier wird die Bildgröße an den Rahmen angepasst
if (myFitImage == true){
myFrame.fit(FitOptions.fillProportionally);
myFrame.fit(FitOptions.centerContent);
myFrame.fit(FitOptions.frameToContent);
}
}
var myNotReplaced = myFound.length - myCounter;
alert("Bei " + myNotReplaced + " Textcodierungen wurden die entsprechenden Bilder positioniert.\n" + myCounter + " Bilddatei(en) wurde nicht gefunden!");
Skript ist lauffähig ab Version CS2
Texte mit einem ausgewählten Zeichenformat im Dokument ermitteln
TextWithAppliedCharacterStyle.jsx
Link zur Ursprungsdiskussion im Forum
In der Diskussion »Wie kann ich ein Glossar von Wörtern und ein Abbildungsverzeichnis automatisch generieren« wurde nach einer Möglichkeit gefragt, Begriffe, die mit einem bestimmten Zeichenformat ausgezeichnet sind, aufzuspüren und aufzulisten.
Das Skript »TextWithAppliedCharacterStyle.jsx« ist eine Abwandlung des Skripts »usedCharsOfAppliedFont.jsx« zu eben diesem Zweck.
Es ermittelt die Texte (Wörter), die mit einem ausgewählten Zeichenformat ausgezeichnet sind und gibt das Ergebnis in einem Textrahmen auf der Montagefläche links neben der ersten Seite des Dokuments aus.
Die Texte werden sortiert, Duplikate gelöscht.
Bekannter Fehler: bei sehr umfangreichen Trefferquoten ist es möglich, dass InDesign einen Fehler über zu wenig Speicher meldet. Bis zur Behebung dieses Problems ist es möglich den Fehler durch Auskommentierung (zwei Slashes // voranstellen) der folgenden Zeile zu umgehen:
vorher:
newString.sort();
nachher:
//newString.sort();
// TextWithAppliedCharacterStyle.jsx
//DESCRIPTION:Erstellt eine Übersicht über die Texte mit einem ausgewählten Zeichenformat.
/*
InDesign@MartinFischer.de
27.04.2009
*/
// Prototype zum Löschen von redundanten Werten in einem Array
// http://www.constructors.de/array-prototype-gleiche-werte-aus-einem-array-loeschen-4-42.html
Array.prototype.array_unique = function () {
var value = index = [];
for ( var x = 0; x < this.length; ++x ) {
if ( index[this[x]] == null ) {
value[value.length] = this[x];
} index[this[x]] = this[x];
} return value;
};
// -----------------------------------------------------------------------------------------------------------------
// Hauptprogramm
// -----------------------------------------------------------------------------------------------------------------
var d = app.activeDocument;
var myCS = getCS( d );
var myArray = new Array();
var l = 'FuzzyInfo'; // Label für Inforahmen
// Inforahmen löschen (falls vorhanden)
try {
d.textFrames.item( l ).remove()
}
catch( e ){};
app.findTextPreferences = null;
app.findTextPreferences.appliedCharacterStyle = myCS;
// Vorkommen des Zeichenformats ermitteln und Inhalte ( Text ) sammeln
var myResult = d.findText();
for ( var i = myResult.length-1; i >= 0; i-- ) {
myArray.push( myResult[i].contents );
}
// Duplikate löschen
var newString = myArray.array_unique();
// ermittelte Texte sortieren
newString.sort();
// ermittelte Texte ausgeben
makeInfoFrame( myCS.name + '\r' + newString.join( '\r' ) );
// -----------------------------------------------------------------------------------------------------------------
// Funktionen
// -----------------------------------------------------------------------------------------------------------------
// Textrahmen zur Ausgabe der Information erstellen
function makeInfoFrame ( aData )
{
var t = d.textFrames.add(
{
contents: aData,
geometricBounds: [0, -100, d.documentPreferences.pageHeight, 0],
label: l,
fillColor: 'Black',
fillTint:15,
} )
with ( t.parentStory )
{
leftIndent = 0;
firstLineIndent = 0;
justification = Justification.LEFT_ALIGN;
texts.firstItem().appliedCharacterStyle = myCS;
}
t.lines.firstItem().appliedFont = d.paragraphStyles.firstItem().appliedFont;
t.lines.firstItem().spaceAfter = '10 pt';
zoomObject( t.lines.firstItem() );
}
// Objekt heranzoomen
function zoomObject ( myObject ) {
app.select( myObject,SelectionOptions.replaceWith );
app.activeWindow.zoomPercentage = 300; // Zoomfaktor
app.selection = null;
}
// Dialog zur Auswahl eines Fonts
function getCS( d ){
var myDialog = app.dialogs.add( {name:"Auswahl Zeichenformat"} );
var myCS = d.characterStyles.everyItem().name;
with( myDialog.dialogColumns.add() ){
with( dialogRows.add() ){
var myDropDown = dropdowns.add( {stringList: myCS, selectedIndex:myCS.length-1} );
}
}
var myResult = myDialog.show();
if( myResult == true ){
var aCS = d.characterStyles.item( myCS[myDropDown.selectedIndex] );
myDialog.destroy();
}
else{
myDialog.destroy();
exit()
}
return aCS;
}
Skript ist lauffähig ab Version CS3
Textvariablenexport
TextvariablenExport.jsx
Link zur Ursprungsdiskussion im Forum
Exportiert Variablen mit benutzerdefiniertem Text.
Gegenstück zu Textvariablen_benutzerdefiniert.jsx
TextvariablenExport.jsx greift auf eine config.txt zurück (oder legt sie neu an), in welcher der Pfad zur Listendatei angegeben ist. Wenn beide Skripte (TextvariablenExport.jsx und Textvariablen_benutzerdefiniert.jsx ) im selben Verzeichnis sind, bedienen sie dieselbe Listendatei - rein und raus.
---
Siehe auch das Skript variables.jsx von Peter Kahrel, mit dem sich benutzerdefinierte Textvariablen des aktiven Dokuments über einen Dialog einfach bearbeiten lassen.
/ 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 ();
}
Skript ist lauffähig ab Version CS4
Übersatztext formatieren
UebersatzFormatieren_501d.js
Link zur Ursprungsdiskussion im Forum
Dokumentweit wird allem Übersatztext das Absatzformat "condensed" zugewiesen (den Namen im Script an jenen im Dokument anpassen).
//UebersatzFormatieren_501d.js
//DESCRIPTION:Übersatztext ein Format zuweisen
// das zuzuweisende Absatzformat
var paraStyleName = "condensed";
// vorbeugenderweise das Anzeigen von Dialogen aktivieren
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;
// prüfen, ob ein Dokument geöffnet ist
if (app.documents.length == 0) {
alert ("Es ist kein Dokument offen.", "Achtung");
exit();
}
// das Dokument im Vordergrund
var curDoc = app.documents[0];
// die Textketten
var allStories = curDoc.stories;
// eine Schleife durch die Textketten
for (var s=0; s< allStories.length; s++) {
var allFrames = allStories[s].textContainers;
var lastFrame = allFrames[allFrames.length-1];
if (lastFrame.overflows) {
var firstPara = lastFrame.texts[0].insertionPoints.item(-1).paragraphs[0];
var lastPara = allStories[s].characters.item(-1).paragraphs[0];
try {
allStories[s].paragraphs.itemByRange(firstPara, lastPara).appliedParagraphStyle = paraStyleName;
}
catch (e) {
}
}
}
// das Ende der Aktion verkünden
var dlog = new Window("palette");
dlog.size = [320,100];
dlog.add("statictext", [80, 100, 320, 116], "Fertig.");
dlog.show();
// eine kleine Pause
$.sleep(999);
// das Fenster schliessen
dlog.close();
Skript ist lauffähig ab Version CS5
Verbindung von aufeinanderfolgenden Zahlen durch Bis-Strich (1)
groupSequentiellNum.jsx
Link zur Ursprungsdiskussion im Forum
Gruppiert in einem ausgewählten Textabschnitt (z.B. in einem Register) aufeinanderfolgende, durch Komma (und Leerzeichen) getrennte Zahlen mit einem Bis-Strich:
aus 1, 2, 4, 5, 6
wird 1-2, 4-6.
Siehe auch Verbindung von aufeinanderfolgenden Zahlen durch Bis-Strich (2)
und Gruppierung von aufeinanderfolgenden Zahlen durch f. und ff.
// groupSequentiellNum.jsx
//DESCRIPTION: 1, 2, 4, 5, 6 -> 1-2, 4-6
if (app.selection.length > 0 && app.selection[0].hasOwnProperty ('baseline'))
{
var s = app.selection[0].parentStory;
app.findGrepPreferences = app.changeGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences.findWhat = '\d+, ([\d+, ])+';
var r = s.findGrep();
for ( aLine = r.length-1; aLine >= 0; aLine-- )
r[aLine].contents= checkOneLine ( r[aLine].contents );
}
else
alert('Achtung!\nBitte einen Textabschnitt auswählen.');
function checkOneLine ( aString )
{
var a = aString.split( ', ');
for ( var i = 0; i < aString.length-1; i++ )
{
var k = i +1;
while ( k < aString.length && a[k] == Number( a[k-1] ) + 1)
{
k++;
}
if ( Number(a[k-1]) > Number( a[i] ) )
{
a[i] = a[i] + '?' + a[k-1];
a.splice( i+1, k-1-i );
}
}
return a.join( ', ');
}
Skript ist lauffähig ab Version CS3
Verbindung von aufeinanderfolgenden Zahlen durch Bis-Strich (2)
groupSequentiellNum2.jsx
Link zur Ursprungsdiskussion im Forum
Gruppiert in einem ausgewählten Textabschnitt (z.B. in einem Register) aufeinanderfolgende, durch Komma (und Leerzeichen) getrennte Zahlen mit einem Bis-Strich.
In dieser Version muss die Folge mindestens aus 3 Zahlen bestehen:
aus 1, 2, 4, 5, 6
wird 1, 2, 4-6.
Siehe auch Verbindung von aufeinanderfolgenden Zahlen durch Bis-Strich (1)
und Gruppierung von aufeinanderfolgenden Zahlen durch f. und ff.
// groupSequentiellNum.2jsx
//DESCRIPTION: 1, 2, 4, 5, 6 -> 1, 2, 4-6
if (app.selection.length > 0 && app.selection[0].hasOwnProperty ('baseline'))
{
var s = app.selection[0].parentStory;
app.findGrepPreferences = app.changeGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences.findWhat = '\d+, ([\d+, ])+';
var r = s.findGrep();
for ( aLine = r.length-1; aLine >= 0; aLine-- )
r[aLine].contents= checkOneLine ( r[aLine].contents );
}
else
alert('Achtung!\nBitte einen Textabschnitt auswählen.');
function checkOneLine ( aString )
{
var a = aString.split( ', ');
for ( var i = 0; i < aString.length-1; i++ )
{
var k = i +1;
while ( k < aString.length && a[k] == Number( a[k-1] ) + 1)
{
k++;
}
if ( k > i+2 && Number(a[k-1]) > Number( a[i] ) ) // 1, 2, 4, 5, 6 -> 1, 2, 4-6
// if ( Number(a[k-1]) > Number( a[i] ) ) // 1, 2, 4, 5, 6 -> 1?2, 4-6
{
a[i] = a[i] + '?' + a[k-1];
a.splice( i+1, k-1-i );
}
}
return a.join( ', ');
}
Skript ist lauffähig ab Version CS3
Vertikaler Keil nur bei bestimmten Absatzformaten
vertikalerKeil_xxxl.jsx
Link zur Ursprungsdiskussion im Forum
Hier eine kleine Erweiterung, bei der man den einzelnen zu berücksichtigenden AF noch eine Gewichtung für das Austreiben oben/unten mitgeben kann.
So kann man z.B. bei einem AF angeben, daß oben über das Verhältnis von Abstand oben und unten hinaus stärker gekeilt wird als unten.
Die Definition der Gewichtung sieht so aus:
var myStyles = [
{name:'U1', oben:100, unten:75},
{name:'U2', oben:100, unten:50},
{name:'U3', oben:200, unten:100}
];
Nach den geschwungenen Klammern } muß bis auf die letzte Klammer jeweils ein Komma stehen (nach der letzten Klammmer sollte keines stehen; wenn jedoch eines steht, macht da auch nichts).
Auf name: folgt der Name des AF in Anführungszeichen,
auf oben: die Gewichtung (Prozent) für den Abstand oben und
auf unten: die Gewichtung (Prozent) für den Abstand unten.
Der Normalfall für die Gewichtung sind oben und unten jeweils 100%.
Hat ein zu berücksichtigendes AF einen Abstand oben von 4 mm und unten von 2 mm wird oben und unten im Verhältnis 2:1 (proportional zum bisherigen Abstand) ausgetrieben.
Soll dieses proportionale Verhältnis aufgehoben werden und oben wie unten jeweils derselbe Wert dazuaddiert werden, dann gebe ich in dem Beispiel von oben folgende Werte ein:
{name:'U1', oben:50, unten:100}
Andersherum gesagt wird damit der Skalierungsfaktor oben halbiert. Unten bleibt er erhalten. Bei einem Verhältnis von 4:2 bzw. 2:1 ergibt das ein Skalierungsverhältnis von 1:1.
Soll oben der Skalierungsfaktor verdoppelt werden, so lautet die Definition:
{name:'U1', oben:200, unten:100}
oder
{name:'U1', oben:100, unten:50}
Das Verhältnis bleibt damit innerhalb eines AF gleich. Der Unterschied von {name:'U1', oben:200, unten:100} gegenüber {name:'U1', oben:100, unten:50} liegt im Verhältnis des Skalierungsfaktors zu anderen zu berücksichtigenden AF.
Die Definition der Gewichtung erlaubt also eine Einflußnahme in das Verhältnis von Abstand oben und unten innerhalb eines AF und in das Verhältnis gegenüber den anderen zu berücksichtigen AF.
Nochmal: Der Normalfall für die Gewichtung sind oben und unten jeweils 100%.
Zu Illustrationszwecken spiegelt die Voreinstellung im folgenden Skript nicht den Normalfall wider.
// vertikalerKeil_xxxl.jsx
//DESCRIPTION: bringt die Abstände der Absätze proportional zu den ursrpünglichen Werten ein oder treibt sie aus, um den ausgewählten Textrahmen vertikal zu füllen. Beim Austreiben wird zusätzlich eine Gewichtung des Keils oben und unten berücksichtigt.
// Vor dem Start des Skripts muß ein Textrahmen ausgewählt sein ( sonst läuft nix )
// ===========================================
// Voreinstellungen
// ===========================================
// zum Keilen zu berücksichtigende Absatzformate mit ihren Gewichtungen
var myStyles = [
{name:'U1', oben:100, unten:100},
{name:'U2', oben:100, unten:100},
{name:'03', oben:100, unten:900}
];
var myLimit = 20 // maximaler Keilraum; wenn mehr Raum zum Keilen nötig, erscheint eine Fehlermeldung und weiter passiert nichts
var myInfo = true; // Infokasten mit Angaben zum Keilfaktor erzeugen
// ===========================================
// Ende Voreinstellungen
// ===========================================
// ein Objekt ausgewählt?
if ( app.selection.length > 0 )
{
var myDoc = app.documents[0];
if (myInfo == true)
{
var myLayer = checkLayer( "Faktor vertikaler Keil" );
var myOS = checkOS( "Faktor vertikaler Keil" );
}
main( );
}
else
alert( "Welcher Textrahmen darf's denn sein?" )
function main( )
{
// Schleife für mehrere Objekte
for ( var i = 0; i < app.selection.length; i++ )
{
// ist das Objekt ein Textrahmen
if ( app.selection[i].constructor.name == "TextFrame" )
doFrame( app.selection[i] );
else
alert( "Fehler \nKeinen Textrahmen erwischt, \nsondern ( in english ) \"" + app.selection[i].constructor.name + "\"!" )
}
}
// -----------------------------------------------------------
// Abarbeitung eines Textrahmens
// -----------------------------------------------------------
function doFrame( myFrame )
{
var myPs = myFrame.paragraphs;
// untere Textrahmenkante
var myPage = app.activeWindow.activePage;
// Wenn die untere Textrahmenkante über dem unteren Seitenrand liegt, dann ist diese die Bezugslinie zum Austreiben
if ( ( myFrame.geometricBounds[2] < myDoc.documentPreferences.pageHeight - myPage.marginPreferences.bottom ) )
var myBottom = myFrame.geometricBounds[2];
// Wenn die untere Textrahmenkante auf dem unteren Seitenrand oder darunter liegt,
// dann ist der untere Seitenrand die Bezugslinie zum Austreiben
else
var myBottom = myDoc.documentPreferences.pageHeight - myPage.marginPreferences.bottom;
// Grundlinie letzte Zeile
if (myFrame.lines.length > 1)
{
var myBaseline = myFrame.lines[-1].characters[1].baseline;
var myDiff = myBottom - myBaseline;
var mySpace = getSpace ( myPs );
if ( ( myDiff*-1 > mySpace ) || ( myDiff > myLimit ) )
alert( "Sorry!\rZu wenig Raum, um den Text einzubringen. - " + myDiff );
else
doWedge( myFrame, myPs, myDiff, mySpace, myBottom );
}
}
// -----------------------------------------------------------
// zu keilenden Raum berechnen
// -----------------------------------------------------------
function getSpace( p )
{
var aSpace = 0;
// Addition der Abstände VOR den Absätzen
// der Abstand des ersten Absatzes wird nicht berücksichtigt
for ( var oneP = 1; oneP < p.length; oneP++ )
if (checkStyle( p[oneP] ) )
aSpace += p[oneP].spaceBefore * checkStyle( p[oneP] ).oben/100;
// Addition der Abstände NACH den Absätzen
// der Abstand des letzten Absatzes wird nicht berücksichtigt
for ( var oneP = 0; oneP < p.length-1; oneP++ )
if (checkStyle( p[oneP] ) )
aSpace += p[oneP].spaceAfter * checkStyle( p[oneP] ).unten/100;
return aSpace;
}
// -----------------------------------------------------------
// Keilen
// -----------------------------------------------------------
function doWedge( myFrame, myPs, aDiff, aSpace, myBottom )
{
// Berechnung des Zuschlagfaktors
var myFactor = aDiff/aSpace
//alert( myFactor );
// Proportionale Verteilung des zu verteilenden Raums auf die Abstände VOR den Absätzen
// erweitert wird nur dort, wo bereits Abstand drin ist
// der Abstand des ersten Absatzes wird nicht berücksichtigt
for ( oneP = 1; oneP < myPs.length; oneP++ )
if ( myPs[oneP].spaceBefore > 0 && checkStyle( myPs[oneP] ) )
myPs[oneP].spaceBefore += myPs[oneP].spaceBefore*myFactor*checkStyle( myPs[oneP] ).oben/100;
// Proportionale Verteilung des zu verteilenden Raums auf die Abstände NACH den Absätzen
// erweitert wird nur dort, wo bereits Abstand drin ist
// der Abstand des letzten Absatzes wird nicht berücksichtigt
for ( oneP = 0; oneP < myPs.length-1; oneP++ )
if ( myPs[oneP].spaceAfter > 0 && checkStyle(myPs[oneP] ) )
myPs[oneP].spaceAfter += myPs[oneP].spaceAfter*myFactor*checkStyle( myPs[oneP] ).unten/100;
// Setzt die untere Rahmenkante an den unteren Satzspiegelrand
myGB = myFrame.geometricBounds =
[ myFrame.geometricBounds[0],
myFrame.geometricBounds[1],
myBottom,
myFrame.geometricBounds[3] ];
if (myInfo == true)
makeInfo( myFactor, myFrame.parent );
}
// -----------------------------------------------------------
// Inforahmen für Factor erzeugen
// -----------------------------------------------------------
function makeInfo ( aFactor, aPage )
{
// Erzeugt Inforahmen
myFactorFrame = aPage.textFrames.add( {
contents: String( aFactor ),
geometricBounds:[myGB[0]-4, myGB[1], myGB[0], myGB[3]],
itemLayer:myLayer} );
myFactorFrame.applyObjectStyle( myOS, true );
}
// -----------------------------------------------------------
// Verfügbarkeit einer Ebene prüfen
// -----------------------------------------------------------
function checkLayer( aName )
{
try
{
theLayer = app.activeDocument.layers.item( aName ).name;
}
catch ( e )
{
theLayer = app.activeDocument.layers.add( {name:aName, visible:false} );
}
return theLayer;
}
// -----------------------------------------------------------
// Verfügbarkeit eines Objektstils prüfen
// -----------------------------------------------------------
function checkOS( aName )
{
try
{
app.activeDocument.objectStyles.item( aName ).name;
var theOS = app.activeDocument.objectStyles.item( aName );
}
catch ( e )
{
var theOS = app.activeDocument.objectStyles.add( {name:aName} );
}
return theOS;
}
// ----------------------------------------------------------------------------------------------------------------------
// Prüfen, ob zugewiesenes Absatzformat in der Liste der zu berücksichtigenden AFs genannt
// ----------------------------------------------------------------------------------------------------------------------
function checkStyle ( aPar )
{
for ( var k = 0; k < myStyles.length; k++ )
if ( aPar.appliedParagraphStyle.name == myStyles[k].name )
return myStyles[k];
return false;
}
Mit einer Definition wie {name:'U1', oben:100, unten:0}, also 0 für Gewichtung unten, ist zu erreichen, daß unten nicht gekeilt wird.
Martin Fischer
Skript ist lauffähig ab Version CS2
Vertikaler Keil nur bei bestimmten Absatzformaten
vertikalerKeil_xxxl02.jsx
Link zur Ursprungsdiskussion im Forum
Aus gegebenem Anlass (Script Vertikaler Keil) hier eine Version des Skripts, die Lineal und Nullpunkt den Anforderungen entsprechend einstellt und am Ende des Skripts wieder die Ausgangsposition herstellt.
Ansonsten gilt wie in vertikalerKeil_xxxl.jsx:
Hier eine kleine Erweiterung, bei der man den einzelnen zu berücksichtigenden AF noch eine Gewichtung für das Austreiben oben/unten mitgeben kann.
So kann man z.B. bei einem AF angeben, daß oben über das Verhältnis von Abstand oben und unten hinaus stärker gekeilt wird als unten.
Die Definition der Gewichtung sieht so aus:
var myStyles = [
{name:'U1', oben:100, unten:75},
{name:'U2', oben:100, unten:50},
{name:'U3', oben:200, unten:100}
];
Nach den geschwungenen Klammern } muß bis auf die letzte Klammer jeweils ein Komma stehen (nach der letzten Klammmer sollte keines stehen; wenn jedoch eines steht, macht da auch nichts).
Auf name: folgt der Name des AF in Anführungszeichen,
auf oben: die Gewichtung (Prozent) für den Abstand oben und
auf unten: die Gewichtung (Prozent) für den Abstand unten.
Der Normalfall für die Gewichtung sind oben und unten jeweils 100%.
Hat ein zu berücksichtigendes AF einen Abstand oben von 4 mm und unten von 2 mm wird oben und unten im Verhältnis 2:1 (proportional zum bisherigen Abstand) ausgetrieben.
Soll dieses proportionale Verhältnis aufgehoben werden und oben wie unten jeweils derselbe Wert dazuaddiert werden, dann gebe ich in dem Beispiel von oben folgende Werte ein:
{name:'U1', oben:50, unten:100}
Andersherum gesagt wird damit der Skalierungsfaktor oben halbiert. Unten bleibt er erhalten. Bei einem Verhältnis von 4:2 bzw. 2:1 ergibt das ein Skalierungsverhältnis von 1:1.
Soll oben der Skalierungsfaktor verdoppelt werden, so lautet die Definition:
{name:'U1', oben:200, unten:100}
oder
{name:'U1', oben:100, unten:50}
Das Verhältnis bleibt damit innerhalb eines AF gleich. Der Unterschied von {name:'U1', oben:200, unten:100} gegenüber {name:'U1', oben:100, unten:50} liegt im Verhältnis des Skalierungsfaktors zu anderen zu berücksichtigenden AF.
Die Definition der Gewichtung erlaubt also eine Einflußnahme in das Verhältnis von Abstand oben und unten innerhalb eines AF und in das Verhältnis gegenüber den anderen zu berücksichtigen AF.
Nochmal: Der Normalfall für die Gewichtung sind oben und unten jeweils 100%.
Zu Illustrationszwecken spiegelt die Voreinstellung im folgenden Skript nicht den Normalfall wider.
// vertikalerKeil_xxxl02.jsx
//DESCRIPTION: bringt die Abstände der Absätze proportional zu den ursrpünglichen Werten ein oder treibt sie aus, um den ausgewählten Textrahmen vertikal zu füllen. Beim Austreiben wird zusätzlich eine Gewichtung des Keils oben und unten berücksichtigt.
// Vor dem Start des Skripts muß ein Textrahmen ausgewählt sein ( sonst läuft nix )
// ===========================================
// Voreinstellungen
// ===========================================
// zum Keilen zu berücksichtigende Absatzformate mit ihren Gewichtungen
var myStyles = [
{name:'U1', oben:100, unten:75},
{name:'U2', oben:100, unten:50},
{name:'U3', oben:200, unten:100}
];
var myLimit = 12; // maximaler Keilraum; wenn mehr Raum zum Keilen nötig, erscheint eine Fehlermeldung und weiter passiert nichts
var myInfo = false; // Infokasten mit Angaben zum Keilfaktor erzeugen
// ===========================================
// Ende Voreinstellungen
// ===========================================
// ein Objekt ausgewählt?
if ( app.selection.length > 0 )
{
var myDoc = app.documents[0];
var myOldProps = storeProps();
if (myInfo == true)
{
var myLayer = checkLayer( "Faktor vertikaler Keil" );
var myOS = checkOS( "Faktor vertikaler Keil" );
}
main( );
restoreProps( myOldProps );
}
else
alert( "Welcher Textrahmen darf's denn sein?" )
function main( )
{
// Schleife für mehrere Objekte
for ( var myObject = 0; myObject < app.selection.length; myObject++ )
{
// ist das Objekt ein Textrahmen
if ( app.selection[0].constructor.name == "TextFrame" )
doFrame( app.selection[0] );
else
alert( "Fehler \nKeinen Textrahmen erwischt, \nsondern ( in english ) \"" + app.selection[0].constructor.name + "\"!" )
}
}
// -----------------------------------------------------------
// Abarbeitung eines Textrahmens
// -----------------------------------------------------------
function doFrame( myFrame )
{
var myPs = myFrame.paragraphs;
// untere Textrahmenkante
var myPage = app.activeWindow.activePage;
// Wenn die untere Textrahmenkante über dem unteren Seitenrand liegt, dann ist diese die Bezugslinie zum Austreiben
if ( ( myFrame.geometricBounds[2] < myDoc.documentPreferences.pageHeight - myPage.marginPreferences.bottom ) )
var myBottom = myFrame.geometricBounds[2];
// Wenn die untere Textrahmenkante auf dem unteren Seitenrand oder darunter liegt,
// dann ist der untere Seitenrand die Bezugslinie zum Austreiben
else
var myBottom = myDoc.documentPreferences.pageHeight - myPage.marginPreferences.bottom;
// Grundlinie letzte Zeile
var myBaseline = myFrame.lines[-1].characters[1].baseline;
var myDiff = myBottom - myBaseline;
var mySpace = getSpace ( myPs );
if ( ( myDiff*-1 > mySpace ) || ( myDiff > myLimit ) )
alert( "Sorry!\rZu wenig Raum, um den Text einzubringen. - " + myDiff );
else
doWedge( myFrame, myPs, myDiff, mySpace, myBottom );
}
// -----------------------------------------------------------
// zu keilenden Raum berechnen
// -----------------------------------------------------------
function getSpace( p )
{
var aSpace = 0;
// Addition der Abstände VOR den Absätzen
// der Abstand des ersten Absatzes wird nicht berücksichtigt
for ( var oneP = 1; oneP < p.length; oneP++ )
if (checkStyle( p[oneP] ) )
aSpace += p[oneP].spaceBefore * checkStyle( p[oneP] ).oben/100;
// Addition der Abstände NACH den Absätzen
// der Abstand des letzten Absatzes wird nicht berücksichtigt
for ( var oneP = 0; oneP < p.length-1; oneP++ )
if (checkStyle( p[oneP] ) )
aSpace += p[oneP].spaceAfter * checkStyle( p[oneP] ).unten/100;
return aSpace;
}
// -----------------------------------------------------------
// Keilen
// -----------------------------------------------------------
function doWedge( myFrame, myPs, aDiff, aSpace, myBottom )
{
// Berechnung des Zuschlagfaktors
var myFactor = aDiff/aSpace
//alert( myFactor );
// Proportionale Verteilung des zu verteilenden Raums auf die Abstände VOR den Absätzen
// erweitert wird nur dort, wo bereits Abstand drin ist
// der Abstand des ersten Absatzes wird nicht berücksichtigt
for ( oneP = 1; oneP < myPs.length; oneP++ )
if ( myPs[oneP].spaceBefore > 0 && checkStyle( myPs[oneP] ) )
myPs[oneP].spaceBefore += myPs[oneP].spaceBefore*myFactor*checkStyle( myPs[oneP] ).oben/100;
// Proportionale Verteilung des zu verteilenden Raums auf die Abstände NACH den Absätzen
// erweitert wird nur dort, wo bereits Abstand drin ist
// der Abstand des letzten Absatzes wird nicht berücksichtigt
for ( oneP = 0; oneP < myPs.length-1; oneP++ )
if ( myPs[oneP].spaceAfter > 0 && checkStyle(myPs[oneP] ) )
myPs[oneP].spaceAfter += myPs[oneP].spaceAfter*myFactor*checkStyle( myPs[oneP] ).unten/100;
// Setzt die untere Rahmenkante an den unteren Satzspiegelrand
myGB = myFrame.geometricBounds =
[ myFrame.geometricBounds[0],
myFrame.geometricBounds[1],
myBottom,
myFrame.geometricBounds[3] ];
if (myInfo == true)
makeInfo( myFactor, myFrame.parent );
}
// -----------------------------------------------------------
// Inforahmen für Factor erzeugen
// -----------------------------------------------------------
function makeInfo ( aFactor, aPage )
{
// Erzeugt Inforahmen
myFactorFrame = aPage.textFrames.add( {
contents: String( aFactor ),
geometricBounds:[myGB[0]-4, myGB[1], myGB[0], myGB[3]],
itemLayer:myLayer} );
myFactorFrame.applyObjectStyle( myOS, true );
}
// -----------------------------------------------------------
// Verfügbarkeit einer Ebene prüfen
// -----------------------------------------------------------
function checkLayer( aName )
{
try
{
theLayer = app.activeDocument.layers.item( aName ).name;
}
catch ( e )
{
theLayer = app.activeDocument.layers.add( {name:aName, visible:false} );
}
return theLayer;
}
// -----------------------------------------------------------
// Verfügbarkeit eines Objektstils prüfen
// -----------------------------------------------------------
function checkOS( aName )
{
try
{
app.activeDocument.objectStyles.item( aName ).name;
var theOS = app.activeDocument.objectStyles.item( aName );
}
catch ( e )
{
var theOS = app.activeDocument.objectStyles.add( {name:aName} );
}
return theOS;
}
// ----------------------------------------------------------------------------------------------------------------------
// Prüfen, ob zugewiesenes Absatzformat in der Liste der zu berücksichtigenden AFs genannt
// ----------------------------------------------------------------------------------------------------------------------
function checkStyle ( aPar )
{
for ( var k = 0; k < myStyles.length; k++ )
if ( aPar.appliedParagraphStyle.name == myStyles[k].name )
return myStyles[k];
return false;
}
// ----------------------------------------------------------------------------------------------------------------------
// Lineal und Nullpunkt einstellen
// ----------------------------------------------------------------------------------------------------------------------
function storeProps()
{
with ( app.activeDocument )
{
var myHorizontalMeasurementUnits = viewPreferences.horizontalMeasurementUnits;
var myVerticalMeasurementUnits = viewPreferences.verticalMeasurementUnits;
var myRulerOrigin = viewPreferences.rulerOrigin;
var myZeroPoint = zeroPoint;
viewPreferences.horizontalMeasurementUnits = MeasurementUnits.MILLIMETERS;
viewPreferences.verticalMeasurementUnits = MeasurementUnits.MILLIMETERS;
viewPreferences.rulerOrigin = RulerOrigin.pageOrigin;
zeroPoint = [0,0];
}
return { h:myHorizontalMeasurementUnits, v:myVerticalMeasurementUnits, r:myRulerOrigin, z:myZeroPoint }
}
// ----------------------------------------------------------------------------------------------------------------------
// Lineal und Nullpunkt zurückstellen
// ----------------------------------------------------------------------------------------------------------------------
function restoreProps ( p )
{
with ( app.activeDocument )
{
viewPreferences.horizontalMeasurementUnits = p.h;
viewPreferences.verticalMeasurementUnits = p.v;
viewPreferences.rulerOrigin = p.r;
zeroPoint = p.z;
}
}
Skript ist lauffähig ab Version CS2
Vertikaler Keil nur bei bestimmten Absatzformaten
vertikalerKeil_xxl.jsx
Link zur Ursprungsdiskussion im Forum
In Vertikaler Keil - Austreiben wurde eine Erweiterung des Skripts vertikalerKeil_xl.jsx angefragt. Es sollte nur bei Absätzen, die mit einem bestimmten Absatzformat ausgezeichnet sind, ausgetrieben werden.
// vertikalerKeil_xxl.jsx
//DESCRIPTION: bringt die Abstände der mit bestimmten Absatzformaten ausgezeichneten Absätze proportional zu den ursrpünglichen Werten ein oder treibt sie aus, um den ausgewählten Textrahmen vertikal zu füllen.
// Vor dem Start des Skripts muß ein Textrahmen ausgewählt sein ( sonst läuft nix )
// ===========================================
// Voreinstellungen
// ===========================================
var myStyles = ['U1', 'U2']; // zum Keilen zu berücksichtigende Absatzformate
var myLimit = 10; // maximaler Keilraum; wenn mehr Raum zum Keilen nötig, erscheint eine Fehlermeldung und weiter passiert nichts
var myInfo = false; // Infokasten mit Angaben zum Keilfaktor erzeugen
// ===========================================
// Ende Voreinstellungen
// ===========================================
// ein Objekt ausgewählt?
if ( app.selection.length > 0 )
{
var myDoc = app.documents[0];
if (myInfo == true)
{
var myLayer = checkLayer( "Faktor vertikaler Keil" );
var myOS = checkOS( "Faktor vertikaler Keil" );
}
main( );
}
else
alert( "Welcher Textrahmen darf's denn sein?" )
function main( )
{
// Schleife für mehrere Objekte
for ( var myObject = 0; myObject < app.selection.length; myObject++ )
{
// ist das Objekt ein Textrahmen
if ( app.selection[0].constructor.name == "TextFrame" )
doFrame( app.selection[0] );
else
alert( "Fehler \nKeinen Textrahmen erwischt, \nsondern ( in english ) \"" + app.selection[0].constructor.name + "\"!" )
}
}
// -----------------------------------------------------------
// Abarbeitung eines Textrahmens
// -----------------------------------------------------------
function doFrame( myFrame )
{
var myPs = myFrame.paragraphs;
// untere Textrahmenkante
var myPage = app.activeWindow.activePage;
// Wenn die untere Textrahmenkante über dem unteren Seitenrand liegt, dann ist diese die Bezugslinie zum Austreiben
if ( ( myFrame.geometricBounds[2] < myDoc.documentPreferences.pageHeight - myPage.marginPreferences.bottom ) )
var myBottom = myFrame.geometricBounds[2];
// Wenn die untere Textrahmenkante auf dem unteren Seitenrand oder darunter liegt,
// dann ist der untere Seitenrand die Bezugslinie zum Austreiben
else
var myBottom = myDoc.documentPreferences.pageHeight - myPage.marginPreferences.bottom;
// Grundlinie letzte Zeile
var myBaseline = myFrame.lines[-1].characters[1].baseline;
var myDiff = myBottom - myBaseline;
var mySpace = getSpace ( myPs );
if ( ( myDiff*-1 > mySpace ) || ( myDiff > myLimit ) )
alert( "Sorry!\rZu wenig Raum, um den Text einzubringen. - " + myDiff );
else
doWedge( myFrame, myPs, myDiff, mySpace, myBottom );
}
// -----------------------------------------------------------
// zu keilenden Raum berechnen
// -----------------------------------------------------------
function getSpace( p )
{
var aSpace = 0;
// Addition der Abstände VOR den Absätzen
// der Abstand des ersten Absatzes wird nicht berücksichtigt
for ( var oneP = 1; oneP < p.length; oneP++ )
if (checkStyle( p[oneP] ) )
aSpace += p[oneP].spaceBefore;
// Addition der Abstände NACH den Absätzen
// der Abstand des letzten Absatzes wird nicht berücksichtigt
for ( var oneP = 0; oneP < p.length-1; oneP++ )
if (checkStyle( p[oneP] ) )
aSpace += p[oneP].spaceAfter;
return aSpace;
}
// -----------------------------------------------------------
// Keilen
// -----------------------------------------------------------
function doWedge( myFrame, myPs, aDiff, aSpace, myBottom )
{
// Berechnung des Zuschlagfaktors
var myFactor = aDiff/aSpace
//alert( myFactor );
// Proportionale Verteilung des zu verteilenden Raums auf die Abstände VOR den Absätzen
// erweitert wird nur dort, wo bereits Abstand drin ist
// der Abstand des ersten Absatzes wird nicht berücksichtigt
for ( oneP = 1; oneP < myPs.length; oneP++ )
if ( myPs[oneP].spaceBefore > 0 && checkStyle( myPs[oneP] ) )
myPs[oneP].spaceBefore += myPs[oneP].spaceBefore*myFactor
// Proportionale Verteilung des zu verteilenden Raums auf die Abstände NACH den Absätzen
// erweitert wird nur dort, wo bereits Abstand drin ist
// der Abstand des letzten Absatzes wird nicht berücksichtigt
for ( oneP = 0; oneP < myPs.length-1; oneP++ )
if ( myPs[oneP].spaceAfter > 0 && checkStyle(myPs[oneP] ) )
myPs[oneP].spaceAfter += myPs[oneP].spaceAfter*myFactor
// Setzt die untere Rahmenkante an den unteren Satzspiegelrand
myGB = myFrame.geometricBounds =
[ myFrame.geometricBounds[0],
myFrame.geometricBounds[1],
myBottom,
myFrame.geometricBounds[3] ];
if (myInfo == true)
makeInfo( myFactor, myFrame.parent );
}
// -----------------------------------------------------------
// Inforahmen für Factor erzeugen
// -----------------------------------------------------------
function makeInfo ( aFactor, aPage )
{
// Erzeugt Inforahmen
myFactorFrame = aPage.textFrames.add( {
contents: String( aFactor ),
geometricBounds:[myGB[0]-4, myGB[1], myGB[0], myGB[3]],
itemLayer:myLayer} );
myFactorFrame.applyObjectStyle( myOS, true );
}
// -----------------------------------------------------------
// Verfügbarkeit einer Ebene prüfen
// -----------------------------------------------------------
function checkLayer( aName )
{
try
{
theLayer = app.activeDocument.layers.item( aName ).name;
}
catch ( e )
{
theLayer = app.activeDocument.layers.add( {name:aName, visible:false} );
}
return theLayer;
}
// -----------------------------------------------------------
// Verfügbarkeit eines Objektstils prüfen
// -----------------------------------------------------------
function checkOS( aName )
{
try
{
app.activeDocument.objectStyles.item( aName ).name;
var theOS = app.activeDocument.objectStyles.item( aName );
}
catch ( e )
{
var theOS = app.activeDocument.objectStyles.add( {name:aName} );
}
return theOS;
}
// ----------------------------------------------------------------------------------------------------------------------
// Prüfen, ob zugewiesenes Absatzformat in der Liste der zu berücksichtigenden AFs genannt
// ----------------------------------------------------------------------------------------------------------------------s
function checkStyle ( aPar )
{
for ( var k = 0; k < myStyles.length; k++ )
if ( aPar.appliedParagraphStyle.name == myStyles[k] )
return true;
return false;
}
Bei den Voreinstellungen können bestimmte Parameter für die Ausführung des Skripts gesetzt:
1. Namen der zum zum Keilen zu berücksichtigende Absatzformate
var myStyles = ['U1', 'U2'];
2. maximaler Keilraum (mm); wenn mehr Raum zum Keilen nötig, erscheint eine Fehlermeldung und weiter passiert nichts
var myLimit = 10;
3. Infokasten mit Angaben zum Keilfaktor erzeugen
('true' zum Erzeugen der Info, 'false' zum Unterlassen)
var myInfo = false;
Mit den aktuellen Voreinstellungen wird nur bei Absätzen mit den Formaten 'U1' und 'U' gekeilt.
Beträgt der Abstand zwischen der Grundlinie der letzten Zeile zum unteren Satzspiegel mehr als 10 mm, erscheint eine Fehlermeldung und es wird nicht gekeilt.
Es wird kein Infokasten erzeugt.
Martin Fischer
Skript ist lauffähig ab Version CS2
Verwendete Zeichen einer Schrift im Dokument ermitteln
usedCharsOfAppliedFont.jsx
Link zur Ursprungsdiskussion im Forum
Welche Zeichen einer Schrift kommen in einem Dokument überhaupt vor?
Das folgende Skript ermittelt die Zeichen, die mit einer ausgewählten Schrift ausgezeichnet sind und gibt das Ergebnis in einem Textrahmen auf der Montagefläche links neben der ersten Seite des Dokuments aus.
Aus technischen Gründen können allerdings die Zeichen von fehlenden Schriften nicht ermittelt werden. Im Skript wurde zur Ermittlung der Zeichen die Suchmethode findText() verwendet und InDesign erlaubt per Skript nur die Suche nach aktiven Fonts.
// usedCharsOfAppliedFont.jsx
//DESCRIPTION:Erstellt eine Übersicht über die in einem Dokument verwendeten Zeichen eines ausgewählten Fonts.
// 01.04.2009
// Prototype zum Löschen von redundanten Werten in einem Array
// http://www.constructors.de/array-prototype-gleiche-werte-aus-einem-array-loeschen-4-42.html
Array.prototype.array_unique = function () {
var value = index = [];
for ( var x = 0; x < this.length; ++x ) {
if ( index[this[x]] == null ) {
value[value.length] = this[x];
} index[this[x]] = this[x];
} return value;
};
// -----------------------------------------------------------------------------------------------------------------
// Hauptprogramm
// -----------------------------------------------------------------------------------------------------------------
var d = app.activeDocument;
var myFont = getFont( d );
var myArray = new Array();
var l = 'FuzzyInfo'; // Label für Inforahmen
// Inforahmen löschen (falls vorhanden)
try {
d.textFrames.item( l ).remove()
}
catch( e ){};
app.findTextPreferences = null;
app.findTextPreferences.appliedFont = myFont;
// Vorkommen der Schrift ermitteln und Inhalte ( Text ) sammeln
var myResult = d.findText();
for ( var i = myResult.length-1; i >= 0; i-- ) {
myArray.push( myResult[i].contents );
}
var myString = myArray.join( '' ) ;
// gefundenen Text in Zeichen auflösen
var myChars = new Array;
for ( var i = myString.length-1; i >= 0; i-- ) {
myChars.push( myString[i] );
}
// Zeichenwiederholung reduzieren/löschen
var newString = myChars.array_unique();
// ermittelte Zeichen sortieren
newString.sort();
// ermittelte Zeichen ausgeben
makeInfoFrame( myFont.name + '\r' + newString.join( '\r' ) );
// -----------------------------------------------------------------------------------------------------------------
// Funktionen
// -----------------------------------------------------------------------------------------------------------------
// Textrahmen zur Ausgabe der Information erstellen
function makeInfoFrame ( aData )
{
var t = d.textFrames.add(
{
contents: aData,
geometricBounds: [0, -100, d.documentPreferences.pageHeight, 0],
label: l,
fillColor: 'Black',
fillTint:15,
} )
with ( t.parentStory )
{
leftIndent = 0;
firstLineIndent = 0;
justification = Justification.LEFT_ALIGN;
texts.firstItem().appliedFont = myFont;
}
t.lines.firstItem().appliedFont = d.paragraphStyles.firstItem().appliedFont;
t.lines.firstItem().spaceAfter = '10 pt';
zoomObject( t.lines.firstItem() );
}
// Objekt heranzoomen
function zoomObject ( myObject ) {
app.select( myObject,SelectionOptions.replaceWith );
app.activeWindow.zoomPercentage = 300; // Zoomfaktor
app.selection = null;
}
// Dialog zur Auswahl eines Fonts
function getFont( d ){
var myDialog = app.dialogs.add( {name:"Auswahl Schrift"} );
var myFonts = new Array;
for ( var f = 0; f < d.fonts.length; f++ ) {
if (d.fonts.item(f).status == FontStatus.INSTALLED)
myFonts.push(d.fonts.item(f).name);
}
with( myDialog.dialogColumns.add() ){
with( dialogRows.add() ){
var myDropDown = dropdowns.add( {stringList: myFonts, selectedIndex:0} );
}
}
var myResult = myDialog.show();
if( myResult == true ){
var aFont = d.fonts.item( myFonts[myDropDown.selectedIndex] );
myDialog.destroy();
}
else{
myDialog.destroy();
exit()
}
return aFont;
}
Skript ist lauffähig ab Version CS3
Verwendung von Textvariablen im Text anzeigen
showTextvariableInstances.jsx
Link zur Ursprungsdiskussion im Forum
Mit diesem Skript ist es möglich, sich die Verwendung von Textvariablen im Text anzeigen zu lassen.
Nach Start des Skripts wird eine Textvariable aus einer DropDown-Liste ausgewählt. Dann werden die entsprechenden Fundstellen mit Angaben zu Seite und Inhalt der Textvariable aufgelistet.
Durch Klick auf eine Fundstelle in der Liste wird die Fundstelle im Text ausgewählt und herangezoomt.
Das Bildschirmfoto zeigt die Palette nach Auswahl der Textvariable mein Text und nach Klick auf den letzten Eintrag mit der Seitenangabe 94 und dem Inhalt der Variable Hallo Welt!.
/*
showTextvariableInstances.jsx
//DESCRIPTION:Zeigt und verweist auf die Verwendung von Textvariablen im Dokument.
VERSION: 0.2
AUTHOR: Martin Fischer
EMAIL: InDesign@MartinFischer.de
DATE: 27.2.2012
NEW: Nur verwendete Textvariablen werden in die Liste aufgenommen; Liste wird aktualisiert, sobald sie den Fokus erhält
*/
#targetengine "session"
main();
function main()
{
var d = app.activeDocument;
var d_name = d.name;
the_result_panel([], [], undefined, d, d_name);
}
function the_result_panel ( obj_array, content_array, dd_sel, d, d_name )
{
// Maße für die Listenboxen
var p_height = 300;
var p_width = 200;
// erzeuge Palette
if (a_palette == undefined)
var a_palette = new Window ( 'palette {properties:{ closeOnKey:?OSCmnd+W?, resizeable:false, maximizeButton:false, minimizeButton:false , closeButton:true}}', 'Textvariable' ) ;
with ( a_palette )
{
window.orientation = 'row';
window.alignment = 'top';
location = [d.layoutWindows.firstItem().bounds[3]-p_width-50, d.layoutWindows.firstItem().bounds[0] +17];
gr = add ( 'group' ) ;
gr.orientation = 'column';
var tv_list = get_list(d);
gr.drop_down = gr.add ( 'dropdownlist', undefined, tv_list); //, {enterKeySignalsOnChange:true}) ;
if (dd_sel != undefined)
gr.drop_down.selection = dd_sel;
gr.listbox_inst = gr.add ( 'listbox', [0, 0, p_width, p_height], '', {items : content_array } ) ;
gr.button_group_act = gr.add ( 'button', undefined, 'Aktualisieren' ) ;
gr.button_group_close = gr.add ( 'button', undefined, 'Schließen' ) ;
// Aktualisieren
gr.button_group_act.onClick = function ()
{
var t_var = app.activeDocument.textVariables.itemByName(gr.drop_down.selection.text);
var result = look_for_instances(t_var);
var obj_array = result.object;
var content_array = result.contents;
var t_var_name = result.name;
var new_dd_sel = gr.drop_down.selection.index;
a_palette.close();
the_result_panel(obj_array, content_array, new_dd_sel, d, d_name);
//~ obj_array = set_listitems(gr, d.textVariables.itemByName(gr.drop_down.selection.text) );
}
// Schließen
gr.button_group_close.onClick = function () {a_palette.close();}
// Reaktion auf Änderung im dropDown-Feld
gr.drop_down.onChange = function ()
{
activate_doc(d_name, a_palette);
obj_array = set_listitems(gr, d.textVariables.itemByName(gr.drop_down.selection.text) );
}
// Reaktion auf Wechsel der Auswahl in der Liste
gr.listbox_inst.onChange = function ()
{
activate_doc(d_name, a_palette);
if ( this.selection != null )
selectIt ( obj_array [ this.selection.index] , a_palette) ;
}
//~ gr.drop_down.onActivate = function ()
//~ {
//~ try {
//~ gr.drop_down.removeAll();
//~ var tv_list = check_dropdownitems(gr, d);
//~ } catch(e){$.writeln( e)}
//~ }
// Fokus auf Liste
gr.listbox_inst.onActivate = function ()
{
if (gr.drop_down.selection != null && obj_array.length > 0)
{
try{
activate_doc(d_name, a_palette);
if (gr.listbox_inst.items.length >= d.textVariables.itemByName(gr.drop_down.selection.text).associatedInstances.length)
{
obj_array = set_listitems(gr, d.textVariables.itemByName(gr.drop_down.selection.text) );
}
} catch(e) { alert( e ); }
}
}
// zeige die Palette an
show () ;
}
return a_palette;
}
function set_listitems(gr, t_var)
{
gr.listbox_inst.removeAll();
var result = look_for_instances(t_var);
for (var i = 0; i < result.contents.length; i++)
gr.listbox_inst.add('item', result.contents[i]);
return result.object;
}
function check_dropdownitems(gr, d)
{
gr.drop_down.removeAll();
var list_array = get_list(d);
for (var i = 0; i < list_array.length; i++)
gr.drop_down.add('item', list_array[i]);
return list_array;
}
function activate_doc(d_name, a_palette)
{
if (app.activeDocument.name != d_name, a_palette)
{
// Fokus auf das Dokument, aus dem die Textvariablen stammen
if (app.documents.itemByName(d_name).isValid)
app.documents.itemByName(d_name).windows.firstItem().bringToFront();
else
{
a_palette.close();
exit();
}
}
}
function get_list(d)
{
var list_array = d.textVariables.everyItem().name;
for (var i = list_array.length-1; i>= 0; i--)
{
// Entfernen von unbenutzten Textvariablen, Kapitelnummer und Seitennummer aus der Liste
if (d.textVariables.itemByName(list_array[i]).associatedInstances.length == 0 || list_array[i] == 'TV XRefChapterNumber' || list_array[i] == 'TV XRefPageNumber')
{
list_array.splice(i,1);
}
}
return list_array;
}
function look_for_instances(t_var)
{
var result_array = new Array;
var cont_array = new Array;
var obj_array = new Array;
for (var i = 0; i < t_var.associatedInstances.length; i++)
{
switch(t_var.associatedInstances[i].storyOffset.parent.constructor.name)
{
case 'Story':
case 'Cell':
case 'Footnote':
var obj = t_var.associatedInstances[i].storyOffset.parent.characters.item(t_var.associatedInstances[i].storyOffset.index);
break;
case 'Note':
var obj = t_var.associatedInstances[i].storyOffset.parent.storyOffset;
break;
case 'TextFrame':
var obj = t_var.associatedInstances[i].storyOffset.parent;
break;
case 'XmlStory':
case 'Change':
var obj = null;
break;
default:
var obj = t_var.associatedInstances[i].storyOffset;
} // switch
if (obj != null)
{
var pg = findPage(obj);
if (pg != null)
{
result_array.push ({object: obj, page: pg.name, contents: t_var.associatedInstances[i].resultText});
} // if (pg != null)
} // if (obj != null)
} // for
result_array.sort(numsort);
for (var x = 0; x < result_array.length; x++)
{
cont_array.push(result_array[x].page + ':\t' + result_array[x].contents);
obj_array.push(result_array[x].object);
}
return {object:obj_array, contents:cont_array, name:t_var.name};
}
function numsort(a, b)
{
return Number(a.page) - Number(b.page);
}
function selectIt ( the_obj, a_palette )
{
// Selects object, turns to page and zooms in on it
var the_zoom = app.activeWindow.zoomPercentage;
if (the_obj != null)
{
app.select ( the_obj,SelectionOptions.replaceWith ) ;
app.activeWindow.zoomPercentage = 800; the_zoom;
}
else // Verabschiedung
{
alert('Wort nicht mehr greifbar!');
a_palette.close();
}
}
// findPage()-Funktion von Gregor Fellenz
// 27.7.2010
// http://forums.adobe.com/message/3003131#3003131
function findPage( theObj )
{
if ( theObj.hasOwnProperty( "baseline" ) )
{
theObj = theObj.parentTextFrames[0];
}
while ( theObj != null )
{
if ( theObj.hasOwnProperty ( "parentPage" ) )
return theObj.parentPage;
var whatIsIt = theObj.constructor;
switch ( whatIsIt )
{
case Page : return theObj;
case Spread : return theObj.pages.firstItem();
case Character : theObj = theObj.parentTextFrames[0]; break;
case Footnote :; // drop through
case Cell : theObj = theObj.insertionPoints[0].parentTextFrames[0]; break;
case Note : theObj = theObj.storyOffset.parentTextFrames[0]; break;
case XMLElement : if ( theObj.insertionPoints[0] != null ) { theObj = theObj.insertionPoints[0].parentTextFrames[0]; break; }
case Application : return null;
default: theObj = theObj.parent;
}
if ( theObj == null )
return null;
}
return theObj
}
Skript ist lauffähig ab Version CS4
Web- und email-Adressen verlinken
MakeHyperlinks_CS.jsx
Link zur Ursprungsdiskussion im Forum
Das Skript sucht im Dokument nach Web- und email-Adressen und erstellt entsprechende Hyperlinks.
//MakeHyperlinks_CS4.jsx
main();
function main() {
with (app.findChangeGrepOptions) {
includeFootnotes = true;
includeHiddenLayers = false;
includeLockedLayersForFind = false;
includeLockedStoriesForFind = false;
includeMasterPages = true;
}
app.findGrepPreferences = null;
// URL
app.findGrepPreferences.findWhat = '\<(http|www)\S*\>';
var myURLs = app.activeDocument.findGrep();
makeHyperlink('http://', myURLs);
// email
app.findGrepPreferences.findWhat = '\<\S*@\S*\.\w{2,3}\>'; // '\^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2, 4}\>'
var myEmails = app.activeDocument.findGrep();
makeHyperlink('mailto:', myEmails);
}
function makeHyperlink(aPrefix, myArray) {
for (var i = myArray.length-1; i >= 0; i-- ) {
try{
var aString = aPrefix + myArray[i].contents.replace(aPrefix, '')
var myHyperlinkTextSource = app.activeDocument.hyperlinkTextSources.add(myArray[i]);
var myHyperlinkDestination = app.activeDocument.hyperlinkURLDestinations.add({destinationURL:aString});
var myHyperlink = app.activeDocument.hyperlinks.add({source:myHyperlinkTextSource, destination:myHyperlinkDestination});
//myHyperlink.visible = true;
}
catch(e){}
}
}
Skript ist lauffähig ab Version CS4
Weitere Erweiterung des Standardskripts FindChangeByList.jsx
FindChangeByList_mod3.jsx
Link zur Ursprungsdiskussion im Forum
In <S&E per FindChangeByList mod1> wird angefragt, ob Fehlermeldungen unterdrückt werden können, welche zum Abbruch des Skripts führen, wenn Suchparameter (z.B. Absatz- und Zeichenformate) übergeben werden, die im Dokument nicht vorhanden sind.
Das folgende Skript FindChangeByList_mod3.jsx basiert auf FindChangeByList_mod2.jsx.
Ab Zeile 158 wurde eine Fehlerabfangroutine eingebaut (Ende Zeile 172).
Kann ein Suchbefehl nicht ausgeführt werden, erscheint eine Fehlermeldung mit Hinweis auf die problematische Zeile. Nach Beendigung des Dialogs wird das Skript weiter ausgeführt.
Diese Fehlermeldung kann unterdrückt werden, indem Zeile 171 kommentiert wird:
// alert ( 'Fehler\r' + myLine);
Wen der Ergebnisreport stört, der kann Zeile 75 kommentieren:
// exportTXT( myData.join( '\r'), 'FindChangeResults.txt' ); // export of results
//FindChangeByList_mod3.jsx
//An InDesign CS3 JavaScript
//
// -----------------------------------------
// A variation of FindChangeByList.jsx
// New function 'chooseMyOwnList()' added by Martin Fischer
// Saves statistics in 'FindChangeResults.txt', either in the document's path or at the desktop (if document has not been saved yet)
// error capturing find-commands
// -----------------------------------------
//
//Loads a series of tab-delimited strings from a text file, then performs a series
//of find/change operations based on the strings read from the file.
//
//The data file is tab-delimited, with carriage returns separating records.
//
//The format of each record in the file is:
//findType< tab>findProperties< tab>changeProperties< tab>findChangeOptions< tab>description
//
//Where:
//< tab> is a tab character
//findType is "text", "grep", or "glyph" (this sets the type of find/change operation to use).
//findProperties is a properties record (as text) of the find preferences.
//changeProperties is a properties record (as text) of the change preferences.
//findChangeOptions is a properties record (as text) of the find/change options.
//description is a description of the find/change operation
//
//Very simple example:
//text {findWhat:"--"} {changeTo:"^_"} {includeFootnotes:true, includeMasterPages:true, includeHiddenLayers:true, wholeWord:false} Find all double dashes and replace with an em dash.
//
//More complex example:
//text {findWhat:"^9^9.^9^9"} {appliedCharacterStyle:"price"} {include footnotes:true, include master pages:true, include hidden layers:true, whole word:false} Find .00 to .99 and apply the character style "price".
//
//All InDesign search metacharacters are allowed in the "findWhat" and "changeTo" properties for findTextPreferences and changeTextPreferences.
//
//If you enter backslashes in the findWhat property of the findGrepPreferences object, they must be "escaped"
//as shown in the example below:
//
//{findWhat:"\s+"}
//
//For more on InDesign scripting, go to http://www.adobe.com/products/indesign/scripting.html
//or visit the InDesign Scripting User to User forum at http://www.adobeforums.com
//
var myData = new Array();
main();
function main(){
var myObject;
var myCheckSelection = false;
if(app.documents.length > 0){
if(app.selection.length > 0){
switch(app.selection[0].constructor.name){
case "InsertionPoint":
case "Character":
case "Word":
case "TextStyleRange":
case "Line":
case "Paragraph":
case "TextColumn":
case "Text":
case "TextFrame":
var myObject = myDisplayDialog();
var myCheckSelection = myObject[1];
var myObject = myObject[0];
if(myObject != "None"){
myFindChangeByList(myObject, myCheckSelection);
}
break;
default:
myFindChangeByList(app.documents.item(0), false);
}
}
else{
//Nothing was selected, so simply search the document.
myFindChangeByList(app.documents.item(0), false);
}
exportTXT( myData.join( '\r'), 'FindChangeResults.txt' ); // export of results
}
else{
alert("No documents are open. Please open a document and try again.");
}
}
function myDisplayDialog(){
var myObject;
var myCheckSelection = false;
var myDialog = app.dialogs.add({name:"FindChangeByList"});
with(myDialog.dialogColumns.add()){
with(dialogRows.add()){
with(dialogColumns.add()){
staticTexts.add({staticLabel:"Search Range:"});
}
var myRangeButtons = radiobuttonGroups.add();
with(myRangeButtons){
radiobuttonControls.add({staticLabel:"Selection", checkedState:true});
radiobuttonControls.add({staticLabel:"Selected Story"});
radiobuttonControls.add({staticLabel:"Document"});
}
}
}
var myResult = myDialog.show();
if(myResult == true){
switch(myRangeButtons.selectedButton){
case 0:
var myObject = app.selection[0];
var myCheckSelection = true;
break;
case 1:
var myObject = app.selection[0].parentStory;
var myCheckSelection = false;
break;
case 2:
var myObject = app.documents.item(0);
var myCheckSelection = false;
break;
}
}
else{
var myObject = "None";
}
myDialog.destroy();
return [myObject, myCheckSelection];
}
function myFindChangeByList(myObject, myCheckSelection){
var myScriptFileName, myFindChangeFile, myFindChangeFileName, myScriptFile, myResult;
var myFindChangeArray, myFindPreferences, myChangePreferences, myFindLimit;
var myStartCharacter, myEndCharacter;
var myFindChangeFile = myFindFile("/FindChangeSupport/FindChangeList.txt")
if(myFindChangeFile != null){
// Because the selection will change as we add/remove characters,
// we'll need to reset the selection after each pass if we are
// checking the selection. We'll get the index of the first character
// in the selection (relative to the start of its parent story) and
// the index of the last character in the selection (relative to the
// *end* of the story, and we'll use them later in the script to
// keep the ends of the selection in place.
if(myCheckSelection == true){
var myStart = myObject.characters.item(0).index;
var myEnd = myObject.characters.item(-1).index;
var myStory = myObject.parentStory;
var myStoryEnd = myStory.characters.item(-1).index;
var myEnd = (myStoryEnd - myEnd)+1;
}
var myFindChangeFile = File(myFindChangeFile);
var myResult = myFindChangeFile.open("r", undefined, undefined);
if(myResult == true){
//Loop through the find/change operations.
do{
var myLine = myFindChangeFile.readln();
//Ignore comment lines and blank lines.
if((myLine.substring(0,4)=="text")||(myLine.substring(0, 4)=="grep")||(myLine.substring(0,5)=="glyph")){
myFindChangeArray = myLine.split("\t");
//The first field in the line is the findType string.
myFindType = myFindChangeArray[0];
//The second field in the line is the FindPreferences string.
myFindPreferences = myFindChangeArray[1];
//The second field in the line is the ChangePreferences string.
myChangePreferences = myFindChangeArray[2];
//The fourth field is the range--used only by text find/change.
myFindChangeOptions = myFindChangeArray[3];
try {
switch(myFindType){
case "text":
myFindText(myObject, myFindPreferences, myChangePreferences, myFindChangeOptions);
break;
case "grep":
myFindGrep(myObject, myFindPreferences, myChangePreferences, myFindChangeOptions);
break;
case "glyph":
myFindGlyph(myObject, myFindPreferences, myChangePreferences, myFindChangeOptions);
break;
}
} catch (e) {
alert ( 'Fehler\r' + myLine);
}
if(myCheckSelection == true){
var myStartCharacter = myStory.characters.item(myStart);
var myEndCharacter = myStory.characters.item(-myEnd);
var myObject = myStory.texts.itemByRange(myStartCharacter, myEndCharacter);
app.select (myObject);
}
}
} while(myFindChangeFile.eof == false);
myFindChangeFile.close();
}
}
}
function myFindText(myObject, myFindPreferences, myChangePreferences, myFindChangeOptions){
//Reset the find/change preferences before each search.
app.changeTextPreferences = NothingEnum.nothing;
app.findTextPreferences = NothingEnum.nothing;
var myString = "app.findTextPreferences.properties = "+ myFindPreferences + ";";
myString += "app.changeTextPreferences.properties = " + myChangePreferences + ";";
myString += "app.findChangeTextOptions.properties = " + myFindChangeOptions + ";";
app.doScript(myString, ScriptLanguage.javascript);
var myFoundItems = myObject.changeText();
if (myFoundItems.length > 0)
myData.push( myFoundItems.length + ':\t' + myString);
//Reset the find/change preferences after each search.
//app.changeTextPreferences = NothingEnum.nothing;
//app.findTextPreferences = NothingEnum.nothing;
}
function myFindGrep(myObject, myFindPreferences, myChangePreferences, myFindChangeOptions){
//Reset the find/change grep preferences before each search.
app.changeGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences = NothingEnum.nothing;
var myString = "app.findGrepPreferences.properties = "+ myFindPreferences + ";";
myString += "app.changeGrepPreferences.properties = " + myChangePreferences + ";";
myString += "app.findChangeGrepOptions.properties = " + myFindChangeOptions + ";";
app.doScript(myString, ScriptLanguage.javascript);
var myFoundItems = myObject.changeGrep();
if (myFoundItems.length > 0)
myData.push( myFoundItems.length + ':\t' + myString);
//Reset the find/change grep preferences after each search.
//app.changeGrepPreferences = NothingEnum.nothing;
//app.findGrepPreferences = NothingEnum.nothing;
}
function myFindGlyph(myObject, myFindPreferences, myChangePreferences, myFindChangeOptions){
//Reset the find/change glyph preferences before each search.
app.changeGlyphPreferences = NothingEnum.nothing;
app.findGlyphPreferences = NothingEnum.nothing;
var myString = "app.findGlyphPreferences.properties = "+ myFindPreferences + ";";
myString += "app.changeGlyphPreferences.properties = " + myChangePreferences + ";";
myString += "app.findChangeGlyphOptions.properties = " + myFindChangeOptions + ";";
app.doScript(myString, ScriptLanguage.javascript);
var myFoundItems = myObject.changeGlyph();
if (myFoundItems.length > 0)
myData.push( myFoundItems.length + ':\t' + myString);
//Reset the find/change glyph preferences after each search.
//app.changeGlyphPreferences = NothingEnum.nothing;
//app.findGlyphPreferences = NothingEnum.nothing;
}
function myFindFile(myFilePath){
var myScriptFile = myGetScriptPath();
var myScriptFile = File(myScriptFile);
var myScriptFolder = myScriptFile.path;
myFilePath = myScriptFolder + myFilePath;
if(File(myFilePath).exists == false){
//Display a dialog to choose own list
var aResult = chooseMyOwnList( myScriptFile.path + '/FindChangeSupport');
if ( aResult != 'None' )
myFilePath = File( aResult );
else
myFilePath = File.openDialog("Choose the file containing your find/change list");
}
return myFilePath;
}
function myGetScriptPath(){
try{
myFile = app.activeScript;
}
catch(myError){
myFile = myError.fileName;
}
return myFile;
}
function chooseMyOwnList( aPath )
{
var myChoosedList = "None";
var myListFiles = Folder( aPath ).getFiles( '*.txt' )
var myLists = new Array;
for ( var f = 0; f < myListFiles.length; f++ )
myLists.push( myListFiles[f].name );
if (myLists.length > 0 ) {
var myDialog = app.dialogs.add({name:"FindChangeByList"});
with(myDialog.dialogColumns.add()){
with(dialogRows.add()){
with(dialogColumns.add()){
staticTexts.add({staticLabel:"Liste:"});
}
with(dialogColumns.add()){
var myListsDropdown = dropdowns.add({stringList:myLists, selectedIndex:0});
}
}
}
var myResult = myDialog.show();
if(myResult == true)
{
var myChoosedList = aPath + '/' + myLists[myListsDropdown.selectedIndex];
myDialog.destroy();
}
else
{
myDialog.destroy();
exit();
}
}
return myChoosedList;
}
function exportTXT( myData, myFileName ){
var myCreator = "R*ch";
var myType = "UTF-8";
var myPath = ( app.activeDocument.saved == true)
? app.activeDocument.filePath
: '~/Desktop';
var myFile = new File( myPath + '/' + myFileName);
myFile.open('w', myType, myCreator);
myFile.write(myData);
myFile.close();
}
Skript ist lauffähig ab Version CS3
Worte in Versalbuchstaben umwandeln in Groß-/Kleinschreibung (erster Buchstabe im Wort groß)
caps2titleCase_or_smallCaps.jsx
Link zur Ursprungsdiskussion im Forum
Wandelt Worte, die gänzlich aus Versalbuchstaben (caps) bestehen, in titleCase (erster Buchstabe im Wort groß) um.
Optional wird ein Kapitälchen-Zeichenformat 'SmallCaps', das bei Bedarf vom Skript angelegt wird, zugewiesen.
Entwickelt mit Unterstützung von Peter Kahrel (GREP) und Quarz (Design).
//caps2titleCase_or_smallCaps.jsx
//DESCRIPTION:Wandelt Worte in Versalbuchstaben um in 'erster Buchstabe im Wort groß'; optional wird ein Kapitälchen-Zeichenformat zugewiesen.
// Ist Text ausgewählt, beschränkt sich die Umwandlung auf diese Auswahl.
// Andernfalls erfolgt die Umwandlung im ganzen Dokument
var applyCS = confirm('Zeichenformat zuweisen?');
if (applyCS == true)
var myCS = getCS('SmallCaps');
var myRange = (app.selection.length > 0 && app.selection[0].hasOwnProperty ('baseline'))
? app.selection[0]
: app.documents.firstItem();
app.findGrepPreferences = null;
app.findGrepPreferences.findWhat = '(?<=\<\u)\u+\b';
var myResult = myRange.findGrep();
for (var i = myResult.length-1; i >= 0; i-- )
{
myResult[i].contents = myResult[i].contents.toLowerCase();
if (applyCS == true)
myResult[i].words.firstItem().appliedCharacterStyle = myCS;
}
function getCS(oneStyle){
var aCS = null;
aCS = app.documents.firstItem().characterStyles.item(oneStyle);
if (aCS == null)
aCS = app.documents.firstItem().characterStyles.add({name:oneStyle, capitalization:Capitalization.SMALL_CAPS});
return aCS;
}
Skript ist lauffähig ab Version CS3
Wörter mit falscher Silbentrennung finden
properWordDivision.jsx
Link zur Ursprungsdiskussion im Forum
Das Skript properWordDivision.jsx findet in einem Dokument Wörter mit falscher Silbentrennung bzw. Trennungen, die nicht der BenutzerInnen-Eingabe entsprechen.
Beispiel für eine Eingabe:
ge~trennt
Das Skript findet das Wort, wenn es etwa so getren-
nt ist.
Ein kurzes Video (9,6 MB) dazu.
Wird das gesuchte Wort ohne Tilden eingegeben, findet das Skript alle Trennungen des Wortes.
Hinweis:
Während der Ausführung des Skripts ? konkret: beim Durchlaufen der einzelnen Fundstellen ? können Korrekturen an den Wörtern durchgeführte werden. (z.B. mit bedingten Trennstrichen)
Wenn sich durch die Korrekturen die Zeichenpositionen verschieben, kann es (nur wenn nach mehreren Wörtern gesucht wird) zu einer Verschiebung der Auswahl kommen. In dem Fall die Suchen einfach noch einmal neu starten.
Alternativ dazu kann das entsprechende Wort für eine spätere Bearbeitung markiert werden. Die Markierung erfolgt mittels bedingtem Text.
Die Suche allein verändert das Dokument nicht. Beim Markieren wird allerdings eine Bedingung hinzugefügt. (InDesign > Fenster > Schrift und Tabellen > Bedingter Text)
Skript ist lauffähig ab Version CS5
Zahlen per Faktor umrechnen (mit Rundung)
BerechnungMitDialogUndRundung.jsx
Link zur Ursprungsdiskussion im Forum
Das Skript ersetzt in einer Auswahl (oder falls kein Text ausgewählt ist im ganzen Dokument) alle Zahlen, die mit einem per Dialog zu bestimmenden Zeichenformat ausgezeichnet sind, durch eine neue Zahl, die sich aus der alten Zahl multipliziert mit einem im Dialog angegebenen Faktor ergibt.
Im Feld "Rundung" kann ein Rundungsfaktor eingegeben werden.
Rundung 0,01 bedeutet runden auf 2 Stellen nach dem Komma.
Rundung 0,001 bedeutet runden auf 3 Stellen nach dem Komma.
Damit wird auch die Länge der Stellen nach dem Komma gesteuert.
// BerechnungMitDialogUndRundung.jsx
var myDoc = app.documents[0];
var myObj = (app.selection.length > 0 &&
(
(
app.selection[0].hasOwnProperty('baseline') &&
app.selection[0].constructor.name != 'InsertionPoint'
) ||
app.selection[0].constructor.name == 'TextFrame' ||
app.selection[0].constructor.name == 'Table' ||
app.selection[0].constructor.name == 'Cell'
)
)
? app.selection[0]
: app.activeDocument;
var theStyles = myDoc.characterStyles.everyItem().name; // Zeichenformate in Array
theStyles.shift(); // Abschneiden von Zeichenformat [Keine]
var theData = myDisplayDialog(); // Funktionsaufruf
var myFactor = theData.factor;
if (myFactor != undefined)
{
app.findGrepPreferences = app.changeGrepPreferences = null;
app.findGrepPreferences.appliedCharacterStyle = theData.style;
app.findGrepPreferences.findWhat = '\d+[\.,]?\d*';
var myNumbers = myObj.findGrep();
app.findGrepPreferences = app.changeGrepPreferences = null;
for (oneNum = myNumbers.length-1; oneNum >= 0; oneNum--)
{
// Funktionsaufruf zu Berechnung und
// Zuweisung des neuen Inhats
if (isNaN(myNumbers[oneNum].contents.split(",").join(".") )){}
else
{
myNumbers[oneNum].contents = theCalculation(myNumbers[oneNum].contents, theData.round)
}
}
}
// Dialog
function myDisplayDialog()
{
var myFieldWidth = 80;
var myDialog = app.dialogs.add({name:"Berechnung"});
with(myDialog.dialogColumns.add())
{
with(dialogRows.add())
{
with(dialogColumns.add())
{
staticTexts.add({staticLabel:"Faktor:", minWidth:myFieldWidth});
}
with(dialogColumns.add())
{
var myFacTextEditbox = textEditboxes.add({editContents:"1,19", minWidth:140});
}
}
with(dialogRows.add())
{
with(dialogColumns.add())
{
staticTexts.add({staticLabel:"Rundung:", minWidth:myFieldWidth});
}
with(dialogColumns.add())
{
var myRoundTextEditbox = textEditboxes.add({editContents:"0,01", minWidth:140});
}
}
with(dialogRows.add())
{
with(dialogColumns.add())
{
staticTexts.add({staticLabel:"Zeichenformat:", minWidth:myFieldWidth});
}
with(dialogColumns.add())
{
var myStylesDropDown = dropdowns.add({stringList:theStyles, selectedIndex:0, minWidth:140});
}
}
}
var myResult = myDialog.show();
if(myResult == true)
{
var aFactor = myFacTextEditbox.editContents.split(",").join(".")*1;
var aStyle = theStyles[myStylesDropDown.selectedIndex];
var myRoundNum = Number(myRoundTextEditbox.editContents.split(",").join("."))
var aRound = (isNaN(myRoundNum) || myRoundNum == 0)
? 1
: 1/myRoundNum;
//Remove the dialog box from memory.
myDialog.destroy();
}
else
{
myDialog.destroy();
}
return {factor:aFactor, style:aStyle, round:aRound};
}
// Berechnungsfunktion
function theCalculation(theData, theRound){
var theOldNumber = theData.split(",").join(".") // Komma wird ggf. durch Punkt ersetzt
var theNewString = myRound(parseFloat(theOldNumber) * myFactor, theRound) ; // Berechnung der neuen Zahl
return theNewString;
}
function myRound(aNum, aDec)
{
var myResult = Math.round(aNum * aDec)/aDec;
if (aDec == 1)
return String(myResult);
if (myResult - Math.floor(myResult) == 0)
myResult += '.';
var myParts = String(myResult).split('.');
while (myParts[1].length < String(aDec).length-1)
{
myParts[1] += '0';
}
return myParts.join(',');
}
Skript ist lauffähig ab Version CS3
Zeichenformat auf Basis des ersten ausgewählten Zeichens erstellen und allen Vorkommen dieses Fonts im Dokument zuweisen
cStyleBasedOnFont.jsx
Link zur Ursprungsdiskussion im Forum
Das Skript ermittelt den Font (mit Schnitt) des ersten ausgewählten Zeichens.
Sofern noch nicht vorhanden, erstellt es ein Zeichenformat mit diesen Fontattributen und einem aus Schriftfamilie und Schnitt zusammengesetzten Namen (z.B. 'Bwgrkl-Regular').
Dieses Zeichenformat wird allen Vorkommen des Fonts (Schrift mit speziellem Schnitt) zugewiesen.
//cStyleBasedOnFont.jsx
//DESCRIPTION:Erstellt Zeichenformat auf Basis des ersten ausgewählten Zeichens und weist dieses allen Vorkommen dieses Fonts im Dokument zu.
if (app.selection.length == 0 || !app.selection[0].hasOwnProperty('baseline'))
exit();
var myDoc = app.documents.firstItem();
var mySel = app.selection[0];
try
{
var myFontFamily = mySel.characters.firstItem().appliedFont.fontFamily;
var myFontStyle = mySel.characters.firstItem().appliedFont.fontStyleName;
}
catch(e)
{
alert("Font nicht vorhanden");
exit();
}
var myCharStyleName = myFontFamily + "-" + myFontStyle;
var myCharStyle = myDoc.characterStyles.item(myCharStyleName);
if (myCharStyle.isValid == false)
myCharStyle = myDoc.characterStyles.add({name:myCharStyleName, appliedFont: myFontFamily, fontStyle:myFontStyle});
app.findTextPreferences = app.changeTextPreferences = null;
app.findTextPreferences.appliedFont = myFontFamily;
app.findTextPreferences.fontStyle = myFontStyle;
app.changeTextPreferences.appliedCharacterStyle = myCharStyle;
var myResults = myDoc.changeText();
Skript ist lauffähig ab Version CS3
Zeichenformat auf bestimmte Zeichen nach der ursprünglichen Formatierung erweitern
extendCharstyle2Chars.jsx
Das Skript extendCharstyle2Chars.jsx erweitert die Formatierung mit einem bestimmten Zeichenformat auf bestimmte Zeichen.
Zum Beispiel können damit alle Kommata, Semikolon und Doppelpunkte nach Text, der mit einem Italic-Zeichenformat ausgezeichnet ist, ebenfalls kursiv gesetzt werden.
Zu Kontrollzwecken verwendet das Skript nicht das ursprüngliche Zeichenformat für diese Erweiterung, sondern ein neues Zeichenformat auf der Basis des gewählten mit dem Zusatz '_ext'. Somit kann diese Erweiterung ggf. durch Löschen dieses neu angelegten Zeichenformats wieder rückgängig gemacht werden.
Auf Wunsch kann dieses Zeichenformat auch gelöscht und durch ein anderes (z.B. das Basiszeichenformat) ersetzt werden.
Wurde im Dialog ein Zeichenformat 'Italic' ausgewählt und als Folgezeichen ein Komma und Doppelpunkt angegeben, wird zunächst ein Zeichenformat 'Italic_ext' angelegt.
Danach werden alle Kommata und Doppelpunkte, die auf die Auszeichnung mit dem Zeichenformat »Italic« folgen mit dem Zeichenformat »Italic_ext« ausgezeichnet.
Der Auswahldialog.
// extendCharstyle2Chars.jsx
//DESCRIPTION:Erweitert ein ausgewähltes Zeichenformat auf Zeichen aus einer Liste, die Text mit diesem Zeichenformat folgen.
var myCounter = 0;
var myDoc = app.documents[0];
if (app.selection.length > 0)
var myRange = app.selection[0].parentStory;
else
var myRange = myDoc;
var myBaseStyle = "Italic";
var myDefaultSymbols = ",;:";
var mySymbols = new Array
var theDialog = myDisplayDialog();
var myStyle = myDoc.characterStyles.item(theDialog[0]);
var myNewStyle = checkCS(myStyle.name + "_ext", myStyle);
var mySymbols = theDialog[1].split("");
app.findTextPreferences = null; app.changeTextPreferences = null;
app.findTextPreferences.appliedCharacterStyle = myStyle;
var myResult = myRange.findText();
for (oneResult = 0; oneResult < myResult.length; oneResult++)
{
try{
var myIndex = myResult[oneResult].characters[-1].index;
extendCharStyle(myResult[oneResult].parent.characters[myIndex +1]);
/*
if (myResult[oneResult].parent.constructor.name != "Footnote")
extendCharStyle(myResult[oneResult].parentStory.characters[myIndex +1]);
else
extendCharStyle(myResult[oneResult].parent.characters[myIndex +1]);*/
} catch(e){}
}
alert("Ergebnis:\r" + myCounter + " Ersetzungen");
// --------------------------------------------------------------------
// Prüfung des Zeichens danach und ggf. Erweiterung des Zeichenformats
// --------------------------------------------------------------------
function extendCharStyle(theCharAfter)
{
for (oneSymb = 0; oneSymb < mySymbols.length; oneSymb++)
{
try
{
if (theCharAfter.contents == mySymbols[oneSymb])
{
//theCharAfter.appliedCharacterStyle = myStyle;
theCharAfter.appliedCharacterStyle = myNewStyle;
myCounter += 1;
}
}
catch(e){}
}
}
// --------------------------------------------------------------------
// Dialog zur Auswahl von Zeichenformat und Folgezeichen
// --------------------------------------------------------------------
function myDisplayDialog(){
var myFieldWidth = 80;
var myCharStyles = myDoc.characterStyles.everyItem().name;
// Festlegung Vorauswahl
for (theCSIndex = myCharStyles.length-1; theCSIndex >= 0; theCSIndex--)
{
if (myCharStyles[theCSIndex].substr(0,myBaseStyle.length) == myBaseStyle) break;
}
var myDialog = app.dialogs.add({name:"Erweitere Zeichenformat"});
with(myDialog.dialogColumns.add()){
with(dialogRows.add()){
with(dialogColumns.add()){
staticTexts.add({staticLabel:"Zeichenformat:", minWidth:myFieldWidth});
}
with(dialogColumns.add()){
var mySourceDropdown = dropdowns.add({stringList:myCharStyles, selectedIndex:theCSIndex});
}
}
with(dialogRows.add()){
with(dialogColumns.add()){
staticTexts.add({staticLabel:"Folgezeichen:", minWidth:myFieldWidth});
}
with(dialogColumns.add()){
var mySymbolsField = textEditboxes.add({editContents:myDefaultSymbols});
}
}
}
var myResult = myDialog.show();
if(myResult == true){
var theCharStyle =myCharStyles[mySourceDropdown.selectedIndex];
var theSymbolList = mySymbolsField.editContents;
myDialog.destroy();
}
else{
myDialog.destroy()
exit();
}
return [theCharStyle, theSymbolList] ;
}
// -------------------------------------------------------------------------------------
// Überprüfe Zeichenformat
// -------------------------------------------------------------------------------------
function checkCS(oneStyle, myBase){
try {
app.activeDocument.characterStyles.item(oneStyle).name;
}
catch (e) {
app.activeDocument.characterStyles.add({name:oneStyle, basedOn:myBase});
}
return app.activeDocument.characterStyles.item(oneStyle)
}
Skript ist lauffähig ab Version CS3
Zeichenformat "[Ohne]"
noCharStyleAttr.jsx
Link zur Ursprungsdiskussion im Forum
Dieses Skript formatiert ausgewählte Zeichen, den Text in einem ausgewählten Textrahmen oder in ausgewählten Tabellenzellen mit dem Zeichenformat [Ohne] und entfernt in der Auswahl darüberhinaus auch alle weiteren vom Absatzformat abweichenden Zeicheneigenschaften.
// noCharStyleAttr.jsx
//DESCRIPTION: formatiert ausgewählte Zeichen, den Text in einem ausgewählten Textrahmen oder in ausgewählten Tabellenzellen mit dem Zeichenformat [Ohne] und löscht Abweichungen.
if ( app.selection.length > 0)
{
with (app.selection[0])
{
if (hasOwnProperty('baseline') || constructor.name == 'TextFrame')
{
texts.firstItem().applyCharacterStyle( app.activeDocument.characterStyles.firstItem());
texts.firstItem().clearOverrides( OverrideType.characterOnly);
}
else if (hasOwnProperty('cells'))
{
cells.everyItem().texts.firstItem().applyCharacterStyle( app.activeDocument.characterStyles.firstItem() );
cells.everyItem().texts.firstItem().clearOverrides( OverrideType.characterOnly);
}
}
}
Skript ist lauffähig ab Version CS2
Zeilenweiser Verlauf der Schriftgrössen
GroessenVerlauf.js
Link zur Ursprungsdiskussion im Forum
Dieses Script weist dem Text des ausgewählten Rahmens die definierten Werte zu.
Die beiden Listen ('sizeList' = Schriftgrössen / 'leadList' = Zeilenabstand) zu Beginn des Codes können nach Wunsch verlängert werden. Bedingung ist, dass beide Listen dieselbe Anzahl Elemente aufweisen.
Das Script macht eine Schleife durch die Listen und den Text und weist von oben nach unten die gewünschten Werte zu. Die letzte Zahl beider Listen wird dem restlichen Text zugewiesen.
//GroessenVerlauf.js
//DESCRIPTION:Erzeugt einen zeilenweisen Verlauf der Schriftgrössen
// die Schriftgrössen- und Zeilenabstandswerte
var sizeList = new Array (25, 20, 15, 10);
var leadList = new Array (26, 21, 16, 12);
// vorsichtshalber die Dialoge einschalten
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;
// die Anzahl der Werte prüfen
var nSizes = sizeList.length;
var nLeads = leadList.length;
if (nSizes != nLeads) {
alert ("Anzahl Schriftgrössen und Zeilenabstände stimmen nicht überein.", "Stop");
exit();
}
// prüfen, ob ein Dokument geöffnet ist
if (app.documents.length == 0){
alert ("Es ist kein Dokument offen.", "Achtung");
exit();
}
var curDoc = app.documents[0];
// testen, ob ein Textrahmen ausgewählt ist
var curSel = app.selection;
if (curSel.length != 0) {
var curType = curSel[0].constructor.name;
if (curType == "Text" | curType == "InsertionPoint") {
// var textFrame = curSel[0].parent.textFrames.item(0);
// var textFrame = curSel[0].parent.textFrames[0];
var textFrame = curSel[0].parentTextFrames[0];
}
else if (curType == "Group") {
alert ("Das funktioniert nicht mit gruppierten Rahmen.", "Stop");
exit();
}
else if (curType == "TextFrame") {
var textFrame = curSel[0];
}
else {
alert ("Bitte einen Textrahmen auswählen.", "Stop");
}
}
else {
alert ("Es ist nichts ausgewählt.", "Achtung");
exit();
}
// die vertikale Masseinheit speichern
// wenn nicht 2053991795 (= Millimeter), auf Millimeter umstellen
vM = curDoc.viewPreferences.verticalMeasurementUnits;
if (vM != 2053991795) {
curDoc.viewPreferences.verticalMeasurementUnits = MeasurementUnits.millimeters;
}
var linkedFrame = textFrame.nextTextFrame;
if (linkedFrame == null) {
var gB = textFrame.geometricBounds;
// den Rahmen höher machen
textFrame.geometricBounds = [gB[0], gB[1], 300, gB[3]];
}
// die Zieltextkette
var curStory = textFrame.parentStory;
// das Alinieren an den Grundlinienraster ausschalten
curStory.alignToBaseline = false;
// eine Schleife durch die Schriftgrössenwerte
for (var i=0; i<(nSizes-1); i++) {
try {
// die aktuelle Grösse und den Zeilenabstand zuweisen
curStory.lines.itemByRange(i, -1).properties = {pointSize:sizeList[i], leading:leadList[i]};
// wenn das letzte Zeichen der aktuellen Zeile ein Leerschlag ist ...
if (curStory.lines[i].characters.item(-1).contents == " ") {
// ... einen Shift-Return einfügen
curStory.lines[i+1].insertionPoints[0].contents = "\n";
}
else {
// sonst einen Bindestrich einsetzen
curStory.lines[i+1].insertionPoints[0].contents = "-\n";
}
}
catch (e) {
}
}
// die letzen definierten Werte holen ...
var lastSize = sizeList[nSizes-1];
var lastLead = leadList[nLeads-1];
// ... und sie dem restlichen Text zuweisen
try {
curStory.lines.itemByRange(i, -1).properties = {pointSize:lastSize, leading:lastLead};
}
catch (e) {
}
if (linkedFrame == null) {
// den Rahmen anpassen ...
try {
textFrame.fit(FitOptions.frameToContent);
gB = textFrame.geometricBounds;
// ... und etwas höher machen
textFrame.geometricBounds = [gB[0], gB[1], gB[2]+2, gB[3]];
}
catch (e) {
}
}
// die Masseinheit zurücksetzen (falls notwendig)
if (vM != 2053991795) {
curDoc.viewPreferences.verticalMeasurementUnits = vM;
}
Skript ist lauffähig ab Version CS2
Zwei Testscripts für die Version 04 des BilderKatalog-Scripts
test_replace.js
Link zur Ursprungsdiskussion im Forum
Hallo Leute,
nachstehend die beiden Testscripts, welche hier ...
http://www.hilfdirselbst.ch/...;post=289581;page=2;
... in meinem Beitrag vom 21. Mai erwähnt sind.
Mit diesem AppleScript werden 16 Absätze erstellt, welche die
Mac-Roman-Zeichen von 128 bis 255 enthalten, dazwischen immer
der Buchstabe "s" als Trenner.
Der erste Absatz sieht so aus: "01sÄsÅsÇsÉsÑsÖsÜsásàs"
Nun zum JavaScript-Testscript. Vier Versuche (von sehr vielen :-)
1. Die Zeile mit einem Akzentbuchstaben ist aktiviert, die Funktionen
werden ohne Prüfung aufgerufen = 4160 Millisekunden.
2. Die Zeile mit einem Akzentbuchstaben ist aktiviert, die Funktionen
werden nur aufgerufen, wenn der Test ergibt, dass die entsprechende
Sorte im String vorkommt = 950 Millisekunden.
3. Die Zeile mit sieben Akzentbuchstaben ist aktiviert, die Funktionen
werden ohne Prüfung aufgerufen = 4300 Millisekunden.
4. Die Zeile mit sieben Akzentbuchstaben ist aktiviert, die Funktionen
werden alle aufgerufen, aber mit Test = 4500 Millisekunden.
Wenn der Cursor in einem Textrahmen blinkt, wird die Zeile dort eingesetzt.
-- Skript 1
--Get_128_MacRoman_chars.scpt
set aStrList to {"01s"}
set ctr to 2
repeat with i from 128 to 255
set end of aStrList to (ASCII character i) & "s"
if (i is greater than 128) and (i mod 8) = 0 then
set end of aStrList to return & (text -2 thru -1 of ("0" & ctr)) & "s"
set ctr to ctr + 1
end if
end repeat
aStrList as string
-- Skript 2//
test_replace.js
//Suchen von geteilten Akzent, Ersetzen durch ein Zeichen
//Stoppt die Zeit für 1000 Ausführungen
var t1 = new Date();
for (var k=0; k< 1000; k++) {
// nur ein Akzentbuchstabe
var defName = "xa\u0300xexaxnxaxaxcx";
// sieben Akzentbuchstaben, je einer pro Sorte
// var defName = "xa\u0300xe\u0301xa\u0302xn\u0303xa\u0308xa\u030Axc\u0327x";
// die sieben Funktionen aufrufen, ohne Test
defName = rep1(defName);
defName = rep2(defName);
defName = rep3(defName);
defName = rep4(defName);
defName = rep5(defName);
defName = rep6(defName);
defName = rep7(defName);
/*
// für jede Sorte testen, ob das Zeichen vorkommt
if (defName.indexOf("\u0300") != -1) {
defName = rep1(defName);
}
if (defName.indexOf("\u0301") != -1) {
defName = rep2(defName);
}
if (defName.indexOf("\u0302") != -1) {
defName = rep3(defName);
}
if (defName.indexOf("\u0303") != -1) {
defName = rep4(defName);
}
if (defName.indexOf("\u0308") != -1) {
defName = rep5(defName);
}
if (defName.indexOf("\u030A") != -1) {
defName = rep6(defName);
}
if (defName.indexOf("\u0327") != -1) {
defName = rep7(defName);
}
*/
}
// der Dialog meldet die Ausführungsdauer in Millisekunden
var t2 = new Date();
alert (t2-t1);
// dient zum Einsetzen des Strings in einen Textrahmen,
// falls der Cursor darin blinkt
try {
app.selection[0].contents = defName;
}
catch (e) {
}
// die sieben Funktionen
function rep1(defName) {
defName = defName.replace(/a\u0300/g, 'à').replace(/A\u0300/g, 'À');
defName = defName.replace(/e\u0300/g, 'è').replace(/E\u0300/g, 'È');
defName = defName.replace(/i\u0300/g, 'ì').replace(/I\u0300/g, 'Ì');
defName = defName.replace(/o\u0300/g, 'ò').replace(/O\u0300/g, 'Ò');
defName = defName.replace(/u\u0300/g, 'ù').replace(/U\u0300/g, 'Ù');
return defName;
}
function rep2(defName) {
defName = defName.replace(/a\u0301/g, 'á').replace(/A\u0301/g, 'Á');
defName = defName.replace(/e\u0301/g, 'é').replace(/E\u0301/g, 'É');
defName = defName.replace(/i\u0301/g, 'í').replace(/I\u0301/g, 'Í');
defName = defName.replace(/o\u0301/g, 'ó').replace(/O\u0301/g, 'Ó');
defName = defName.replace(/u\u0301/g, 'ú').replace(/U\u0301/g, 'Ú');
return defName;
}
function rep3(defName) {
defName = defName.replace(/a\u0302/g, 'â').replace(/A\u0302/g, 'Â');
defName = defName.replace(/e\u0302/g, 'ê').replace(/E\u0302/g, 'Ê');
defName = defName.replace(/i\u0302/g, 'î').replace(/I\u0302/g, 'Î');
defName = defName.replace(/o\u0302/g, 'ô').replace(/O\u0302/g, 'Ô');
defName = defName.replace(/u\u0302/g, 'û').replace(/U\u0302/g, 'Û');
return defName;
}
function rep4(defName) {
defName = defName.replace(/a\u0303/g, 'ã').replace(/A\u0303/g, 'Ã');
defName = defName.replace(/n\u0303/g, 'ñ').replace(/N\u0303/g, 'Ñ');
defName = defName.replace(/o\u0303/g, 'õ').replace(/O\u0303/g, 'Õ');
return defName;
}
function rep5(defName) {
defName = defName.replace(/a\u0308/g, 'ä').replace(/A\u0308/g, 'Ä');
defName = defName.replace(/e\u0308/g, 'ë').replace(/E\u0308/g, 'Ë');
defName = defName.replace(/i\u0308/g, 'ï').replace(/I\u0308/g, 'Ï');
defName = defName.replace(/o\u0308/g, 'ö').replace(/O\u0308/g, 'Ö');
defName = defName.replace(/u\u0308/g, 'ü').replace(/U\u0308/g, 'Ü');
defName = defName.replace(/y\u0308/g, 'ÿ').replace(/Y\u0308/g, '?');
return defName;
}
function rep6(defName) {
defName = defName.replace(/a\u030A/g, 'å').replace(/A\u030A/g, 'Å');
return defName;
}
function rep7(defName) {
defName = defName.replace(/c\u0327/g, 'ç').replace(/C\u0327/g, 'Ç');
return defName;
}
Ein Vergleich mit der Version 03 des BilderKatalog-Scripts ergab
dieselbe Ausführungszeit. Deshalb habe ich den obenstehenden Code
in die Version 04 eingebaut und auf http://www.fachhefte.ch zum
Download bereitgestellt.
Gruss, Hans
Skript ist lauffähig ab Version CS2