liquid_feedback_frontend
view static/wysihtml/wysihtml.all-commands.js @ 1478:8c9f7f9152ce
Fixed redirecting after delegation change
| author | bsw | 
|---|---|
| date | Thu Oct 18 17:54:48 2018 +0200 (2018-10-18) | 
| parents | 32cc544d5a5b | 
| children | 
 line source
     1 wysihtml.commands.alignCenterStyle = (function() {
     2   var nodeOptions = {
     3     styleProperty: "textAlign",
     4     styleValue: "center",
     5     toggle: true
     6   };
     8   return {
     9     exec: function(composer, command) {
    10       return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions);
    11     },
    13     state: function(composer, command) {
    14       return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions);
    15     }
    16   };
    17 })();
    19 wysihtml.commands.alignJustifyStyle = (function() {
    20   var nodeOptions = {
    21     styleProperty: "textAlign",
    22     styleValue: "justify",
    23     toggle: true
    24   };
    26   return {
    27     exec: function(composer, command) {
    28       return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions);
    29     },
    31     state: function(composer, command) {
    32       return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions);
    33     }
    34   };
    35 })();
    37 wysihtml.commands.alignLeftStyle = (function() {
    38   var nodeOptions = {
    39     styleProperty: "textAlign",
    40     styleValue: "left",
    41     toggle: true
    42   };
    44   return {
    45     exec: function(composer, command) {
    46       return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions);
    47     },
    49     state: function(composer, command) {
    50       return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions);
    51     }
    52   };
    53 })();
    55 wysihtml.commands.alignRightStyle = (function() {
    56   var nodeOptions = {
    57     styleProperty: "textAlign",
    58     styleValue: "right",
    59     toggle: true
    60   };
    62   return {
    63     exec: function(composer, command) {
    64       return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions);
    65     },
    67     state: function(composer, command) {
    68       return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions);
    69     }
    70   };
    71 })();
    73 /* Sets text background color by inline styles */
    74 wysihtml.commands.bgColorStyle = (function() {
    75   return {
    76     exec: function(composer, command, color) {
    77       var colorVals  = wysihtml.quirks.styleParser.parseColor("background-color:" + (color.color || color), "background-color"),
    78           colString;
    80       if (colorVals) {
    81         colString = (colorVals[3] === 1 ? "rgb(" + [colorVals[0], colorVals[1], colorVals[2]].join(', ') : "rgba(" + colorVals.join(', ')) + ')';
    82         wysihtml.commands.formatInline.exec(composer, command, {styleProperty: 'backgroundColor', styleValue: colString});
    83       }
    84     },
    86     state: function(composer, command, color) {
    87       var colorVals  = color ? wysihtml.quirks.styleParser.parseColor("background-color:" + (color.color || color), "background-color") : null,
    88           colString;
    90       if (colorVals) {
    91         colString = (colorVals[3] === 1 ? "rgb(" + [colorVals[0], colorVals[1], colorVals[2]].join(', ') : "rgba(" + colorVals.join(', ')) + ')';
    92       }
    94       return wysihtml.commands.formatInline.state(composer, command, {styleProperty: 'backgroundColor', styleValue: colString});
    95     },
    97     remove: function(composer, command) {
    98       return wysihtml.commands.formatInline.remove(composer, command, {styleProperty: 'backgroundColor'});
    99     },
   101     stateValue: function(composer, command, props) {
   102       var st = this.state(composer, command),
   103           colorStr,
   104           val = false;
   106       if (st && wysihtml.lang.object(st).isArray()) {
   107         st = st[0];
   108       }
   110       if (st) {
   111         colorStr = st.getAttribute('style');
   112         if (colorStr) {
   113           val = wysihtml.quirks.styleParser.parseColor(colorStr, "background-color");
   114           return wysihtml.quirks.styleParser.unparseColor(val, props);
   115         }
   116       }
   117       return false;
   118     }
   119   };
   120 })();
   122 wysihtml.commands.bold = (function() {
   123   var nodeOptions = {
   124     nodeName: "B",
   125     toggle: true
   126   };
   128   return {
   129     exec: function(composer, command) {
   130       wysihtml.commands.formatInline.exec(composer, command, nodeOptions);
   131     },
   133     state: function(composer, command) {
   134       return wysihtml.commands.formatInline.state(composer, command, nodeOptions);
   135     }
   136   };
   137 })();
   139 /* Formats block for as a <pre><code class="classname"></code></pre> block
   140  * Useful in conjuction for sytax highlight utility: highlight.js
   141  *
   142  * Usage:
   143  *
   144  * editorInstance.composer.commands.exec("formatCode", "language-html");
   145 */
   146 wysihtml.commands.formatCode = (function() {
   147   return {
   148     exec: function(composer, command, classname) {
   149       var pre = this.state(composer)[0],
   150           code, range, selectedNodes;
   152       if (pre) {
   153         // caret is already within a <pre><code>...</code></pre>
   154         composer.selection.executeAndRestore(function() {
   155           code = pre.querySelector("code");
   156           wysihtml.dom.replaceWithChildNodes(pre);
   157           if (code) {
   158             wysihtml.dom.replaceWithChildNodes(code);
   159           }
   160         });
   161       } else {
   162         // Wrap in <pre><code>...</code></pre>
   163         range = composer.selection.getRange();
   164         selectedNodes = range.extractContents();
   165         pre = composer.doc.createElement("pre");
   166         code = composer.doc.createElement("code");
   168         if (classname) {
   169           code.className = classname;
   170         }
   172         pre.appendChild(code);
   173         code.appendChild(selectedNodes);
   174         range.insertNode(pre);
   175         composer.selection.selectNode(pre);
   176       }
   177     },
   179     state: function(composer) {
   180       var selectedNode = composer.selection.getSelectedNode(), node;
   181       if (selectedNode && selectedNode.nodeName && selectedNode.nodeName == "PRE"&&
   182           selectedNode.firstChild && selectedNode.firstChild.nodeName && selectedNode.firstChild.nodeName == "CODE") {
   183         return [selectedNode];
   184       } else {
   185         node = wysihtml.dom.getParentElement(selectedNode, { query: "pre code" });
   186         return node ? [node.parentNode] : false;
   187       }
   188     }
   189   };
   190 })();
   192 /**
   193  * Inserts an <img>
   194  * If selection is already an image link, it removes it
   195  *
   196  * @example
   197  *    // either ...
   198  *    wysihtml.commands.insertImage.exec(composer, "insertImage", "http://www.google.de/logo.jpg");
   199  *    // ... or ...
   200  *    wysihtml.commands.insertImage.exec(composer, "insertImage", { src: "http://www.google.de/logo.jpg", title: "foo" });
   201  */
   202 wysihtml.commands.insertImage = (function() {
   203   var NODE_NAME = "IMG";
   204   return {
   205     exec: function(composer, command, value) {
   206       value = typeof(value) === "object" ? value : { src: value };
   208       var doc     = composer.doc,
   209           image   = this.state(composer),
   210           textNode,
   211           parent;
   213       // If image is selected and src ie empty, set the caret before it and delete the image
   214       if (image && !value.src) {
   215         composer.selection.setBefore(image);
   216         parent = image.parentNode;
   217         parent.removeChild(image);
   219         // and it's parent <a> too if it hasn't got any other relevant child nodes
   220         wysihtml.dom.removeEmptyTextNodes(parent);
   221         if (parent.nodeName === "A" && !parent.firstChild) {
   222           composer.selection.setAfter(parent);
   223           parent.parentNode.removeChild(parent);
   224         }
   226         // firefox and ie sometimes don't remove the image handles, even though the image got removed
   227         wysihtml.quirks.redraw(composer.element);
   228         return;
   229       }
   231       // If image selected change attributes accordingly
   232       if (image) {
   233         for (var key in value) {
   234           if (value.hasOwnProperty(key)) {
   235             image.setAttribute(key === "className" ? "class" : key, value[key]);
   236           }
   237         }
   238         return;
   239       }
   241       // Otherwise lets create the image
   242       image = doc.createElement(NODE_NAME);
   244       for (var i in value) {
   245         image.setAttribute(i === "className" ? "class" : i, value[i]);
   246       }
   248       composer.selection.insertNode(image);
   249       if (wysihtml.browser.hasProblemsSettingCaretAfterImg()) {
   250         textNode = doc.createTextNode(wysihtml.INVISIBLE_SPACE);
   251         composer.selection.insertNode(textNode);
   252         composer.selection.setAfter(textNode);
   253       } else {
   254         composer.selection.setAfter(image);
   255       }
   256     },
   258     state: function(composer) {
   259       var doc = composer.doc,
   260           selectedNode,
   261           text,
   262           imagesInSelection;
   264       if (!wysihtml.dom.hasElementWithTagName(doc, NODE_NAME)) {
   265         return false;
   266       }
   268       selectedNode = composer.selection.getSelectedNode();
   269       if (!selectedNode) {
   270         return false;
   271       }
   273       if (selectedNode.nodeName === NODE_NAME) {
   274         // This works perfectly in IE
   275         return selectedNode;
   276       }
   278       if (selectedNode.nodeType !== wysihtml.ELEMENT_NODE) {
   279         return false;
   280       }
   282       text = composer.selection.getText();
   283       text = wysihtml.lang.string(text).trim();
   284       if (text) {
   285         return false;
   286       }
   288       imagesInSelection = composer.selection.getNodes(wysihtml.ELEMENT_NODE, function(node) {
   289         return node.nodeName === "IMG";
   290       });
   292       if (imagesInSelection.length !== 1) {
   293         return false;
   294       }
   296       return imagesInSelection[0];
   297     }
   298   };
   299 })();
   301 wysihtml.commands.fontSize = (function() {
   302   var REG_EXP = /wysiwyg-font-size-[0-9a-z\-]+/g;
   304   return {
   305     exec: function(composer, command, size) {
   306       wysihtml.commands.formatInline.exec(composer, command, {className: "wysiwyg-font-size-" + size, classRegExp: REG_EXP, toggle: true});
   307     },
   309     state: function(composer, command, size) {
   310       return wysihtml.commands.formatInline.state(composer, command, {className: "wysiwyg-font-size-" + size});
   311     }
   312   };
   313 })();
   315 /* Set font size by inline style */
   316 wysihtml.commands.fontSizeStyle = (function() {
   317   return {
   318     exec: function(composer, command, size) {
   319       size = size.size || size;
   320       if (!(/^\s*$/).test(size)) {
   321         wysihtml.commands.formatInline.exec(composer, command, {styleProperty: "fontSize", styleValue: size, toggle: false});
   322       }
   323     },
   325     state: function(composer, command, size) {
   326       return wysihtml.commands.formatInline.state(composer, command, {styleProperty: "fontSize", styleValue: size || undefined});
   327     },
   329     remove: function(composer, command) {
   330       return wysihtml.commands.formatInline.remove(composer, command, {styleProperty: "fontSize"});
   331     },
   333     stateValue: function(composer, command) {
   334       var styleStr,
   335           st = this.state(composer, command);
   337       if (st && wysihtml.lang.object(st).isArray()) {
   338           st = st[0];
   339       }
   340       if (st) {
   341         styleStr = st.getAttribute("style");
   342         if (styleStr) {
   343           return wysihtml.quirks.styleParser.parseFontSize(styleStr);
   344         }
   345       }
   346       return false;
   347     }
   348   };
   349 })();
   351 wysihtml.commands.foreColor = (function() {
   352   var REG_EXP = /wysiwyg-color-[0-9a-z]+/g;
   354   return {
   355     exec: function(composer, command, color) {
   356       wysihtml.commands.formatInline.exec(composer, command, {className: "wysiwyg-color-" + color, classRegExp: REG_EXP, toggle: true});
   357     },
   359     state: function(composer, command, color) {
   360       return wysihtml.commands.formatInline.state(composer, command, {className: "wysiwyg-color-" + color});
   361     }
   362   };
   363 })();
   365 /* Sets text color by inline styles */
   366 wysihtml.commands.foreColorStyle = (function() {
   367   return {
   368     exec: function(composer, command, color) {
   369       var colorVals, colString;
   371       if (!color) { return; }
   373       colorVals = wysihtml.quirks.styleParser.parseColor("color:" + (color.color || color), "color");
   375       if (colorVals) {
   376         colString = (colorVals[3] === 1 ? "rgb(" + [colorVals[0], colorVals[1], colorVals[2]].join(", ") : "rgba(" + colorVals.join(', ')) + ')';
   377         wysihtml.commands.formatInline.exec(composer, command, {styleProperty: "color", styleValue: colString});
   378       }
   379     },
   381     state: function(composer, command, color) {
   382       var colorVals  = color ? wysihtml.quirks.styleParser.parseColor("color:" + (color.color || color), "color") : null,
   383           colString;
   386       if (colorVals) {
   387         colString = (colorVals[3] === 1 ? "rgb(" + [colorVals[0], colorVals[1], colorVals[2]].join(", ") : "rgba(" + colorVals.join(', ')) + ')';
   388       }
   390       return wysihtml.commands.formatInline.state(composer, command, {styleProperty: "color", styleValue: colString});
   391     },
   393     remove: function(composer, command) {
   394       return wysihtml.commands.formatInline.remove(composer, command, {styleProperty: "color"});
   395     },
   397     stateValue: function(composer, command, props) {
   398       var st = this.state(composer, command),
   399           colorStr,
   400           val = false;
   402       if (st && wysihtml.lang.object(st).isArray()) {
   403         st = st[0];
   404       }
   406       if (st) {
   407         colorStr = st.getAttribute("style");
   408         if (colorStr) {
   409           val = wysihtml.quirks.styleParser.parseColor(colorStr, "color");
   410           return wysihtml.quirks.styleParser.unparseColor(val, props);
   411         }
   412       }
   413       return false;
   414     }
   415   };
   416 })();
   418 wysihtml.commands.insertBlockQuote = (function() {
   419   var nodeOptions = {
   420     nodeName: "BLOCKQUOTE",
   421     toggle: true
   422   };
   424   return {
   425     exec: function(composer, command) {
   426       return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions);
   427     },
   429     state: function(composer, command) {
   430       return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions);
   431     }
   432   };
   433 })();
   435 wysihtml.commands.insertHorizontalRule = (function() {
   436   return {
   437     exec: function(composer) {
   438       var node = composer.selection.getSelectedNode(),
   439           phrasingOnlyParent = wysihtml.dom.getParentElement(node, { query: wysihtml.PERMITTED_PHRASING_CONTENT_ONLY }, null, composer.editableArea),
   440           elem = document.createElement('hr'),
   441           range, idx;
   443       // HR is not allowed into some elements (where only phrasing content is allowed)
   444       // thus the HR insertion must break out of those https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Content_categories
   445       if (phrasingOnlyParent) {
   446         composer.selection.splitElementAtCaret(phrasingOnlyParent, elem);
   447       } else {
   448         composer.selection.insertNode(elem);
   449       }
   451       if (elem.nextSibling) {
   452         composer.selection.setBefore(elem.nextSibling);
   453       } else {
   454         composer.selection.setAfter(elem);
   455       }
   456     },
   457     state: function() {
   458       return false; // :(
   459     }
   460   };
   461 })();
   463 wysihtml.commands.insertOrderedList = (function() {
   464   return {
   465     exec: function(composer, command) {
   466       wysihtml.commands.insertList.exec(composer, command, "OL");
   467     },
   469     state: function(composer, command) {
   470       return wysihtml.commands.insertList.state(composer, command, "OL");
   471     }
   472   };
   473 })();
   475 wysihtml.commands.insertUnorderedList = (function() {
   476   return {
   477     exec: function(composer, command) {
   478       wysihtml.commands.insertList.exec(composer, command, "UL");
   479     },
   481     state: function(composer, command) {
   482       return wysihtml.commands.insertList.state(composer, command, "UL");
   483     }
   484   };
   485 })();
   487 wysihtml.commands.italic = (function() { 
   488   var nodeOptions = {
   489     nodeName: "I",
   490     toggle: true
   491   };
   493   return {
   494     exec: function(composer, command) {
   495       wysihtml.commands.formatInline.exec(composer, command, nodeOptions);
   496     },
   498     state: function(composer, command) {
   499       return wysihtml.commands.formatInline.state(composer, command, nodeOptions);
   500     }
   501   };
   503 })();
   505 wysihtml.commands.justifyCenter = (function() {
   506   var nodeOptions = {
   507     className: "wysiwyg-text-align-center",
   508     classRegExp: /wysiwyg-text-align-[0-9a-z]+/g,
   509     toggle: true
   510   };
   512   return {
   513     exec: function(composer, command) {
   514       return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions);
   515     },
   517     state: function(composer, command) {
   518       return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions);
   519     }
   520   };
   522 })();
   524 wysihtml.commands.justifyFull = (function() {
   525   var nodeOptions = {
   526     className: "wysiwyg-text-align-justify",
   527     classRegExp: /wysiwyg-text-align-[0-9a-z]+/g,
   528     toggle: true
   529   };
   531   return {
   532     exec: function(composer, command) {
   533       return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions);
   534     },
   536     state: function(composer, command) {
   537       return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions);
   538     }
   539   };
   540 })();
   542 wysihtml.commands.justifyLeft = (function() {
   543   var nodeOptions = {
   544     className: "wysiwyg-text-align-left",
   545     classRegExp: /wysiwyg-text-align-[0-9a-z]+/g,
   546     toggle: true
   547   };
   549   return {
   550     exec: function(composer, command) {
   551       return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions);
   552     },
   554     state: function(composer, command) {
   555       return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions);
   556     }
   557   };
   558 })();
   560 wysihtml.commands.justifyRight = (function() {
   561   var nodeOptions = {
   562     className: "wysiwyg-text-align-right",
   563     classRegExp: /wysiwyg-text-align-[0-9a-z]+/g,
   564     toggle: true
   565   };
   567   return {
   568     exec: function(composer, command) {
   569       return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions);
   570     },
   572     state: function(composer, command) {
   573       return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions);
   574     }
   575   };
   576 })();
   578 wysihtml.commands.subscript = (function() {
   579   var nodeOptions = {
   580     nodeName: "SUB",
   581     toggle: true
   582   };
   584   return {
   585     exec: function(composer, command) {
   586       wysihtml.commands.formatInline.exec(composer, command, nodeOptions);
   587     },
   589     state: function(composer, command) {
   590       return wysihtml.commands.formatInline.state(composer, command, nodeOptions);
   591     }
   592   };
   594 })();
   596 wysihtml.commands.superscript = (function() {
   597   var nodeOptions = {
   598     nodeName: "SUP",
   599     toggle: true
   600   };
   602   return {
   603     exec: function(composer, command) {
   604       wysihtml.commands.formatInline.exec(composer, command, nodeOptions);
   605     },
   607     state: function(composer, command) {
   608       return wysihtml.commands.formatInline.state(composer, command, nodeOptions);
   609     }
   610   };
   612 })();
   614 wysihtml.commands.underline = (function() {
   615   var nodeOptions = {
   616     nodeName: "U",
   617     toggle: true
   618   };
   620   return {
   621     exec: function(composer, command) {
   622       wysihtml.commands.formatInline.exec(composer, command, nodeOptions);
   623     },
   625     state: function(composer, command) {
   626       return wysihtml.commands.formatInline.state(composer, command, nodeOptions);
   627     }
   628   };
   630 })();
