'use strict';

var through = require('through2');

// Map to avoid duplicate keys.
var substitutions = {
  '.aPM': '.applyProjectionMatrix',
  '.aP': '.applyProjection',
  '.uPM': '.updateProjectionMatrix',
  '.m4': '.applyMatrix4',
  '.m3': '.applyMatrix3',
  '.ps': '.positionScreen',
  '.pw': '.positionWorld',
  '.ra': '.rotateOnAxis',
  '.rx': '.rotateX',
  '.ry': '.rotateY',
  '.rz': '.rotateZ',
  '.ta': '.translateOnAxis',
  '.tx': '.translateX',
  '.ty': '.translateY',
  '.tz': '.translateZ',
  '.lA': '.lookAt',
  '.dTS': '.distanceToSquared',
  '.dT': '.distanceTo',
  '.nM': '.getNormalMatrix',
  '.mM': '.multiplyMatrices',
  '.nz': '.normalize',
  '.aa': '.setFromAxisAngle',
  '.gI': '.getInverse',
  '.tr': '.transpose',
  '.cV': '.crossVectors',
  '.mWI': '.matrixWorldInverse',
  '.mW': '.matrixWorld',
  '.mP': '.setFromMatrixPosition',
  '.mRQ': '.makeRotationFromQuaternion',
  '.mQ': '.multiplyQuaternions',
  '.qu': /\.quaternion(?!\w+)/g,
  '.sR': '.setFromRotationMatrix',
  '.sQ': '.setFromQuaternion',
  '.sE': '.setFromEuler',
  '.uQ': '.updateQuaternion',
  '.uR': '.updateRotation',
  '.nm': '.normalModel',
  '.nr': '.normal',
  '.id': '.identity',
  '.mt': '.material',
  '.po': '.position',
  '.ro': '.rotation',
  '.aS': '.addScalar',
  '.mS': '.multiplyScalar',
  '.uM': '.updateMatrix',
  '.rgb': '.setRGB',
  '.sV': '.subVectors',
  '.pM': '.projectionMatrix',
  '.mx': /\.matrix(?!\w+)/g,
  '.cFN': '.computeFaceNormals',
  '.ds': /\.distance(?!\w+)/g,
  // Camera.
  '.ca': '.camera',
  '.as': '.aspect',
  // Render data.
  'ls': /lights(?!\w+)/g,
  'os': /objects(?!\w+)/g,
  // Render list.
  'sO': 'setObject',
  'cTV': 'checkTriangleVisibility',
  'cBC': 'checkBackfaceCulling',
  'pV': 'pushVertex',
  // Bounding box.
  '.sFP': '.setFromPoints',
  '.sFO': '.setFromObject',
  '.eP': '.expandByPoint',
  '.iB': '.isIntersectionBox',
  '.eS': '.expandByScalar',
  '.mE': '.makeEmpty',
  '.vi': '.visible',
  '.ve': '.vertices',
  '.fa': '.faces',
  '.qd': '.quads',
  'el': 'elements',
  '.se': '.scene',
  '.ch': '.children',
  // Ignore .removeChild.
  '.rm': /\.remove(?!\w+)/g,
  '.rr': '.renderer',
  '.rg': '.running',
  '.ud': /\.update(?!\w+)/g,
  '.cp': '.copy',
  '.mul': /\.multiply(?!\w+)/g,
  '.sc': /\.scale(?!\w+)/g,
  '.sP': /\.setPosition(?!\w+)/g,
  '.pS': '.projectScene',
  // Filter properties.
  '.fi': '.filter',
  '.cB': '.categoryBits',
  '.mB': '.maskBits',
  '.grI': '.groupIndex',
  // Material properties.
  'wf': 'wireframe',
  'op': 'opacity',
  'bl': 'blending',
  'ov': 'overdraw',
  // Material sides.
  '.DS': '.DoubleSide',
  '.FS': '.FrontSide',
  '.BS': '.BackSide',
  // Color properties.
  'am': 'ambient',
  'df': 'diffuse',
  'em': 'emissive',
  'tC': 'strokeColor',
  'cr': 'color',
  // Utils.
  '.e': '.extends',
  // Browserify warnings.
  'NF': 'MODULE_NOT_FOUND',
  'N': 'Cannot find module '
};

var exclude = [
  'fillStyle',
  'strokeStyle',
  'lineWidth',
  'shadowColor',
  'shadowBlur',
  'beginPath',
  'moveTo',
  'lineTo',
  'setTransform',
  'translate',
  'fill',
  'stroke',
  'innerWidth',
  'innerHeight'
];

module.exports = function() {

  function replaceAll(file, encoding, callback) {
    /*jshint validthis:true*/
    if (file.isNull()) {
      this.push(file);
      return callback();
    }

    try {
      var contents = String(file.contents);

      Object.keys(substitutions).forEach(function(key) {
        var value = substitutions[key];
        var regex = value instanceof RegExp ? value
         : new RegExp(value.replace('.', '\\.'), 'g');
        contents = contents.replace(regex, key);
      });

      file.contents = new Buffer(contents);
    } catch (e) {
      throw new Error();
    }

    this.push(file);
    callback();
  }

  return through.obj(replaceAll);
};

@@ -2070,63 +2070,8 @@
 n',%0A
-  // Ignore .removeChild.%0A  '.rm': /%5C.remove(?!%5Cw+)/g,%0A
   '.
@@ -2192,36 +2192,8 @@
 /g,%0A
-  '.sc': /%5C.scale(?!%5Cw+)/g,%0A
   '.
@@ -2801,16 +2801,48 @@
 e '%0A%7D;%0A%0A
+// Only for reference rigt now.%0A
 var excl
@@ -3001,16 +3001,27 @@
 slate',%0A
+  'scale',%0A
   'fill'
@@ -3065,16 +3065,28 @@
 rHeight'
+,%0A  'remove'
 %0A%5D;%0A%0Amod

Remove overzealous replacements for 'replace' and 'scale'.