shuto_log.aep

ブログ名変わりました。自分がやったことなどを備忘録的な感じで残していこうと思います。

エクスプレッション中の文字列を置換するExtededScript書いた

AfterEffectsでエクスプレッション中の記述を置換するExtendedScriptを書いたので備忘録的に残しておきたいと思います。 実行前の前提として、置換したいエクスプレッションのプロパティを複数選択した状態であることとします。 冒頭は forEach() を使えるようにするためのおまじない。

// ExtendedScriptでforEach()を使えるようにする
// Production steps of ECMA-262, Edition 5, 15.4.4.18
// Reference: http://es5.github.com/#x15.4.4.18
if ( !Array.prototype.forEach ) {
    Array.prototype.forEach = function( callback, thisArg ) {
  
      var T, k;
  
      if ( this == null ) {
        throw new TypeError( " this is null or not defined" );
      }
  
      // 1. Let O be the result of calling ToObject passing the |this| value as the argument.
      var O = Object(this);
  
      // 2. Let lenValue be the result of calling the Get internal method of O with the argument "length".
      // 3. Let len be ToUint32(lenValue).
      var len = O.length >>> 0; // Hack to convert O.length to a UInt32
  
      // 4. If IsCallable(callback) is false, throw a TypeError exception.
      // See: http://es5.github.com/#x9.11
      if ( {}.toString.call(callback) != "[object Function]" ) {
        throw new TypeError( callback + " is not a function" );
      }
  
      // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
      if ( thisArg ) {
        T = thisArg;
      }
  
      // 6. Let k be 0
      k = 0;
  
      // 7. Repeat, while k < len
      while( k < len ) {
  
        var kValue;
  
        // a. Let Pk be ToString(k).
        //   This is implicit for LHS operands of the in operator
        // b. Let kPresent be the result of calling the HasProperty internal method of O with argument Pk.
        //   This step can be combined with c
        // c. If kPresent is true, then
  
        if ( k in O ) {
  
          // i. Let kValue be the result of calling the Get internal method of O with argument Pk.
          kValue = O[ k ];
  
          // ii. Call the Call internal method of callback with T as the this value and
          // argument list containing kValue, k, and O.
          callback.call( T, kValue, k, O );
        }
        // d. Increase k by 1.
        k++;
      }
      // 8. return undefined
    };
  }
  
  // =================== ここからメイン ====================== //
  function main() {
      // 選択中のレイヤーを取得
      var layers = app.project.activeItem.selectedLayers;
      layers.forEach(function(l){
          // 選択中のプロパティを取得
          var properties = l.selectedProperties;
          properties.forEach(function(p){
              // 選択中のプロパティがエクスプレッションを記述できないタイプならスキップ
              if (p.canSetExpression != true) continue;
              $.writeln("置換前: " + p.expression);
              // ================== 使用時にここを変える ===================== //
              // TODO: Window()とかstatictext使ってGUIから入力できるようにする
              // 置換後文字列
              var s = p.expression.replace (/" "/g, '"Particular"');
              // ============================================================= //
              // 置換後の文字列をエクスプレッションに適用
              p.expression = s;
              $.writeln("置換後" + s);
              $.writeln("");
          });
      });
  }
  
  main();