diff --git a/dist/pell.js b/dist/pell.js index 62ddf0c..bfa0c9c 100644 --- a/dist/pell.js +++ b/dist/pell.js @@ -8,12 +8,7 @@ var _extends = Object.assign || function (target) { for (var i = 1; i < argument var defaultParagraphSeparatorString = 'defaultParagraphSeparator'; var formatBlock = 'formatBlock'; -var addEventListener = function addEventListener(parent, type, listener) { - return parent.addEventListener(type, listener); -}; -var appendChild = function appendChild(parent, child) { - return parent.appendChild(child); -}; + var createElement = function createElement(tag) { return document.createElement(tag); }; @@ -24,8 +19,7 @@ var queryCommandValue = function queryCommandValue(command) { return document.queryCommandValue(command); }; -var exec = function exec(command) { - var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; +var exec = function exec(command, value) { return document.execCommand(command, false, value); }; @@ -33,104 +27,72 @@ var defaultActions = { bold: { icon: 'B', title: 'Bold', - state: function state() { - return queryCommandState('bold'); - }, - result: function result() { - return exec('bold'); - } + state: queryCommandState.bind('bold'), + result: exec.bind(null, 'bold') }, italic: { icon: 'I', title: 'Italic', - state: function state() { - return queryCommandState('italic'); - }, - result: function result() { - return exec('italic'); - } + state: queryCommandState.bind('italic'), + result: exec.bind(null, 'italic') }, underline: { icon: 'U', title: 'Underline', - state: function state() { - return queryCommandState('underline'); - }, - result: function result() { - return exec('underline'); - } + state: queryCommandState.bind('underline'), + result: exec.bind(null, 'underline') }, strikethrough: { icon: 'S', title: 'Strike-through', - state: function state() { - return queryCommandState('strikeThrough'); - }, - result: function result() { - return exec('strikeThrough'); - } + state: queryCommandState.bind('strikeThrough'), + result: exec.bind(null, 'strikeThrough') }, heading1: { icon: 'H1', title: 'Heading 1', - result: function result() { - return exec(formatBlock, '

'); - } + result: exec.bind(null, formatBlock, '

') }, heading2: { icon: 'H2', title: 'Heading 2', - result: function result() { - return exec(formatBlock, '

'); - } + result: exec.bind(null, formatBlock, '

') }, paragraph: { icon: '¶', title: 'Paragraph', - result: function result() { - return exec(formatBlock, '

'); - } + result: exec.bind(null, formatBlock, '

') }, quote: { icon: '“ ”', title: 'Quote', - result: function result() { - return exec(formatBlock, '

'); - } + result: exec.bind(null, formatBlock, '
') }, olist: { icon: '#', title: 'Ordered List', - result: function result() { - return exec('insertOrderedList'); - } + result: exec.bind(null, 'insertOrderedList') }, ulist: { icon: '•', title: 'Unordered List', - result: function result() { - return exec('insertUnorderedList'); - } + result: exec.bind(null, 'insertUnorderedList') }, code: { icon: '</>', title: 'Code', - result: function result() { - return exec(formatBlock, '
');
-    }
+    result: exec.bind(null, formatBlock, '
')
   },
   line: {
     icon: '―',
     title: 'Horizontal Line',
-    result: function result() {
-      return exec('insertHorizontalRule');
-    }
+    result: exec.bind(null, 'insertHorizontalRule')
   },
   link: {
     icon: '🔗',
     title: 'Link',
     result: function result() {
-      var url = window.prompt('Enter the link URL');
+      var url = prompt('Enter the link URL');
       if (url) exec('createLink', url);
     }
   },
@@ -138,7 +100,7 @@ var defaultActions = {
     icon: '📷',
     title: 'Image',
     result: function result() {
-      var url = window.prompt('Enter the image URL');
+      var url = prompt('Enter the image URL');
       if (url) exec('insertImage', url);
     }
   }
@@ -153,7 +115,8 @@ var defaultClasses = {
 
 var init = function init(settings) {
   var actions = settings.actions ? settings.actions.map(function (action) {
-    if (typeof action === 'string') return defaultActions[action];else if (defaultActions[action.name]) return _extends({}, defaultActions[action.name], action);
+    if (typeof action === 'string') return defaultActions[action];
+    if (defaultActions[action.name]) return _extends({}, defaultActions[action.name], action);
     return action;
   }) : Object.keys(defaultActions).map(function (action) {
     return defaultActions[action];
@@ -165,7 +128,7 @@ var init = function init(settings) {
 
   var actionbar = createElement('div');
   actionbar.className = classes.actionbar;
-  appendChild(settings.element, actionbar);
+  settings.element.appendChild(actionbar);
 
   var content = settings.element.content = createElement('div');
   content.contentEditable = true;
@@ -185,28 +148,26 @@ var init = function init(settings) {
       }, 0);
     }
   };
-  appendChild(settings.element, content);
+  settings.element.appendChild(content);
 
   actions.forEach(function (action) {
     var button = createElement('button');
     button.className = classes.button;
     button.innerHTML = action.icon;
     button.title = action.title;
-    button.setAttribute('type', 'button');
     button.onclick = function () {
       return action.result() && content.focus();
     };
 
     if (action.state) {
       var handler = function handler() {
-        return button.classList[action.state() ? 'add' : 'remove'](classes.selected);
+        return button.classList[action.state() ? 'add' : 'remove'](classes.selected)[('keyup', 'mouseup', 'click')].map(function (e) {
+          return content.addEventListener(e, handler);
+        });
       };
-      addEventListener(content, 'keyup', handler);
-      addEventListener(content, 'mouseup', handler);
-      addEventListener(button, 'click', handler);
     }
 
-    appendChild(actionbar, button);
+    actionbar.appendChild(button);
   });
 
   if (settings.styleWithCSS) exec('styleWithCSS');
diff --git a/dist/pell.min.js b/dist/pell.min.js
index 8615f8e..635109e 100644
--- a/dist/pell.min.js
+++ b/dist/pell.min.js
@@ -1 +1 @@
-!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e(t.pell={})}(this,function(t){"use strict";var e=Object.assign||function(t){for(var e=1;e1&&void 0!==arguments[1]?arguments[1]:null;return document.execCommand(t,!1,e)},l={bold:{icon:"B",title:"Bold",state:function(){return o("bold")},result:function(){return c("bold")}},italic:{icon:"I",title:"Italic",state:function(){return o("italic")},result:function(){return c("italic")}},underline:{icon:"U",title:"Underline",state:function(){return o("underline")},result:function(){return c("underline")}},strikethrough:{icon:"S",title:"Strike-through",state:function(){return o("strikeThrough")},result:function(){return c("strikeThrough")}},heading1:{icon:"H1",title:"Heading 1",result:function(){return c("formatBlock","

")}},heading2:{icon:"H2",title:"Heading 2",result:function(){return c("formatBlock","

")}},paragraph:{icon:"¶",title:"Paragraph",result:function(){return c("formatBlock","

")}},quote:{icon:"“ ”",title:"Quote",result:function(){return c("formatBlock","

")}},olist:{icon:"#",title:"Ordered List",result:function(){return c("insertOrderedList")}},ulist:{icon:"•",title:"Unordered List",result:function(){return c("insertUnorderedList")}},code:{icon:"</>",title:"Code",result:function(){return c("formatBlock","
")}},line:{icon:"―",title:"Horizontal Line",result:function(){return c("insertHorizontalRule")}},link:{icon:"🔗",title:"Link",result:function(){var t=window.prompt("Enter the link URL");t&&c("createLink",t)}},image:{icon:"📷",title:"Image",result:function(){var t=window.prompt("Enter the image URL");t&&c("insertImage",t)}}},a={actionbar:"pell-actionbar",button:"pell-button",content:"pell-content",selected:"pell-button-selected"},s=function(t){var o=t.actions?t.actions.map(function(t){return"string"==typeof t?l[t]:l[t.name]?e({},l[t.name],t):t}):Object.keys(l).map(function(t){return l[t]}),s=e({},a,t.classes),f=t.defaultParagraphSeparator||"div",d=i("div");d.className=s.actionbar,r(t.element,d);var m=t.element.content=i("div");return m.contentEditable=!0,m.className=s.content,m.oninput=function(e){var n=e.target.firstChild;n&&3===n.nodeType?c("formatBlock","<"+f+">"):"
"===m.innerHTML&&(m.innerHTML=""),t.onChange(m.innerHTML)},m.onkeydown=function(t){"Tab"===t.key?t.preventDefault():"Enter"===t.key&&"blockquote"===u("formatBlock")&&setTimeout(function(){return c("formatBlock","<"+f+">")},0)},r(t.element,m),o.forEach(function(t){var e=i("button");if(e.className=s.button,e.innerHTML=t.icon,e.title=t.title,e.setAttribute("type","button"),e.onclick=function(){return t.result()&&m.focus()},t.state){var o=function(){return e.classList[t.state()?"add":"remove"](s.selected)};n(m,"keyup",o),n(m,"mouseup",o),n(e,"click",o)}r(d,e)}),t.styleWithCSS&&c("styleWithCSS"),c("defaultParagraphSeparator",f),t.element},f={exec:c,init:s};t.exec=c,t.init=s,t.default=f,Object.defineProperty(t,"__esModule",{value:!0})}); +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e(t.pell={})}(this,function(t){"use strict";var e=Object.assign||function(t){for(var e=1;eB",title:"Bold",state:i.bind("bold"),result:l.bind(null,"bold")},italic:{icon:"I",title:"Italic",state:i.bind("italic"),result:l.bind(null,"italic")},underline:{icon:"U",title:"Underline",state:i.bind("underline"),result:l.bind(null,"underline")},strikethrough:{icon:"S",title:"Strike-through",state:i.bind("strikeThrough"),result:l.bind(null,"strikeThrough")},heading1:{icon:"H1",title:"Heading 1",result:l.bind(null,"formatBlock","

")},heading2:{icon:"H2",title:"Heading 2",result:l.bind(null,"formatBlock","

")},paragraph:{icon:"¶",title:"Paragraph",result:l.bind(null,"formatBlock","

")},quote:{icon:"“ ”",title:"Quote",result:l.bind(null,"formatBlock","

")},olist:{icon:"#",title:"Ordered List",result:l.bind(null,"insertOrderedList")},ulist:{icon:"•",title:"Unordered List",result:l.bind(null,"insertUnorderedList")},code:{icon:"</>",title:"Code",result:l.bind(null,"formatBlock","
")},line:{icon:"―",title:"Horizontal Line",result:l.bind(null,"insertHorizontalRule")},link:{icon:"🔗",title:"Link",result:function(){var t=prompt("Enter the link URL");t&&l("createLink",t)}},image:{icon:"📷",title:"Image",result:function(){var t=prompt("Enter the image URL");t&&l("insertImage",t)}}},u={actionbar:"pell-actionbar",button:"pell-button",content:"pell-content",selected:"pell-button-selected"},a=function(t){var i=t.actions?t.actions.map(function(t){return"string"==typeof t?o[t]:o[t.name]?e({},o[t.name],t):t}):Object.keys(o).map(function(t){return o[t]}),a=e({},u,t.classes),c=t.defaultParagraphSeparator||"div",d=n("div");d.className=a.actionbar,t.element.appendChild(d);var s=t.element.content=n("div");return s.contentEditable=!0,s.className=a.content,s.oninput=function(e){var n=e.target.firstChild;n&&3===n.nodeType?l("formatBlock","<"+c+">"):"
"===s.innerHTML&&(s.innerHTML=""),t.onChange(s.innerHTML)},s.onkeydown=function(t){"Tab"===t.key?t.preventDefault():"Enter"===t.key&&"blockquote"===r("formatBlock")&&setTimeout(function(){return l("formatBlock","<"+c+">")},0)},t.element.appendChild(s),i.forEach(function(t){var e=n("button");if(e.className=a.button,e.innerHTML=t.icon,e.title=t.title,e.onclick=function(){return t.result()&&s.focus()},t.state);d.appendChild(e)}),t.styleWithCSS&&l("styleWithCSS"),l("defaultParagraphSeparator",c),t.element},c={exec:l,init:a};t.exec=l,t.init=a,t.default=c,Object.defineProperty(t,"__esModule",{value:!0})}); diff --git a/src/pell.js b/src/pell.js index 3e2fe64..db7fb2f 100644 --- a/src/pell.js +++ b/src/pell.js @@ -1,83 +1,83 @@ const defaultParagraphSeparatorString = 'defaultParagraphSeparator' const formatBlock = 'formatBlock' -const addEventListener = (parent, type, listener) => parent.addEventListener(type, listener) + const appendChild = (parent, child) => parent.appendChild(child) const createElement = tag => document.createElement(tag) const queryCommandState = command => document.queryCommandState(command) const queryCommandValue = command => document.queryCommandValue(command) -export const exec = (command, value = null) => document.execCommand(command, false, value) +export const exec = (command, value) => document.execCommand(command, false, value) const defaultActions = { bold: { icon: 'B', title: 'Bold', - state: () => queryCommandState('bold'), - result: () => exec('bold') + state: queryCommandState.bind('bold'), + result: exec.bind(null, 'bold') }, italic: { icon: 'I', title: 'Italic', - state: () => queryCommandState('italic'), - result: () => exec('italic') + state: queryCommandState.bind('italic'), + result: exec.bind(null, 'italic') }, underline: { icon: 'U', title: 'Underline', - state: () => queryCommandState('underline'), - result: () => exec('underline') + state: queryCommandState.bind('underline'), + result: exec.bind(null, 'underline') }, strikethrough: { icon: 'S', title: 'Strike-through', - state: () => queryCommandState('strikeThrough'), - result: () => exec('strikeThrough') + state: queryCommandState.bind('strikeThrough'), + result: exec.bind(null, 'strikeThrough') }, heading1: { icon: 'H1', title: 'Heading 1', - result: () => exec(formatBlock, '

') + result: exec.bind(null, formatBlock, '

') }, heading2: { icon: 'H2', title: 'Heading 2', - result: () => exec(formatBlock, '

') + result: exec.bind(null, formatBlock, '

') }, paragraph: { icon: '¶', title: 'Paragraph', - result: () => exec(formatBlock, '

') + result: exec.bind(null, formatBlock, '

') }, quote: { icon: '“ ”', title: 'Quote', - result: () => exec(formatBlock, '

') + result: exec.bind(null, formatBlock, '
') }, olist: { icon: '#', title: 'Ordered List', - result: () => exec('insertOrderedList') + result: exec.bind(null, 'insertOrderedList') }, ulist: { icon: '•', title: 'Unordered List', - result: () => exec('insertUnorderedList') + result: exec.bind(null, 'insertUnorderedList') }, code: { icon: '</>', title: 'Code', - result: () => exec(formatBlock, '
')
+    result: exec.bind(null, formatBlock, '
')
   },
   line: {
     icon: '―',
     title: 'Horizontal Line',
-    result: () => exec('insertHorizontalRule')
+    result: exec.bind(null, 'insertHorizontalRule')
   },
   link: {
     icon: '🔗',
     title: 'Link',
     result: () => {
-      const url = window.prompt('Enter the link URL')
+      const url = prompt('Enter the link URL')
       if (url) exec('createLink', url)
     }
   },
@@ -85,7 +85,7 @@ const defaultActions = {
     icon: '📷',
     title: 'Image',
     result: () => {
-      const url = window.prompt('Enter the image URL')
+      const url = prompt('Enter the image URL')
       if (url) exec('insertImage', url)
     }
   }
@@ -103,7 +103,7 @@ export const init = settings => {
     ? (
       settings.actions.map(action => {
         if (typeof action === 'string') return defaultActions[action]
-        else if (defaultActions[action.name]) return { ...defaultActions[action.name], ...action }
+        if (defaultActions[action.name]) return { ...defaultActions[action.name], ...action }
         return action
       })
     )
@@ -115,7 +115,7 @@ export const init = settings => {
 
   const actionbar = createElement('div')
   actionbar.className = classes.actionbar
-  appendChild(settings.element, actionbar)
+  settings.element.appendChild(actionbar)
 
   const content = settings.element.content = createElement('div')
   content.contentEditable = true
@@ -132,24 +132,21 @@ export const init = settings => {
       setTimeout(() => exec(formatBlock, `<${defaultParagraphSeparator}>`), 0)
     }
   }
-  appendChild(settings.element, content)
+  settings.element.appendChild(content)
 
   actions.forEach(action => {
     const button = createElement('button')
     button.className = classes.button
     button.innerHTML = action.icon
     button.title = action.title
-    button.setAttribute('type', 'button')
     button.onclick = () => action.result() && content.focus()
 
     if (action.state) {
       const handler = () => button.classList[action.state() ? 'add' : 'remove'](classes.selected)
-      addEventListener(content, 'keyup', handler)
-      addEventListener(content, 'mouseup', handler)
-      addEventListener(button, 'click', handler)
+      ['keyup', 'mouseup', 'click'].map(e => content.addEventListener(e, handler))
     }
 
-    appendChild(actionbar, button)
+    actionbar.appendChild(button)
   })
 
   if (settings.styleWithCSS) exec('styleWithCSS')