【Mac】Platypus でメニューバーアプリを作る
ネットで見つけた良い感じの画像やテキストをコピーして、ひたすら Mac に溜めこみ、ひとつのテキストファイルに表示する、という「お気に入りノート」みたいなものを作りたいと思った。
といっても大したもんじゃなく、実体はテキストファイルだ。
テキストファイルにコピペするだけの話である。
そのテキストファイルを開いてペーストする、という作業を省力化するために、Platypus でアプリを作ろうと思う。名付けて note.app だ。
ステータスメニュー・アプリ
Platypus の基本的なことを前に書いた。
🔗 【Mac】Platypus で遊ぶ | 林檎コンピュータ
今回はステータスメニューというインターフェイスでアプリっぽいものを作る。
オレンジの丸で囲んだ「Status item settings」を押すと、メニューバーに表示するアイコンを設定できる。アイコンではなくテキストを表示することもできる。
おためしのスクリプトを書いてみる。
Platypus のステータスメニューアプリは、まず起動した時にスクリプトを実行する。引数がつかない状態での実行である。引数がつかない状態だと、ステータスメニューアプリは、スクリプトが出力する文字列をメニューとして表示する。
メニューを選択すると、今度はそのメニューの名前を引数として、もう一度スクリプトを実行する。その引数に従って処理へと誘導する仕掛けだ。
#!/bin/sh
if test -z "$1"; then
echo 'Hello World'
echo 'ばか'
else
echo "NOTIFICATION:$1"
fi
test -z
で引数があるかどうかを判定している。
NOTIFICATION
は、Platypus の構文で、通知センターの通知を表示する。書式は、
"NOTIFICATION:メッセージ"
となっている。
これを [Create App] して実行すると、メニューバーにアイコンが表示される。
クリックすると、こんな感じだ。
Quit menuTest というのは特に設定しなくても、自動でつけてくれるらしい。
実行すると、ちゃんと動く。
もうちょっと書き加えてみる。
ステータスメニューアプリの構文
#!/bin/sh
if test -z "$1"; then
echo 'Hello World'
echo 'ばか'
echo '----'
echo 'アラート'
else
if test "$1" = 'Hello World' -o "$1" = 'ばか'; then
echo "NOTIFICATION:$1"
elif test "$1" = 'アラート'; then
echo "ALERT:これがアラートだ|そう、アラートだ"
fi
fi
—-(改行)を出力すると、仕切り線が引かれる。
"ALERT:これがアラートだ|そう、アラートだ"
ALERT は、アラートを表示する構文だ。
書式は "ALERT:タイトル|メッセージ"
。以下のように表示される。
さらに書き加えてみる。
#!/bin/sh
if test -z "$1"; then
echo 'Hello World'
echo 'ばか'
echo '----'
echo 'アラート'
echo '----'
echo "MENUITEMICON|safari.png|safari"
echo "MENUITEMICON|/Users/ユーザ名/Desktop/chrome.png|chrome"
echo "MENUITEMICON|https://mac-ra.com/image/firefox.png|Firefox"
echo '----'
echo "SUBMENU|サブ|アイテム1|アイテム2|アイテム3"
else
if test "$1" = 'Hello World' -o "$1" = 'ばか'; then
echo "NOTIFICATION:$1"
elif test "$1" = 'アラート'; then
echo "ALERT:これがアラートだ|そう、アラートだ"
fi
url=`pbpaste`
if test "$1" = 'safari'; then
/usr/bin/open -a Safari.app "$url"
elif test "$1" = 'chrome'; then
/usr/bin/open -a 'Google Chrome.app' "$url"
elif test "$1" = 'Firefox'; then
/usr/bin/open -a Firefox.app "$url"
fi
if test "$1" = 'アイテム1'; then
/usr/bin/say 'こんにちは'
elif test "$1" = 'アイテム2'; then
/usr/bin/say 'さようなら'
elif test "$1" = 'アイテム3'; then
/usr/bin/say 'お疲れ様'
fi
fi
アプリにして実行すると、以下のようになる。
"MENUITEMICON|safari.png|safari"
MENUITEMICON は上の画像のようにアイコンを表示する構文だ。上のアイコンは透明背景の png で、256px の正方形で作った。
書式は、
"MENUITEMICON|アイコンの場所|アイテム名(日本語不可)"
アイテムの場所はローカルのパスでもいいし、ネット上のアイコンも利用できるらしい(未確認)。しかしアイコンのファイルをバンドルさせれば、画像ファイル名だけですむ。引数にはアイテム名が渡される。なぜか、日本語だと通らない。
"SUBMENU|サブ|アイテム1|アイテム2|アイテム3"
SUBMENU はサブメニューを作成する構文だ。書式は、
"SUBMENU|タイトル|アイテム1|アイテム2|アイテム3"
理屈はわかった。
note.app
Note.app に向けてスクリプトを書いてみる。
単に気に入った画像やテキストを見つけたら note.md というファイルにペーストし、役に立ちそうな情報は memo.md というファイルにペーストすることを目指す。
#!/bin/sh
if test -z "$1"; then
echo 'ノート'
echo 'Memo'
else
if test "$1" = 'ノート'; then
sh note.sh
elif test "$1" = 'Memo'; then
sh note.sh "$1"
else
exit 0
fi
fi
バンドルするシェルスクリプトは、【Mac】素のテキストに画像を添付 | 林檎コンピュータで書いた mdlink.sh というやつに手を加え、以下のようにした。
📝 note.sh#!/bin/sh
url=`pbpaste`
ext=`echo ${url##*.}`
# saveFolder 等の指定。
saveFolder='~/画像を保存するフォルダ'
if test -z "$1"; then
note='~/ノートのパス/note.md'
elif test "$1" = 'Memo'; then
note='~/メモのパス/メモ帳.md'
else
note='/ノートのパス/note.md'
fi
# 画像のダウンロードを試みる。
if echo "${url}" | grep -sqE '^http'; then
if test "${ext}" = 'png' -o "${ext}" = 'jpg' -o "${ext}" = 'jpeg' -o "${ext}" = 'gif'; then
cd "${saveFolder}"
curl -O "${url}"
filename=`basename "${url}"`
savePath=`echo "${saveFolder}"'/'"${filename}"`
echo '![画像]('"${savePath}"')' >> "$note"
echo "$url"'
------
' >> "$note"
else # Markdown のリンクを作る
blogtitle=`curl -Ss "${url}" | nkf -w | grep -o "<title>[^<]*</title>" | sed -e 's/<[^>]*>//g'`
echo '['$blogtitle']('"${url}"')
------
' >> "$note"
fi
else # UTF-8 で書き出す。
echo "$url" | /usr/local/bin/nkf -w >> "$note"
echo '
------
' >> "$note"
fi
これはなにかというと、コピーした内容が http アドレスなら マークダウン記法でリンクを作り、インターネットの画像のアドレスなら、その画像をダウンロードして、同じくマークダウンのアドレスを返す。
ふつうの文字列なら、UTF-8 にして書き出すようになっている。このため、nkf という文字コードを扱うコマンドが必要だ。
ノートに追加したい画像をネットで見つけたら、右クリックで「イメージのアドレスをコピー」して、note.app を実行する。
url の場合はタイトルの取得を試みているけれど、これはあまり精度が高くない。
試してみると、どうにか動いている。
Typoraなどで開いてみると画像も見られて、いちおう満足。だが、pixiv の画像はダウンロードはできないし、なんというかもうひとつだ。
最近のコメント