Denna delen av 99 uppdateras inte längre utan har arkiverats inför framtiden som ett museum.
Här kan du läsa mer om varför.
Mac-nyheter hittar du på Macradion.com och forumet hittar du via Applebubblan.

Hur radera hel paragraph i InDesign?

Tråden skapades och har fått 14 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • 2008-07-25 10:55

Jag lyckas inte radera ett helt stycke (eller i stort sett någonting) i InDesign på nedanstående vis. Varför? Hur gör man?

(Jag försöker identifiera stycken som börjar med vissa ord och radera styckena i sin helhet.)

set mySelectedParagraphs to text of paragraphs of selection as string
delete mySelectedParagraphs

ger felmeddelandet (i script debugger)
Adobe InDesign CS2 got an error: {"Detta är ett teststycke."} doesn't understand the delete message.

set mySelectedParagraphs to text of paragraphs of selection as string
search myStory for mySelectedParagraphs replacing with ""

ger felet
Adobe InDesign CS2 got an error: Ogiltigt värde för parametern for för händelsen search. string förväntades, ("Detta är ett teststycke.") togs emot.

En "Paragraph" kan betyda två saker, antingen (texten i) ett stycke, eller ett "Stycke-objekt".

Ett styckeobjekt är vad InDesign behöver ha för att kunna referera

Syntaxen (ur huvudet) är

tell application "Adobe InDesign CS2"
	tell active document
		tell story 1
			delete (paragraphs whose contents begins with "s")
		end tell
	end tell
end tell
  • Medlem
  • 2008-07-25 22:57

Tack, det fungerar bra!
Men jag ser nu att jag missade ett inte i min första fråga:

Jag försöker identifiera stycken som intebörjar med vissa ord och radera styckena i sin helhet.

tell application "Adobe InDesign CS2"
	tell active document
		tell story 1
			delete ((paragraphs) whose (contents does not start with "s"))
		end tell
	end tell
end tell

Förutom det genanta i att inte prova det uppenbara så är just det här med s.k "filter" lite knepigt.

Syntaxen i raden är [kommando] [objekt] [filter]

när du testar med sånt här skall du börja testa med kommandot "get" och endast objektet (inget filter), så att du vet att du får fatt i objeketet. När du kommit så långt kan du lägga på ditt filter.

Ett filter utvärderar en egenskap hos objektet, genom att ställa upp ett villkor. Villkoret måste vara utformat så att det returnerar sant eller falskt.

Normalt sett kan man inte hoppa flera "nivåer" i egenskaper. Låt oss t.ex. säga att vi har en textbunden bild i något/några av styckena och vill ta reda på om den/de saknar länkar

Man skule då kunna tänka sig en syntax som är något i stil med

paragraphs whose status of missing links of images contains status false

Men det går inte, för där frågar vi inte om en egenskap hos stycket, utan om något hos en bild, och det kan inte stycket svara på!

I ett sånt fall skulle man istället behöva något i stil med:

parent of (images where status of item link is missing link and class of parent is paragraph)

Alltså, först frågar man om bilderna som uppfyller ett visst villkor, och sedan hämtar man objektreferensen för dem

OBS! ingen av dessa kodsnuttar är kontrollerade, så det kan vara felaktiga - men principen är riktig

Tänk också på att det bara är ett fåtal program som har välutvecklat stöd för filter, InDesign är ett av dem, men trots det kan det finnas buggar, vilket kan leda till att det inte går, då får man istället loopa genom objekten och antingen ta bort dem ett och ett (i det här fallet måste man då loopa baklänges och ta bort från slutet) eller bygga upp en lista och när man är klar ta bort alla objekt i listan.

  • Medlem
  • 2008-07-26 08:49
Ursprungligen av Richard Rönnbäck:
tell application "Adobe InDesign CS2"
	tell active document
		tell story 1
			delete ((paragraphs) whose (contents does not start with "s"))
		end tell
	end tell
end tell

Förutom det genanta i att inte prova det uppenbara så är just det här med s.k "filter" lite knepigt...

jajaja, men det uppenbara för en mästare är inte lika uppenbart för novisen...

Jag försökte med att sätta in ett [not] här och där men fick bara fel tillbaka.

[get] brukar jag köra med, och fick tillbaka innehållet jag ville radera, men det var visst fel ändå.

Tack ska du ha. Jag jobbar vidare på det där med listan tror jag. Inte för att ovanstående inte fingerar (jag har inte testat) utan för att jag även, i ett eventuellt steg 2, vill hantera det som raderas.

  • Medlem
  • 2008-07-28 08:32

Jag har nu fått ihop en modell att bygga vad jag vill uppnå kring. Tack!

  • Medlem
  • 2008-07-29 10:17

äsch, nu kör jag fast igen...

Jag har

set mySaveList to {"Alfa", "Beta", "Gamma", "Delta"}

Men kan inte få till raderingen av stycken som inte börjar med något av dessa ord.
Jag gissar att jag måste identifiera alla stycken som ska raderas och ta dem tillsammans på slutet.

