(Mac) EvernoteでMarkdownを書きながらMarkedを利用して自動プレビュー表示

EvernoteでMarkdownを書いてリアルタイムにプレビューを表示するためのスクリプトを作成しました。
Markdonwのプレビュー表示はMarkedを利用しています。

MacEvernoteでは、ノートを保存したタイミングでノート(個別コンテンツ)毎のディレクトリ${HOME}/Library/Application Support/Evernote/accounts/Evernote/<アカウント名>/content/<個別コンテンツディレクトリ>のタイムスタンプが更新されます。
最新の個別コンテンツディレクトリ内のcontent.htmlのファイルを定期的に監視して、前回より更新が加わった場合にはhtml形式よりテキスト形式に変換したcontent.mdファイルを同ディレクトリ内に作成します。
作成したcontent.mdファイルをMarkedに渡してリフレッシュすることでMarkdownのリアルタイムプレビューを実現しています。
Evernoteに貼付けた画像ファイルについても、別途htmlのimgタグのsrcをMarkdown形式に変換することで対応しています。

元ネタはrubyで作成されたスクリプトbashで書き直しています。

GitHub iwazer / everwatch

スクリプト


#!/bin/bash

ACCOUNT="<ACCOUNT>"         # your evernote account name
CHECK_INTERVAL=2          # content update check interval (sec)
MARKED_REFRESH_BG=yes     # [yes/no] yes:background, no:background
VERBOSE=no                # [yes/no] yes:check result output, no:silent

CONTENT_DIR="${HOME}/Library/Application Support/Evernote/accounts/Evernote/${ACCOUNT}/content"
CONTENT_HTML=content.html # read file
CONTENT_MD=content.md     # write file

while true;
do
  LATEST_DIR=`stat -l -t '%FT%T' "${CONTENT_DIR}"/* | cut -d' ' -f6- | sort | tail -1 | cut -d' ' -f2-`
  NEW_HASH=`md5 "${LATEST_DIR}/${CONTENT_HTML}" | cut -d= -f2`
  if [ "${HASH}"x == "${NEW_HASH}"x ]; then
    test "${VERBOSE}"x == "yes"x && echo "content not been updated."
    sleep ${CHECK_INTERVAL}
    continue
  fi
  HASH=${NEW_HASH}
  cat "${LATEST_DIR}/${CONTENT_HTML}" | sed -e 's/<img src=\"\([^"]*\)\"[^>]*>/![](\1)/g' | textutil -stdin -convert txt -stdout >"${LATEST_DIR}/${CONTENT_MD}"
  test "${VERBOSE}"x == "yes"x && echo "content updated, refresh markdown."
  open -a Marked "${LATEST_DIR}/${CONTENT_MD}" $(test "${MARKED_REFRESH_FG}"x != "yes"x && echo '-g')
  sleep ${CHECK_INTERVAL}
done

利用方法


以下の変数については、適切な設定に変更してください。

  • ACCOUNT - Evernoteのアカウント名を入力します。
  • CHECK_INTERVAL - コンテンツの更新をチェックする間隔の秒数を指定します。
  • MARKED_REFRESH_BG - Markedをリフレッシュする際にウィンドウをバックグラウンドのままにする場合は”yes”、リフレッシュ毎にフォアグラウンドで表示する場合には”no”を指定します。
  • VERBOSE - コンテンツの更新結果を標準出力に表示する場合は”yes”、サイレントに実行する場合は”no”を指定します。

スクリプトを保存して実行権限付与の上、実行します。(以下はVERBOSEが”yes"の場合)

$ ./everwatch.sh
content updated, refresh markdown.
content not been updated.
content not been updated.
content not been updated.
content updated, refresh markdown.
content not been updated.
・・・

EvernoteのアプリでいずれかのノートにMarkdown文書を作成して保存を行うと、
content updated, refresh markdown.のメッセージが出力された際に、保存された内容でMarkedがリフレッシュされると思います。


参考サイト
Mac OSX EvernoteでMarkdownを書いてMarkedでプレビューする
Evernoteで図入りのMarkdown文書を書いてMarkedでプレビューする方法