MacNote3 について
Mac で階層構造で管理できるノートアプリとして、MacNote3 というアプリを愛用していた。
MacNote3 → http://nsek.net/SYW/software/japanese/macnote3/index.html
このアプリを愛用していたもう一つの理由は、iOS 機器で利用できる mmNote というアプリとの同期機能(手動)があって、 Mac と iPhone でノートを共有できることだった。
mmNote → http://nsek.net/SYW/software/iPhoneJ/mmnote/index.html
ところが、ある時期から mmNote の動作が iOS のアップデートで動作しなくなり、 Mac でのみ利用しながら、代替えのアプリを探していた。
欲しかった機能は
- 階層でノートを管理できること
- 全文検索ができること
- Mac と iPhone などとの連携ができること
と単純だったのですが、階層で管理できるのが見つからなかった。(Microsoft OneNote が良いかとも思ったのだけど、ノートとセクションというのがちょっとなじめなかった)
Write との出会い
そんなときに、偶然、友人から Write というアプリを紹介してもらった。
Write → http://writeapp.net/
Write は、多階層でノートが管理できるほか、Mac と iOS 機器との連携が、iCloud or DropBox で同期する方法で利用できる。
更にうれしいのは、MarkDown記法 に対応していて、 iPhone のソフトキーボードでは、MarkDown に便利な記号が簡単に入力できるように工夫されている。MarkDown用ノートアプリ ともいえるほど。
MarkDownのプリビュー機能や、HTML形式に変換出力や、PDF出力にも対応している。すごい。
有料アプリではあるが、高くはないと思ったので、3種(Mac版、iPhone版、iPad版それぞれ別に購入が必要)とも購入して、本格的に移行しようと思い立った。
MacNote3からのデータ取り出し
さて、移行するには現在保有している約400枚(?)のノートを MacNote3 から取り出す必要がある。
幸い、私はリッチテキストは使っていなかったし、画像等の貼り付けもしていなかったので、テキストだけ取り出せば良かった。
最初は、MacNote3が利用しているデータフォルダーから直接取り出そうと思ったが、ノートごとに保存されているデータは、XML形式(?)で、なおかつテキスト部分はBASE64のようなコード変換された形式だったので、単純にはできなかった。MacNote3にもノートをエキスポートする機能はあるものの、1ノート毎に手動で行うのは面倒だった。
半ば諦めかけていたが、MacNote3はAppleScriptに対応していたことを思い出し、スクリプトエディタで、MacNote3 の用語説明を見たら、使えそうなクラス、メソッドがあったので、試行錯誤はあったものの、結果的には簡単なスクリプトで全ノートのテキストを一括して取り出すことができた。
MacNote3 から全ノートデータのテキストを取り出すスクリプト
作成したのは、とりあえずノートのタイトルと本文を取り出し、それぞれの区切り行を加えて1つのテキストファイルに出力するスクリプト。できてしまえば、こんなに少ない行数でできる。
tell application "MacNote3"
set titleList to ""
set saveFile to choose file name
open for access saveFile with write permission
set allPages to all pages
repeat with aPage in allPages
set pTitle to title of aPage
set pText to text of aPage
write "== MacNote title ==" & return to saveFile
write pTitle & return to saveFile
write "== MacNote text ==" & return to saveFile
write pText & return to saveFile
write "== MacNote end ==" & return to saveFile
set titleList to titleList & pTitle & return
end repeat
close access saveFile
display dialog "書き出しが終わりました。"
set the clipboard to titleList
end tell
Write へのデータ移行
AppleScript で取り出したテキストデータは、文字コードが SHIFT-JIS なので、文字コード変換が出来るテキストエディタなどで、 UTF-8 に変換しておきましょう。(iconv でコマンドラインで変換してみたら、内部のデータがおかしいのかエラーになったので、安易に Jedit X で変換した)
MacNote3 のデータで、フォルダ(階層の区切り)は、本文無しのノートデータのようになっていたので、それを利用して、フォルダを作ってその中に1枚のノートを1ファイルとし、タイトルをファイル名にしたテキストデータを作るプログラムを Python で書いて、一気にノートを変換した。
後は、DropBox の Write フォルダに放り込んで、Mac, iPhone, iPad と同期ができた。
最初は AppleScript でやろうとしたが、文字コードの扱いが思うようにならなかったし、Write は AppleScript 非対応だった。で、慣れていない Perl で書いてみていたら、知人に「 Python が簡単だよ」と言われたので、Webの情報で勉強しながら書いてみたら、なるほど、助言どおり比較的簡単にできた。
Write 用へテキストファイルを分割する Python プログラム
Python 初心者のコードなので、稚拙で恥ずかしいのですが、助言を期待して晒すことにしました。ご指摘や助言、大歓迎です。
# !/usr/bin/python
# -*- coding: utf-8 -*-
import codecs
import os
odir = 'MacNote'
otitle = ""
odata = ""
ostart = 0
fin = codecs.open('conv.txt','r','utf-8')
for row in fin:
linedata = row.rstrip()
if '== MacNote title ==' in linedata:
ostart = 1
elif '== MacNote text ==' in linedata:
ostart = 2
elif '== MacNote end ==' in linedata:
if len(odata)< 2:
odir = otitle
else:
if not os.path.exists(odir): os.mkdir(odir)
ofname = otitle.replace('/', '_')
if len(ofname)>20: ofname = ofname[0:20]
ofneme = odir + '/' + ofname + '.txt'
fout_utf = codecs.open(ofneme,'w','utf-8')
fout_utf.write(u'■' + otitle + '\n')
fout_utf.write(odata)
fout_utf.close()
otitle = ''
odata = ''
ostart = 0
elif ostart == 1:
otitle = linedata
odata = ''
else:
odata = odata + linedata + '\n'
fin.close()