Batch convert .cwk to .docx

GabeShack
Valued Contributor III

I've found a few scripts claiming to do this, but cannot find one that works. Any thoughts? Going from appleworks 6 to word formatting and in batch.

Have a few teachers with hundreds of old appleworks documents that i don't want to convert by hand.

Gabe Shackney
Princeton Public Schools

Gabe Shackney
Princeton Public Schools
1 ACCEPTED SOLUTION

GabeShack
Valued Contributor III

Actually found 2 scripts that together get me there. Need to be saved in applescript as apps so you can drop them in.
1st one batch converts AppleWorks to Pages, then 2nd coverts pages to a word doc. Its a little clunky, but did the job. Both require Pages from iwork 09.

Script to convert .awk to .pages:

on run
    doyourduty(choose file with multiple selections allowed)
end run

on open droppedItems
    doyourduty(droppedItems)
end open

on doyourduty(theItems)
    repeat with anItem in theItems
        tell application "Finder"
            set {name:fileName, name extension:nameExtension, class:itemClass, container:parentFolder} to item (anItem as text)
            set isFolder to itemClass is folder
        end tell
        if isFolder then
            tell application "Finder" to set itemList to items of anItem
            doyourduty(itemList)
        else
            if nameExtension is "cwk" then
                tell application "Pages"
                    open (anItem as alias)
                    -- Save file to folder that dropped file exists in.
                    set docPathAndName to (parentFolder as text) & text 1 thru -4 of fileName & "pages"
                    save front document in docPathAndName
                    close front document
                end tell
            end if
        end if
    end repeat
end doyourduty

Script to export .pages files as .doc:

