wysihtml.commands.alignCenterStyle = (function() { var nodeOptions = { styleProperty: "textAlign", styleValue: "center", toggle: true }; return { exec: function(composer, command) { return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions); }, state: function(composer, command) { return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions); } }; })(); wysihtml.commands.alignJustifyStyle = (function() { var nodeOptions = { styleProperty: "textAlign", styleValue: "justify", toggle: true }; return { exec: function(composer, command) { return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions); }, state: function(composer, command) { return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions); } }; })(); wysihtml.commands.alignLeftStyle = (function() { var nodeOptions = { styleProperty: "textAlign", styleValue: "left", toggle: true }; return { exec: function(composer, command) { return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions); }, state: function(composer, command) { return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions); } }; })(); wysihtml.commands.alignRightStyle = (function() { var nodeOptions = { styleProperty: "textAlign", styleValue: "right", toggle: true }; return { exec: function(composer, command) { return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions); }, state: function(composer, command) { return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions); } }; })(); /* Sets text background color by inline styles */ wysihtml.commands.bgColorStyle = (function() { return { exec: function(composer, command, color) { var colorVals = wysihtml.quirks.styleParser.parseColor("background-color:" + (color.color || color), "background-color"), colString; if (colorVals) { colString = (colorVals[3] === 1 ? "rgb(" + [colorVals[0], colorVals[1], colorVals[2]].join(', ') : "rgba(" + colorVals.join(', ')) + ')'; wysihtml.commands.formatInline.exec(composer, command, {styleProperty: 'backgroundColor', styleValue: colString}); } }, state: function(composer, command, color) { var colorVals = color ? wysihtml.quirks.styleParser.parseColor("background-color:" + (color.color || color), "background-color") : null, colString; if (colorVals) { colString = (colorVals[3] === 1 ? "rgb(" + [colorVals[0], colorVals[1], colorVals[2]].join(', ') : "rgba(" + colorVals.join(', ')) + ')'; } return wysihtml.commands.formatInline.state(composer, command, {styleProperty: 'backgroundColor', styleValue: colString}); }, remove: function(composer, command) { return wysihtml.commands.formatInline.remove(composer, command, {styleProperty: 'backgroundColor'}); }, stateValue: function(composer, command, props) { var st = this.state(composer, command), colorStr, val = false; if (st && wysihtml.lang.object(st).isArray()) { st = st[0]; } if (st) { colorStr = st.getAttribute('style'); if (colorStr) { val = wysihtml.quirks.styleParser.parseColor(colorStr, "background-color"); return wysihtml.quirks.styleParser.unparseColor(val, props); } } return false; } }; })(); wysihtml.commands.bold = (function() { var nodeOptions = { nodeName: "B", toggle: true }; return { exec: function(composer, command) { wysihtml.commands.formatInline.exec(composer, command, nodeOptions); }, state: function(composer, command) { return wysihtml.commands.formatInline.state(composer, command, nodeOptions); } }; })(); /* Formats block for as a
block * Useful in conjuction for sytax highlight utility: highlight.js * * Usage: * * editorInstance.composer.commands.exec("formatCode", "language-html"); */ wysihtml.commands.formatCode = (function() { return { exec: function(composer, command, classname) { var pre = this.state(composer)[0], code, range, selectedNodes; if (pre) { // caret is already within a
...
composer.selection.executeAndRestore(function() { code = pre.querySelector("code"); wysihtml.dom.replaceWithChildNodes(pre); if (code) { wysihtml.dom.replaceWithChildNodes(code); } }); } else { // Wrap in
...
range = composer.selection.getRange(); selectedNodes = range.extractContents(); pre = composer.doc.createElement("pre"); code = composer.doc.createElement("code"); if (classname) { code.className = classname; } pre.appendChild(code); code.appendChild(selectedNodes); range.insertNode(pre); composer.selection.selectNode(pre); } }, state: function(composer) { var selectedNode = composer.selection.getSelectedNode(), node; if (selectedNode && selectedNode.nodeName && selectedNode.nodeName == "PRE"&& selectedNode.firstChild && selectedNode.firstChild.nodeName && selectedNode.firstChild.nodeName == "CODE") { return [selectedNode]; } else { node = wysihtml.dom.getParentElement(selectedNode, { query: "pre code" }); return node ? [node.parentNode] : false; } } }; })(); /** * Inserts an * If selection is already an image link, it removes it * * @example * // either ... * wysihtml.commands.insertImage.exec(composer, "insertImage", "http://www.google.de/logo.jpg"); * // ... or ... * wysihtml.commands.insertImage.exec(composer, "insertImage", { src: "http://www.google.de/logo.jpg", title: "foo" }); */ wysihtml.commands.insertImage = (function() { var NODE_NAME = "IMG"; return { exec: function(composer, command, value) { value = typeof(value) === "object" ? value : { src: value }; var doc = composer.doc, image = this.state(composer), textNode, parent; // If image is selected and src ie empty, set the caret before it and delete the image if (image && !value.src) { composer.selection.setBefore(image); parent = image.parentNode; parent.removeChild(image); // and it's parent too if it hasn't got any other relevant child nodes wysihtml.dom.removeEmptyTextNodes(parent); if (parent.nodeName === "A" && !parent.firstChild) { composer.selection.setAfter(parent); parent.parentNode.removeChild(parent); } // firefox and ie sometimes don't remove the image handles, even though the image got removed wysihtml.quirks.redraw(composer.element); return; } // If image selected change attributes accordingly if (image) { for (var key in value) { if (value.hasOwnProperty(key)) { image.setAttribute(key === "className" ? "class" : key, value[key]); } } return; } // Otherwise lets create the image image = doc.createElement(NODE_NAME); for (var i in value) { image.setAttribute(i === "className" ? "class" : i, value[i]); } composer.selection.insertNode(image); if (wysihtml.browser.hasProblemsSettingCaretAfterImg()) { textNode = doc.createTextNode(wysihtml.INVISIBLE_SPACE); composer.selection.insertNode(textNode); composer.selection.setAfter(textNode); } else { composer.selection.setAfter(image); } }, state: function(composer) { var doc = composer.doc, selectedNode, text, imagesInSelection; if (!wysihtml.dom.hasElementWithTagName(doc, NODE_NAME)) { return false; } selectedNode = composer.selection.getSelectedNode(); if (!selectedNode) { return false; } if (selectedNode.nodeName === NODE_NAME) { // This works perfectly in IE return selectedNode; } if (selectedNode.nodeType !== wysihtml.ELEMENT_NODE) { return false; } text = composer.selection.getText(); text = wysihtml.lang.string(text).trim(); if (text) { return false; } imagesInSelection = composer.selection.getNodes(wysihtml.ELEMENT_NODE, function(node) { return node.nodeName === "IMG"; }); if (imagesInSelection.length !== 1) { return false; } return imagesInSelection[0]; } }; })(); wysihtml.commands.fontSize = (function() { var REG_EXP = /wysiwyg-font-size-[0-9a-z\-]+/g; return { exec: function(composer, command, size) { wysihtml.commands.formatInline.exec(composer, command, {className: "wysiwyg-font-size-" + size, classRegExp: REG_EXP, toggle: true}); }, state: function(composer, command, size) { return wysihtml.commands.formatInline.state(composer, command, {className: "wysiwyg-font-size-" + size}); } }; })(); /* Set font size by inline style */ wysihtml.commands.fontSizeStyle = (function() { return { exec: function(composer, command, size) { size = size.size || size; if (!(/^\s*$/).test(size)) { wysihtml.commands.formatInline.exec(composer, command, {styleProperty: "fontSize", styleValue: size, toggle: false}); } }, state: function(composer, command, size) { return wysihtml.commands.formatInline.state(composer, command, {styleProperty: "fontSize", styleValue: size || undefined}); }, remove: function(composer, command) { return wysihtml.commands.formatInline.remove(composer, command, {styleProperty: "fontSize"}); }, stateValue: function(composer, command) { var styleStr, st = this.state(composer, command); if (st && wysihtml.lang.object(st).isArray()) { st = st[0]; } if (st) { styleStr = st.getAttribute("style"); if (styleStr) { return wysihtml.quirks.styleParser.parseFontSize(styleStr); } } return false; } }; })(); wysihtml.commands.foreColor = (function() { var REG_EXP = /wysiwyg-color-[0-9a-z]+/g; return { exec: function(composer, command, color) { wysihtml.commands.formatInline.exec(composer, command, {className: "wysiwyg-color-" + color, classRegExp: REG_EXP, toggle: true}); }, state: function(composer, command, color) { return wysihtml.commands.formatInline.state(composer, command, {className: "wysiwyg-color-" + color}); } }; })(); /* Sets text color by inline styles */ wysihtml.commands.foreColorStyle = (function() { return { exec: function(composer, command, color) { var colorVals, colString; if (!color) { return; } colorVals = wysihtml.quirks.styleParser.parseColor("color:" + (color.color || color), "color"); if (colorVals) { colString = (colorVals[3] === 1 ? "rgb(" + [colorVals[0], colorVals[1], colorVals[2]].join(", ") : "rgba(" + colorVals.join(', ')) + ')'; wysihtml.commands.formatInline.exec(composer, command, {styleProperty: "color", styleValue: colString}); } }, state: function(composer, command, color) { var colorVals = color ? wysihtml.quirks.styleParser.parseColor("color:" + (color.color || color), "color") : null, colString; if (colorVals) { colString = (colorVals[3] === 1 ? "rgb(" + [colorVals[0], colorVals[1], colorVals[2]].join(", ") : "rgba(" + colorVals.join(', ')) + ')'; } return wysihtml.commands.formatInline.state(composer, command, {styleProperty: "color", styleValue: colString}); }, remove: function(composer, command) { return wysihtml.commands.formatInline.remove(composer, command, {styleProperty: "color"}); }, stateValue: function(composer, command, props) { var st = this.state(composer, command), colorStr, val = false; if (st && wysihtml.lang.object(st).isArray()) { st = st[0]; } if (st) { colorStr = st.getAttribute("style"); if (colorStr) { val = wysihtml.quirks.styleParser.parseColor(colorStr, "color"); return wysihtml.quirks.styleParser.unparseColor(val, props); } } return false; } }; })(); wysihtml.commands.insertBlockQuote = (function() { var nodeOptions = { nodeName: "BLOCKQUOTE", toggle: true }; return { exec: function(composer, command) { return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions); }, state: function(composer, command) { return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions); } }; })(); wysihtml.commands.insertOrderedList = (function() { return { exec: function(composer, command) { wysihtml.commands.insertList.exec(composer, command, "OL"); }, state: function(composer, command) { return wysihtml.commands.insertList.state(composer, command, "OL"); } }; })(); wysihtml.commands.insertUnorderedList = (function() { return { exec: function(composer, command) { wysihtml.commands.insertList.exec(composer, command, "UL"); }, state: function(composer, command) { return wysihtml.commands.insertList.state(composer, command, "UL"); } }; })(); wysihtml.commands.italic = (function() { var nodeOptions = { nodeName: "I", toggle: true }; return { exec: function(composer, command) { wysihtml.commands.formatInline.exec(composer, command, nodeOptions); }, state: function(composer, command) { return wysihtml.commands.formatInline.state(composer, command, nodeOptions); } }; })(); wysihtml.commands.justifyCenter = (function() { var nodeOptions = { className: "wysiwyg-text-align-center", classRegExp: /wysiwyg-text-align-[0-9a-z]+/g, toggle: true }; return { exec: function(composer, command) { return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions); }, state: function(composer, command) { return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions); } }; })(); wysihtml.commands.justifyFull = (function() { var nodeOptions = { className: "wysiwyg-text-align-justify", classRegExp: /wysiwyg-text-align-[0-9a-z]+/g, toggle: true }; return { exec: function(composer, command) { return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions); }, state: function(composer, command) { return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions); } }; })(); wysihtml.commands.justifyLeft = (function() { var nodeOptions = { className: "wysiwyg-text-align-left", classRegExp: /wysiwyg-text-align-[0-9a-z]+/g, toggle: true }; return { exec: function(composer, command) { return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions); }, state: function(composer, command) { return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions); } }; })(); wysihtml.commands.justifyRight = (function() { var nodeOptions = { className: "wysiwyg-text-align-right", classRegExp: /wysiwyg-text-align-[0-9a-z]+/g, toggle: true }; return { exec: function(composer, command) { return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions); }, state: function(composer, command) { return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions); } }; })(); wysihtml.commands.subscript = (function() { var nodeOptions = { nodeName: "SUB", toggle: true }; return { exec: function(composer, command) { wysihtml.commands.formatInline.exec(composer, command, nodeOptions); }, state: function(composer, command) { return wysihtml.commands.formatInline.state(composer, command, nodeOptions); } }; })(); wysihtml.commands.superscript = (function() { var nodeOptions = { nodeName: "SUP", toggle: true }; return { exec: function(composer, command) { wysihtml.commands.formatInline.exec(composer, command, nodeOptions); }, state: function(composer, command) { return wysihtml.commands.formatInline.state(composer, command, nodeOptions); } }; })(); wysihtml.commands.underline = (function() { var nodeOptions = { nodeName: "U", toggle: true }; return { exec: function(composer, command) { wysihtml.commands.formatInline.exec(composer, command, nodeOptions); }, state: function(composer, command) { return wysihtml.commands.formatInline.state(composer, command, nodeOptions); } }; })();