hilfdirselbst.ch
Facebook Twitter gamper-media
Forenindex -- Lesezeichen

15 Lesezeichen für skript

Skript zum Index generieren
Mit folgendem Skript lassen sich Indexeinträge basierend auf einer Konkordanzliste (Liste mit aufzunehmenden Begriffen) erzeugen. Ein Dialog fordert zur Auswahl der Textdatei mit der Begriffsliste auf. Die Begriffe müssen durch Zeilenschaltung voneinander getrennt sein (je Begriff eine neue Zeile).

Code
// IndexFromList.jsx  
//DESCRIPTION: Erzeugt Indexeinträge 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();

var myWords = getWords(myList);
proceedWithList(myWords);
alert("Habe fertig!");


// 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(/ +\n/g, '\n').replace(/\n+/g, '\n');
// ersetzen von mehrfach aufeinander folgende Leerzeichen aller Art und von RETURNs durch RETURNs
aText = aText.replace(/\s+/g, '\n');

var words = aText.split('\n');
aFile.close();
return words;
}
else {
exit();
}
}

// Begriffsliste abarbeiten
function proceedWithList (w) {
// bei Bedarf wird ein neuer Index erzeugt
if (myDoc.indexes.length == 0)
myDoc.indexes.add();

app.findPreferences = app.changePreferences = null;

for (var i = 0; i < w.length; i++)
if (w[i] != "")
makeEntry(w[i]);

// Aktualisieurng des Index
myDoc.indexes[0].update();
}

// Indexeintrag erzeugen
function makeEntry(oneWord) {
var myResult = myDoc.search(oneWord, true, true, undefined);
for (var oneEntry = myResult.length-1; oneEntry >=0; oneEntry--) {
// Fehler abfangen, z.B. Fußnoten ausnehmen
try {
// Hinzufügen des Themas
myDoc.indexes[0].topics.add(oneWord);
// Hinzufügen der Referenz
myDoc.indexes[0].topics.item(myResult[oneEntry].contents).pageReferences.add(myResult[oneEntry], PageReferenceType.currentPage);
}
catch(e) {}
}
}


Das Skript basiert auf Peter Kahrels IndexFromCharacterStyle_shortVersion.js (Dank für die Vorlage).

Aktuell ist es so eingestellt, daß es Groß-/Kleinschreibung unterscheidet ("fischen" ungleich "Fischen") und daß es nach ganzen Worten sucht ("Fisch" findet "Fisch", aber nicht "Fischer").
Diese Einschränkung könnte bei Bedarf später per Dialog mit Optionen geöffnet werden.

Ferner ignoriert diese Version Fundstellen in Fußnoten.
Um letztere zu berücksichtigen, müßten die Fußnoten z.B. über das Skript notes2text.jsx von Peter Kahrel zunächst in Endnoten umgewandelt und nach der Erzeugung der Indexeinträge mit demselben Skript wieder in Fußnoten zurückkonvertiert werden.

edit (16.11.2007):
Eine aktualisierte Fassung (für InDesign CS2) findet sich in Indexhilfe erwünscht.
...
Martin Fischer
5. Mär 2007, 08:48
FindChangeList - allgemeine Fragen
Hallo rübi,

Antwort auf: 1. Ist es egal in welcher Codierung die Datei gespeichert wird (Windows Latin, MacOS, Utf 8)?


Ja, denn Adobe-Programme konvertieren 8-bit codierte Dateien nach Unicode:

Zitat von Adobe InDesign CS2 Scripting Reference When doing file I/O, Adobe applications convert 8-bit character encoding to Unicode. By default, this conversion process assumes that the system encoding is used (code page 1252 in Windows or Mac Roman in Mac OS).



Antwort auf: 2. Warum muss ich mindestens eine findChangeOption eingeben damit überhaupt etwas passiert?


FindChangeByList.jsx erwartet pro Zeile 5 Felder:

Zitat von FindChangeList.txt The format of each record in the file is:
findType<tab>findProperties<tab>changeProperties<tab>findChangeOptions<tab>description

Where:
<tab> is a tab character
(1) findType is "text", "grep", or "glyph" (this sets the type of find/change operation to use).
(2) findProperties is a properties record (as text) of the find preferences.
(3) changeProperties is a properties record (as text) of the change preferences.
(4) findChangeOptions is a properties record (as text) of the find/change options.
(5) description is a description of the find/change operation


