Styling Paragraphs (CS2 most likely)
InDesign, surprisingly, cares whether or not the text in a paragraph is actually visible in order to apply a style to it, even though you are giving a command a specific paragraph. To get around this, the style has to be applied to the paragraph in the parent story. Luckily, the paragraph count is exactly the same.
tell myTextFrame
place (myContent)
set myTextFrameParentStory to parent story
set paragraphCount to (get count of paragraphs in myTextFrameParentStory)
tell myTextFrameParentStory
repeat with n from 1 to paragraphCount
tell paragraph n
set applied paragraph style to "myParagraphStyle"
end tell
end repeat
end tell
end tell
Source: MacScripters
Extract All Text (CS2)
This script extracts all of the stories in an InDesign file, and then combines everything in Word. This is sort of a substitute to TexTractor in Quark as I couldn't find a viable counterpart for InDesign at the time. It would take quite a bit of work to get this as clean as the plug-ins, but works in a pinch. This also includes a subroutine that combines the output into a Word document, but there were problems associated with Word. The first is that using the copy and paste command via Applescript has a 256 character limit. The second is that the Merge Document command is frustratingly slow.
global masterDocument
global masterText
global newDocument
global newText
global theSaveToFolder
global theDocumentName
--troubleshooting only
global myStory -- to story myCounter
global theInsertionPoint --to insertion point 1 of myStory
global theInsertionPointObj --to object reference of theInsertionPoint
global theParentTextFrame --to item 1 of parent text frames of theInsertionPointObj
global thePage --to parent of theParentTextFrame
global thePageNumber --to name of thePage
global myStory
tell application "Adobe InDesign CS2"
set documentCount to (get count of documents)
if documentCount = 0 then
display dialog "No documents are open. Please open a document and try again."
quit
end if
repeat with d from 1 to documentCount
set theDocument to document d
if (count stories of theDocument) > 0 then
my ExportAllText(theDocument)
end if
end repeat
end tell
display dialog "DONE"
on ExportAllText(theDocument)
tell application "Adobe InDesign CS2"
set theDocumentName to (get name of theDocument) as string
set theSaveToFolder to CreateFolder(theDocumentName) of me
tell theDocument
repeat with myCounter from 1 to (count stories)
set myStory to story myCounter
set thePageNumber to id of myStory
set myFormat to RTF
set myExtension to ".rtf"
set myFileName to "Export_" & thePageNumber & myExtension
set myFilePath to (theSaveToFolder as string) & myFileName
tell myStory
export format myFormat to (myFilePath as string)
end tell
end repeat
end tell --document
end tell --InDesign
--my MergeDocumentsInsertFile(theSaveToFolder)
end ExportAllText
(* This works, but it takes a long time. *)
on MergeDocumentsInsertFile(theFolder)
tell application "Finder" to set alias_list to files of (theFolder as alias)
tell application "Microsoft Word"
make new document
tell active document to repeat with this_doc in alias_list
insert file at after last character file name (this_doc as Unicode text)
end repeat
set theDesktopFolder to path to desktop as Unicode text
set theFileName to (theDocumentName as string) & ".rtf"
save as document 1 file name (theDesktopFolder & theFileName) file format format rtf
close active document saving no
tell application "Finder" to set theTrashedFolder to delete (theFolder as alias)
end tell
end MergeDocumentsInsertFile
on CreateFolder(theFolderName)
set theFolderFinalName to trim_line(theFolderName, ".indd", 1) of me
tell application "Finder"
set theFolder to make folder at (get path to desktop folder) with properties {name:theFolderFinalName, owner privileges:read write, group privileges:read write, everyones privileges:read write}
end tell
return theFolder
end CreateFolder
on trim_line(this_text, trim_chars, trim_indicator)
-- 0 = beginning, 1 = end, 2 = both
set x to the length of the trim_chars
-- TRIM BEGINNING
if the trim_indicator is in {0, 2} then
repeat while this_text begins with the trim_chars
try
set this_text to characters (x + 1) thru -1 of this_text as string
on error
-- the text contains nothing but the trim characters
return ""
end try
end repeat
end if
-- TRIM ENDING
if the trim_indicator is in {1, 2} then
repeat while this_text ends with the trim_chars
try
set this_text to characters 1 thru -(x + 1) of this_text as string
on error
-- the text contains nothing but the trim characters
return ""
end try
end repeat
end if
return this_text
end trim_line
on WriteLog(the_text)
set this_story to the_text & return
set this_file to (((path to desktop folder) as text) & "Log.txt")
my write_to_file(this_story, this_file, true)
end WriteLog
on write_to_file(this_data, target_file, append_data)
try
set the target_file to the target_file as text
set the open_target_file to ¬
open for access file target_file with write permission
if append_data is false then ¬
set eof of the open_target_file to 0
write this_data to the open_target_file starting at eof
close access the open_target_file
return true
on error
try
close access file target_file
end try
return false
end try
end write_to_file
Extract All Text 2
This methodically goes through an InDesign document getting the text contained in each text frame, and tries to maintain some semblance of content order.
It does so by looking at each page as a grid and getting the page item that is contained in each square, moving left to right, up to down. Text is placed in an array, joined with returns, and INDD-proprietary tags removed. Faster than the previous version, but still not as clean as a plug-in.
(*
File: Get Text Extraction (InDesign CS3)
Author(s): Philip Regan
Source Code Copyright: Copyright (c) 2010 Philip Regan All Rights Reserved.
Additional Copyright: replace_chars(), write_to_file() Copyright (c) Apple, Inc. Used with permission.
Source: New source only; no adaptations.
Requirements: Document Opened in InDesign CS3
Notes:
This methodically goes through an InDesign document getting the text contained in each text frame.
It does so by looking at each page as a grid and getting the page item that is contained in each
square, moving left to right, up to down. Text is placed in an array, joined with returns, and
INDD-proprietary tags removed.
Change History:
10_04_06_01_00_000: Started source
*)
property kDebugRun : true
property pDocumentName : ""
property pExtractedText : {}
property kTagsToRemove : {"", "<2003>", " ", "<00AD>"}
-- InDesign constants
property kPageItem_ContentType_Unassigned : "unassigned"
property kPageItem_ContentType_Text : "text type"
tell application "Adobe InDesign CS3"
set theDocument to document 1
my ProcessDocument(theDocument)
my SaveExtractedText()
end tell -- application
on ProcessDocument(theDocument)
tell application "Adobe InDesign CS3"
tell theDocument
set pDocumentName to name
set pageCount to get count of every page
repeat with thisPage from 1 to pageCount
-- if (kDebugRun) then
-- log "Page: " & thisPage
-- end if
set thePage to page thisPage
my ProcessPage(thePage)
end repeat -- pages
end tell -- document
end tell
end ProcessDocument
on ProcessPage(thePage)
tell application "Adobe InDesign CS3"
tell thePage
set pageItemList to {}
set pageItemCount to (get count of every page item)
repeat with thisPageItem from 1 to pageItemCount
set thePageItem to page item thisPageItem
set end of pageItemList to thePageItem
end repeat -- page items
if (get count of items in pageItemList) = 1 then
my ProcessPageItem(item 1 of pageItemList)
else
repeat while (get count of items in pageItemList) > 1
set indexFound to ProcessPageItemListInPage(pageItemList, thePage) of me
set pageItemList to RemoveItemInListByIndex(pageItemList, indexFound) of me
-- if (kDebugRun) then
-- log "page item list count: " & (get count of items in pageItemList)
-- end if
-- something odd happened, but if we don't do this, then we'll never get out of here
if indexFound = 0 then
-- log "ERROR!: indexFound = 0"
repeat with thisPageItem from 1 to (get count of items in pageItemList)
my ProcessPageItem(item thisPageItem of pageItemList)
end repeat
exit repeat
end if
end repeat
my ProcessPageItem(item 1 of pageItemList)
end if
end tell -- page
end tell
end ProcessPage
on ProcessPageItemListInPage(pageItemList, thePage) -- (list) as integer
set indexOfItemToRemove to 0
set kCursorIncrement to 72
tell application "Adobe InDesign CS3"
set theBounds to bounds of thePage
set pageY1 to item 1 of theBounds
set pageX1 to item 2 of theBounds
set pageY2 to item 3 of theBounds
set pageX2 to item 4 of theBounds
repeat with cursorX from (pageX1 - kCursorIncrement) to pageX2 by kCursorIncrement
repeat with cursorY from (pageY1 - kCursorIncrement) to pageY2 by kCursorIncrement
--log "{x, y} = {" & cursorX & ", " & cursorY & "}"
set cursorY1 to cursorY
set cursorX1 to cursorX
set cursorY2 to cursorY1 + kCursorIncrement
set cursorX2 to cursorX1 + kCursorIncrement
set cursorCoordinates to {cursorY1, cursorX1, cursorY2, cursorX2}
set pageItemCount to (get count of items in pageItemList)
repeat with thisPageItem from 1 to pageItemCount
set thePageItem to item thisPageItem of pageItemList
--log "page item: " & thisPageItem
set pageItemCoordinates to geometric bounds of thePageItem
set pageItemIsWithinCursor to IsPageItemWithinCursor(pageItemCoordinates, cursorCoordinates) of me
if (pageItemIsWithinCursor) then
my ProcessPageItem(thePageItem)
return thisPageItem
end if
end repeat -- page items
end repeat -- cursorY
end repeat -- cursorX
end tell
return indexOfItemToRemove
end ProcessPageItemListInPage
on IsPageItemWithinCursor(pageItemCoordinates, cursorCoordinates) --(list, list) as boolean
-- if (kDebugRun) then
-- log "cursor:" & cursorCoordinates
-- end if
set pageItemY1 to item 1 of pageItemCoordinates
set pageItemX1 to item 2 of pageItemCoordinates
set pageItemY2 to item 3 of pageItemCoordinates
set pageItemX2 to item 4 of pageItemCoordinates
set cursorY1 to item 1 of cursorCoordinates
set cursorX1 to item 2 of cursorCoordinates
set cursorY2 to item 3 of cursorCoordinates
set cursorX2 to item 4 of cursorCoordinates
set Y1_OK to false
set X1_OK to false
set Y2_OK to false
set X2_OK to false
if pageItemY1 ≥ cursorY1 then set Y1_OK to true
if pageItemX1 ≥ cursorX1 then set X1_OK to true
if pageItemY1 < cursorY2 then set Y2_OK to true
if pageItemX1 < cursorX2 then set X2_OK to true
if Y1_OK and X1_OK and Y2_OK and X2_OK then
return true
end if
return false
end IsPageItemWithinCursor
on RemoveItemInListByIndex(theList, theIndex) -- (list, integer) as list
if theIndex is 0 then return theList
set newList to {}
set itemCount to (get count of items in theList)
repeat with thisItem from 1 to itemCount
if thisItem is not theIndex then
set theItem to item thisItem of theList
set end of newList to theItem
end if
end repeat
return newList
end RemoveItemInListByIndex
on ProcessPageItem(thePageItem)
tell application "Adobe InDesign CS3"
set theContentType to ""
try
set theContentType to content type of thePageItem as string
on error
set theContentType to kPageItem_ContentType_Unassigned
end try
if theContentType contains kPageItem_ContentType_Text then
set theContents to contents of thePageItem
set end of pExtractedText to (get text of thePageItem as string)
end if
end tell
end ProcessPageItem
on SaveExtractedText()
set AppleScript's text item delimiters to return
set formattedText to pExtractedText as Unicode text
set AppleScript's text item delimiters to ""
set tagCount to (get count of items in kTagsToRemove)
repeat with thisTag from 1 to tagCount
set theTag to item thisTag in kTagsToRemove
set formattedText to replace_chars(formattedText, theTag, "") of me
end repeat
my WriteText(formattedText, pDocumentName & ".txt")
end SaveExtractedText
on replace_chars(this_text, search_string, replacement_string)
set AppleScript's text item delimiters to the search_string
set the item_list to every text item of this_text
set AppleScript's text item delimiters to the replacement_string
set this_text to the item_list as string
set AppleScript's text item delimiters to ""
return this_text
end replace_chars
on WriteText(the_text, file_name)
set this_story to the_text & return
set this_file to (((path to desktop folder) as text) & file_name)
my write_to_file(this_story, this_file, true)
end WriteText
on write_to_file(this_data, target_file, append_data)
try
set the target_file to the target_file as text
set the open_target_file to ¬
open for access file target_file with write permission
if append_data is false then ¬
set eof of the open_target_file to 0
write this_data to the open_target_file starting at eof
close access the open_target_file
return true
on error
try
close access file target_file
end try
return false
end try
end write_to_file