Jag tragglar vidare...

  • Medlem
  • 2008-07-29 18:06

Nu har jag i alla fall fått till en lista med de ord som inleder de stycken jag vill radera. Men inte raderas de... Första raden nedan fungerar. Den andra inte

delete ((paragraphs) whose (contents starts with "Alfa"))
			
delete ((paragraphs) whose (contents starts with (item 1 of myTmpDelete as string)))

Vad jag kan se gör du inget fel. Detta fungerar (i huvudsak klippt och klistrat från dina och Richards exempel i denna tråd)

set myDeleteList to {"Alfa", "Beta", "Gamma", "Delta"}

tell application "Adobe InDesign CS2"
	tell active document
		tell story 1
			repeat with i from 1 to number of items in myDeleteList
				try
					delete ((paragraphs) whose (contents starts with (item i of myDeleteList as string)))
				end try
			end repeat
		end tell
	end tell
end tell
  • Medlem
  • 2008-07-30 17:39

Jag får inte till det. Men jag löste det genom att först ta ut det jag vill spara i en variabel och sedan radera allt och sedan skriva tillbaka det som ska sparas.
Det jag förlorar är möjligheten att typografera först, men å andra sidan är skriptet delvis till för att göra det lättare att typografera texten.

Om nån kommer på en lösning är jag ändå nyfiken. Tack för hjälpen!

Jag har faktiskt redan beskrivit varför det inte funkar, men det här med filter är som sagt svårt så jag ska försöka förtydliga lite.

Ett filter (whose/where-sats) är ett sätt att ställa upp villkor för objekt. För att det ska funka måste åtminstone två förutsättningar vara uppfyllda

1) Objektet måste stödja filter
2) Filtret måste gälla en egenskap som finns direkt hos objektet

I ditt fall är det första uppfyllt, men inte det andra. Om du säger "get properties of paragraph 1" så får du en uppsättning egenskaper som finns hos objektet, bland annat ordet "contents" dvs. vilket textinnehåll som stycket har

Däremot finns INTE egenskapen "first word"!

Anledningen till att du kan säga "first word of contents of paragraph 1" är att AppleScript FÖRST hämtar texten och DÄREFTER bryter ut det första ordet. Det är alltså en tvåstegsraket - men filter måste vara en enstegsraket.

Då kanske man frågar sig varför man kan säga 'paragraphs whose contents begin with "Alfa" ' och vid närmare påsyn ser man att anledningen till det är att vi då utvärderar "contents" direkt - dvs en enstegsraket.

Rent teoretiskt skulle man alltså i det här läget behöva tänka sig ett filter som sa något i stil med

get paragraphs whose contents begins with something that is in {"Alfa", "Beta", "Gamma"}

Problemet är att det inte går, eftersom "begins" kräver att det man jämför med är en text t.ex. "Alfa" och inte en lista (även om listan innehåller texter)

I det här läget måste man nog gilla läget och inse att man måste köra med en repeat-loop, och det finns då två sätt att göra det, det ena är att man loopar listan, och frågar efter stycken som börjar med respektive ord, det andra är att man går genom styckena och frågar om det börjar med något av orden i listan.

Vad som är effektivast beror på hur lång listan med ord, respektive hur många stycken som finns, men i det här fallet skulle jag nog föredra att loopa styckena, och då blir det såhär

set mySaveList to {"Alfa", "Beta", "Gamma", "Delta"}
set myContentsOfDeletedParagraphs to {}

tell application "Adobe InDesign CS2"
	tell active document
		tell story 1
			repeat with i from (count of paragraphs) to 1 by -1
				set myCurrentParaContents to (contents of paragraph i)
				if first word of myCurrentParaContents is not in mySaveList then
					set end of myContentsOfDeletedParagraphs to myCurrentParaContents
					delete paragraph i
				end if
			end repeat
		end tell
	end tell
end tell

Observera att jag tar bort från slutet, vilket är säkrare (och i det här fallet nödvändigt) eftersom man annars förskjuter textinnehållet så att säga

  • Medlem
  • 2008-07-31 10:29

Det var som fasen! Skriptet är nu redan distribuerat, men det går ju enkelt att ändra i ändå.

Tack Richard! Vad skulle jag göra utan dig...

Tja, du skulle kanske:

* skriva sämre skript
* åtnuta lägre kollegiealt anseende
* ha en svagare karriärsutveckling
* ha ett lite tråkigare liv

Hmm... Kan jag få provision...

  • Medlem
  • 2008-08-01 07:14

hehe... Skriptet är nu hur som helst helt värdelöst ändå. En kommunikationsmiss gjorde att jag missade att den text som ska raderas i inte är uppbygd exakt på det sätt jag beskrev ovan. Rensningen går inte att automatisera för det kommer aldrig att gå att lita på att underlaget uär sammansatt på samma sätt från gång till annan...

Det var ju tråkigt, men tack vare det så har du säkert lärt dig mer om AppleScripts underbara värld

1
Bevaka tråden