Du könntest die FindChangeOptions auch ohne Attribute übergeben: {}

Antwort auf: 3. Wie kann ich nach einem Zeichenformat (entweder Helvetica Neue 75 bold oder besser noch nur den Schnitt 75 bold) suchen?
>> appliedFont?? Wie würde die komplette Suche lauten?

text<tab>{fontStyle:"75 Bold"}<tab>{appliedCharacterStyle:"Bold"}<tab>{}<tab>// ersetze Schriftstil '75 bold' durch Zeichenformat 'Bold'

also:
Code
text	{fontStyle:"75 Bold"}	{appliedCharacterStyle:"Bold"}	{}	// ersetze Schriftstil '75 bold' durch Zeichenformat 'Bold' 


Antwort auf: 4. In dem Beispiel in der Datei
(//text {findWhat:"^9^9.^9^9"} {appliedCharacterStyle:"price"} steht kein "change to"
> Ist die dritte Stelle in der Eingabe immer das "change to"? Woher weis man, wann es erforderlich ist und wann nicht??

Das steht in den Instruktionen zur Struktur der Einträge in 'FindChangeList.txt' (s.o.).

Ich habe Übersichten zu den Eigenschaften (properties), nach denen gesucht werden kann und die ersetzt werden können, nebst den möglichen Optionen angehängt (es handelt sich um Auszüge aus der HTML-Umsetzung der Scripting-Reference für CS3: indesigncs3jshelp.zip):

Text-Suche:
01_FindTextPreference.html
02_ChangeTextPreference.html
03_FindChangeTextOption.html

GREP-Suche:
04_FindGrepPreference.html
05_ChangeGrepPreference.html
06_FindChangeGrepOption.html
...
Martin Fischer
22. Mär 2008, 09:07
Benchmark für Photoshop
Hallo miteinander,

[edit jekyll]
Uuups. Ich habe das hier total verpasst Blush:

http://www.hilfdirselbst.ch/..._P208582.html#208582


Zitat von Thomas (06.02.2006)
Du hast ja jetzt die 'Lizenz zu ändern'. Bring doch mal ganz vorne den Link in Ordnung.
Mir ist egal ob zu mir:
Aktuell!! http://www.richard-ebv.de/images/HDS/psBench.zip
oder zu dir verlinkst, Hauptsache auf den aktuellen Benchmark.


Habe auch den Titel gleich mit geändert :o)
[/edit]


ich habe mal den PSbench von hier:

http://htttp:/...ages/HDS/psBench.zip

http://www.geocities.com/psbench/index.html

so umgeschrieben das er alleine komplett durchläuft und man nur noch eine Gesamtzeit für die ganze Suite bekommt.

Mich würde mal interressierren, ob die Aktion so unter Windows läuft. Zumindestens im sichern Dialog dürfte es etwas hakeln, aber das tut es unter OS9 und X <.3 auch.

Wer also Lust und Zeit hat, seinen Rechner mal zwischen 2? und 20! Minuten zu quälen, bitte schön:

http://www.e-b-v.de/...enchautorun1.atn.zip
http://www.e-b-v.de/...enchautorun3.atn.zip

Die Aktion laden, starten und der Rest sollte sich selbst erklären;-)

Das kam hier so raus (für 1-fache Durchläufe):
G3 b/w 400MHz 768MB RAM 256 davon für PS6: 19'30" = 1170" = 100%
G4 2x800MHz 1,5GB RAM 700 davon für PS7: 5'33" = 333" = 350%
G4/500 1,4GHz 768MB RAM 350 davon für PS7: 5'54" = 354" = 330%
G4 2x1GHz 1,25GB RAM 800 davon für PS6: 4'34" = 274" = 427%
Tibook akku 867 1GB RAM 800 davon für PS7: 10'30" = 630" = 186%
Tibook Netz 867 1GB RAM 800 davon für PS7: 6'58" = 418" = 280%
G5 2x2GHz 2GB RAM 1350 davon für PS7: 2'14" = 134" = 873%

[Nachtrag 28.1.04]

G5 2x2GHz 2GB RAM 1350 davon für PSCS: 2'46" = 166" = 705%

Also etwa auf PS7 auf dem selben Gerät und gleicher Konfiguration:

-20%

