Autosaving every 10 minutes TextEdit documents.


This morning there was a thread starting with :
Hello MacScripter community, I just signed up for this forum and I’m an Applescript newbie, but I’m committed to doing whatever is needed to achieve my goal: to …
asking for a way to Autosave TextEdit documents every 10 minutes.

I’m unable to retrieve it.
As I built a script answering the question I post it here.

--[SCRIPT autosaveTextEdit]
To autosave TextEdit documents
paste this script in the Script Editor

menu > File > Save As.
uncheck screen at startup
check "Stay Open" (* "Rester en arrière-plan" in French *)
save this script as an Application Bundle

In the Accounts PreferencePane (tab Login Items),
install it as one of the applications launched at boot_time 

Every ten minutes, if TextEdit is in use, 
the open documents will be duplicated,
then the duplicates are saved and closed.

property minutesBetweenSaves : 10 (*
enregistrera toutes les 10 minutes *)


on idle
	my autoSave()
	return minutesBetweenSaves * minutes
end idle


on autoSave()
	local theApp, mtFile, miDuplicate, titres, theDocs, aDoc, sourceName, leChemin, lesDocsAvant, unNom
	local lesDocsApres, leDossier, nomEnListe, nomEnListe, ext, nbw, nomFenetre, nouveauNom
	set theApp to "TextEdit"
	set {mtFile, miDuplicate} to {3, 8}
	tell application "System Events" to set titres to title of processes
	if theApp is in titres then
		tell application theApp
Build a list of open documents *)
			set theDocs to every document
			repeat with aDoc in theDocs
				set sourceName to name of aDoc
				set leChemin to path of aDoc
					leChemin as text
				on error
The doc was never saved before *)
					set lesDocsAvant to name of every document
Build a list of names of other open documents *)
					set lesDocsAvant to {}
					repeat with unNom in lesDocsAvant
						if unNom is not (aDoc as text) then set end of lesDocsAvant to unNom
					end repeat
Save the doc; You will be asked to define a name and a location *)
					save aDoc
Loop extracting the name of the saved document *)
					set lesDocsApres to name of every document
					repeat with unNom in lesDocsApres
						if unNom is not in lesDocsAvant then exit repeat
					end repeat
Get container and name of the newly saved document *)
					set leChemin to path of document unNom
					set sourceName to unNom
				end try
Now, we are working on a document which was saved at least once so a pathname is defined.
We may get the path to it's container. *)
				tell application "System Events"
					set leDossier to path of container of disk item leChemin
				end tell
Extract name extension and name without extension *)
				set nomEnListe to my decoupe(sourceName, ".")
				set nomCourt to my recolle(items 1 thru -2 of nomEnListe, ".")
				set ext to item -1 of nomEnListe
				tell application theApp to activate
				tell application "System Events" to tell process theApp
					set nbw to (count of (every window whose subrole is "AXStandardWindow"))
Trigger the menu item Duplicate *)
					tell menu bar 1 to tell menu bar item mtFile to tell menu 1 to click menu item miDuplicate
Wait for possible sheet "document was edited, are you really wanting to duplicate it"
and click "Duplicate" if it appears *)
					repeat 5 times
						delay 0.1
						if exists first sheet of window sourceName then
							click first button of first sheet of window sourceName
							exit repeat
						end if
					end repeat
Wait for the duplicate window *)
						delay 0.1
						if nbw < (count of (every window whose subrole is "AXStandardWindow")) then exit repeat
					end repeat
The duplicate window is available *)
					set nomFenetre to (name of first window whose subrole is "AXStandardWindow")
Build a date_time_stamped file name *)
					set nouveauNom to nomCourt & my buildstamp() & ext
Save the duplicate with the date_time_stamped name *)
					my saveIt(nomFenetre, nouveauNom, leDossier)
Close the duplicate *)
					tell window nouveauNom
						click button 1
					end tell
				end tell -- System Events.
			end repeat -- aDoc
		end tell -- theApp
	end if -- theApp.
end autoSave


on saveIt(dName, nName, dDossier)
	tell application "System Events"
		make new file at end of folder dDossier with properties {name:nName}
	end tell
	set dAlias to (dDossier & nName) as alias
	tell application "TextEdit"
		save document dName in dAlias
	end tell
end saveIt


on buildstamp()
	return do shell script "date +_%Y-%m-%dT%H.%M.%S."
end buildstamp


on decoupe(t, d)
	local oTIDs, l
	set oTIDs to AppleScript's text item delimiters
	set AppleScript's text item delimiters to d
	set l to text items of t
	set AppleScript's text item delimiters to oTIDs
	return l
end decoupe


on recolle(l, d)
	local oTIDs, t
	set oTIDs to AppleScript's text item delimiters
	set AppleScript's text item delimiters to d
	set t to "" & l
	set AppleScript's text item delimiters to oTIDs
	return t
end recolle


Yvan KOENIG (VALLAURIS, France) vendredi 3 février 2012 15:01:13