MacNote3 からのデータ取り出しと、Writeへの移行

## 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 から全ノートデータのテキストを取り出すスクリプト

　作成したのは、とりあえずノートのタイトルと本文を取り出し、それぞれの区切り行を加えて１つのテキストファイルに出力するスクリプト。できてしまえば、こんなに少ない行数でできる。

```AppleScript:ManNote3export.scpt
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 初心者のコードなので、稚拙で恥ずかしいのですが、助言を期待して晒すことにしました。ご指摘や助言、大歓迎です。

```Python:SepNote.py
#!/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()
```