• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
String Munging (Re: Finding Filenames that contain a certain string)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

String Munging (Re: Finding Filenames that contain a certain string)


  • Subject: String Munging (Re: Finding Filenames that contain a certain string)
  • From: Jon Pugh <email@hidden>
  • Date: Sun, 22 Jul 2007 20:04:04 -0700

At 3:24 PM -0500 7/22/07, John C. Welch wrote:
>Having said that, string
>manipulation is one of the biggest holes in generic AppleScript. As in it
>kinda sucks at it.

Enclosed, please find my SmartString object which makes string manipulation a breeze in AppleScript.  Watch for line breaks.

Jon

(*
	SmartString 1.6

	Copyright 1994-2007 by Jon Pugh <email@hidden>
	Jon's Home Page <http://www.seanet.com/~jonpugh/>

	The best way to use this script is to load it from disk when you compile
	but check for updates when you run, like so:

	-- the alias follows the file if it's moved or renamed
	property ssFile : alias "YourDisk:Folder1:Folder2:SmartString"
	-- the modification date is burned in at compile time
	property ssDate : modification date of (info for ssFile)
	-- the script object is loaded at compile time too
	property ss : load script ssFile
	-- at run time check the mod date
	set modDate to modification date of (info for ssFile)
	-- if newer then load a new copy
	if modDate > ssDate then
		set SmartString to load script ssFile
		-- remember the date for the newly loaded file
		set ssDate to modDate
		--display dialog "I'm loaded"
	end if
	tell ss's SmartString
		setString("Your text here")
		-- do stuff
	end tell

	SmartString is an AppleScript script object which knows how to perform numerous operations
	on strings.  The complete list of operations are:

	newString(aString) --> script object factory method

	getString() --> string (only reads)
	setString(aString)
	setList(aList, seperator)

	subString(x, y) --> string (only reads)
	beforeString(subString) --> string (only reads)
	afterString(subString) --> string (only reads)
	betweenStrings(afterThis, beforeThis) --> string (only reads)

	appendString(aString) --> string
	prependString(aString) --> string
	insertBefore(subString, thisString) --> string
	insertAfter(subString, thisString) --> string

	deleteCharacters(x, y) --> string
	deleteString(subString) --> string
	deleteBefore(beforeString) --> string
	deleteAfter(afterString) --> string
	deleteBetween(beforeThis, afterThis) --> string

	keepBefore(beforeString) --> string
	keepAfter(afterString) --> string
	keepBetween(beforeThis, afterThis) --> string
	replaceString(subString, withString) --> string
	replaceStrings(subString, withString) --> string
	replaceBetween(frontTag, rearTag, newValue) --> string

	getTokens(delim) --> list (only reads)

	firstToken(delim) --> string (only reads)
	deleteFirstToken(delim)
	keepFirstToken(delim)

	lastToken(delim) --> string (only reads)
	deleteLastToken(delim)
	keepLastToken(delim)

	NthToken(n, delim) --> string (only reads)
	deleteNthToken(n, delim)
	keepNthToken(n, delim)

	trimWhitespace()
	uppercase()
	lowercase()
*)

