code: function generateAttributeEdits(oldNode, newNode) {
          // shallow copy the old attributes object so that we can modify it
          var oldAttributes = $.extend({}, oldNode.attributes),
              newAttributes = newNode.attributes,
              edits = [];
  
          Object.keys(newAttributes).forEach(function (attributeName) {
              if (oldAttributes[attributeName] !== newAttributes[attributeName]) {
                  var type = oldAttributes.hasOwnProperty(attributeName) ? "attrChange" : "attrAdd";
                  edits.push({
                      type: type,
                      tagID: oldNode.tagID,
                      attribute: attributeName,
                      value: newAttributes[attributeName]
                  });
              }
              delete oldAttributes[attributeName];
          });
  
          Object.keys(oldAttributes).forEach(function (attributeName) {
              edits.push({
                  type: "attrDelete",
                  tagID: oldNode.tagID,
                  attribute: attributeName
              });
          });
  
          return edits;
      }
docs: @private
  
  Determines the changes made to attributes and generates edits for those changes.
  
  @param {SimpleNode} oldNode node from old tree
  @param {SimpleNode} newNode node from new tree
  @return {Array.<Object>} list of edits to mutate attributes from the old node to the new