【Photoshop】レイヤー名にレイヤー詳細情報を追加する

レイヤー名にレイヤーの種別やらブレンドモードやら不透明度などを追記するスクリプトを作りました。
キャプチャ画像付きで解説する際に便利だと思われるので。

動作確認環境は `Phtoshop2018` + `MacOSSierra` ですが、古い PSバージョンでも動くと思われます。

* 後述のソースを拡張子jsxで保存して、 フォトショから読み込んで使えばOKです。
* 追記した情報を更新したい場合は再度実行してください。
* 自動更新はしないので、クイックに使用したい場合はショートカットを適用してみて下さい。
* もしくは、なんらかのスクリプトイベントに紐づけて自動実行するような感じにして下さい。
* 実行前は一度psdセーブをして下さい。
* 実行時にエラーになってしまう場合は、psdファイルを開き直すとうまく行くようです。

および

* 追記した情報を削除したい場合は、二番目のソースを同様に実行してください。

<img width="291" alt=" 2018-01-20 3.38.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/8302/3aa871ba-bfe8-3c57-55a4-162aaaaa8587.png">
これが、

<img width="359" alt=" 2018-01-20 3.39.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/8302/ee2068ae-87ca-388e-a2e1-2c6bb532f914.png">
こうなる。

※ 通常レイヤーおよび不透明度100%のデフォルト設定ぽい時は、情報の追記せずスキップするので、
そのようなレイヤーしかないドキュメントに適用しても何もおきないので注意です。

※ レイヤー種別の情報（カギカッコで囲まれた部分）の表示はいらん、という人は、ソース中の`showLayerKindFlag`を`false`に設定してやればそのような挙動になります。

###情報を追記するjsxソース