Ich habe allerdings noch nicht festmachen können, was da bremst. Die langen Filter am Ende des Tests sind jeweils nur etwa 1 sec langsammer. Allerdings ist Punktieren von etwa 14" auf knapp 30" fast nur noch halb so schnell.

[Ende Nachtrag 28.1.04]


MfG

Thomas...
Thomas Richard
23. Nov 2003, 02:01
for-Schleife einmal ohne, einmal mit geschweiften Klammern
Hallo, miteinander!
Kai und ich rätseln schon ein paar Tage. Weshalb funktioniert das folgende Script. Es soll abfragen, ob im Dokument die Farbe "Test" bereits vorkommt. Falls NEIN, die Farbe anlegen, falls JA, nichts weiter tun. Daß dieses (erfolgreich auszuführende) Script zustande kam, beruht übrigens auf einem Schreibfehler. Wir hatten schlicht und ergreifend die geschweiften Klammern zu setzen vergessen ;-)
Code
for (var n=0; n< app.activeDocument.swatches.length; n++) 
if(app.activeDocument.swatches[n].name == "Test"){
exit ();
}
else (app.activeDocument.swatches[n].name != "Test")
{app.activeDocument.colors.add({name:"Test", model:ColorModel.PROCESS, colorValue:[0, 100, 100, 0]});
};


Im folgenden Script hingegen wird ein Fehler geworfen: "Dieser Farbfeldname wird bereits verwendet. Wählen Sie einen anderen Namen." Logisch (jedenfalls denke ich mir das so), da das Script mehrmals versucht eine Farbe mit gleichem Farbfeldnamen anzulegen.
Code
//JS soll prüfen, ob ein Farbname im Dokument enthalten ist. 
//Falls JA, nichts weiter tun
//Falls NEIN eine Farbe mit dem geprüften Namen anlegen:

//DIES FUNKTIONIERT NICHT, DA DAS SCRIPT VERSUCHT DIE FARBE "Test" MEHRMALS ANZULEGEN.

for (var n=0; n< app.activeDocument.swatches.length; n++){
if(app.activeDocument.swatches[n].name == "Test"){
exit ();
}
else (app.activeDocument.swatches[n].name != "Test")
{app.activeDocument.colors.add({name:"Test", model:ColorModel.PROCESS, colorValue:[0, 100, 100, 0]})
};
};

Aber weshalb funktioniert die obere Version des Scripts ohne die geschweiften Klammern um die Anweisungen der for-Schleife herum?
...
Uwe Laubender
23. Sep 2009, 21:18
[JS] Barcode Generator Skript - TESTEN
 
Hallo,

im engl. Skripting-Forum wurde ein Skript zur Erstellung von EAN13/ISBN-Barcodes veröffentlicht.

Hat irgendjemand die Möglichkeit einen mit diesem Skript erzeugten Barcode mit einem Barcode-Leser zu prüfen?

Hier der Link:
http://www.adobeforums.com/...?14@581.kUhHholPQaO@
...
zaphodbeeblebroxx
26. Sep 2007, 14:33
[JS] Indexeinträge im Umbruch visualisieren
Peter Kahrel hat in den letzten Tagen im Adobe Scripting-Forum zwei interessante CS3-Skripte zur Visualisierung von Indexeinträgen veröffentlicht, die ich hier festhalten möchte:

1. Taggen
Mit diesem Skript werden die Indexeinträge an Ort und Stelle in Tags dargestellt:
'<ix>Indexeintrag</ix>'. Untereinträge werden durch '#' separiert.

Code
index2text (app.activeDocument);  
//delete_index (app.activeDocument);

function index2text (doc)
{
var tops = doc.indexes[0].allTopics;
for (var i = 0; i < tops.length; i++)
for (var j = tops[i].pageReferences.length-1; j > -1; j--)
tops[i].pageReferences[j].sourceText.contents =
'<ix>' + topic_path (tops[i], tops[i].name) + '</ix>';
}

// create topic string. Subtopics are separated by '#'
function topic_path (top, str)
{
if (top.parent.constructor.name == 'Index')
return str;
else
return topic_path (top.parent, top.parent.name + '#' + str)
}

function delete_index (doc)
{
// delete page references and topics
doc.indexes[0].topics.everyItem().pageReferences.everyItem().remove();
doc.indexes[0].topics.everyItem().remove();
}


