coteditor/CotEditor — pull request #219 by 1024jp (2014-09-25 18:07:24+00:00)
Title: Change syntax style file from plist to YAML

This is pull-request for the issue #154.

シンタックススタイルの定義ファイルのフォーマットを従来の plist (XML) から YAML に変更しました。
これにより、

- 定義ファイルサイズの削減 (plist の約半分以下)
- 定義ファイルを CotEditro のシンタックス定義編集シート **以外** から生成する場合の作業効率の向上

が見込めます。

動作と仕様の妥当性に関してレビューののちマージするかの見当をお願いできればと思います。

### 仕様

新しい YAML 形式のファイルは従来の plist と同じく NSDictionary を書き出す形をとり、各キーワードや階層構造の変更などは行わずに単純に書式を XML から YAML に書き換えるものとする。

ファイルの保存場所は、従来のシンタックス定義ファイルが `~/Library/Application Support/CotEditor/SyntaxColorings/` であったのに対して、新しい YAML ファイルは `Syntaxes` に保存する。つまり `Syntaxes/` ディレクトリ内は新しい YAML 形式の定義ファイルのみが保存されることになり、両者が混在することはない。

YAML のパースは、 C で書かれており実績も多い LibYAML をベースに使い YAML.Framework という LibYAML のラッパーを通して行なっている。この YAML.Framework は CotEditor 用におもにフォーマットの面で少々変更を加えており、OgreKit のようにプロジェクト内に専用のリポジトリを作成して運用する予定。

### 定義ファイルの移行処理

従来の定義ファイルの移行に関しては、それぞれ以下の形を取る。

- バンドルされている定義ファイルはすでに全て YAML に変更済み
- ユーザが Application Support/ 領域に保存している定義ファイルは、CotEditor 2.0 の初回起動時 (*後述) に自動で plist から YAML への移行処理を行なう
- 環境設定ウインドウからは従来の plist 形式の定義ファイルもインポートできるようにする。この場合は、インポート時に plist から YAML に変換され、YAML 形式にてユーザ領域に保存

CotEditor 1.x 系が YAML 形式の新しい定義ファイルを読み込む手段は提供しない。

#### ユーザデータの移行処理に関して

この pull-request 時点では、SyntaxColorings ディレクトリと Sytnaxes ディレクトリの両者の存在をチェックし SyntaxColorings が存在し Syntaxes ディレクトリが存在しないときに、移行処理の必要有りと判断し、plist から YAML への移行を行なうようにしている。

最終的には（CotEditor 2.0 リリーまでには）、これをディレクトリの存在から判断するのではなく、アプリケーション起動時にカラーリングテーマの移行処理と合わせ、UserDefaults に保存したフラグと照らし合わせて処理の判断を行なうようにする予定。この処理部分の実装はこの pull-request マージ後に行う。

### 移行によるデメリット

実際にベンチマークを計ってはいないが、この移行により CotEditor の起動速度が若干下がった可能性がある。これは、現在の CotEdtior が起動時に全ての定義ファイルのキャッシュを作成していることに起因する。つまり、すべてのシンタックス定義ファイルを読み・パースする必要がある。

ただし、クリティカルなほどの遅延は発生していないように感じるのと、この起動時に全ての定義をキャッシュする仕様への疑問もある（将来的に変更する可能性がある）ので、YAMLに変更することで得られるメリットを優先し実行に踏み切った。