I am trying to make an Applescript that condenses multiple lines down to one line.
For example
"a
b
c
d"
to
('a','b','c','d')
The string is in TextWrangler, and my script is
set AppleScript's text item delimiters to {return & linefeed, return, linefeed, character id 8233, character id 8232}
tell application "TextWrangler"
tell text window 1
set i to 2
set selection to "('
"
repeat while i < 6
select (insertion point before line i)
select line the (startLine of the selection)
copy (contents of the selection) as text to myText
set newText to text items of myText
set AppleScript's text item delimiters to {""}
set newText to newText as text
select insertion point after line 1
if i = 2 then
set selection to newText
else
set selection to "','" & newText
end if
set i to i + 1
end repeat
set selection to "')"
end tell
end tell
The issue is that result of the script is ('a','b','b'), so I am unable to remove 'new line' character. If someone help me to improve it to work with dynamic number of lines, I will be grateful.
To get the text from TextWrangler, you would use:
tell application "TextWrangler"
set myString to text of window 1
end tell
To update the text in TextWrangler, you use:
tell application "TextWrangler"
set text of window 1 to myString
end tell
So, you can wrap those two pieces of code around adayzdone's code.
tell application "TextWrangler"
set myString to text of window 1
end tell
set myList to paragraphs of myString
set listCount to count myList
repeat with i from 1 to my listCount
set item i of myList to quoted form of item i of myList
end repeat
set {TID, text item delimiters} to {text item delimiters, ", "}
set newString to ("(" & myList as text) & ")"
set text item delimiters to TID
tell application "TextWrangler"
set text of window 1 to myString
end tell
You can try something like this:
set myString to "a
b
c
d"
set myList to paragraphs of myString
set listCount to count myList
repeat with i from 1 to my listCount
set item i of myList to quoted form of item i of myList
end repeat
set {TID, text item delimiters} to {text item delimiters, ", "}
set newString to ("(" & myList as text) & ")"
set text item delimiters to TID
return newString
Related
I have a code like this
tell application "app"
set 1 to something
repeat with some in 1
set refpdf to field "File Attachments" of record 1
on findAndReplaceInText(theText, theSearchString, theReplacementString)
set AppleScript's text item delimiters to theSearchString
set theTextItems to every text item of theText
set AppleScript's text item delimiters to theReplacementString
set theText to theTextItems as string
set AppleScript's text item delimiters to ""
return theText
end findAndReplaceInText
set refpdf1 to findAndReplaceInText(refpdf, "some", "some2")
set libh to findAndReplaceInText(libraryname, "test", "test2")
end repeat
end tell
It gives me an error, But I should change text with the on findAndReplaceInText command, what I have done wrong?
Three issues:
The handler must be on the top level of the script
some is a reserved word, use something else
A handler inside an application tell block must be called with my
tell application "app"
set 1 to something
repeat with somethingElse in 1
set refpdf to field "File Attachments" of record 1
set refpdf1 to my findAndReplaceInText(refpdf, "some", "some2")
set libh to my findAndReplaceInText(libraryname, "test", "test2")
end repeat
end tell
on findAndReplaceInText(theText, theSearchString, theReplacementString)
set AppleScript's text item delimiters to theSearchString
set theTextItems to every text item of theText
set AppleScript's text item delimiters to theReplacementString
set theText to theTextItems as string
set AppleScript's text item delimiters to ""
return theText
end findAndReplaceInText
This code gets two bits of two and copies them to the clipboard.
One bit of text is html. Before stripping out all the html I want to replace the tags with empty lines.
I can't get the replaced correctly, but the rest of the code works.
Any idea what I am doing wrong. I also tried using return instead of linefeed.
tell application "GarageSale 7"
repeat with theListing in (get selected ebay listings)
set des to get the description of theListing
set comment to get private comment of theListing
end repeat
end tell
set theText to des
to searchReplace(thisText, "<br>", linefeed)
set AppleScript's text item delimiters to searchTerm
set thisText to thisText's text items
set AppleScript's text item delimiters to replacement
set thisText to "" & thisText
set AppleScript's text item delimiters to {""}
return thisText
end searchReplace
on removeMarkupFromText(theText)
set tagDetected to false
set theCleanText to ""
repeat with a from 1 to length of theText
set theCurrentCharacter to character a of theText
if theCurrentCharacter is "<" then
set tagDetected to true
else if theCurrentCharacter is ">" then
set tagDetected to false
else if tagDetected is false then
set theCleanText to theCleanText & theCurrentCharacter as string
end if
end repeat
return theCleanText
end removeMarkupFromText
get the clipboard
set the clipboard to removeMarkupFromText(theText) & comment
You've defined a handler called searchReplace(), but you never actually use it. That's why your script isn't replacing the <br> tags.
Firstly, you want to define the handler properly. It should take arguments that are represented by variables; currently, your last two arguments are specific values:
to searchReplace(thisText, "<br>", linefeed)
Here's a suggested edit:
to searchReplace(thisText, searchTerm, replacement)
set my text item delimiters to searchTerm
set thisText to thisText's text items
set my text item delimiters to replacement
set thisText to thisText as text
set my text item delimiters to {""}
return thisText
end searchReplace
Then you can call it from your script like so:
tell application "GarageSale 7"
repeat with theListing in (get selected ebay listings)
set des to get the description of theListing
set comment to get private comment of theListing
end repeat
end tell
set theText to searchReplace(des, "<br>", linefeed)
set the clipboard to removeMarkupFromText(theText) & comment
This script is for use in Capture One where I am assigning people's names to the EXIF data.
I am trying to return the results of a list that could be one or more choices made by the user. I can get it to work with using item 1 in the list but I can't figure out how to deal with someone choosing 2 or more names from anywhere in the list?
Thanks for any help you can offer.
tell application "Capture One 11"
set peopleChoices to {"Abbie", "Charlie", "De-Arne", "Dean", "Jason", "Marlene", "Peta ", "Phoenix", "Rod", "Vanessa", "Yvonne"}
set peopleList to choose from list peopleChoices with prompt "Select your keyword/s:" with multiple selections allowed
if the result is not false then
set exif_keywords to item 1 of the result
end if
set selectedVariants to get selected variants
repeat with i from 1 to number of items in selectedVariants
set this_item to item i of selectedVariants
set theID to id of (parent image of this_item)
do shell script "/usr/local/bin/exiftool -Subject='" & exif_keywords & "' -m -overwrite_original_in_place " & quoted form of theID
reload metadata this_item
end repeat
display dialog "EXIF data has been updated"
end tell
You are constraining the list to one item in this line
set exif_keywords to item 1 of the result
Just change it to
set exif_keywords to result
I don't know how the keywords are supposed to be passed in the exiftool line, you might flatten the list with text item delimiters, this example joins the list comma separated. Replace "," with space if the parameters have to be space separated.
set {ASTID, AppleScript's text item delimiters} to {AppleScript's text item delimiters, ","}
set exif_keywords to exif_keywords as text
set AppleScript's text item delimiters to ASTID
I have included the whole working script below in case anyone else is looking for something similar. The "-sep" is part of exiftool and splits the string depending on what you put after it. I had to escape it for the shell script line but it nromally does not have the back slashes.
tell application "Capture One 11"
set peopleChoices to {"Abbie", "Charlie", "De-Arne", "Dean", "Jason", "Marlene", "Peta", "Phoenix", "Rod", "Vanessa", "Yvonne"}
set peopleList to choose from list peopleChoices with prompt "Select your keyword:" with multiple selections allowed
if the result is not false then
set exif_keywords to result
set {TID, AppleScript's text item delimiters} to {AppleScript's text item delimiters, ","}
set exif_keywords to exif_keywords as text
set AppleScript's text item delimiters to TID
end if
set selectedVariants to get selected variants
repeat with i from 1 to number of items in selectedVariants
set this_item to item i of selectedVariants
set theID to id of (parent image of this_item)
do shell script "/usr/local/bin/exiftool -sep \",\" -Keywords='" & exif_keywords & "' -m -overwrite_original_in_place " & quoted form of theID
reload metadata this_item
end repeat
display dialog "EXIF data has been updated"
end tell
What i want is to do a find and replace command with applescript. I know I can use namechanger and other programs but that takes too many steps. I'm all about efficiency.
tell application "Finder"
set selected_items to selection
set jobNum to text returned of (display dialog "Job Number:" default answer "")
set name of document folder selection to jobNum (*if it did work it would rename the entire folder which isn't what I want. My goal is to replace all "12345" with the value of jobNum*)
end tell
sample folder structure (i can't submit images yet because I need 10pts)
main folder: 12345_Sample Job Folder
- 12345_D.ai
- 12345_P.ai
- Proofs
- Working Files
- 12345.ai
Try this script:
set jobFolder to choose folder with prompt "Choose the Job Folder:"
tell application "Finder"
set rootName to jobFolder's name
set searchString to my FindSearchString(rootName)
set replaceString to text returned of (display dialog ("This script will search for files that contain " & searchString & ". Please enter the replacement text and click OK.") default answer searchString)
set everything to every file in (jobFolder's entire contents)
repeat with onething in everything
if ((onething's name) as text) contains searchString then
set onething's name to my replace_chars(((onething's name) as text), searchString, replaceString)
end if
end repeat
set jobFolder's name to my replace_chars(((jobFolder's name) as text), searchString, replaceString)
end tell
---------------------------------
on replace_chars(this_text, search_string, replacement_string)
set astid to AppleScript's text item delimiters
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 astid
return this_text
end replace_chars
---------------------------------
to FindSearchString(txt)
set astid to AppleScript's text item delimiters
set AppleScript's text item delimiters to "_"
set sst to txt's text item 1
set AppleScript's text item delimiters to astid
return sst
end FindSearchString
This will only affect filenames within the initial chosen folder, not subfolder names. At the very end, it changes the name of the chosen folder.
The renaming handler is based on the code at the bottom of this page
I'm using this AppleScript to get the content of a selection of eMails:
using terms from application "Mail"
on run {input, parameters}
set mailContents to {}
repeat with aMessage in input
set end of mailContents to content of aMessage
end repeat
return mailContents
end run
end using terms from
The result looks like this:
{"

Here's some text followed by a longer URL, which is cut by a line break!
http://www.XYZ.net/diario/actualidad/economia/20140714/-ciudad-bar
ata-para-el-turismo_353_34541.html
"}
I want to use all links in those specific mails for fort her processing but it's not possible to use the divided URLs as seen in the example before.
So how to tell the AppleScript to keep the URL together?
Try this. I started with your mailContents example. You end up with a list of the links in the httpLinks variable. This works assuming every link starts with "http" and ends with "html". Good luck.
set mailContents to {"

Here's some text followed by a longer URL, which is cut by a line break!
http://www.XYZ.net/diario/actualidad/economia/20140714/-ciudad-bar
ata-para-el-turismo_353_34541.html
"}
set httpLinks to {}
repeat with i from 1 to count of mailContents
set thisContent to item i of mailContents
-- remove all return characters (mac, unix, and windows characters)
set AppleScript's text item delimiters to {character id 10, character id 13, character id 13 & character id 10}
set textItems to text items of thisContent
set AppleScript's text item delimiters to ""
set newText to textItems as text
-- find links
set AppleScript's text item delimiters to "http"
set textItems to text items of newText
if (count of textItems) is greater than 1 then
set AppleScript's text item delimiters to "html"
repeat with j from 2 to count of textItems
set linkItems to text items of (item j of textItems)
set thisLink to "http" & item 1 of linkItems & "html"
set end of httpLinks to thisLink
end repeat
end if
set AppleScript's text item delimiters to ""
end repeat
return httpLinks
This does not break lines, hope you can use it somehow:
tell application "Mail"
set mailSelection to selection
set mailContents to {}
repeat with mail in mailSelection
set end of mailContents to content of mail
end repeat
get mailContents
end tell
Thank you very much! I had to customize your script a bit because not every URL ends with html. Furthermore I used the source of the messages instead of content, because the deleted line breaks had the result, that it was very difficult to separate the URLs from other text. There was no space between them. This is my actual code:
`using terms from application "Mail"
on run {input, parameters}
set mailContents to {}
repeat with aMessage in input
set end of mailContents to source of aMessage
end repeat
set httpLinks to {}
repeat with i from 1 to count of mailContents
set thisContent to item i of mailContents
-- remove all return characters (mac, unix, and windows characters)
set AppleScript's text item delimiters to {"=09", "=" & character id 10, "=" & character id 13, "3D", character id 92}
set textItems to text items of thisContent
set AppleScript's text item delimiters to ""
set newText to textItems as rich text
-- find links
set AppleScript's text item delimiters to "http"
set textItems to text items of newText
if (count of textItems) is greater than 1 then
set AppleScript's text item delimiters to "target"
repeat with j from 2 to count of textItems
set linkItems to text items of (item j of textItems)
set thisLink to "http" & item 1 of linkItems & "target"
set end of httpLinks to thisLink
end repeat
end if
set AppleScript's text item delimiters to ""
end repeat
set list1 to httpLinks
set list2 to {}
repeat with x from 1 to count of items of list1
set n to item x of list1
if n is not in list2 then set end of list2 to n
end repeat
return list2
end run
end using terms from`