Safariの最前面のウィンドウの内容をすべて取得してTextEditで新規ドキュメントを作成

Safariで表示中の最前面のウィンドウのURLを取得して本文文字列を抽出し、テキストエディットの新規書類としてオープンするAppleScriptです。

たまに、Blog上の情報を部分的に利用したいようなときに、テキスト内容をコピー&ペーストで別のアプリケーションに持ってきますが、たまにテキストの選択ができないBlogに遭遇することがあります。

こんなとき、SafariのAppleScript用語辞書にはdocumentからtextが取得できるということになっていますが、目下Safari 10.1.2上のこの機能にはアクセスできません。SafariのAppleScript用語辞書はSafari 10.xになってからdocumentのpropertiesが取得できない(エラーになる)など、いまひとつです。

さらに、もっと前からdocumentのtextが取得できないようになっているので、とりあえずバグレポートで文句を書きつつ、対処してみました(Appleがバグ修正するのを待つよりも自前でScript書いた方が早いという)。

Safariの最前面のウィンドウ(frontmost document)から表示中のURLだけ取得してくれば、AppleScript単体でWeb内容のダウンロードからテキストの抽出までできるので、そのとおりに処理。取得しただけだとスクリプトエディタ上でログ表示(コピー可)するだけなので、とりあえずテキストエディットの新規書類を作成してその本文にテキストを入れてみました。

ちなみに、本Blog掲載のプログラムリストの末尾に「スクリプトエディタに内容を転送するリンク」をつけていますが、これはコピー&ペーストではなく、カスタムURLプロトコル(applescript://)経由でプロセス間通信によりWebブラウザからスクリプトエディタにデータ転送する仕組みを利用しています。一般ユーザーにとっては、「コピー&ペーストではない」という点がなかなか理解できないようです。

AppleScript名:Safariの最前面のウィンドウの内容をすべて取得してTextEditで新規ドキュメントを作成
– Created 2017-09-09 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”
–http://piyocast.com/as/archives/4823

property NSAttributedString : a reference to current application’s NSAttributedString
property NSData : a reference to current application’s NSData
property |NSURL| : a reference to current application’s |NSURL|

–Get URL from frontmost window (document)
tell application “Safari”
  if (every document) = {} then return
  
tell front document
    set aURLstr to URL
  end tell
end tell

–Get String from Safari URL
set sRes to getStringFromRemoteHTML(aURLstr) of me

–Make new document with TextEdit to browse or edit text contents
tell application “TextEdit”
  make new document with properties {text:sRes}
  
activate
end tell

on getStringFromRemoteHTML(aURLstr as string)
  set theURL to |NSURL|’s URLWithString:aURLstr
  
set theData to NSData’s dataWithContentsOfURL:theURL
  
set attStr to NSAttributedString’s alloc()’s initWithHTML:theData documentAttributes:(missing value)
  
if attStr = missing value then error “Internet Connection lost or Wrong URL”
  
return (attStr’s |string|()) as string
end getStringFromRemoteHTML

★Click Here to Open This Script 

Leave a Reply