1 /**
  2  * font command.
  3  * @author yiminghe@gmail.com
  4  */
  5 KISSY.add("editor/plugin/font/cmd", function (S, Editor) {
  6 
  7     var getQueryCmd = Editor.Utils.getQueryCmd;
  8 
  9     function getValueFromSingle(element, styleObj) {
 10         var nodeName = element.nodeName();
 11         if (styleObj.element != nodeName) {
 12             return false;
 13         }
 14         var styles = styleObj.styles, v;
 15         for (var s in styles) {
 16             if (v = element.style(s)) {
 17                 return v;
 18             }
 19         }
 20         var overrides = styleObj.overrides;
 21         for (var i = 0; i < overrides.length; i++) {
 22             var override = overrides[i];
 23             if (override.element != nodeName) {
 24                 continue;
 25             }
 26             var attributes = override.attributes;
 27             for (var a in attributes) {
 28                 if (v = element.attr(a)) {
 29                     return v;
 30                 }
 31             }
 32         }
 33         return false;
 34     }
 35 
 36     function getValueFromStyleObj(elementPath, styleObj) {
 37         var elements = elementPath.elements,
 38             element,
 39             i,
 40             v;
 41         for (i = 0; i < elements.length; i++) {
 42             element = elements[ i ];
 43             if (element[0] == elementPath.block[0] ||
 44                 element[0] == elementPath.blockLimit[0]) {
 45                 continue;
 46             }
 47             v = getValueFromSingle(element, styleObj);
 48             if (v !== false) {
 49                 return v;
 50             }
 51         }
 52         return v;
 53     }
 54 
 55     return {
 56         addButtonCmd:function (editor, cmdType, style) {
 57             var queryCmd = getQueryCmd(cmdType);
 58             if (!editor.hasCommand(cmdType)) {
 59                 editor.addCommand(cmdType, {
 60                     exec:function (editor, effect) {
 61                         var doc = editor.get("document")[0];
 62                         editor.execCommand("save");
 63                         var checked = editor.queryCommandValue(cmdType);
 64                         if (checked) {
 65                             style.remove(doc);
 66                         } else {
 67                             style.apply(doc);
 68                         }
 69                         editor.execCommand("save");
 70                         editor.notifySelectionChange();
 71                     }
 72                 });
 73 
 74                 editor.addCommand(queryCmd, {
 75                     exec:function (editor) {
 76                         var selection = editor.getSelection();
 77                         if (selection && !selection.isInvalid) {
 78                             var startElement = selection.getStartElement(),
 79                                 currentPath = new Editor.ElementPath(startElement);
 80                             return  style.checkActive(currentPath);
 81                         }
 82                     }
 83                 });
 84             }
 85         },
 86 
 87         addSelectCmd:function (editor, cmdType, styleObj) {
 88             var queryCmd = getQueryCmd(cmdType);
 89             if (!editor.hasCommand(cmdType)) {
 90                 editor.addCommand(cmdType, {
 91                     exec:function (editor, value) {
 92                         editor.focus();
 93                         var currentValue = editor.queryCommandValue(cmdType) || "";
 94                         var style = new Editor.Style(styleObj, {
 95                                 value:value
 96                             }),
 97                             doc = editor.get("document")[0];
 98                         editor.execCommand("save");
 99                         if (value.toLowerCase() == currentValue.toLowerCase()) {
100                             style.remove(doc);
101                         } else {
102                             style.apply(doc);
103                         }
104                         editor.execCommand("save");
105                     }
106                 });
107                 editor.addCommand(queryCmd, {
108                     exec:function (editor) {
109                         var selection = editor.getSelection();
110                         if (selection && !selection.isInvalid) {
111                             var startElement = selection.getStartElement();
112                             var currentPath = new Editor.ElementPath(startElement);
113                             return getValueFromStyleObj(currentPath, styleObj);
114                         }
115                     }
116                 });
117             }
118         }
119     };
120 }, {
121     requires:['editor']
122 });