text: // core/plugin.js
  /**
   * Created with JetBrains PhpStorm.
   * User: campaign
   * Date: 10/8/13
   * Time: 6:15 PM
   * To change this template use File | Settings | File Templates.
   */
  UE.plugin = function(){
    var _plugins = {};
    return {
      register : function(pluginName,fn,oldOptionName,afterDisabled){
        if(oldOptionName && utils.isFunction(oldOptionName)){
          afterDisabled = oldOptionName;
          oldOptionName = null
        }
        _plugins[pluginName] = {
          optionName : oldOptionName || pluginName,
          execFn : fn,
          //当插件被禁用时执行
          afterDisabled : afterDisabled
        }
      },
      load : function(editor){
        utils.each(_plugins,function(plugin){
          var _export = plugin.execFn.call(editor);
          if(editor.options[plugin.optionName] !== false){
            if(_export){
              //后边需要再做扩展
              utils.each(_export,function(v,k){
                switch(k.toLowerCase()){
                  case 'shortcutkey':
                    editor.addshortcutkey(v);
                    break;
                  case 'bindevents':
                    utils.each(v,function(fn,eventName){
                      editor.addListener(eventName,fn);
                    });
                    break;
                  case 'bindmultievents':
                    utils.each(utils.isArray(v) ? v:[v],function(event){
                      var types = utils.trim(event.type).split(/\s+/);
                      utils.each(types,function(eventName){
                        editor.addListener(eventName, event.handler);
                      });
                    });
                    break;
                  case 'commands':
                    utils.each(v,function(execFn,execName){
                      editor.commands[execName] = execFn
                    });
                    break;
                  case 'outputrule':
                    editor.addOutputRule(v);
                    break;
                  case 'inputrule':
                    editor.addInputRule(v);
                    break;
                  case 'defaultoptions':
                    editor.setOpt(v)
                }
              })
            }
  
          }else if(plugin.afterDisabled){
            plugin.afterDisabled.call(editor)
          }
  
        });
        //向下兼容
        utils.each(UE.plugins,function(plugin){
          plugin.call(editor);
        });
      },
      run : function(pluginName,editor){
        var plugin = _plugins[pluginName];
        if(plugin){
          plugin.exeFn.call(editor)
        }
      }
    }
  }();