Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 
 
 

603 lignes
17 KiB

  1. wysihtml.commands.alignCenterStyle = (function() {
  2. var nodeOptions = {
  3. styleProperty: "textAlign",
  4. styleValue: "center",
  5. toggle: true
  6. };
  7. return {
  8. exec: function(composer, command) {
  9. return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions);
  10. },
  11. state: function(composer, command) {
  12. return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions);
  13. }
  14. };
  15. })();
  16. wysihtml.commands.alignJustifyStyle = (function() {
  17. var nodeOptions = {
  18. styleProperty: "textAlign",
  19. styleValue: "justify",
  20. toggle: true
  21. };
  22. return {
  23. exec: function(composer, command) {
  24. return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions);
  25. },
  26. state: function(composer, command) {
  27. return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions);
  28. }
  29. };
  30. })();
  31. wysihtml.commands.alignLeftStyle = (function() {
  32. var nodeOptions = {
  33. styleProperty: "textAlign",
  34. styleValue: "left",
  35. toggle: true
  36. };
  37. return {
  38. exec: function(composer, command) {
  39. return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions);
  40. },
  41. state: function(composer, command) {
  42. return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions);
  43. }
  44. };
  45. })();
  46. wysihtml.commands.alignRightStyle = (function() {
  47. var nodeOptions = {
  48. styleProperty: "textAlign",
  49. styleValue: "right",
  50. toggle: true
  51. };
  52. return {
  53. exec: function(composer, command) {
  54. return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions);
  55. },
  56. state: function(composer, command) {
  57. return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions);
  58. }
  59. };
  60. })();
  61. /* Sets text background color by inline styles */
  62. wysihtml.commands.bgColorStyle = (function() {
  63. return {
  64. exec: function(composer, command, color) {
  65. var colorVals = wysihtml.quirks.styleParser.parseColor("background-color:" + (color.color || color), "background-color"),
  66. colString;
  67. if (colorVals) {
  68. colString = (colorVals[3] === 1 ? "rgb(" + [colorVals[0], colorVals[1], colorVals[2]].join(', ') : "rgba(" + colorVals.join(', ')) + ')';
  69. wysihtml.commands.formatInline.exec(composer, command, {styleProperty: 'backgroundColor', styleValue: colString});
  70. }
  71. },
  72. state: function(composer, command, color) {
  73. var colorVals = color ? wysihtml.quirks.styleParser.parseColor("background-color:" + (color.color || color), "background-color") : null,
  74. colString;
  75. if (colorVals) {
  76. colString = (colorVals[3] === 1 ? "rgb(" + [colorVals[0], colorVals[1], colorVals[2]].join(', ') : "rgba(" + colorVals.join(', ')) + ')';
  77. }
  78. return wysihtml.commands.formatInline.state(composer, command, {styleProperty: 'backgroundColor', styleValue: colString});
  79. },
  80. remove: function(composer, command) {
  81. return wysihtml.commands.formatInline.remove(composer, command, {styleProperty: 'backgroundColor'});
  82. },
  83. stateValue: function(composer, command, props) {
  84. var st = this.state(composer, command),
  85. colorStr,
  86. val = false;
  87. if (st && wysihtml.lang.object(st).isArray()) {
  88. st = st[0];
  89. }
  90. if (st) {
  91. colorStr = st.getAttribute('style');
  92. if (colorStr) {
  93. val = wysihtml.quirks.styleParser.parseColor(colorStr, "background-color");
  94. return wysihtml.quirks.styleParser.unparseColor(val, props);
  95. }
  96. }
  97. return false;
  98. }
  99. };
  100. })();
  101. wysihtml.commands.bold = (function() {
  102. var nodeOptions = {
  103. nodeName: "B",
  104. toggle: true
  105. };
  106. return {
  107. exec: function(composer, command) {
  108. wysihtml.commands.formatInline.exec(composer, command, nodeOptions);
  109. },
  110. state: function(composer, command) {
  111. return wysihtml.commands.formatInline.state(composer, command, nodeOptions);
  112. }
  113. };
  114. })();
  115. /* Formats block for as a <pre><code class="classname"></code></pre> block
  116. * Useful in conjuction for sytax highlight utility: highlight.js
  117. *
  118. * Usage:
  119. *
  120. * editorInstance.composer.commands.exec("formatCode", "language-html");
  121. */
  122. wysihtml.commands.formatCode = (function() {
  123. return {
  124. exec: function(composer, command, classname) {
  125. var pre = this.state(composer)[0],
  126. code, range, selectedNodes;
  127. if (pre) {
  128. // caret is already within a <pre><code>...</code></pre>
  129. composer.selection.executeAndRestore(function() {
  130. code = pre.querySelector("code");
  131. wysihtml.dom.replaceWithChildNodes(pre);
  132. if (code) {
  133. wysihtml.dom.replaceWithChildNodes(code);
  134. }
  135. });
  136. } else {
  137. // Wrap in <pre><code>...</code></pre>
  138. range = composer.selection.getRange();
  139. selectedNodes = range.extractContents();
  140. pre = composer.doc.createElement("pre");
  141. code = composer.doc.createElement("code");
  142. if (classname) {
  143. code.className = classname;
  144. }
  145. pre.appendChild(code);
  146. code.appendChild(selectedNodes);
  147. range.insertNode(pre);
  148. composer.selection.selectNode(pre);
  149. }
  150. },
  151. state: function(composer) {
  152. var selectedNode = composer.selection.getSelectedNode(), node;
  153. if (selectedNode && selectedNode.nodeName && selectedNode.nodeName == "PRE"&&
  154. selectedNode.firstChild && selectedNode.firstChild.nodeName && selectedNode.firstChild.nodeName == "CODE") {
  155. return [selectedNode];
  156. } else {
  157. node = wysihtml.dom.getParentElement(selectedNode, { query: "pre code" });
  158. return node ? [node.parentNode] : false;
  159. }
  160. }
  161. };
  162. })();
  163. /**
  164. * Inserts an <img>
  165. * If selection is already an image link, it removes it
  166. *
  167. * @example
  168. * // either ...
  169. * wysihtml.commands.insertImage.exec(composer, "insertImage", "http://www.google.de/logo.jpg");
  170. * // ... or ...
  171. * wysihtml.commands.insertImage.exec(composer, "insertImage", { src: "http://www.google.de/logo.jpg", title: "foo" });
  172. */
  173. wysihtml.commands.insertImage = (function() {
  174. var NODE_NAME = "IMG";
  175. return {
  176. exec: function(composer, command, value) {
  177. value = typeof(value) === "object" ? value : { src: value };
  178. var doc = composer.doc,
  179. image = this.state(composer),
  180. textNode,
  181. parent;
  182. // If image is selected and src ie empty, set the caret before it and delete the image
  183. if (image && !value.src) {
  184. composer.selection.setBefore(image);
  185. parent = image.parentNode;
  186. parent.removeChild(image);
  187. // and it's parent <a> too if it hasn't got any other relevant child nodes
  188. wysihtml.dom.removeEmptyTextNodes(parent);
  189. if (parent.nodeName === "A" && !parent.firstChild) {
  190. composer.selection.setAfter(parent);
  191. parent.parentNode.removeChild(parent);
  192. }
  193. // firefox and ie sometimes don't remove the image handles, even though the image got removed
  194. wysihtml.quirks.redraw(composer.element);
  195. return;
  196. }
  197. // If image selected change attributes accordingly
  198. if (image) {
  199. for (var key in value) {
  200. if (value.hasOwnProperty(key)) {
  201. image.setAttribute(key === "className" ? "class" : key, value[key]);
  202. }
  203. }
  204. return;
  205. }
  206. // Otherwise lets create the image
  207. image = doc.createElement(NODE_NAME);
  208. for (var i in value) {
  209. image.setAttribute(i === "className" ? "class" : i, value[i]);
  210. }
  211. composer.selection.insertNode(image);
  212. if (wysihtml.browser.hasProblemsSettingCaretAfterImg()) {
  213. textNode = doc.createTextNode(wysihtml.INVISIBLE_SPACE);
  214. composer.selection.insertNode(textNode);
  215. composer.selection.setAfter(textNode);
  216. } else {
  217. composer.selection.setAfter(image);
  218. }
  219. },
  220. state: function(composer) {
  221. var doc = composer.doc,
  222. selectedNode,
  223. text,
  224. imagesInSelection;
  225. if (!wysihtml.dom.hasElementWithTagName(doc, NODE_NAME)) {
  226. return false;
  227. }
  228. selectedNode = composer.selection.getSelectedNode();
  229. if (!selectedNode) {
  230. return false;
  231. }
  232. if (selectedNode.nodeName === NODE_NAME) {
  233. // This works perfectly in IE
  234. return selectedNode;
  235. }
  236. if (selectedNode.nodeType !== wysihtml.ELEMENT_NODE) {
  237. return false;
  238. }
  239. text = composer.selection.getText();
  240. text = wysihtml.lang.string(text).trim();
  241. if (text) {
  242. return false;
  243. }
  244. imagesInSelection = composer.selection.getNodes(wysihtml.ELEMENT_NODE, function(node) {
  245. return node.nodeName === "IMG";
  246. });
  247. if (imagesInSelection.length !== 1) {
  248. return false;
  249. }
  250. return imagesInSelection[0];
  251. }
  252. };
  253. })();
  254. wysihtml.commands.fontSize = (function() {
  255. var REG_EXP = /wysiwyg-font-size-[0-9a-z\-]+/g;
  256. return {
  257. exec: function(composer, command, size) {
  258. wysihtml.commands.formatInline.exec(composer, command, {className: "wysiwyg-font-size-" + size, classRegExp: REG_EXP, toggle: true});
  259. },
  260. state: function(composer, command, size) {
  261. return wysihtml.commands.formatInline.state(composer, command, {className: "wysiwyg-font-size-" + size});
  262. }
  263. };
  264. })();
  265. /* Set font size by inline style */
  266. wysihtml.commands.fontSizeStyle = (function() {
  267. return {
  268. exec: function(composer, command, size) {
  269. size = size.size || size;
  270. if (!(/^\s*$/).test(size)) {
  271. wysihtml.commands.formatInline.exec(composer, command, {styleProperty: "fontSize", styleValue: size, toggle: false});
  272. }
  273. },
  274. state: function(composer, command, size) {
  275. return wysihtml.commands.formatInline.state(composer, command, {styleProperty: "fontSize", styleValue: size || undefined});
  276. },
  277. remove: function(composer, command) {
  278. return wysihtml.commands.formatInline.remove(composer, command, {styleProperty: "fontSize"});
  279. },
  280. stateValue: function(composer, command) {
  281. var styleStr,
  282. st = this.state(composer, command);
  283. if (st && wysihtml.lang.object(st).isArray()) {
  284. st = st[0];
  285. }
  286. if (st) {
  287. styleStr = st.getAttribute("style");
  288. if (styleStr) {
  289. return wysihtml.quirks.styleParser.parseFontSize(styleStr);
  290. }
  291. }
  292. return false;
  293. }
  294. };
  295. })();
  296. wysihtml.commands.foreColor = (function() {
  297. var REG_EXP = /wysiwyg-color-[0-9a-z]+/g;
  298. return {
  299. exec: function(composer, command, color) {
  300. wysihtml.commands.formatInline.exec(composer, command, {className: "wysiwyg-color-" + color, classRegExp: REG_EXP, toggle: true});
  301. },
  302. state: function(composer, command, color) {
  303. return wysihtml.commands.formatInline.state(composer, command, {className: "wysiwyg-color-" + color});
  304. }
  305. };
  306. })();
  307. /* Sets text color by inline styles */
  308. wysihtml.commands.foreColorStyle = (function() {
  309. return {
  310. exec: function(composer, command, color) {
  311. var colorVals, colString;
  312. if (!color) { return; }
  313. colorVals = wysihtml.quirks.styleParser.parseColor("color:" + (color.color || color), "color");
  314. if (colorVals) {
  315. colString = (colorVals[3] === 1 ? "rgb(" + [colorVals[0], colorVals[1], colorVals[2]].join(", ") : "rgba(" + colorVals.join(', ')) + ')';
  316. wysihtml.commands.formatInline.exec(composer, command, {styleProperty: "color", styleValue: colString});
  317. }
  318. },
  319. state: function(composer, command, color) {
  320. var colorVals = color ? wysihtml.quirks.styleParser.parseColor("color:" + (color.color || color), "color") : null,
  321. colString;
  322. if (colorVals) {
  323. colString = (colorVals[3] === 1 ? "rgb(" + [colorVals[0], colorVals[1], colorVals[2]].join(", ") : "rgba(" + colorVals.join(', ')) + ')';
  324. }
  325. return wysihtml.commands.formatInline.state(composer, command, {styleProperty: "color", styleValue: colString});
  326. },
  327. remove: function(composer, command) {
  328. return wysihtml.commands.formatInline.remove(composer, command, {styleProperty: "color"});
  329. },
  330. stateValue: function(composer, command, props) {
  331. var st = this.state(composer, command),
  332. colorStr,
  333. val = false;
  334. if (st && wysihtml.lang.object(st).isArray()) {
  335. st = st[0];
  336. }
  337. if (st) {
  338. colorStr = st.getAttribute("style");
  339. if (colorStr) {
  340. val = wysihtml.quirks.styleParser.parseColor(colorStr, "color");
  341. return wysihtml.quirks.styleParser.unparseColor(val, props);
  342. }
  343. }
  344. return false;
  345. }
  346. };
  347. })();
  348. wysihtml.commands.insertBlockQuote = (function() {
  349. var nodeOptions = {
  350. nodeName: "BLOCKQUOTE",
  351. toggle: true
  352. };
  353. return {
  354. exec: function(composer, command) {
  355. return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions);
  356. },
  357. state: function(composer, command) {
  358. return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions);
  359. }
  360. };
  361. })();
  362. wysihtml.commands.insertOrderedList = (function() {
  363. return {
  364. exec: function(composer, command) {
  365. wysihtml.commands.insertList.exec(composer, command, "OL");
  366. },
  367. state: function(composer, command) {
  368. return wysihtml.commands.insertList.state(composer, command, "OL");
  369. }
  370. };
  371. })();
  372. wysihtml.commands.insertUnorderedList = (function() {
  373. return {
  374. exec: function(composer, command) {
  375. wysihtml.commands.insertList.exec(composer, command, "UL");
  376. },
  377. state: function(composer, command) {
  378. return wysihtml.commands.insertList.state(composer, command, "UL");
  379. }
  380. };
  381. })();
  382. wysihtml.commands.italic = (function() {
  383. var nodeOptions = {
  384. nodeName: "I",
  385. toggle: true
  386. };
  387. return {
  388. exec: function(composer, command) {
  389. wysihtml.commands.formatInline.exec(composer, command, nodeOptions);
  390. },
  391. state: function(composer, command) {
  392. return wysihtml.commands.formatInline.state(composer, command, nodeOptions);
  393. }
  394. };
  395. })();
  396. wysihtml.commands.justifyCenter = (function() {
  397. var nodeOptions = {
  398. className: "wysiwyg-text-align-center",
  399. classRegExp: /wysiwyg-text-align-[0-9a-z]+/g,
  400. toggle: true
  401. };
  402. return {
  403. exec: function(composer, command) {
  404. return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions);
  405. },
  406. state: function(composer, command) {
  407. return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions);
  408. }
  409. };
  410. })();
  411. wysihtml.commands.justifyFull = (function() {
  412. var nodeOptions = {
  413. className: "wysiwyg-text-align-justify",
  414. classRegExp: /wysiwyg-text-align-[0-9a-z]+/g,
  415. toggle: true
  416. };
  417. return {
  418. exec: function(composer, command) {
  419. return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions);
  420. },
  421. state: function(composer, command) {
  422. return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions);
  423. }
  424. };
  425. })();
  426. wysihtml.commands.justifyLeft = (function() {
  427. var nodeOptions = {
  428. className: "wysiwyg-text-align-left",
  429. classRegExp: /wysiwyg-text-align-[0-9a-z]+/g,
  430. toggle: true
  431. };
  432. return {
  433. exec: function(composer, command) {
  434. return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions);
  435. },
  436. state: function(composer, command) {
  437. return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions);
  438. }
  439. };
  440. })();
  441. wysihtml.commands.justifyRight = (function() {
  442. var nodeOptions = {
  443. className: "wysiwyg-text-align-right",
  444. classRegExp: /wysiwyg-text-align-[0-9a-z]+/g,
  445. toggle: true
  446. };
  447. return {
  448. exec: function(composer, command) {
  449. return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions);
  450. },
  451. state: function(composer, command) {
  452. return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions);
  453. }
  454. };
  455. })();
  456. wysihtml.commands.subscript = (function() {
  457. var nodeOptions = {
  458. nodeName: "SUB",
  459. toggle: true
  460. };
  461. return {
  462. exec: function(composer, command) {
  463. wysihtml.commands.formatInline.exec(composer, command, nodeOptions);
  464. },
  465. state: function(composer, command) {
  466. return wysihtml.commands.formatInline.state(composer, command, nodeOptions);
  467. }
  468. };
  469. })();
  470. wysihtml.commands.superscript = (function() {
  471. var nodeOptions = {
  472. nodeName: "SUP",
  473. toggle: true
  474. };
  475. return {
  476. exec: function(composer, command) {
  477. wysihtml.commands.formatInline.exec(composer, command, nodeOptions);
  478. },
  479. state: function(composer, command) {
  480. return wysihtml.commands.formatInline.state(composer, command, nodeOptions);
  481. }
  482. };
  483. })();
  484. wysihtml.commands.underline = (function() {
  485. var nodeOptions = {
  486. nodeName: "U",
  487. toggle: true
  488. };
  489. return {
  490. exec: function(composer, command) {
  491. wysihtml.commands.formatInline.exec(composer, command, nodeOptions);
  492. },
  493. state: function(composer, command) {
  494. return wysihtml.commands.formatInline.state(composer, command, nodeOptions);
  495. }
  496. };
  497. })();