script SmartString

	property parent : AppleScript
	property theString : ""

	on newString(aString)
		copy me to foo
		foo's setString(aString)
		return foo
	end newString

	on getString()
		return theString
	end getString

	on setString(aString)
		set theString to aString as string
	end setString

	on setList(aList, seperator)
		set oldSep to AppleScript's text item delimiters
		set AppleScript's text item delimiters to seperator
		setString(aList as string)
		set AppleScript's text item delimiters to oldSep
	end setList

	on appendString(aString)
		set theString to theString & aString
	end appendString

	on prependString(aString)
		set theString to aString & theString
	end prependString

	on beforeString(aString)
		set foo to offset of aString in theString
		if foo = 0 then
			--return theString
			return ""
		else if foo = 1 then
			return ""
		else
			--return (characters 1 thru (foo - 1) of theString) as string
			return text 1 thru (foo - 1) of theString
		end if
	end beforeString

	on afterString(aString)
		set foo to offset of aString in theString
		if foo = 0 then
			return ""
		else
			copy foo + (length of aString) to foo
			if foo > length of theString then
				return ""
			else
				--return (characters foo thru -1 of theString) as string
				return text foo thru -1 of theString
			end if
		end if
	end afterString

	on betweenStrings(afterThis, beforeThis)
		set savedString to theString
		keepAfter(afterThis)
		keepBefore(beforeThis)
		set tempString to getString()
		setString(savedString)
		return tempString
	end betweenStrings

	on replaceString(thisStr, thatStr) -- syntax forgivenness so you don't have to remember if there is or isn't an s
		replaceStrings(thisStr, thatStr) -- expecting only a single replacement could be considered here, but we're not that subtle yet
	end replaceString

	on replaceStrings(thisStr, thatStr)
		set oldDelim to AppleScript's text item delimiters
		set AppleScript's text item delimiters to thisStr
		set theList to text items of theString
		set AppleScript's text item delimiters to thatStr
		set theString to theList as string
		set AppleScript's text item delimiters to oldDelim
	end replaceStrings

	on deleteString(aString)
		set foo to offset of aString in theString
		if foo ‚ 0 then
			set theString to beforeString(aString) & afterString(aString) as string
		end if
	end deleteString

	on replaceBetween(frontTag, rearTag, newValue)
		set t1 to beforeString(frontTag)
		deleteBefore(frontTag)
		deleteBefore(rearTag)
		set theString to {t1, frontTag, newValue, theString} as string
	end replaceBetween

	on subString(x, y)
		return text x thru y of theString
		--return (characters x thru y of theString) as string
	end subString

	on insertBefore(beforeStr, thisStr)
		set theString to {beforeString(beforeStr), thisStr, beforeStr, afterString(beforeStr)} as string
	end insertBefore

	on insertAfter(afterStr, thisStr)
		set theString to {beforeString(afterStr), afterStr, thisStr, afterString(afterStr)} as string
	end insertAfter

	on deleteBefore(beforeStr)
		set theString to beforeStr & afterString(beforeStr)
	end deleteBefore

	on deleteAfter(afterStr)
		set theString to beforeString(afterStr) & afterStr
	end deleteAfter

	on deleteBetween(afterThis, beforeThis)
		set theString to {beforeString(beforeThis), beforeThis, afterThis, afterString(afterThis)} as string
	end deleteBetween

	on keepBefore(beforeStr)
		set theString to beforeString(beforeStr)
	end keepBefore

	on keepAfter(afterStr)
		set theString to afterString(afterStr)
	end keepAfter

	on keepBetween(afterThis, beforeThis)
		set theString to betweenStrings(afterThis, beforeThis)
	end keepBetween

	on deleteCharacters(x, y)
		if x > 1 then
			--set a to (characters 1 thru (x - 1) of theString) as string
			set a to text 1 thru (x - 1) of theString
		else
			set a to ""
		end if
		if y < length of theString then
			--set b to (characters (y + 1) thru -1 of theString) as string
			set b to text (y + 1) thru -1 of theString
		else
			set b to ""
		end if
		set theString to a & b
	end deleteCharacters

	on getTokens(delim)
		set oldDelim to AppleScript's text item delimiters
		set AppleScript's text item delimiters to delim
		set theList to text items of theString
		set AppleScript's text item delimiters to oldDelim
		return theList
	end getTokens

	on firstToken(delim)
		return NthToken(1, delim)
	end firstToken

	on lastToken(delim)
		return NthToken(-1, delim)
	end lastToken

	on NthToken(n, delim)
		if n = 0 then error "Cannot get delim zero"
		set t to getTokens(delim)
		if t = {} then return ""
		set numItems to number of items of t
		if n > numItems then error "Cannot get delim " & n & ", only " & numItems & " of tokens"
		return item n of t
	end NthToken

	on deleteNthToken(n, delim)
		if n = 0 then error "Cannot delete delim zero"
		set foo to getTokens(delim)
		set m to number of items of foo
		if n = 1 then
			set foo to items 2 thru m of foo
		else if n < 0 then
			set foo to items 1 thru (m + n) of foo
		else if n = m then
			set foo to items 1 thru (m - 1) of foo
		else
			set foo to (items 1 thru (n - 1) of foo) & (items (n + 1) thru m of foo)
		end if
		set oldDelim to AppleScript's text item delimiters
		set AppleScript's text item delimiters to delim
		try
			set theString to foo as string
		on error theMsg number theNum
			set AppleScript's text item delimiters to oldDelim
			error theMsg number theNum
		end try
		set AppleScript's text item delimiters to oldDelim
	end deleteNthToken

	on deleteFirstToken(delim)
		deleteNthToken(1, delim)
	end deleteFirstToken

	on deleteLastToken(delim)
		deleteNthToken(-1, delim)
	end deleteLastToken

	on keepFirstToken(delim)
		setString(NthToken(1, delim))
	end keepFirstToken

	on keepLastToken(delim)
		setString(NthToken(-1, delim))
	end keepLastToken

	on keepNthToken(n, delim)
		setString(NthToken(n, delim))
	end keepNthToken

	on trimWhitespace()
		repeat while theString contains return
			deleteString(return)
		end repeat
		set twoTabs to tab & tab
		repeat while theString contains twoTabs
			replaceString(twoTabs, tab)
		end repeat
		set twoSpaces to "  "
		repeat while theString contains twoSpaces
			replaceString(twoSpaces, space)
		end repeat
		if length of theString > 1 then
			repeat while character 1 of theString = tab or character 1 of theString = space
				--set theString to (characters 2 thru -1 of theString) as string
				set theString to text 2 thru -1 of theString
			end repeat
			repeat while last character of theString = tab or last character of theString = space
				--set theString to (characters 1 thru -2 of theString) as string
				set theString to text 1 thru -2 of theString
			end repeat
		end if
	end trimWhitespace

	on uppercase()
		local newString
		set newString to ""
		repeat with c in characters of theString
			set a to ASCII number contents of c
			if a > 96 and a < 123 then
				set a to a - 32
				set newString to newString & (ASCII character a)
			else
				set newString to newString & c
			end if
		end repeat
		set theString to newString
	end uppercase

	on lowercase()
		set newString to ""
		repeat with c in characters of theString
			set a to ASCII number contents of c
			if a > 64 and a < 91 then
				set a to a + 32
				set newString to newString & (ASCII character a)
			else
				set newString to newString & c
			end if
		end repeat
		set theString to newString
	end lowercase

end script
 _______________________________________________
Do not post admin requests to the list. They will be ignored.
AppleScript-Users mailing list      (email@hidden)
Help/Unsubscribe/Update your Subscription:
Archives: http://lists.apple.com/archives/applescript-users

This email sent to email@hidden

  • Follow-Ups:
    • Re: String Munging (Re: Finding Filenames that contain a certain string)
      • From: Matt Deatherage <email@hidden>
References: 
 >Re: Finding Filenames that contain a certain string (From: "John C. Welch" <email@hidden>)

  • Prev by Date: Re: Finding Filenames that contain a certain string
  • Next by Date: Re: format of text in resulting text file
  • Previous by thread: Re: Finding Filenames that contain a certain string
  • Next by thread: Re: String Munging (Re: Finding Filenames that contain a certain string)
  • Index(es):
    • Date
    • Thread