Saturday, February 23, 2019

#1 2019-02-05 03:45:47 pm

From:: South Tirol
Registered: 2008-07-04
Posts: 603

Offline reading in Webarchive format

I already asked in a previous post how to transform HTML to webarchive

the results are nice, (but look the same as if you would open a webarchive in TextEdit)
I don't use Safari but would love to save/keep some sites for offline reading, using my preferred Browser, Chrome. Saving HTML with all the resources folder creates just clutter!

So, to get a perfect webarchive I have to use Safari or is it possible to script this process without involving Safari in this workflow?



#2 2019-02-05 04:36:54 pm

Shane Stanley
From:: Australia
Registered: 2002-12-07
Posts: 5573

Re: Offline reading in Webarchive format

You can do it without any browser. Here's the code, but there are a couple of catches (see below):


use AppleScript version "2.4" -- Yosemite (10.10) or later
use scripting additions
use framework "Foundation"
use framework "AppKit"
use framework "WebKit"
property thePath : missing value

set thePath to (POSIX path of (path to desktop)) & "Test.webarchive"
my archivePage:"" toPath:thePath

on archivePage:thePageURL toPath:aPath
   set my thePath to aPath -- store path for use later
   my performSelectorOnMainThread:"setUpWebViewForPage:" withObject:thePageURL waitUntilDone:false
end archivePage:toPath:

on setUpWebViewForPage:thePageURL
   -- needs to be done on the main thread
   -- make a WebView
   set theView to current application's WebView's alloc()'s initWithFrame:{origin:{x:0, y:0}, |size|:{width:100, height:100}}
   -- tell it to call delegate methods on me
   theView's setFrameLoadDelegate:me
   -- load the page
   theView's setMainFrameURL:thePageURL
end setUpWebViewForPage:

-- called when the WebView loads a frame
on WebView:aWebView didFinishLoadForFrame:webFrame
   -- the main frame is our interest
   if webFrame = aWebView's mainFrame() then
       -- get the data and write it to file
       set theArchiveData to webFrame's dataSource()'s webArchive()'s |data|()
       theArchiveData's writeToFile:thePath atomically:true
       display dialog "The webarchive was saved" buttons {"OK"} default button 1
   end if
end WebView:didFinishLoadForFrame:

on WebView:WebView didFailLoadWithError:theError forFrame:webFrame
   -- got an error, bail
   WebView's stopLoading:me
   display dialog "The webarchive was not saved" buttons {"OK"} default button 1
end WebView:didFailLoadWithError:forFrame:

It needs to be run either from Script Editor, or as a stay-open applet (in which case you can add code to quit after the dialogs). The stay-open issue means it won't run in Script Debugger as yet.

Shane Stanley <>



Board footer

Powered by FluxBB

RSS (new topics) RSS (active topics)