Sketchプラグイン　メモ

選択アートボードのデータを吐き出すプラグインを作るためのメモ
自分用です

## APIの仕様
公式のAPIリファレンス：
https://developer.sketchapp.com/reference/api/
Sketch APIのgithub：
https://github.com/BohemianCoding/SketchAPI
Sketch App API（非公式のObj-cクラスダンプ）： 
パブリックプロパティやメソッドを確認できます
https://github.com/abynim/Sketch-Headers

## Objective-Cの関数をCocoaScriptの記述に変換
詳細はこちら：
https://developer.sketchapp.com/guides/cocoascript/

関数の引数ラベルは、アンダーバーでつなぐ
例えば、

```
// Objective-C
[[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:true attributes:nil error:nil];
```
　　　　　　　　　　　　　　　↓

```
// CocoaScript
NSFileManager.defaultManager().createDirectoryAtPath_withIntermediateDirectories_attributes_error(path, true, nil, nil);
```

## Pluginから取得できるSketchのオブジェクトについて

- require('sketch/dom')から取得したオブジェクトは、
Sketch APIのオブジェクト。
- context.documentや、context.selectionなど、contextから取得したオブジェクトは、Sketch App APIのオブジェクト

## オブジェクト

| ツール名  | クラス名(Sketch App API)  | 
|---|---|
| Artboard | MSArtboardGroup |
| Line | MSShapeGroup |
| Arrow | MSShapeGroup |
| Rectangle | MSShapeGroup |
| Rounded | MSShapeGroup |
| Star | MSShapeGroup |
| Polygon | MSShapeGroup |
| Triangle | MSShapeGroup |
| Vector | MSShapeGroup |
| Pencil | MSShapeGroup |
| Oval | MSShapeGroup |
| Text | MSTextLayer |
| Bitmap | MSBitmapLayer |
| Hotspot | MSHotspotLayer |
| Symbol | MSSymbolInstance |
| Slice | MSSliceLayer |

## サンプルコード
### レイヤーを取得する
```
var layers = symbolMaster.layers();
log(layers);
```

実行結果

```
(
    "<MSTextLayer: 0x7fc35ffa7c00> input_TEXT BOX (5B1B913C-E914-4E13-B64E-C0B95B5CF981)",
    "<MSShapeGroup: 0x7fc35ffd47f0> shape (F4CAF400-EFEA-49CA-A111-513D221C2184)"
)
```
### オーバーライド元のシンボルを取得する
```
var parent = symbol.symbolMaster(); // symbolは、MSSymbolInstance 戻り値は、MSSymbolMaster
```

### シンボルのオーバーライド項目を取得する
```
var overrides = symbol.overrides(); // symbolは、MSSymbolInstance
log(overrides);
```

実行結果

```
{
    "41A74F0C-1BB0-45EA-8309-DE9D7C9D1DB5" =     {
        "BB49DFC7-069E-46D8-B998-EFB77658E5A2" = testtest;
        symbolID = "ADCB6E13-3EAC-4159-9991-501017FFBBC8";
    };
    "98CEA3B9-61AE-4756-A858-CC8096E957D6" =     {
        symbolID = "CF9A2621-1462-4803-B6C0-D498EDFDAF5B"; 
        // シンボルをオーバーライドで選択してる時は、symbolIDが表示される、デフォルトのままで、シンボルを変更してない場合は、表示されないので注意
    };
}

```

### シンボルから、オブジェクトIDのオブジェクトを取得
```
// targetは、MSSymbolInstance
// layers関数があるオブジェクトなら使えるはず
function findObjectByObjectId(target, objectId) {
	var layers = target.layers();
	var count = layers.count();
	for (var i = 0; i < count; i++) {
		var layer = layers[i];
		if (layer.objectID() == objectId) {
			return layer;
		}
		if (typeof layer.layers == 'function') {
			var rtn = findObjectByObjectId(layer, objectId);
			if (rtn) return rtn;
		}
	}
	return null;
}
```

### シンボルから、オーバーライドしたオブジェクト名を表示
```
// symbolは、MSSymbolInstance
var document = require('sketch/dom').getSelectedDocument();
var overrides = symbol.overrides();
for (var key in overrides) {
  var items = overrides[key];
  if (items['symbolID']) {
    var selectedSymbol = document.getSymbolMasterWithID(items['symbolID']);
    for (var ikey in items) {
      if ('symbolID' != ikey) {
        var overrideObj = findObjectByObjectId(selectedSymbol._object, ikey);
        log('name:' + overrideObj.name());
      }
    }
  } else {
    if (Array.isArray(items)) {
      for (var ikey in items) {
        var overrideObj = findObjectByObjectId(symbol.symbolMaster(), ikey);
        log('name:' + overrideObj.name());
      }
    } else {
      var overrideObj = findObjectByObjectId(symbol.symbolMaster(), key);
      log('name:' + overrideObj.name());
    }
  }
}
```