Hallo Jan,
da hast Du Dir ne Menge Mühe gegeben und dann bremst Dich die Sache mit den Fußnoten doch noch aus. Nach den Irritierungen der letzten Tage ist es mir fast eine Erleichterung, daß AppleScript offensichtlich auch Probleme mit dem Zugriff auf diverse Objekte in den Fußnoten hat, wenn auch deutlich weniger als JavaScript.
Hatte ich Dich nicht darauf hingewiesen, daß die Schleife über die Zeichen zur Zuweisung als Scherz aufzufassen sei? ;-)
Du kannst die Ausführungsgeschwindigkeit etwas steigern, wenn Du auf diese Schleife verzichtest. Tausche dafür folgende Zeilen
repeat with i from myStartPos to myEndPos by 1
set applied character style of character i of myStory to myCharacterStyleRef
end repeat
durch diese Zeile aus:
set applied character style of characters myStartPos thru myEndPos of myStory to myCharacterStyleRef
Das Fußnotenproblem konnte ich innerhalb Deines AppleScripts nicht lösen.
Ich habe - mit Ausnahme der Überprüfung des Absatzformats - keine Möglichkeit gefunden, festzustellen, ob die gefundenen Zeichen sich in einer Fußnote befinden.
Ferner habe ich keine Möglichkeit gefunden, den Text der Fußnote, in der die Tags gefunden worden sind, in einen temporären Textrahmen zu verschieben, um sie dort bearbeiten zu lassen, weil ich aus der Fußnote selbst das Fußnotenobjekt nicht zu fassen bekomme.
Allerdings habe ich mit dem Skript
notes2text.jsx von
Peter Kahrel einen Weg gefunden, das Problem mit etwas Mut zu umschiffen:
Das Skript wandelt im aktiven Dokument sämtliche Fußnoten in Text um (hängt sie ans Ende der Textflüsse).
Danach kannst Du "fußnotenempfindliche" Skripte, wie Dein obiges AS ablaufen lassen.
Anschließend lassen sich mit demselben Skript die Fußnoten in Textform wieder in richtige Fußnoten umwandeln.
Über einen Dialog kannst Du wählen, ob Du die Fußnoten in Text oder umgekehrt konvertieren willst.
// notes2text.jsx
//DESCRIPTION: Converts footnotes of every story to text or back text to footnotes
// An InDesign CS2 script from Peter Kahrel
// with some adjustments and additions (Dialog to select the operation,
// considering every story but only the selected one) by Martin Fischer
//some global constants
notecueStyle = 'Fußnotenzeichen' //cues, char. style
notenumStyle = 'Fußnotenzeichen' //note number (in foot- and in endnotes), char. style
noteStyle = 'FN' //for notes, paragraph style
notePar1Style = 'FN' //for first paragraph in note, par. style
sepText = '\u2002' //separator text in notes
noteStart = '\u2704' //codes for notes when
noteEnd = '\u2705' //placed at end of story
u = undefined
//---------------------------------------------------------------------
var myResult = myDialog();
var myStories = app.documents[0].stories;
for (oneStory = 0; oneStory < myStories.length; oneStory++)
{
if (myResult == "notes2Text")
notes2text( myStories[oneStory] )
else text2Footnotes(myStories[oneStory])
}
function notes2text( theStory )
{
app.findPreferences = app.changePreferences = null
var notes = theStory.search( '^F' )
if( notes.length > 0 )
{
app.activeDocument.footnoteOptions.separatorText = ''
app.activeDocument.footnoteOptions.markerPositioning =
FootnoteMarkerPositioning.normalMarker
for( var j = 0; j < theStory.footnotes.length; j++ )
{
theStory.insertionPoints[-1].contents = '\r' + noteStart
theStory.footnotes[j].texts[0].move(
LocationOptions.after, theStory.insertionPoints[-1] )
theStory.insertionPoints[-1].contents = noteEnd
}
//must refresh 'notes'
var notes = theStory.search( '^F' )
for( var j = theStory.footnotes.length-1; j > -1; j-- )
notes[j].insertionPoints[0].contents = ''
theStory.search( '^F', false, false, '' )
}
}
//-----------------------------------------------------------------------
function text2Footnotes(theStory)
{
app.findPreferences = app.changePreferences = null
var cues = theStory.search( '' )
if( cues.length > 0 )
{
doNoteStyles()
var nStart = theStory.search( noteStart, false, true )
//var story = cues[0].parentStory
theStory.paragraphs.itemByRange(
nStart[0].paragraphs[0],
theStory.paragraphs[-1] ).applyStyle
( pStyles.item( noteStyle ), false )
//apply notePar1Style to first paragraph of each note
for( var j = nStart.length-1; j > -1; j-- )
nStart[j].paragraphs[0].applyStyle
( pStyles.item( notePar1Style ), false )
with( app.activeDocument.footnoteOptions )
{
footnoteTextStyle = pStyles.item( notePar1Style )
separatorText = sepText
footnoteMarkerStyle = chStyles.item( notecueStyle )
markerPositioning = FootnoteMarkerPositioning.normalMarker
}
for( var j = cues.length-1; j > -1; j-- )
var fn = cues[j].insertionPoints[0].footnotes.add()
var nStart = theStory.search( noteStart, false, true )
var nEnd = theStory.search( noteEnd, false, true )
for( var j = cues.length-1; j > -1; j-- )
theStory.characters.itemByRange( nStart[j], nEnd[j] ).move
( LocationOptions.after, theStory.footnotes[j].insertionPoints[-1] )
theStory.search( '', false, true, '' )
//delete placeholdres
theStory.search( noteStart, u, u, '' )
theStory.search( noteEnd, u, u, '' )
//mop up stray hard returns
while( theStory.characters[-1].contents == '\r' )
theStory.characters[-1].remove()
}
}
//--------------------------------------------------------------------------
//create some styles for notes
function doNoteStyles()
{
chStyles = app.activeDocument.characterStyles
if( chStyles.item( notecueStyle ) == null )
chStyles.add( { name : notecueStyle, position : Position.superscript } )
if( chStyles.item( notenumStyle ) == null )
chStyles.add( { name : notenumStyle } )
pStyles = app.activeDocument.paragraphStyles
if( pStyles.item( noteStyle ) == null )
pStyles.add( {
name : noteStyle,
basedOn : pStyles.item('[Basic Paragraph]') } )
if( pStyles.item( notePar1Style ) == null )
{
var temp = pStyles.add( {
name : notePar1Style,
basedOn : pStyles.item( noteStyle ) } )
with( temp.nestedStyles.add() )
{
appliedCharacterStyle = chStyles.item( notenumStyle )
delimiter = NestedStyleDelimiters.anyWord
inclusive = true
}
}
}
//-----------------------------------------------------------------------
function myDialog(myDefaultPara01,myDefaultPara02)
{
var myDialog = app.dialogs.add({name:"Operation"});
var theChoice = ["notes2Text", "text2Footnotes"];
with(myDialog.dialogColumns.add()){
with(dialogRows.add()){
with(dialogColumns.add()){
staticTexts.add({staticLabel:"Choice:"});
}
with(dialogColumns.add()){
var myChoiceDropdown = dropdowns.add({stringList:theChoice, selectedIndex:0});
}
}
}
var theResult = myDialog.show();
if(theResult == true){
var theOpera = theChoice[myChoiceDropdown.selectedIndex]
myDialog.destroy();
}
else{
myDialog.destroy();
exit();
}
return theOpera;
}
Wäre das jetzt nicht eine neue Herausforderung für Dich, auch dieses Skript nach AppleScript zu übersetzen? ;-)
Viel Spaß
Martin