2. Inline-Graphiken
Im Unterschied zum o.g. Skript erscheinen die Indexeinträge nicht zwischen Tags, sondern werden in einen verankerten Textrahmen, der mit dem Objektstil 'sidebar' (muss vor Ausführung des Skripts angelegt sein) ausgezeichnet wird, eingefügt. Sie laufen damit im Text mit.

Code
index2text (app.activeDocument);  
//delete_index (app.activeDocument);

function index2text (doc)
{
var tops = doc.indexes[0].allTopics;
for (var i = 0; i < tops.length; i++)
for (var j = tops[i].pageReferences.length-1; j > -1; j--)
{
var ip = tops[i].pageReferences[j].sourceText;
var p_ref = topic_path (tops[i], tops[i].name);
side_note (ip, p_ref)
}
}

// create topic string. Subtopics are separated by '#'
function topic_path (top, str)
{
if (top.parent.constructor.name == 'Index')
return str;
else
return topic_path (top.parent, top.parent.name + '#' + str)
}

function delete_index (doc)
{
// delete page references and topics
doc.indexes[0].topics.everyItem().pageReferences.everyItem().remove();
doc.indexes[0].topics.everyItem().remove();
}

function side_note (ins_point, s)
{
var sidebar = ins_point.textFrames.add ();
sidebar.geometricBounds = [0,0,10,70];
sidebar.appliedObjectStyle = app.activeDocument.objectStyles.item ('sidebar');
sidebar.contents = s;
sidebar.fit (FitOptions.frameToContent);
}


Diese beiden Skriptversionen haben mir so gut gefallen, dass ich gleich noch eine kleine Änderung für InDesign CS4 vorgenommen habe. Die Indexeinträge werden hier an Ort und Stelle in bedingten Text ('Index') umgesetzt und können damit ein- und ausgeblendet werden.

Code
// index2conditionalText.jsx 
// Original by Peter Kahrel
// modified by Martin Fischer to take use of InDesign CS4 conditional text
// 04.12.2008

Object.prototype.get = function( )
{
try {
var myObject = this.item( arguments[0].name );
myObject.name;
}
catch (e) {
var myObject = this.add( arguments[0] );
}
return myObject;
}

index2text (app.activeDocument);
//delete_index (app.activeDocument);

function index2text (doc)
{
var myConditionSet = app.activeDocument.conditions.get( {name:'Index', indicatorMethod:ConditionIndicatorMethod.USE_HIGHLIGHT} )
var tops = doc.indexes[0].allTopics;
for (var i = 0; i < tops.length; i++)
for (var j = tops[i].pageReferences.length-1; j > -1; j--)
{
var ip = tops[i].pageReferences[j].sourceText;
var p_ref = topic_path (tops[i], tops[i].name);
conditional_note (ip, p_ref, myConditionSet)
}
myConditionSet.visible = false;
}

// create topic string. Subtopics are separated by '#'
function topic_path (top, str)
{
if (top.parent.constructor.name == 'Index')
return str;
else
return topic_path (top.parent, top.parent.name + '#' + str)
}

function delete_index (doc)
{
// delete page references and topics
doc.indexes[0].topics.everyItem().pageReferences.everyItem().remove();
doc.indexes[0].topics.everyItem().remove();
}

function conditional_note (ins_point, s, c)
{
ins_point.appliedConditions = c;
ins_point.contents = s;
}


Nach Ausführung des Skripts ist der bedingte Text 'Index' ausgeblendet.
Bei Bedarf kann der bedingte Text über die Suche-Ersetze Funktion wieder gelöscht werden (etwa für eine erneute Visualisierung der Indexeinträge nach einer Erweiterung derselben).
...
Martin Fischer
5. Dez 2008, 08:07
Doppelseiten alphabetisch ordnen nach Absatzformat?
So sollte es auch in CS2 laufen:

Code
d = app.activeDocument;   
l = d.layers.item ('Ebene 2');

for ( i = 0; i < d.spreads.length; i++ )
{
o = d.spreads[i].pageItems;
if ( o.length> 1 )
{
g = d.spreads[i].groups.add( o );
duppel( g );
g.ungroup();
}
else if ( o.length == 1 )
{
duppel(o[0] );
}
}
l.groups.everyItem().ungroup();

function duppel( x )
{
newObj = x.duplicate( [0,0] );
newObj.itemLayer = l;
}