```javascript
(function (){

    var BLEND_MODE_NAMES = {
        'NORMAL': '',
        'COLORBLEND':'カラー',
        'COLORBURN':'焼き込みカラー',
        'COLORDODGE':'覆焼きカラー',
        'DARKEN':'比較（暗）',
        'DIFFERENCE':'差の絶対値',
        'DISSOLVE':'ディザ合成',
        'DIVIDE':'除算',
        'EXCLUSION':'除外',
        'HARDLIGHT':'ハード ライト',
        'HARDMIX':'ハードミックス',
        'HUE':'色相',
        'LIGHTEN':'比較（明）',
        'LINEARBURN':'焼き込み（リニア）',
        'LINEARDODGE':'覆焼き（リニア）加算',
        'LINEARLIGHT':'リニアライト',
        'LUMINOSITY':'輝度',
        'MULTIPLY':'乗算',
        'OVERLAY':'オーバーレイ',
        'PASSTHROUGH':'通過',
        'PINLIGHT':'ピンライト',
        'SATURATION':'彩度',
        'SCREEN':'スクリーン',
        'SOFTLIGHT':'ソフトライト',
        'SUBTRACT':'減算',
        'VIVIDLIGHT':'ビビッドライト'
    };

    var LAYER_KIND_NAMES = {
        'BLACKANDWHITE':'白黒',
        'BRIGHTNESSCONTRAST':'明るさコントラスト',
        'CHANNELMIXER':'チャンネルミキサー',
        'COLORBALANCE':'カラーバランス',
        'CURVES':'トーンカーブ',
        'EXPOSURE':'露光量',
        'GRADIENTFILL':'グラデーション（塗りつぶしレイヤー）',
        'GRADIENTMAP':'グラデーションマップ',
        'HUESATURATION':'色相・彩度',
        'INVERSION':'階調の反転',
        'LEVELS':'レベル補正',
        'NORMAL':'',
        'PATTERNFILL':'パターン（塗りつぶしレイヤー）',
        'PHOTOFILTER':'フィルター',
        'POSTERIZE':'ポスタライズ',
        'SELECTIVECOLOR':'特定色域の選択',
        'SMARTOBJECT':'スマートオブジェクト',
        'SOLIDFILL':'べた塗り（塗りつぶしレイヤー）',
        'TEXT':'テキストレイヤー',
        'THRESHOLD':'しきい値',
        'LAYER3D':'3Dレイヤー',
        'VIBRANCE':'自然な彩度',
        'VIDEO':'ビデオレイヤー',
    };

    function getBlendModeInJa(blendMode) {
        blendMode = '' + blendMode;
        var index = blendMode.indexOf('BlendMode.');
        if (index >= 0) {
            blendMode = blendMode.substr(index + 1 + 9);
            if (BLEND_MODE_NAMES[blendMode] !== void 0) {
                blendMode = BLEND_MODE_NAMES[blendMode];
            }
        }
        return blendMode;
    }

    function geLayerKindInJa(layerKind) {
        layerKind = '' + layerKind;
        var index = layerKind.indexOf('LayerKind.');
        if (index >= 0) {
            layerKind = layerKind.substr(index + 1 + 9);
            if (LAYER_KIND_NAMES[layerKind] !== void 0) {
                layerKind = LAYER_KIND_NAMES[layerKind];
            }
        }
        return layerKind;
    }

    function removeArtlayerNameInfo(sep) {
        var artLayers = app.activeDocument.artLayers;
        for (var i=0; i < artLayers.length; i++) {
            var artLayer = artLayers[i];
            var name = artLayer.name;
            var index = name.indexOf(sep);
            if (index >= 0) {
                name = name.substr(0, index);
                // $.writeln(name)
                var visible = artLayer.visible;
                artLayer.name = name;
                // 強制でvisibleがtrueになってしまうようなので元に戻す
                artLayer.visible = visible;
            }
        }
    }
    function addArtlayerNameInfo(sep, showLayerKindFlag) {
        removeArtlayerNameInfo(sep);
        var artLayers = app.activeDocument.artLayers;
        for (var i=0; i < artLayers.length; i++) {
            var artLayer = artLayers[i];
            var name = artLayer.name;
            var index = name.indexOf(sep);
            var layerKind = artLayer.kind;
            layerKind = showLayerKindFlag ? geLayerKindInJa(layerKind) : '';
            if (layerKind !== '') {
                layerKind = '[' + layerKind + ']';
            }
            var layerOpacity = Math.round(artLayer.opacity);
            if (layerOpacity === 100) {
                layerOpacity = '';
            } else {
                layerOpacity = layerOpacity + '%';
            }
            var blendMode = artLayer.blendMode;
            blendMode = getBlendModeInJa(blendMode);

            temp = [];
            if (blendMode !== '') {
                temp.push(blendMode);
            }
            if (layerOpacity !== '') {
                temp.push(layerOpacity);
            }
            if (layerKind !== '') {
                temp.push(layerKind);
            }
            if (temp.length > 0) {
                temp = temp.join(' ');
                newName = name + sep + temp;
                // $.writeln(newName);
                var visible = artLayer.visible;
                artLayer.name = newName;
                //  強制でvisibleがtrueになってしまうようなので元に戻す
                artLayer.visible = visible;
            }
        }
    }
var SEP = ' : '; // 情報部分との区切り文字
var showLayerKindFlag = !true; // レイヤー種別を表示したくない場合はfalseにする
try {
    addArtlayerNameInfo(SEP, showLayerKindFlag);
} catch (e) {
    alert(e);
}
})();
```
 
### 追記した情報を削除するjsxソース

```javascript
(function (){

    function removeArtlayerNameInfo(sep) {
        var artLayers = app.activeDocument.artLayers;
        for (var i=0; i < artLayers.length; i++) {
            var artLayer = artLayers[i];
            var name = artLayer.name;
            var index = name.indexOf(sep);
            if (index >= 0) {
                name = name.substr(0, index);
                // $.writeln(name);
                var visible = artLayer.visible;
                artLayer.name = name;
                // 強制でvisibleがtrueになってしまうようなので元に戻す
                artLayer.visible = visible;
            }
        }
    }
 
var SEP = ' : '; // 情報部分との区切り文字
try {
    removeArtlayerNameInfo(SEP);
} catch (e) {
    alert(e);
}
})();
```