slate-html-serializer
Version:
An HTML serializer for Slate editors.
2 lines (1 loc) • 6.26 kB
JavaScript
!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("react"),require("react-dom/server"),require("slate"),require("immutable")):"function"==typeof define&&define.amd?define(["exports","react","react-dom/server","slate","immutable"],r):r(e.SlateHtmlSerializer={},e.React,e.ReactDOMServer,e.Slate,e.Immutable)}(this,function(e,r,t,n,a){"use strict";r=r&&r.hasOwnProperty("default")?r.default:r;var i=Object.prototype.toString,o=function(e){switch(i.call(e)){case"[object Function]":return"function";case"[object Date]":return"date";case"[object RegExp]":return"regexp";case"[object Arguments]":return"arguments";case"[object Array]":return"array";case"[object String]":return"string"}if("object"==typeof e&&e&&"number"==typeof e.length)try{if("function"==typeof e.callee)return"arguments"}catch(e){if(e instanceof TypeError)return"arguments"}return null===e?"null":void 0===e?"undefined":e&&1===e.nodeType?"element":e===Object(e)?"object":typeof e},l=Object.assign||function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e},u=new a.Record({object:"string",text:""}),s={deserialize:function(e){if(e.tagName&&"br"===e.tagName.toLowerCase())return{object:"text",text:"\n",marks:[]};if("#text"===e.nodeName){if(e.nodeValue&&e.nodeValue.match(/<!--.*?-->/))return;return{object:"text",text:e.nodeValue,marks:[]}}},serialize:function(e,t){if("string"===e.object)return t.split("\n").reduce(function(e,t,n){return 0!==n&&e.push(r.createElement("br",{key:n})),e.push(t),e},[])}};function c(e){if("undefined"==typeof DOMParser)throw new Error("The native `DOMParser` global which the `Html` serializer uses by default is not present in this environment. You must supply the `options.parseHtml` function instead.");return(new DOMParser).parseFromString(e,"text/html").body||window.document.createElement("body")}var d=function(){var e=this;this.deserialize=function(r){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).toJSON,a=void 0!==t&&t,i=e.defaultBlock,o=(0,e.parseHtml)(r),u=Array.from(o.childNodes),s=e.deserializeElements(u);0===(s=s.reduce(function(e,r,t,n){if("block"===r.object)return e.push(r),e;if(t>0&&"block"!==n[t-1].object)return e[e.length-1].nodes.push(r),e;var a=l({object:"block",data:{}},i,{nodes:[r]});return e.push(a),e},[])).length&&(s=[l({object:"block",data:{}},i,{nodes:[{object:"text",text:"",marks:[]}]})]);var c={object:"value",document:{object:"document",data:{},nodes:s}};return a?c:n.Value.fromJSON(c)},this.deserializeElements=function(){var r=[];return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[]).filter(e.cruftNewline).forEach(function(t){var n=e.deserializeElement(t);switch(o(n)){case"array":r=r.concat(n);break;case"object":r.push(n)}}),r},this.deserializeElement=function(r){var t=void 0;r.tagName||(r.tagName="");var n=function(r){switch("[object NodeList]"===Object.prototype.toString.call(r)&&(r=Array.from(r)),o(r)){case"array":return e.deserializeElements(r);case"object":return e.deserializeElement(r);case"null":case"undefined":return;default:throw new Error('The `next` argument was called with invalid children: "'+r+'".')}},a=!0,i=!1,l=void 0;try{for(var u,s=e.rules[Symbol.iterator]();!(a=(u=s.next()).done);a=!0){var c=u.value;if(c.deserialize){var d=c.deserialize(r,n),f=o(d);if("array"!==f&&"object"!==f&&"null"!==f&&"undefined"!==f)throw new Error('A rule returned an invalid deserialized representation: "'+t+'".');if(void 0!==d){if(null===d)return null;"block"===(t="mark"===d.object?e.deserializeMark(d):d).object||"inline"===t.object?(t.data=t.data||{},t.nodes=t.nodes||[]):"text"===t.object&&(t.marks=t.marks||[],t.text=t.text||"");break}}}}catch(e){i=!0,l=e}finally{try{!a&&s.return&&s.return()}finally{if(i)throw l}}return t||n(r.childNodes)},this.deserializeMark=function(r){var t=r.type,n=r.data;return r.nodes.reduce(function(r,a){var i=function r(a){return"mark"===a.object?e.deserializeMark(a):("text"===a.object?(a.marks=a.marks||[],a.marks.push({type:t,data:n})):a.nodes&&(a.nodes=a.nodes.map(r)),a)}(a);return Array.isArray(i)?r.concat(i):(r.push(i),r)},[])},this.serialize=function(n){var a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=n.document.nodes.map(e.serializeNode).filter(function(e){return e});return!1===a.render?i:t.renderToStaticMarkup(r.createElement("body",null,i)).slice(6,-7)},this.serializeNode=function(r){if("text"===r.object){var t=new u({text:r.text}),n=e.serializeString(t);return r.marks.reduce(function(r,t){var n=!0,a=!1,i=void 0;try{for(var o,l=e.rules[Symbol.iterator]();!(n=(o=l.next()).done);n=!0){var u=o.value;if(u.serialize){var s=u.serialize(t,r);if(null===s)return;if(s)return m(s)}}}catch(e){a=!0,i=e}finally{try{!n&&l.return&&l.return()}finally{if(a)throw i}}throw new Error('No serializer defined for mark of type "'+t.type+'".')},n)}var a=r.nodes.map(e.serializeNode),i=!0,o=!1,l=void 0;try{for(var s,c=e.rules[Symbol.iterator]();!(i=(s=c.next()).done);i=!0){var d=s.value;if(d.serialize){var f=d.serialize(r,a);if(null===f)return;if(f)return m(f)}}}catch(e){o=!0,l=e}finally{try{!i&&c.return&&c.return()}finally{if(o)throw l}}throw new Error('No serializer defined for node of type "'+r.type+'".')},this.serializeString=function(r){var t=!0,n=!1,a=void 0;try{for(var i,o=e.rules[Symbol.iterator]();!(t=(i=o.next()).done);t=!0){var l=i.value;if(l.serialize){var u=l.serialize(r,r.text);if(u)return u}}}catch(e){n=!0,a=e}finally{try{!t&&o.return&&o.return()}finally{if(n)throw a}}},this.cruftNewline=function(e){return!("#text"===e.nodeName&&"\n"===e.nodeValue)}},f=0;function m(e){return r.cloneElement(e,{key:f++})}e.default=function e(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};!function(e,r){if(!(e instanceof r))throw new TypeError("Cannot call a class as a function")}(this,e),d.call(this);var t=r.defaultBlock,a=void 0===t?"paragraph":t,i=r.parseHtml,o=void 0===i?c:i,l=r.rules,u=void 0===l?[]:l;a=n.Node.createProperties(a),this.rules=[].concat(function(e){if(Array.isArray(e)){for(var r=0,t=Array(e.length);r<e.length;r++)t[r]=e[r];return t}return Array.from(e)}(u),[s]),this.defaultBlock=a,this.parseHtml=o},Object.defineProperty(e,"__esModule",{value:!0})});