...
Martin Fischer
1. Feb 2008, 10:03
Scripting Hilfe? - Smartes Ankerpunkt wählen
Hallo Scripter,

Ich bin faul, und darum möcht ich den Ankerpunkt per Tastaturkürzel wählen können. Darum habe ich mir 9 Scripts gemacht die jeweils aus einer dieser Zeilen bestehen.
Die Zeile habe ich mir übrigens aus dem Forum gefischt. (Singelmann sei wiedermal dank - muss mir mal sein Buch kaufen) ;)

Code
app.layoutWindows[0].transformReferencePoint = AnchorPoint.TOP_RIGHT_ANCHOR; 
app.layoutWindows[0].transformReferencePoint = AnchorPoint.RIGHT_CENTER_ANCHOR;
app.layoutWindows[0].transformReferencePoint = AnchorPoint.BOTTOM_RIGHT_ANCHOR;
app.layoutWindows[0].transformReferencePoint = AnchorPoint.TOP_CENTER_ANCHOR;
app.layoutWindows[0].transformReferencePoint = AnchorPoint.CENTER_ANCHOR;
app.layoutWindows[0].transformReferencePoint = AnchorPoint.BOTTOM_LEFT_ANCHOR;
app.layoutWindows[0].transformReferencePoint = AnchorPoint.TOP_LEFT_ANCHOR;
app.layoutWindows[0].transformReferencePoint = AnchorPoint.LEFT_CENTER_ANCHOR;
app.layoutWindows[0].transformReferencePoint = AnchorPoint.TOP_RIGHT_ANCHOR;


Die 9 Skripte habe ich mir auf 9 Tasten gelegt und nun kann ich bequem den Ankerpunkt ändern.

Nun gibt es aber ein zwar logisches aber unbequemes Verhalten beim Ankerpunkt wechseln. Unzwar wenn der gerade angewählte Gegenstand ein horizontal oder vertikal gespiegelter Gegenstand ist. Wenn er -100% bei der Skalierung hat, oder 180 gedreht ist, oder beides. Dann wählt das Skript den zwar für das Objekt korrekten Anker, aber im Kopf erwartet man beim Tastendruck "Anker oben links" auch "oben links" und will nicht erst umdenken wie das Objekt gespiegelt ist. Smart ist das Skript, das einem das denken erspart. :)

Als Lösung könnte das Script vielleicht kurz die Auswahl aufheben, den Ankerpunkt wechseln und wieder das zuvor gehabte Objekt zurückanwählen?

Als andere Lösung stelle ich mir ein WENN/DANN Weiche vor. Zum beispiel für OBEN-LINKS:

IF (VERT_SKALIERUNG > 0%) dann wähle TOP_LEFT_ANCHOR;
IF (VERT_SKALIERUNG < 0%) dann wähle TOP_RIGHT_ANCHOR;
IF (VERT_SKALIERUNG < 0%) UND (ROTATION = 180) dann wähle BOTTOM_RIGHT

Schlimm kompliziert wird es für mich als Nichtmathematiker, wenn man das Skript perfekt haben will. Denn es müste für Rotationsbereiche und für Skalierungsbereiche anders reagieren - sich bei 45° und 225° rotation anders verhalten.

Mag mir jemand helfen? Das resultierende Script wäre doch sehr praktisch. Gibt's des schon? Ich hab schon gesucht.
...
Stephan_M
23. Jan 2008, 18:56
automatischer Textfluss
Hier die CS3-Version des obigen Skripts 'AppendPagesIfStoryOverflows.jsx':

Code
//AppendPagesIfStoryOverflows_CS3.jsx  
//
// thanks to Dave Saunders for the functions isText() and DumbRunPages()
// http://jsid.blogspot.com/2005/10/standard-methods-and-functions.html

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.documents.length> 0) && (app.selection.length > 0) && (app.selection[0].isText())) {
var aStory = app.selection[0].parentStory;
var aDoc = app.documents[0];

DumbRunPages(aDoc, aStory)
}
else {
alert("Fehler\rBitte Text auswählen.")
}

