読者です 読者をやめる 読者になる 読者になる

イメージに染まるまで……

Mac,iOSなどAppleの製品についての記事や、セキュリティだったりGTDの記事を書いています。

OSXのAutomatorを利用して、Markdownのリンクを作成する

Mac AppleScript Tips

はじめに

この記事では、コンテクストメニューの拡張で、選択している文字列をMarkdown形式のリンクに変換するサービスを、Automatorで作成します。

条件は、Safariを利用していることです。

というのも、SafariOSXの標準ブラウザであるため、非常に柔軟なApple Scriptの拡張が可能だからです。

では、はじめてみましょう。

作りかた

さて、最初に書いたようにこれはOSXAutomatorを利用します。

ザリガニが見ていた…さんの記事、サービスがいいMacにしておくを参考にしました。

これをちょっとだけ工夫して、Safariで開いているタブを読み取らせて、Markdown形式で囲ませるという操作に変えます。

まずはAutomatorを開き、サービスを作成。

f:id:nya-0:20150606043749p:plain

Apple Scriptを使うので、アクションをサイドバーから選択します。

f:id:nya-0:20150606043803p:plain

最初から入っている文字列があるのですが、最終的に以下の形になるように入力しましょう。

on run {input, parameters}

(* Your script goes here *)
tell application "Safari"
    set dCount to count every document
    if dCount = 0 then return
    tell document 1
        set aURL to URL
    end tell
    if aURL = "bookmarks://" then return my message()
    if aURL = "topsites://" then return my message()
    if aURL = "history://" then return my message()
    return "[" & input & "](" & aURL & ")"
end tell

end run

on message()
display alert "Safariの最前面のタブがウェブページではありません!"
end message

実は、Safariのタブの取得はひと工夫が必要です。同じくザリガニが見ていた…さんの記事に、Safariで表示中の全ページを指定したブラウザで一気に開くAppleScriptという記事がありますが、この記事にあるApple Scriptは、Safariが最前面のアプリではないとURLが取得できませんでした。windowtabはここでは役に立ちません。

では、どうすればいいのでしょうか。

documentを利用します。これですと、Safariが最前面になくても最前面のタブのURLを取得します。

ここでは、AS HoleさんのSafariでオープン中のURLを指定のWindowsのWebブラウザでオープンを参考に、SafariのタブのURLを取得しました。

このスクリプトの素晴らしいところは、Safariがブックマークやトップサイトを表示しているときは何も返さないようになっているところです。

これを見るまで全く気づかず、以下のようなスクリプトで作っていたため、時々Markdownの形式に変更されたテキストの中に、bookmarks://topsites://が入ってしまっていました。

tell document 1
set str to URL
end tell

最終的に上の形にする際に、履歴の画面が表示されている場合を追加しました。

また、一応ですが、トップサイト、ブックマーク、履歴が表示されている際は、すべてon messageSafariの最前面のタブがウェブページでないことをdisplay alertで表示するようになっています。必要ないなら、削除するなりコメントとして最初にハイフンを2つ入れてください。

これで、完成です。

サービスを保存する際に気をつけるべき点としては、"サービス"は次の選択項目を受け取る:を「テキスト」に、検索対象は「すべてのアプリケーション」。そして、「選択されたテキストを出力で置き換える」にチェックをしておいてください。

f:id:nya-0:20150606044044p:plain

一工夫で応用編 〜タイトルまで、入力させよう!

このサービス、ちょっと工夫するだけで簡単に機能を追加することができます。例えば、ページのタイトルもそのまま入力したい場合、SafariApple Scirptから呼び出せる機能、do JavaScriptでタイトルまで入力することが可能です*1

内容は以下の通りです。先程と同様に、新しくサービスを作成して、Apple Scriptを入れるようにします。

on run {input, parameters}

(* Your script goes here *)
tell application "Safari"
    set dCount to count every document
    if dCount = 0 then return
    tell document 1
        set aURL to URL
        set aTitle to do JavaScript "document.title"
    end tell
    if aURL = "bookmarks://" then return my message()
    if aURL = "topsites://" then return my message()
    if aURL = "history://" then return my message()
    return "[" & aTitle & "](" & aURL & ")"
end tell

end run

on message()
display alert "Safariの最前面のタブがウェブページではありません!"
end message

これで、タイトルごと一気に選択した文字列を変えることができます。

おわりに

いかがだったでしょうか。

これをちょっと変えれば、HTMLのタグでも利用できると思います。

これがあれば、タグをつけてタイトルとURLをコピペするなりの操作をして……という面倒さのかなりの面を楽にできると思います。

例えば、こんな風に利用することができるでしょう。

記事を書いている最中に、以前見たサイトを入れたい。しかし、今はSafariでページを開いていない。

とりあえず、「この記事を参照しました」など書いておいて、あとで「記事」の部分をサービスを利用して、ささっと変更してゆく……

これなら、当面は書くことに集中することができます。書きながら調べてURLをコピペして、タイトルをコピペして……などという面倒は避けることができますよね。

私は、書いている最中にこうした面倒な繰り返しが嫌になって、このサービスを作成しました。

Automatorを利用したサービスですので、OSXで利用できるエディタ類ではほとんど利用できるでしょう*2

役に立てれば嬉しいです。

参考リンク

ザリガニが見ていた… | サービスがいいMacにしておく

非常に参考になりました。感謝です!


AS Hole (Apple Scriptの穴) | Safariでオープン中のURLを指定のWindowsのWebブラウザでオープン

いつも素晴らしいスクリプトの数々……感謝です!

*1:ただ、タイトルだけではない要素まで入ることがあります。そこはご容赦ください。windowとtabを利用すれば、綺麗にタイトルを取ることはできますが、Safariが最前面でなければ機能しないので、テキストエディタから利用するサービスとして使えません。

*2:Cocoa Emacsでは使えません。……当然かもしれませんが。