--[SCRIPT batch_exportPages2DOC]
(* 
Enregistrer ce script en tant que script ou progiciel.
Exécuter ce script ou 
déposer l'icône d'un dossier sur son icône.
Il ouvre tout document Pages du dossier 
et l' enregistre en fichier DOC  
dans le dossier "was_Pages_now_DOC".
Celui-ci peut être sur le bureau
ou dans le dossier "~/Documents".

Si le GUIscripting n'est pas activé 
le script demande votre mot de passe pour l'activer.
Le script récupère le dossier d'exportation par défaut
dans le fichier de préférences de Pages.

Éviter de cliquer durant l'exécution du script
sauf évidemment pour sélectionner le dossier source.


Save the script as script or application bundle. Run it or drag and drop a folder icon on its icon. It opens every Pages's documents stored in the folder and save it as DOC file in a folder named "was_Pages_now_DOC". This one may be on the desktop or in the "~/Documents" folder. according to the property storeOnDesktop. If GUIscripting is disabled the script ask for your password to enable it. The script extract the default export path from the Pages's preferences file. Don't click when the script is running. Except, of course, to select the source folder.
Yvan KOENIG (VALLAURIS, France) 2008/04/20 2009/06/17 adapté pour format .doc 2009/12/13 updated for MacOs 10.6… *) property theApp : "Pages" property theExt : "pages" property nomDuRapport : "report_Pages2DOC.txt" property nom_du_dossier : "was_Pages_now_DOC" property storeOnDesktop : true (* true = dest folder will be on Desktop false = dest folder will be in "~/Documents" *) property msg1 : "" -- globale property msg90 : "" -- globale property msg91 : "" -- globale -- property msg92 : "" -- globale property msg94 : "" -- globale property msg96 : "" -- globale property msg99 : "" -- globale property rapport : "" -- globale property dossierDeStockage : "" -- globale property dossierParDefaut : "" -- globale property localExport : "" -- globale property newExt : "" -- globale property newType : "" -- globale property isOs4 : missing value -- globale property isOs5 : missing value -- globale property theMenu : missing value -- globale property menuExport : missing value -- globale property types : {{"doc", "SLDocumentTypeMSWord", 2}, {"pdf", "SLDocumentTypePDF", 1}, {"txt", "SLDocumentTypePlainText", 4}, {"rtf", "SLDocumentTypeRichText", 3}, {"rtfd", "SLDocumentTypeRichTextBundle"}, 3} --===== (* our settings *) property typeNum : 1 (* 1 = WORD, 2 = PDF, 3 = Txt, 4 = rtf, 5 = rtfd *) property theButton : missing value (* 1 button PDF 2 button Word 3 button RTF 4 button Standard *) --===== on run (* lignes exécutées si on double clique sur l'icône du script application • lines executed if one double click the application script's icon *) tell application "System Events" to set dossier to choose folder (* dans un bloc System Events pour avoir un titre de dialogue "localisé" • in a System Events block to get a localized dialog title. *) my commun({dossier}) -- my commun({"Macintosh HD:Users:yvan_koenig:Desktop:for_see:" as alias}) end run --===== on open (sel) (* sel contient une liste d'alias des éléments qu'on a déposés sur l'icône du script (la sélection) • sel contains a list of aliases of the items dropped on the script's icon (the selection) *) my commun(sel) end open --===== on commun(elems) my nettoie() my prepareMessages() tell application "System Events" if not (UI elements enabled) then set (UI elements enabled) to true (* Active le GUI scripting • Enable GUI scripting *) set titres to title of processes end tell -- to System Events if theApp is not in titres then my activateTheApp() (* Active et ferme la fenêtre du document créé à l'ouverture • Activate and close the doc's window created at opening *) set {newExt, newType, theButton} to item typeNum of types (* item 1 = {"doc", "SLDocumentTypeMSWord",2} item 2 = {"pdf", "SLDocumentTypePDF",1} item 3 = {"txt", "SLDocumentTypePlainText",4} item 4 = {"rtf", "SLDocumentTypeRichText",3} item 5 = {"rtfd", "SLDocumentTypeRichTextBundle",3} *) set sysAtt to (system attribute "sys2") if 4 > sysAtt then if my parleAnglais() then error "This script requires MacOs X 10.4 or higher !" else error "Ce script requiert MacOs X 1.4 ou ultérieur !" end if else if 5 > sysAtt then set isOs4 to true set isOs5 to false if my getVersion() < "4" then set theMenu to 3 set menuExport to 13 else set theMenu to 10 set menuExport to 9 end if else if 6 > sysAtt then set isOs4 to false set isOs5 to true if my getVersion() < "4" then set theMenu to 3 set menuExport to 13 else set theMenu to 10 set menuExport to 8 (* was a wrong 9 *) end if else set isOs4 to false set isOs5 to false if my getVersion() < "4" then set theMenu to 3 set menuExport to 13 else set theMenu to 10 set menuExport to 8 (* was a wrong 9 *) end if end if my fermeFenetres() (* • Close existing windows *) my afficheLeMessage(msg1) (* Éviter de cliquer… • Don't click… *) tell application theApp to set localExport to localized string "Export" set dossierParDefaut to my getDefaultExport() as text set rapport to "" set dossierDeStockage to my creeDossierDeStockage(nom_du_dossier) (* Unicode text *) try repeat with elem in elems try my exploreTraite(elem as alias, "") end try end repeat if rapport = "" then set rapport to msg90 -- crée un fichier texte sur le Bureau set p2d to path to desktop set p2r to (p2d as Unicode text) & nomDuRapport tell application "System Events" if exists (file p2r) then delete (file p2r) make new file at end of p2d with properties {name:nomDuRapport} end tell set rapport to rapport as text write rapport to (p2r as alias) on error MsgErr number NroErr if NroErr is not -128 then beep 2 tell application (path to frontmost application as string) to ¬ display dialog "" & NroErr & " : " & MsgErr with icon 0 buttons {msg99} giving up after 20 end if -- NroErr is… return end try my nettoie() if my parleAnglais() then my afficheLeMessage("Export done.") else my afficheLeMessage("Traitement terminé.") end if end commun --===== on nettoie() (* pour ne pas stocker dans le fichier script • So it will not be stored in the script file *) set dossierDeStockage to "" set dossierParDefaut to "" set rapport to "" set localExport to "" set newExt to "" set newType to "" set isOs4 to missing value set isOs5 to missing value set theMenu to missing value set menuExport to missing value set theButton to missing value set msg1 to "" set msg90 to "" set msg91 to "" set msg92 to "" -- set msg94 to "" set msg96 to "" set msg99 to " " end nettoie --===== on afficheLeMessage(m) beep 1 tell application (path to frontmost application as string) activate if my parleAnglais() then display dialog m buttons {" OK "} default button 1 giving up after 10 else display dialog m buttons {" Vu "} default button 1 giving up after 10 end if end tell end afficheLeMessage --===== on creeDossierDeStockage(Nom) (* S'il n'existe pas, construit un dossier destination sur le bureau ou dans "~/Documents" • If does not exist, create a destination folder on the desktop or in "~/Documents" *) local dd, dds if storeOnDesktop is true then set dd to path to desktop as Unicode text else set dd to path to documents folder as Unicode text end if if Nom ends with ":" then set dds to dd & Nom else set dds to dd & Nom & ":" end if (* dossierDeStockage n'existe pas, on le crée • dossierDeStockage is not available, build it *) tell application "System Events" to if not (exists item dds) then make new folder at end of folder dd with properties {name:Nom} return dds as Unicode text end creeDossierDeStockage --===== on exploreTraite(elem, ptree) (* elem est un alias • elem is an alias *) local elem_, cl_, type_Id set elem_ to elem as Unicode text tell application "System Events" to tell disk item elem_ set cl_ to class if cl_ is folder then set type_Id to "" else set type_Id to type identifier end if end tell -- "System Events" set cl_ to cl_ as Unicode text if type_Id is in {"com.apple.iwork.pages.pages", "com.apple.iwork.pages.sffpages"} then (* C'est un fichier Pages. • It's a Pages document *) my TraiteUnDocument(elem_) else if cl_ is in {"file package", "«class cpkg»"} then set rapport to rapport & msg91 & elem_ & return (* "Package", Attention, un package EST un dossier "spécial". • Caution, a package IS a "special" folder. *) else if cl_ is in {"folder", "«class cfol»"} then my ExploreUnDossier(elem_, ptree) else set rapport to rapport & msg92 & elem_ & return (* "Pas un document Pages". • "Not a Pages's document" *) end if -- typeId_ is … end exploreTraite --===== on ExploreUnDossier(dossier, ptree) local nomElement, cheminElement, c repeat with nomElement in list folder dossier without invisibles set cheminElement to dossier & nomElement tell application "System Events" to set c to name of (dossier as alias) my exploreTraite(cheminElement as alias, ptree & c & ":") end repeat end ExploreUnDossier --===== on TraiteUnDocument(leCheminOriginal_UniText) my export2Doc(leCheminOriginal_UniText as alias, leCheminOriginal_UniText) end TraiteUnDocument --===== on export2Doc(p, leCheminOriginal_UniText) (* • here p is the path as alias *) local flag, nom_de_p, nouveauChemin, w, bof, x, p_xport try tell application theApp open p set flag to false repeat 300 times (* Attends que le fichier soit réellement ouvert. • Wait until the file is really open *) if my getNbWindows() > 0 then set flag to true exit repeat end if end repeat end tell -- to theApp if flag is false then error number 8888 (* Le fichier n'a pu être ouvert. • The file can't be open. *) on error MsgErr number NroErr if NroErr = 8888 then set rapport to rapport & msg94 & leCheminOriginal_UniText & return else set rapport to rapport & "### " & MsgErr & " ### " & errNbr & return end if return (* can't do the remaining tasks *) end try tell application "System Events" to tell file leCheminOriginal_UniText set nom_de_p to name end tell -- System Events if nom_de_p ends with theExt then set nom_de_p to text 1 thru -(2 + (length of theExt)) of nom_de_p set nouveauChemin to dossierParDefaut & nom_de_p & "." & newExt --log nouveauChemin tell application "System Events" to if exists (file nouveauChemin) then set name of file nouveauChemin to nom_de_p & my horoDateur(modification date of file nouveauChemin) & "." & newExt (* name stamped *) try set {w, bof} to my getFrontWindow() tell application "System Events" to tell application process theApp click menu item menuExport of menu 1 of menu bar item theMenu of menu bar 1 (* Exporter… *) repeat until exists sheet 1 of window w delay 0.1 end repeat tell sheet 1 of window w (* sheet containing the buttons PDF, Word, RTF, Standard *) -- get properties of UI elements of radio group 1 if isOs4 then click button theButton of radio group 1 else if isOs5 then click checkbox theButton of radio group 1 else click radio button theButton of radio group 1 (* I hope that they will no longer change it *) end if -- isOs4 is true (* if typeNum is 2 then delay 0.2 tell pop up button 1 click click menu item quality of menu 1 end tell delay 0.2 end if *) click button 1 (* Suivant… *) repeat until exists button localExport delay 0.1 end repeat click button localExport (* Exporter… *) end tell -- to sheet… repeat 20 times if exists sheet 1 of window w then click button 2 of sheet 1 of window w (* "Ne pas consulter " dans éventuel rapport d'anomalies • "Don't review" in sheet reporting possible export anomalies *) exit repeat end if delay 0.1 end repeat end tell -- to process … System Events if dossierDeStockage is not dossierParDefaut then (* we must move the file from folder dossierParDefaut to folder dossierDeStockage *) set p_xport to dossierDeStockage & nom_de_p & "." & newExt tell application "System Events" to if exists (file p_xport) then set name of file p_xport to nom_de_p & my horoDateur(modification date of file p_xport) & "." & newExt tell application "Finder" to duplicate file nouveauChemin to folder dossierDeStockage (* • before 10.5, System Events is unable to move *) my wait4File(p_xport) tell application "System Events" to if exists file nouveauChemin then delete file nouveauChemin end if -- dossierDeStockage is not… my ferme1fenetre() on error errMsg number errNbr set rapport to rapport & msg96 & p & return & errMsg & " ### " & errNbr & return end try end export2Doc (* ===== • Build a stamp from the modification date_time *) on horoDateur(dt) local annee, mois, jour, lHeure, lesSecondes, lesMinutes set annee to year of dt set mois to month of dt as number (* existe depuis 10.4 *) set jour to day of dt set lHeure to time of dt set lesSecondes to (lHeure mod 60) set lHeure to round (lHeure div 60) set lesMinutes to (lHeure mod 60) set lHeure to round (lHeure div 60) return "_" & annee & text -2 thru -1 of ("00" & mois) & text -2 thru -1 of ("00" & jour) & "-" & text -2 thru -1 of ("00" & lHeure) & text -2 thru -1 of ("00" & lesMinutes) & text -2 thru -1 of ("00" & lesSecondes) (* • Here, the stamp is "_YYYYMMDD-hhmmss" *) end horoDateur (* ===== • Take care, the front window may be an Inspector or a dialog one. *) on getFrontWindow() local namesOfWindows, w, flag tell application theApp to activate set flag to false tell application "System Events" to tell application process theApp set namesOfWindows to name of every window repeat with w in namesOfWindows if subrole of (get properties of window w) is "AXStandardWindow" then set flag to true exit repeat end if end repeat end tell return {w, flag} (* • w is the name of the front document's window *) end getFrontWindow (* ===== • Wait that the file is completely written on disk *) on wait4File(p) (* • p must be Unicode text *) local oldSize, nnn, newSize set oldSize to 0 tell application "System Events" to set nnn to name of file p repeat try tell application "System Events" to set newSize to physical size of file p if oldSize < newSize then set oldSize to newSize else exit repeat end if end try end repeat end wait4File --===== on activateTheApp() local bof, status tell application theApp to activate if my getStartingStatus() is false then tell application "System Events" to tell application process theApp to keystroke return repeat set {bof, status} to my getFrontWindow() if status is true then exit repeat end repeat end activateTheApp (* ===== • Close existing open windows *) on fermeFenetres() repeat while my getNbWindows() > 0 my ferme1fenetre() end repeat (* • Now there is no open window *) end fermeFenetres --===== on ferme1fenetre() tell application theApp to activate tell application "System Events" to tell application process theApp to keystroke "w" using {command down} end ferme1fenetre --===== on getPlistValue(valName, default) local thePlist, u set thePlist to (path to preferences folder as Unicode text) & "com.apple.iWork." & theApp & ".plist" tell application "System Events" if exists file thePlist then tell contents of property list file thePlist try set u to (value of property list item valName) (* Unicode Text *) on error (* On est là si Pages n'a rien enregistré avec des préférences neuves • Here if Pages never saved with the new preferences file. *) set u to default end try end tell -- to contents of… else (* On est là s'il n'y a pas de fichier de préférences • Here if there is no preferences file. *) set u to default end if end tell -- to system events return u end getPlistValue --===== on getStartingStatus() return my getPlistValue("LSDefaultsUseDefaultStartingPoint", false) end getStartingStatus --===== on getDefaultExport() local u (* son of a bitch, I forgot that they don't use the same name !! *) if theApp contains "Pages" then set u to my getPlistValue("SLDocumentDefaultExportDirectory", "~/Documents") else if theApp contains "Numbers" then set u to my getPlistValue("LSDocumentDefaultExportDirectory", "~/Documents") else error "I didn't coded a Keynote version !" end if set u to (POSIX file (do shell script "echo " & u)) as text if u ends with ":" then return u else return (u & ":") end if end getDefaultExport --===== on getNbWindows() tell application "System Events" to tell application process theApp to return count of windows end getNbWindows --===== on getLocale(a, x) tell application a to return localized string x end getLocale --===== on getVersion() try tell application theApp to return version on error return "1" end try end getVersion --===== on parleAnglais() local z try tell application theApp to set z to localized string "Cancel" on error set z to "Cancel" end try return (z is not "Annuler") end parleAnglais --===== on prepareMessages() if my parleAnglais() then set msg1 to "Don’t click when the script is running." & return & "Except, of course, if it ask for." set msg90 to "No problem during the export process." set msg91 to "Package" set msg92 to "Not a " & theApp & "’s document" -- set msg94 to theApp & " can’t read it" set msg96 to "Not copied." set msg99 to "Oops" else set msg1 to "Éviter de cliquer durant l’exécution du script" & return & "sauf s’il le demande." set msg90 to "Exportation réussie sans incident." set msg91 to "Package" set msg92 to "Pas un document " & theApp -- set msg94 to theApp & " n’a pas pu le lire" set msg96 to "Pas copié." set msg99 to " Vu " end if set msg91 to "### " & msg91 & " ### " set msg92 to "### " & msg92 & " ### " -- set msg94 to "### " & msg94 & " ### " set msg96 to "### " & msg96 & " ### " end prepareMessages --===== --

[/script]

Gabe Shackney
Princeton Public Schools

Gabe Shackney
Princeton Public Schools

View solution in original post

5 REPLIES 5

Nix4Life
Valued Contributor

disregard thought you just wanted to rename

Hey Gabe;

I use this:

http://renamer.com/
hth. it was free at one time not sure about now

LS

hkim
Contributor II

If you don't find something, consider using Automator and/or Sikuli to do the job.

http://www.sikuli.org

damienbarrett
Valued Contributor

Wait, can Word even open an AppleWorks document?

If not, and you need automatic conversion, your best bet is the discontinued (and PPC only) DataViz MacLinkPlus. I still keep an old PPC machine around with this installed on it to do exactly this kind of batch conversion (mostly WordPerfect --> Word).

GabeShack
Valued Contributor III

Actually found 2 scripts that together get me there. Need to be saved in applescript as apps so you can drop them in.
1st one batch converts AppleWorks to Pages, then 2nd coverts pages to a word doc. Its a little clunky, but did the job. Both require Pages from iwork 09.

Script to convert .awk to .pages:

on run
    doyourduty(choose file with multiple selections allowed)
end run

on open droppedItems
    doyourduty(droppedItems)
end open

on doyourduty(theItems)
    repeat with anItem in theItems
        tell application "Finder"
            set {name:fileName, name extension:nameExtension, class:itemClass, container:parentFolder} to item (anItem as text)
            set isFolder to itemClass is folder
        end tell
        if isFolder then
            tell application "Finder" to set itemList to items of anItem
            doyourduty(itemList)
        else
            if nameExtension is "cwk" then
                tell application "Pages"
                    open (anItem as alias)
                    -- Save file to folder that dropped file exists in.
                    set docPathAndName to (parentFolder as text) & text 1 thru -4 of fileName & "pages"
                    save front document in docPathAndName
                    close front document
                end tell
            end if
        end if
    end repeat
end doyourduty

Script to export .pages files as .doc:

--[SCRIPT batch_exportPages2DOC]
(* 
Enregistrer ce script en tant que script ou progiciel.
Exécuter ce script ou 
déposer l'icône d'un dossier sur son icône.
Il ouvre tout document Pages du dossier 
et l' enregistre en fichier DOC  
dans le dossier "was_Pages_now_DOC".
Celui-ci peut être sur le bureau
ou dans le dossier "~/Documents".

Si le GUIscripting n'est pas activé 
le script demande votre mot de passe pour l'activer.
Le script récupère le dossier d'exportation par défaut
dans le fichier de préférences de Pages.

Éviter de cliquer durant l'exécution du script
sauf évidemment pour sélectionner le dossier source.


Save the script as script or application bundle. Run it or drag and drop a folder icon on its icon. It opens every Pages's documents stored in the folder and save it as DOC file in a folder named "was_Pages_now_DOC". This one may be on the desktop or in the "~/Documents" folder. according to the property storeOnDesktop. If GUIscripting is disabled the script ask for your password to enable it. The script extract the default export path from the Pages's preferences file. Don't click when the script is running. Except, of course, to select the source folder.
Yvan KOENIG (VALLAURIS, France) 2008/04/20 2009/06/17 adapté pour format .doc 2009/12/13 updated for MacOs 10.6… *) property theApp : "Pages" property theExt : "pages" property nomDuRapport : "report_Pages2DOC.txt" property nom_du_dossier : "was_Pages_now_DOC" property storeOnDesktop : true (* true = dest folder will be on Desktop false = dest folder will be in "~/Documents" *) property msg1 : "" -- globale property msg90 : "" -- globale property msg91 : "" -- globale -- property msg92 : "" -- globale property msg94 : "" -- globale property msg96 : "" -- globale property msg99 : "" -- globale property rapport : "" -- globale property dossierDeStockage : "" -- globale property dossierParDefaut : "" -- globale property localExport : "" -- globale property newExt : "" -- globale property newType : "" -- globale property isOs4 : missing value -- globale property isOs5 : missing value -- globale property theMenu : missing value -- globale property menuExport : missing value -- globale property types : {{"doc", "SLDocumentTypeMSWord", 2}, {"pdf", "SLDocumentTypePDF", 1}, {"txt", "SLDocumentTypePlainText", 4}, {"rtf", "SLDocumentTypeRichText", 3}, {"rtfd", "SLDocumentTypeRichTextBundle"}, 3} --===== (* our settings *) property typeNum : 1 (* 1 = WORD, 2 = PDF, 3 = Txt, 4 = rtf, 5 = rtfd *) property theButton : missing value (* 1 button PDF 2 button Word 3 button RTF 4 button Standard *) --===== on run (* lignes exécutées si on double clique sur l'icône du script application • lines executed if one double click the application script's icon *) tell application "System Events" to set dossier to choose folder (* dans un bloc System Events pour avoir un titre de dialogue "localisé" • in a System Events block to get a localized dialog title. *) my commun({dossier}) -- my commun({"Macintosh HD:Users:yvan_koenig:Desktop:for_see:" as alias}) end run --===== on open (sel) (* sel contient une liste d'alias des éléments qu'on a déposés sur l'icône du script (la sélection) • sel contains a list of aliases of the items dropped on the script's icon (the selection) *) my commun(sel) end open --===== on commun(elems) my nettoie() my prepareMessages() tell application "System Events" if not (UI elements enabled) then set (UI elements enabled) to true (* Active le GUI scripting • Enable GUI scripting *) set titres to title of processes end tell -- to System Events if theApp is not in titres then my activateTheApp() (* Active et ferme la fenêtre du document créé à l'ouverture • Activate and close the doc's window created at opening *) set {newExt, newType, theButton} to item typeNum of types (* item 1 = {"doc", "SLDocumentTypeMSWord",2} item 2 = {"pdf", "SLDocumentTypePDF",1} item 3 = {"txt", "SLDocumentTypePlainText",4} item 4 = {"rtf", "SLDocumentTypeRichText",3} item 5 = {"rtfd", "SLDocumentTypeRichTextBundle",3} *) set sysAtt to (system attribute "sys2") if 4 > sysAtt then if my parleAnglais() then error "This script requires MacOs X 10.4 or higher !" else error "Ce script requiert MacOs X 1.4 ou ultérieur !" end if else if 5 > sysAtt then set isOs4 to true set isOs5 to false if my getVersion() < "4" then set theMenu to 3 set menuExport to 13 else set theMenu to 10 set menuExport to 9 end if else if 6 > sysAtt then set isOs4 to false set isOs5 to true if my getVersion() < "4" then set theMenu to 3 set menuExport to 13 else set theMenu to 10 set menuExport to 8 (* was a wrong 9 *) end if else set isOs4 to false set isOs5 to false if my getVersion() < "4" then set theMenu to 3 set menuExport to 13 else set theMenu to 10 set menuExport to 8 (* was a wrong 9 *) end if end if my fermeFenetres() (* • Close existing windows *) my afficheLeMessage(msg1) (* Éviter de cliquer… • Don't click… *) tell application theApp to set localExport to localized string "Export" set dossierParDefaut to my getDefaultExport() as text set rapport to "" set dossierDeStockage to my creeDossierDeStockage(nom_du_dossier) (* Unicode text *) try repeat with elem in elems try my exploreTraite(elem as alias, "") end try end repeat if rapport = "" then set rapport to msg90 -- crée un fichier texte sur le Bureau set p2d to path to desktop set p2r to (p2d as Unicode text) & nomDuRapport tell application "System Events" if exists (file p2r) then delete (file p2r) make new file at end of p2d with properties {name:nomDuRapport} end tell set rapport to rapport as text write rapport to (p2r as alias) on error MsgErr number NroErr if NroErr is not -128 then beep 2 tell application (path to frontmost application as string) to ¬ display dialog "" & NroErr & " : " & MsgErr with icon 0 buttons {msg99} giving up after 20 end if -- NroErr is… return end try my nettoie() if my parleAnglais() then my afficheLeMessage("Export done.") else my afficheLeMessage("Traitement terminé.") end if end commun --===== on nettoie() (* pour ne pas stocker dans le fichier script • So it will not be stored in the script file *) set dossierDeStockage to "" set dossierParDefaut to "" set rapport to "" set localExport to "" set newExt to "" set newType to "" set isOs4 to missing value set isOs5 to missing value set theMenu to missing value set menuExport to missing value set theButton to missing value set msg1 to "" set msg90 to "" set msg91 to "" set msg92 to "" -- set msg94 to "" set msg96 to "" set msg99 to " " end nettoie --===== on afficheLeMessage(m) beep 1 tell application (path to frontmost application as string) activate if my parleAnglais() then display dialog m buttons {" OK "} default button 1 giving up after 10 else display dialog m buttons {" Vu "} default button 1 giving up after 10 end if end tell end afficheLeMessage --===== on creeDossierDeStockage(Nom) (* S'il n'existe pas, construit un dossier destination sur le bureau ou dans "~/Documents" • If does not exist, create a destination folder on the desktop or in "~/Documents" *) local dd, dds if storeOnDesktop is true then set dd to path to desktop as Unicode text else set dd to path to documents folder as Unicode text end if if Nom ends with ":" then set dds to dd & Nom else set dds to dd & Nom & ":" end if (* dossierDeStockage n'existe pas, on le crée • dossierDeStockage is not available, build it *) tell application "System Events" to if not (exists item dds) then make new folder at end of folder dd with properties {name:Nom} return dds as Unicode text end creeDossierDeStockage --===== on exploreTraite(elem, ptree) (* elem est un alias • elem is an alias *) local elem_, cl_, type_Id set elem_ to elem as Unicode text tell application "System Events" to tell disk item elem_ set cl_ to class if cl_ is folder then set type_Id to "" else set type_Id to type identifier end if end tell -- "System Events" set cl_ to cl_ as Unicode text if type_Id is in {"com.apple.iwork.pages.pages", "com.apple.iwork.pages.sffpages"} then (* C'est un fichier Pages. • It's a Pages document *) my TraiteUnDocument(elem_) else if cl_ is in {"file package", "«class cpkg»"} then set rapport to rapport & msg91 & elem_ & return (* "Package", Attention, un package EST un dossier "spécial". • Caution, a package IS a "special" folder. *) else if cl_ is in {"folder", "«class cfol»"} then my ExploreUnDossier(elem_, ptree) else set rapport to rapport & msg92 & elem_ & return (* "Pas un document Pages". • "Not a Pages's document" *) end if -- typeId_ is … end exploreTraite --===== on ExploreUnDossier(dossier, ptree) local nomElement, cheminElement, c repeat with nomElement in list folder dossier without invisibles set cheminElement to dossier & nomElement tell application "System Events" to set c to name of (dossier as alias) my exploreTraite(cheminElement as alias, ptree & c & ":") end repeat end ExploreUnDossier --===== on TraiteUnDocument(leCheminOriginal_UniText) my export2Doc(leCheminOriginal_UniText as alias, leCheminOriginal_UniText) end TraiteUnDocument --===== on export2Doc(p, leCheminOriginal_UniText) (* • here p is the path as alias *) local flag, nom_de_p, nouveauChemin, w, bof, x, p_xport try tell application theApp open p set flag to false repeat 300 times (* Attends que le fichier soit réellement ouvert. • Wait until the file is really open *) if my getNbWindows() > 0 then set flag to true exit repeat end if end repeat end tell -- to theApp if flag is false then error number 8888 (* Le fichier n'a pu être ouvert. • The file can't be open. *) on error MsgErr number NroErr if NroErr = 8888 then set rapport to rapport & msg94 & leCheminOriginal_UniText & return else set rapport to rapport & "### " & MsgErr & " ### " & errNbr & return end if return (* can't do the remaining tasks *) end try tell application "System Events" to tell file leCheminOriginal_UniText set nom_de_p to name end tell -- System Events if nom_de_p ends with theExt then set nom_de_p to text 1 thru -(2 + (length of theExt)) of nom_de_p set nouveauChemin to dossierParDefaut & nom_de_p & "." & newExt --log nouveauChemin tell application "System Events" to if exists (file nouveauChemin) then set name of file nouveauChemin to nom_de_p & my horoDateur(modification date of file nouveauChemin) & "." & newExt (* name stamped *) try set {w, bof} to my getFrontWindow() tell application "System Events" to tell application process theApp click menu item menuExport of menu 1 of menu bar item theMenu of menu bar 1 (* Exporter… *) repeat until exists sheet 1 of window w delay 0.1 end repeat tell sheet 1 of window w (* sheet containing the buttons PDF, Word, RTF, Standard *) -- get properties of UI elements of radio group 1 if isOs4 then click button theButton of radio group 1 else if isOs5 then click checkbox theButton of radio group 1 else click radio button theButton of radio group 1 (* I hope that they will no longer change it *) end if -- isOs4 is true (* if typeNum is 2 then delay 0.2 tell pop up button 1 click click menu item quality of menu 1 end tell delay 0.2 end if *) click button 1 (* Suivant… *) repeat until exists button localExport delay 0.1 end repeat click button localExport (* Exporter… *) end tell -- to sheet… repeat 20 times if exists sheet 1 of window w then click button 2 of sheet 1 of window w (* "Ne pas consulter " dans éventuel rapport d'anomalies • "Don't review" in sheet reporting possible export anomalies *) exit repeat end if delay 0.1 end repeat end tell -- to process … System Events if dossierDeStockage is not dossierParDefaut then (* we must move the file from folder dossierParDefaut to folder dossierDeStockage *) set p_xport to dossierDeStockage & nom_de_p & "." & newExt tell application "System Events" to if exists (file p_xport) then set name of file p_xport to nom_de_p & my horoDateur(modification date of file p_xport) & "." & newExt tell application "Finder" to duplicate file nouveauChemin to folder dossierDeStockage (* • before 10.5, System Events is unable to move *) my wait4File(p_xport) tell application "System Events" to if exists file nouveauChemin then delete file nouveauChemin end if -- dossierDeStockage is not… my ferme1fenetre() on error errMsg number errNbr set rapport to rapport & msg96 & p & return & errMsg & " ### " & errNbr & return end try end export2Doc (* ===== • Build a stamp from the modification date_time *) on horoDateur(dt) local annee, mois, jour, lHeure, lesSecondes, lesMinutes set annee to year of dt set mois to month of dt as number (* existe depuis 10.4 *) set jour to day of dt set lHeure to time of dt set lesSecondes to (lHeure mod 60) set lHeure to round (lHeure div 60) set lesMinutes to (lHeure mod 60) set lHeure to round (lHeure div 60) return "_" & annee & text -2 thru -1 of ("00" & mois) & text -2 thru -1 of ("00" & jour) & "-" & text -2 thru -1 of ("00" & lHeure) & text -2 thru -1 of ("00" & lesMinutes) & text -2 thru -1 of ("00" & lesSecondes) (* • Here, the stamp is "_YYYYMMDD-hhmmss" *) end horoDateur (* ===== • Take care, the front window may be an Inspector or a dialog one. *) on getFrontWindow() local namesOfWindows, w, flag tell application theApp to activate set flag to false tell application "System Events" to tell application process theApp set namesOfWindows to name of every window repeat with w in namesOfWindows if subrole of (get properties of window w) is "AXStandardWindow" then set flag to true exit repeat end if end repeat end tell return {w, flag} (* • w is the name of the front document's window *) end getFrontWindow (* ===== • Wait that the file is completely written on disk *) on wait4File(p) (* • p must be Unicode text *) local oldSize, nnn, newSize set oldSize to 0 tell application "System Events" to set nnn to name of file p repeat try tell application "System Events" to set newSize to physical size of file p if oldSize < newSize then set oldSize to newSize else exit repeat end if end try end repeat end wait4File --===== on activateTheApp() local bof, status tell application theApp to activate if my getStartingStatus() is false then tell application "System Events" to tell application process theApp to keystroke return repeat set {bof, status} to my getFrontWindow() if status is true then exit repeat end repeat end activateTheApp (* ===== • Close existing open windows *) on fermeFenetres() repeat while my getNbWindows() > 0 my ferme1fenetre() end repeat (* • Now there is no open window *) end fermeFenetres --===== on ferme1fenetre() tell application theApp to activate tell application "System Events" to tell application process theApp to keystroke "w" using {command down} end ferme1fenetre --===== on getPlistValue(valName, default) local thePlist, u set thePlist to (path to preferences folder as Unicode text) & "com.apple.iWork." & theApp & ".plist" tell application "System Events" if exists file thePlist then tell contents of property list file thePlist try set u to (value of property list item valName) (* Unicode Text *) on error (* On est là si Pages n'a rien enregistré avec des préférences neuves • Here if Pages never saved with the new preferences file. *) set u to default end try end tell -- to contents of… else (* On est là s'il n'y a pas de fichier de préférences • Here if there is no preferences file. *) set u to default end if end tell -- to system events return u end getPlistValue --===== on getStartingStatus() return my getPlistValue("LSDefaultsUseDefaultStartingPoint", false) end getStartingStatus --===== on getDefaultExport() local u (* son of a bitch, I forgot that they don't use the same name !! *) if theApp contains "Pages" then set u to my getPlistValue("SLDocumentDefaultExportDirectory", "~/Documents") else if theApp contains "Numbers" then set u to my getPlistValue("LSDocumentDefaultExportDirectory", "~/Documents") else error "I didn't coded a Keynote version !" end if set u to (POSIX file (do shell script "echo " & u)) as text if u ends with ":" then return u else return (u & ":") end if end getDefaultExport --===== on getNbWindows() tell application "System Events" to tell application process theApp to return count of windows end getNbWindows --===== on getLocale(a, x) tell application a to return localized string x end getLocale --===== on getVersion() try tell application theApp to return version on error return "1" end try end getVersion --===== on parleAnglais() local z try tell application theApp to set z to localized string "Cancel" on error set z to "Cancel" end try return (z is not "Annuler") end parleAnglais --===== on prepareMessages() if my parleAnglais() then set msg1 to "Don’t click when the script is running." & return & "Except, of course, if it ask for." set msg90 to "No problem during the export process." set msg91 to "Package" set msg92 to "Not a " & theApp & "’s document" -- set msg94 to theApp & " can’t read it" set msg96 to "Not copied." set msg99 to "Oops" else set msg1 to "Éviter de cliquer durant l’exécution du script" & return & "sauf s’il le demande." set msg90 to "Exportation réussie sans incident." set msg91 to "Package" set msg92 to "Pas un document " & theApp -- set msg94 to theApp & " n’a pas pu le lire" set msg96 to "Pas copié." set msg99 to " Vu " end if set msg91 to "### " & msg91 & " ### " set msg92 to "### " & msg92 & " ### " -- set msg94 to "### " & msg94 & " ### " set msg96 to "### " & msg96 & " ### " end prepareMessages --===== --

[/script]

Gabe Shackney
Princeton Public Schools

Gabe Shackney
Princeton Public Schools

tomdar2
New Contributor

I've been looking for a .cwk to .pages script for years. Thanks, Gabe! It works for Numbers too if tweaked to replace Pages with Numbers.