function DumbRunPages(theDoc, theStory) {
// What makes this "dumb" is that default master pages are used.
var uRuler = theDoc.viewPreferences.rulerOrigin;
theDoc.viewPreferences.rulerOrigin = RulerOrigin.spreadOrigin;
while (theStory.textContainers[theStory.textContainers.length-1].overflows) {
//Seite nach der letzten Textrahmenseite einfügen
var backPage = aDoc.pages.add(LocationOptions.after, aStory.textContainers[theStory.textContainers.length-1].parent)

app.activeWindow.activePage = backPage;
backPage.appliedMaster = theDoc.pages[-2].appliedMaster;
var myPbounds = backPage.bounds;
var myNewTF = backPage.textFrames.add();
if ( (!theDoc.documentPreferences.facingPages) || (backPage.side == PageSideOptions.rightHand) ) {
myNewTF.geometricBounds =
[myPbounds[0] + backPage.marginPreferences.top,
myPbounds[1] + backPage.marginPreferences.left,
myPbounds[2] - backPage.marginPreferences.bottom,
myPbounds[3] - backPage.marginPreferences.right];
} else {
myNewTF.geometricBounds =
[myPbounds[0] + backPage.marginPreferences.top,
myPbounds[1] + backPage.marginPreferences.right,
myPbounds[2] - backPage.marginPreferences.bottom,
myPbounds[3] - backPage.marginPreferences.left];
}
myNewTF.itemLayer = theStory.textContainers[theStory.textContainers.length-1].itemLayer;
myNewTF.previousTextFrame = theStory.textContainers[theStory.textContainers.length-1];
myNewTF.textFramePreferences.textColumnCount = backPage.marginPreferences.columnCount;
myNewTF.textFramePreferences.textColumnGutter = backPage.marginPreferences.columnGutter;
if (myNewTF.characters.length == 0){
theDoc.viewPreferences.rulerOrigin = uRuler;
alert("Permanently overset"); // This indicates a permanent overset condition so break out of loop
}
}
theDoc.viewPreferences.rulerOrigin = uRuler;
}

...
Martin Fischer
22. Jan 2008, 05:38
XML Tags suchen und ersetzen
Vorhande XML-Elemente lassen sich auch mit dem Indesign-Objekt über VBA gut abgreifen.

Folgende VBA-Routine (Entwicklungs-Umgebung in allen MS-Ofiice vorhanden) klappert in der aktiven Indesign-Datei alle XML-Elemente ab und ändert das Element "Tabelle" in das Element "block" ("block" muss als Tag schon im Indesign-Dokument angelegt sein):


Option Explicit
Private AidApp As New InDesign.Application
Private lgEl As Long


Sub XmlElementRekursStart()

Dim idDoc As InDesign.Document
Dim IdXelements As InDesign.XMLElements

Set idDoc = AidApp.ActiveDocument
Set IdXelements = idDoc.XMLElements.FirstItem.XMLElements

Call XmlElementRekurs(IdXelements)


End Sub

Private Sub XmlElementRekurs(IdXelements As InDesign.XMLElements)

Dim IdXelement As InDesign.XMLElement

Dim i As Long
Dim y As Long

y = IdXelements.Count

For i = 1 To y

lgEl = lgEl + 1

Set IdXelement = IdXelements.Item(i)

If IdXelement.MarkupTag = "Tabelle" Then

'hier deine Aktion
IdXelement.MarkupTag = "block"

End If

If IdXelements.Item(i).XMLElements.Count > 0 Then

Call XmlElementRekurs(IdXelements.Item(i).XMLElements)

End If

Next

End Sub

In der VBA-Entwicklungsumgebung muss unter dem Menü "Extra/Verweise" die "Adobe Indesign CS3 (oder CS2) Type Library" hinzugefügt werden.

Gregor
...
Thaler
20. Jan 2008, 14:35
Alle offenen Dateien speichern... Skript?
Hallo Gerald,

Um alle offenen Dokumente mit "sichern unter" zu sichern und dabei durch Löschen der History ihre Dateigröße zu verringern, verwende ich folgendes Skript. Wink

Code
// 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++)
(myDocs[oneDoc].saved == true)
? myDocs[oneDoc].save(myDocs[oneDoc].fullName)
: unsavedDocs++;

if (unsavedDocs > 0)
alert (unsavedDocs + " Dokument(e) nicht gesichert!")


Es sichert nur die Dokumente, die bereits einmal gesichert worden sind (also ihre pysikalische Heimat auf dem Datenträger gefunden haben).
...
Martin Fischer
11. Jan 2008, 15:50
Gruppen im gesamten Dokument auflösen
Hallo Michael,

dann versuche es doch mit diesem JavaScript:
Code
while (app.documents[0].groups.length !=0) { 
app.documents[0].groups.everyItem().ungroup();
}
alert ("Fertig.", "Schon gemacht");

Damit werden auch gruppierte Gruppen von Gruppen aufgelöst.

Gruss, Hans...
Hans Haesler
28. Nov 2007, 14:18
versionierung von dateien OHNE version cue?
Das Eventskript saveCopy.jsx für InDesign CS3 erstellt vor dem Sichern der aktuellen Datei automatisch eine Kopie der ursprünglichen Version in einem Unterordner namens "Sicherung", welcher bei Bedarf vom Skript angelegt wird.
...
Martin Fischer
9. Nov 2007, 18:34
Eventskript "neue Ebenen"
Hallo Stefan,

> Fehlerzeichenfolge: Es existiert bereits eine Ebene dieses Namens.

Ist dem so?
Existiert bei Dir eine Ebene mit Namen "Text"?

Auf die fehlende geschweifte Klammer am Ende hat Quarz bereits hingewiesen.

Eine Ebene (hier die Ebene 'Text') kannst Du mit folgendem Befehl ganz nach oben verschieben:
app.activeDocument.layers.item( 'Text' ).move( LocationOptions.atBeginning );

Das Gegenteil (ganz nach unten) wäre:
app.activeDocument.layers.item( 'Text' ).move( LocationOptions.atEnd );

Übrigens sieht meine eigene Version jetzt so aus:
Code
//addLayer.jsx 
#targetengine "myEngine"

var myEventListener = app.addEventListener( "afterNew", addLayer, false );

function addLayer( myEvent )
{
myDoc = myEvent.parent;
myDoc.layers[0].name = 'Text'
myDoc.layers.add( {name: 'Grafik', layerColor: UIColors.red} );
myDoc.layers.add( {name: 'Notes', layerColor: UIColors.gray} );
// ... weitere Ebenen hinzufügen

// die unterste Ebene aktivieren
myDoc.activeLayer = myDoc.layers[-1]; // oder ... = myDoc.layers.item( 'Text' );
}


D.h. ich lösche die vorhandene Ebene nicht, sondern benenne sie einfach um.
Das Löschen würde Probleme bereiten, wenn ein neues Dokument mit der Option "Mustertextrahmen" angelegt würde. Denn dort würden die Mustertextrahmen auf die Ebene gelegt, die gleich danach gelöscht wird.

Am Ende wird die unterste Ebene aktiviert.
...
Martin Fischer
12. Nov 2007, 10:37
Eventskrips für CS3
Zitat aber Herr Singelmann hat gesagt

Holy smoke! Bitte meißelt meine Worte nicht in Marmor. Wenn überhaupt meißeln, dann in Vanillepudding, da kriegt man sie wenigstens wieder raus.

Ich habe nur den Scripting Guide zitiert (zu laden unter http://www.adobe.com/...scripting/index.html in der Mitte auf "Scripting resources" klicken), weil ich es plausibel finde, auch diesen Part unser Scripte sprachneutral zu halten.

Dort steht
Zitat in InDesign scripting, menuItems, menus, menuActions,and submenus are all referred to by name. Because of this, scripts need a method of locating these objects that is independent of the installed locale of the application. To do this, you can use an internal database of strings that refer to a specific item, regardless of locale

und
Zitat Note:It is much better to get the locale-independent name of a menuAction than of a menu, menuItem, or submenu, because the title of a menuAction is more likely to be a single string. Many of the other menu objects return multiple strings when you use the getKeyStrings method.


Das Beispielscript im Guide zum finden des neutralen Strings ist
Code
var myString = ""; 
var myMenuAction = app.menuActions.item("Convert to Note");
var myKeyStrings = app.findKeyStrings(myMenuAction.name);
if(myKeyStrings.constructor.name == "Array"){
for(var myCounter = 0; myCounter < myKeyStrings.length; myCounter ++){
myString += myKeyStrings[myCounter] + "\r";
}
}
else{
myString = myKeyStrings;
}
alert(myString);


Um daraus die momentan aktuelle Sprache zu machen
Code
var myString = app.translateKeyString("$ID/NotesMenu.ConvertToNote"); 


So, jetzt ist alles wieder schön relativiert und eingeebnet :)

Danke
...
Gerald Singelmann
28. Jun 2007, 23:09