@wangeditor-next/list-module 3.0.1 → 3.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -109,6 +109,7 @@ export declare const DomEditor: {
109
109
  getNodeType(node: Node): string;
110
110
  checkNodeType(node: Node, type: string): boolean;
111
111
  getNodesStr(nodes: Node[]): string;
112
+ getSelectedVoidNode(editor: IDomEditor): Element | null;
112
113
  getSelectedElems(editor: IDomEditor): Element[];
113
114
  getSelectedNodeByType(editor: IDomEditor, type: string): Node | null;
114
115
  getSelectedTextNode(editor: IDomEditor): Node | null;
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- !function(r,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("@wangeditor-next/core"),require("slate"),require("dom7"),require("snabbdom")):"function"==typeof define&&define.amd?define(["@wangeditor-next/core","slate","dom7","snabbdom"],e):(r="undefined"!=typeof globalThis?globalThis:r||self).WangEditorListModule=e(r.core,r.slate,r.$,r.snabbdom)}(this,function(r,e,t,n){"use strict";r.i18nAddResources("en",{listModule:{unOrderedList:"Unordered list",orderedList:"Ordered list",lowerAlphaList:"Ordered list (a,b,c)"}}),r.i18nAddResources("zh-CN",{listModule:{unOrderedList:"无序列表",orderedList:"有序列表",lowerAlphaList:"有序列表(a,b,c)"}});var o=new WeakMap;function i(r){var t,n=r.children||[],o=n.length;if(0===o)return"";for(var i=0;i<o&&!t;i+=1){var l=n[i];e.Text.isText(l)&&(t=l)}return null==t?"":t.color||""}var l=function(r,e){return l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,e){r.__proto__=e}||function(r,e){for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&(r[t]=e[t])},l(r,e)};function a(r,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function t(){this.constructor=r}l(r,e),r.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}var d=function(){return d=Object.assign||function(r){for(var e,t=1,n=arguments.length;t<n;t++)for(var o in e=arguments[t])Object.prototype.hasOwnProperty.call(e,o)&&(r[o]=e[o]);return r},d.apply(this,arguments)};function s(r){var e="function"==typeof Symbol&&Symbol.iterator,t=e&&r[e],n=0;if(t)return t.call(r);if(r&&"number"==typeof r.length)return{next:function(){return r&&n>=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function c(r,e){var t="function"==typeof Symbol&&r[Symbol.iterator];if(!t)return r;var n,o,i=t.call(r),l=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)l.push(n.value)}catch(r){o={error:r}}finally{try{n&&!n.done&&(t=i.return)&&t.call(i)}finally{if(o)throw o.error}}return l}function u(r,e,t){if(t||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return r.concat(n||Array.prototype.slice.call(e))}function f(r){var e=r.ordered,t=void 0!==e&&e,n=r.start;return t?"number"!=typeof n||Number.isNaN(n)?1:n:1}function v(r){var e=r.orderType;return"a"===e||"A"===e||"i"===e||"I"===e?e:"1"}function p(r,e){return r.ordered===e.ordered&&(!r.ordered||v(r)===v(e)&&f(r)===f(e))}function g(t,n,o){for(var i=n.type,l=function(r,e){var t={};for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&e.indexOf(n)<0&&(t[n]=r[n]);if(null!=r&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(n=Object.getOwnPropertySymbols(r);o<n.length;o++)e.indexOf(n[o])<0&&Object.prototype.propertyIsEnumerable.call(r,n[o])&&(t[n[o]]=r[n[o]])}return t}(n,["type"]),a=void 0!==o?o:l.level||0,d=r.DomEditor.findPath(t,n);;){if(0===d.length||0===d[d.length-1])return null;d=e.Path.previous(d);var s=e.Editor.node(t,d);if(!s)return null;var u=c(s,1)[0],f=u.level,v=void 0===f?0:f;if(r.DomEditor.getNodeType(u)!==i)return null;if(v===a)return u}}"function"==typeof SuppressedError&&SuppressedError;var y=new Set;function h(r){return(r||"").trim().replace(/\s+/g,"").toLowerCase()}var b=new Set(["rgb(0, 0, 0)","rgb(38, 38, 38)","rgb(89, 89, 89)","rgb(140, 140, 140)","rgb(191, 191, 191)","rgb(217, 217, 217)","rgb(233, 233, 233)","rgb(245, 245, 245)","rgb(250, 250, 250)","rgb(255, 255, 255)","rgb(225, 60, 57)","rgb(231, 95, 51)","rgb(235, 144, 58)","rgb(245, 219, 77)","rgb(114, 192, 64)","rgb(89, 191, 192)","rgb(66, 144, 247)","rgb(54, 88, 226)","rgb(106, 57, 201)","rgb(216, 68, 147)","rgb(251, 233, 230)","rgb(252, 237, 225)","rgb(252, 239, 212)","rgb(252, 251, 207)","rgb(231, 246, 213)","rgb(218, 244, 240)","rgb(217, 237, 250)","rgb(224, 232, 250)","rgb(237, 225, 248)","rgb(246, 226, 234)","rgb(255, 163, 158)","rgb(255, 187, 150)","rgb(255, 213, 145)","rgb(255, 251, 143)","rgb(183, 235, 143)","rgb(135, 232, 222)","rgb(145, 213, 255)","rgb(173, 198, 255)","rgb(211, 173, 247)","rgb(255, 173, 210)","rgb(255, 77, 79)","rgb(255, 122, 69)","rgb(255, 169, 64)","rgb(255, 236, 61)","rgb(115, 209, 61)","rgb(54, 207, 201)","rgb(64, 169, 255)","rgb(89, 126, 247)","rgb(146, 84, 222)","rgb(247, 89, 171)","rgb(207, 19, 34)","rgb(212, 56, 13)","rgb(212, 107, 8)","rgb(212, 177, 6)","rgb(56, 158, 13)","rgb(8, 151, 156)","rgb(9, 109, 217)","rgb(29, 57, 196)","rgb(83, 29, 171)","rgb(196, 29, 127)","rgb(130, 0, 20)","rgb(135, 20, 0)","rgb(135, 56, 0)","rgb(97, 71, 0)","rgb(19, 82, 0)","rgb(0, 71, 79)","rgb(0, 58, 140)","rgb(6, 17, 120)","rgb(34, 7, 94)","rgb(120, 6, 80)"].map(function(r){return h(r)}));function m(r){var e=h(r);return"w-e-list-color-".concat(function(r){var e,t,n=7;try{for(var o=s(r),i=o.next();!i.done;i=o.next())n=(31*n+(i.value.codePointAt(0)||0))%2147483647}catch(r){e={error:r}}finally{try{i&&!i.done&&(t=o.return)&&t.call(o)}finally{if(e)throw e.error}}return n.toString(36)}("color:".concat(e)))}function x(r,e){var t=h(e);return!!t&&(!!b.has(t)||!!function(r,e){for(var t,n=(null===(t=null==r?void 0:r.getConfig().styleClassTokens)||void 0===t?void 0:t.color)||[],o=h(e),i=0;i<n.length;i+=1)if(h(n[i])===o)return!0;return!1}(r,e))}var w=[],T=null;function E(r){return r.ordered?"ol":"ul"}function N(e,t,n){if("prev"===n&&0===t)return null;if("next"===n&&t===e.children.length-1)return null;var o="prev"===n?t-1:t+1,i=e.children[o];return r.DomEditor.checkNodeType(i,"list-item")?i:null}var k={type:"list-item",elemToHtml:function(e,t,n){var l="",a="",d=e,s=d.level,c=void 0===s?0:s,u=function(r){return r.ordered?"ol":"ul"}(d),g=function(r){var e=r.ordered;if(void 0===e||!e)return"<ul>";var t=[],n=v(r),o=f(r);return"1"!==n&&t.push('type="'.concat(n,'"')),1!==o&&t.push('start="'.concat(o,'"')),0===t.length?"<ol>":"<ol ".concat(t.join(" "),">")}(d),h=o.get(e),b=h&&Array.isArray(h.children)?h:null,k=n&&Array.isArray(n.children)?n:null,S=function(r){return!!r&&r.children.indexOf(e)>=0},O=k||b;S(k)?O=k:S(b)&&(O=b);var L=n||h;if(null==O)return{html:"<li>".concat(t,"</li>"),prefix:"",suffix:""};T!==O&&(w.length=0,T=O);var A=O.children.indexOf(e);if(A<0)return{html:"<li>".concat(t,"</li>"),prefix:"",suffix:""};var H=N(O,A,"prev"),M=N(O,A,"next"),D=!!M&&(M.level||0)>c;if(H){var C=H.level||0;if(c>C)for(B=0;B<c-C;B+=1)l+=g,w.push(u);else if(c===C){if(!p(H,d)){var j=w.pop()||E(H);l+="</".concat(j,">").concat(g),w.push(u)}}else{for(var z=C-c;z>0;){j=w.pop()||E(H);l+="</".concat(j,"></li>"),z-=1}var P=function(e,t,n){for(var o=t-1;o>=0;o-=1){var i=e.children[o];if(r.DomEditor.checkNodeType(i,"list-item")&&(i.level||0)===n)return i}return null}(O,A,c);if(P&&!p(P,d)){j=w.pop()||E(P);l+="</".concat(j,">").concat(g),w.push(u)}}}else{w.length=0;for(var B=0;B<c+1;B+=1)l+=g,w.push(u)}var I=i(e),V=r.getTextStyleMode(L),_="",R="",q="";if(I)if("class"===V){q=' data-w-e-color="'.concat(I,'"');var X=function(e,t){if(x(e,t))return"class";var n=r.getClassStylePolicy(e),o="preserve-data";"fallback-inline"===n&&(o="inline"),"strict"===n&&(o="throw");var i="[wangeditor] Unsupported list color class token color=".concat(t,". policy=").concat(n),l="".concat(t,"|").concat(o);if(y.has(l)||(y.add(l),r.reportUnsupportedClassStyle(e,{type:"color",value:t,scene:"toHtml",fallback:o,message:i})),"throw"===o)throw new Error(i);return"inline"===o?"inline":"preserve-data"}(L,I);"class"===X?R=' class="'.concat(m(I),'"'):"inline"===X&&(_=' style="color:'.concat(I,'"'))}else _=' style="color:'.concat(I,'"');var U="<li".concat(R).concat(q).concat(_,">").concat(t).concat(D?"":"</li>");if(!M){for(;w.length>0;){var W=w.pop();if(!W)break;a+="</".concat(W,">"),w.length>0&&(a+="</li>")}T=null}return{html:U,prefix:l,suffix:a}}},S='<svg viewBox="0 0 1024 1024"><path d="M384 832h640v128H384z m0-384h640v128H384z m0-384h640v128H384zM192 0v256H128V64H64V0zM128 526.016v50.016h128v64H64v-146.016l128-60V384H64v-64h192v146.016zM256 704v320H64v-64h128v-64H64v-64h128v-64H64v-64z"></path></svg>',O=function(){function t(){this.type="list-item",this.tag="button"}return t.prototype.getListNode=function(e){var t=this.type;return r.DomEditor.getSelectedNodeByType(e,t)},t.prototype.getValue=function(r){return""},t.prototype.isActive=function(r){var e=this.getListNode(r);if(null==e)return!1;var t=e,n=t.ordered,o=void 0!==n&&n;return o===this.ordered&&(!o||v(t)===(this.orderType||"1"))},t.prototype.isDisabled=function(t){return null==t.selection||!!r.DomEditor.getSelectedElems(t).some(function(r){if(e.Editor.isVoid(t,r)&&e.Editor.isBlock(t,r))return!0;var n=r.type;return!!["pre","code","table"].includes(n)})},t.prototype.exec=function(r,t){this.isActive(r)?e.Transforms.setNodes(r,{type:"paragraph",ordered:void 0,level:void 0,start:void 0,orderType:void 0}):e.Transforms.setNodes(r,{type:"list-item",ordered:this.ordered,indent:void 0,start:void 0,orderType:this.ordered?this.orderType:void 0})},t}(),L=function(e){function t(){var t=e.apply(this,u([],c(arguments),!1))||this;return t.ordered=!1,t.title=r.t("listModule.unOrderedList"),t.iconSvg='<svg viewBox="0 0 1024 1024"><path d="M384 64h640v128H384V64z m0 384h640v128H384v-128z m0 384h640v128H384v-128zM0 128a128 128 0 1 1 256 0 128 128 0 0 1-256 0z m0 384a128 128 0 1 1 256 0 128 128 0 0 1-256 0z m0 384a128 128 0 1 1 256 0 128 128 0 0 1-256 0z"></path></svg>',t}return a(t,e),t}(O),A=function(e){function t(){var t=e.apply(this,u([],c(arguments),!1))||this;return t.ordered=!0,t.orderType="a",t.title=r.t("listModule.lowerAlphaList"),t.iconSvg=S,t}return a(t,e),t}(O),H=function(e){function t(){var t=e.apply(this,u([],c(arguments),!1))||this;return t.ordered=!0,t.title=r.t("listModule.orderedList"),t.iconSvg=S,t}return a(t,e),t}(O),M={key:"bulletedList",factory:function(){return new L}},D={key:"numberedList",factory:function(){return new H}},C={key:"numberedListLowerAlpha",factory:function(){return new A}};function j(r){return r.length?r[0].tagName.toLowerCase():""}function z(t){return e.Editor.nodes(t,{at:t.selection||void 0,match:function(e){return 1===r.DomEditor.findPath(t,e).length}})}function P(r,e){if(void 0===e&&(e=!1),r<=0)return String(r);for(var t=r,n="";t>0;){var o=(e?65:97)+(t-1)%26;n=String.fromCharCode(o)+n,t=Math.floor((t-1)/26)}return n}function B(r,e){var t,n;if(void 0===e&&(e=!1),r<=0||r>=4e3)return String(r);var o=r,i="";try{for(var l=s([[1e3,"M"],[900,"CM"],[500,"D"],[400,"CD"],[100,"C"],[90,"XC"],[50,"L"],[40,"XL"],[10,"X"],[9,"IX"],[5,"V"],[4,"IV"],[1,"I"]]),a=l.next();!a.done;a=l.next())for(var d=c(a.value,2),u=d[0],f=d[1];o>=u;)i+=f,o-=u}catch(r){t={error:r}}finally{try{a&&!a.done&&(n=l.return)&&n.call(l)}finally{if(t)throw t.error}}return e?i:i.toLowerCase()}return t.append&&(t.fn.append=t.append),t.attr&&(t.fn.attr=t.attr),t.parent&&(t.fn.parent=t.parent),{renderElems:[{type:"list-item",renderElem:function(t,l,a){o.set(t,a);var d=t,s=d.level,c=void 0===s?0:s,u=d.ordered,g=void 0!==u&&u,y={margin:"5px 0 5px ".concat(20*c,"px"),display:"flex",alignItems:"flex-start"},h="";if(g){var b=function(t,n){var o=n,i=o.type,l=o.level,a=void 0===l?0:l,d=o.ordered,s=void 0!==d&&d,c=f(o),u=n,v=r.DomEditor.findPath(t,u);if(0===v[0])return c;for(;v[0]>0;){var g=e.Path.previous(v),y=e.Editor.node(t,g);if(null==y)break;var h=y[0],b=h.level,m=void 0===b?0:b,x=h.type,w=h.ordered;if(x!==i)break;if(m<a)break;if(m===a){if(w!==s||!p(h,o))break;c+=1}u=h,v=g}return c}(a,t);h=function(r,e){switch(e){case"a":return"".concat(P(r),".");case"A":return"".concat(P(r,!0),".");case"i":return"".concat(B(r),".");case"I":return"".concat(B(r,!0),".");default:return"".concat(r,".")}}(b,v(t))}else h=function(r){void 0===r&&(r=0);var e="";switch(r){case 0:e="•";break;case 1:e="◦";break;default:e="▪"}return e}(c);var m=i(t);return n.jsx("div",{style:y},n.jsx("span",{contentEditable:!1,style:{marginRight:"0.5em",color:m},"data-w-e-reserve":!0},h),n.jsx("span",{style:{flex:"1",wordBreak:"break-word"}},l))}}],editorPlugin:function(t){var n=t.deleteBackward,o=t.handleTab,i=t.normalizeNode,l=t.insertBreak,a=t;return a.insertBreak=function(){var n=c(e.Editor.nodes(t,{match:function(e){return r.DomEditor.checkNodeType(e,"list-item")},universal:!0}),1)[0];return n?""!==n[0].children[0].text?l():void e.Transforms.setNodes(a,{type:"paragraph",ordered:void 0,level:void 0,start:void 0,orderType:void 0}):l()},a.deleteBackward=function(o){var i=a.selection;if(null!=i)if(e.Range.isExpanded(i))n(o);else{var l=r.DomEditor.getSelectedNodeByType(a,"list-item");if(null!=l)if(0!==i.focus.offset)n(o);else{var d=l.level,s=void 0===d?0:d;if(s>0){var c=g(t,l,s-1);if(c){var u=c.ordered;e.Transforms.setNodes(a,{level:s-1,ordered:u,start:u?c.start:void 0,orderType:u?c.orderType:void 0})}else e.Transforms.setNodes(a,{level:s-1})}else e.Transforms.setNodes(a,{type:"paragraph",ordered:void 0,level:void 0,start:void 0,orderType:void 0})}else n(o)}else n(o)},a.handleTab=function(){var t,n,i,l,d=a.selection;if(null!=d){if(e.Range.isCollapsed(d)){var u=r.DomEditor.getSelectedNodeByType(a,"list-item");if(null==u)return void o();if(0===d.focus.offset){var f=u.level,v=void 0===f?0:f;return void e.Transforms.setNodes(a,{level:v+1})}}if(e.Range.isExpanded(d)){var p=0,g=!1;try{for(var y=s(z(a)),h=y.next();!h.done;h=y.next()){var b=c(h.value,1)[0];"list-item"===r.DomEditor.getNodeType(b)?p+=1:g=!0}}catch(r){t={error:r}}finally{try{h&&!h.done&&(n=y.return)&&n.call(y)}finally{if(t)throw t.error}}if(g||p<=1)return void o();try{for(var m=s(z(a)),x=m.next();!x.done;x=m.next()){var w=c(x.value,2),T=(b=w[0],w[1]),E=b.level;v=void 0===E?0:E;e.Transforms.setNodes(a,{level:v+1},{at:T})}}catch(r){i={error:r}}finally{try{x&&!x.done&&(l=m.return)&&l.call(m)}finally{if(i)throw i.error}}}else o()}else o()},a.normalizeNode=function(t){var n=c(t,2),o=n[0],l=n[1],d=r.DomEditor.getNodeType(o);return"bulleted-list"!==d&&"numbered-list"!==d||e.Transforms.unwrapNodes(a,{at:l}),i([o,l])},a},menus:[M,D,C],elemsToHtml:[k],parseElemsHtml:[{selector:"ul:not([data-w-e-type]),ol:not([data-w-e-type])",parseElemHtml:function(r,e,t){return e.flat(1/0)}},{selector:"li:not([data-w-e-type])",parseElemHtml:function(n,o,i){var l=t(n),a=[],s=[];o.forEach(function(t){e.Text.isText(t)||i.isInline(t)?a.push(t):r.DomEditor.checkNodeType(t,"list-item")&&s.push(t)}),0===a.length&&(s.length>0?a.push({text:""}):a.push({text:l.text().replace(/\s+/gm," ")}));var f=function(r){return"ol"===j(r.parent())}(l),v=function(r){for(var e=0,t=r.parent();t.length>0;){var n=j(t);"ul"!==n&&"ol"!==n||(e+=1),t=t.parent()}return Math.max(0,e-1)}(l),p=function(r){var e=r.parent();if("ol"===j(e)){var t=(e.attr("start")||"").trim();if(""!==t){var n=Number.parseInt(t,10);if(!Number.isNaN(n))return n}}}(l),g=function(r){var e=r.parent();if("ol"===j(e)){var t=(e.attr("type")||"").trim();return"1"===t||"a"===t||"A"===t||"i"===t||"I"===t?t:void 0}}(l),y=d(d(d({type:"list-item",ordered:f,level:v},void 0!==p?{start:p}:{}),void 0!==g?{orderType:g}:{}),{children:a});return 0===s.length?y:u([y],c(s),!1)}}]}});
1
+ !function(r,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("@wangeditor-next/core"),require("slate"),require("dom7"),require("snabbdom")):"function"==typeof define&&define.amd?define(["@wangeditor-next/core","slate","dom7","snabbdom"],e):(r="undefined"!=typeof globalThis?globalThis:r||self).WangEditorListModule=e(r.core,r.slate,r.$,r.snabbdom)}(this,function(r,e,t,n){"use strict";r.i18nAddResources("en",{listModule:{unOrderedList:"Unordered list",orderedList:"Ordered list",lowerAlphaList:"Ordered list (a,b,c)"}}),r.i18nAddResources("zh-CN",{listModule:{unOrderedList:"无序列表",orderedList:"有序列表",lowerAlphaList:"有序列表(a,b,c)"}});var o=new WeakMap;function i(r){var t,n=r.children||[],o=n.length;if(0===o)return"";for(var i=0;i<o&&!t;i+=1){var l=n[i];e.Text.isText(l)&&(t=l)}return null==t?"":t.color||""}var l=function(r,e){return l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,e){r.__proto__=e}||function(r,e){for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&(r[t]=e[t])},l(r,e)};function a(r,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function t(){this.constructor=r}l(r,e),r.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}var d=function(){return d=Object.assign||function(r){for(var e,t=1,n=arguments.length;t<n;t++)for(var o in e=arguments[t])Object.prototype.hasOwnProperty.call(e,o)&&(r[o]=e[o]);return r},d.apply(this,arguments)};function s(r){var e="function"==typeof Symbol&&Symbol.iterator,t=e&&r[e],n=0;if(t)return t.call(r);if(r&&"number"==typeof r.length)return{next:function(){return r&&n>=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function c(r,e){var t="function"==typeof Symbol&&r[Symbol.iterator];if(!t)return r;var n,o,i=t.call(r),l=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)l.push(n.value)}catch(r){o={error:r}}finally{try{n&&!n.done&&(t=i.return)&&t.call(i)}finally{if(o)throw o.error}}return l}function u(r,e,t){if(t||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return r.concat(n||Array.prototype.slice.call(e))}function f(r){var e=r.ordered,t=void 0!==e&&e,n=r.start;return t?"number"!=typeof n||Number.isNaN(n)?1:n:1}function v(r){var e=r.orderType;return"a"===e||"A"===e||"i"===e||"I"===e?e:"1"}function p(r,e){return r.ordered===e.ordered&&(!r.ordered||v(r)===v(e)&&f(r)===f(e))}function g(t,n,o){for(var i=n.type,l=function(r,e){var t={};for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&e.indexOf(n)<0&&(t[n]=r[n]);if(null!=r&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(n=Object.getOwnPropertySymbols(r);o<n.length;o++)e.indexOf(n[o])<0&&Object.prototype.propertyIsEnumerable.call(r,n[o])&&(t[n[o]]=r[n[o]])}return t}(n,["type"]),a=void 0!==o?o:l.level||0,d=r.DomEditor.findPath(t,n);;){if(0===d.length||0===d[d.length-1])return null;d=e.Path.previous(d);var s=e.Editor.node(t,d);if(!s)return null;var u=c(s,1)[0],f=u.level,v=void 0===f?0:f;if(r.DomEditor.getNodeType(u)!==i)return null;if(v===a)return u}}"function"==typeof SuppressedError&&SuppressedError;var y=new Set;function h(r){return(r||"").trim().replace(/\s+/g,"").toLowerCase()}var b=new Set(["rgb(0, 0, 0)","rgb(38, 38, 38)","rgb(89, 89, 89)","rgb(140, 140, 140)","rgb(191, 191, 191)","rgb(217, 217, 217)","rgb(233, 233, 233)","rgb(245, 245, 245)","rgb(250, 250, 250)","rgb(255, 255, 255)","rgb(225, 60, 57)","rgb(231, 95, 51)","rgb(235, 144, 58)","rgb(245, 219, 77)","rgb(114, 192, 64)","rgb(89, 191, 192)","rgb(66, 144, 247)","rgb(54, 88, 226)","rgb(106, 57, 201)","rgb(216, 68, 147)","rgb(251, 233, 230)","rgb(252, 237, 225)","rgb(252, 239, 212)","rgb(252, 251, 207)","rgb(231, 246, 213)","rgb(218, 244, 240)","rgb(217, 237, 250)","rgb(224, 232, 250)","rgb(237, 225, 248)","rgb(246, 226, 234)","rgb(255, 163, 158)","rgb(255, 187, 150)","rgb(255, 213, 145)","rgb(255, 251, 143)","rgb(183, 235, 143)","rgb(135, 232, 222)","rgb(145, 213, 255)","rgb(173, 198, 255)","rgb(211, 173, 247)","rgb(255, 173, 210)","rgb(255, 77, 79)","rgb(255, 122, 69)","rgb(255, 169, 64)","rgb(255, 236, 61)","rgb(115, 209, 61)","rgb(54, 207, 201)","rgb(64, 169, 255)","rgb(89, 126, 247)","rgb(146, 84, 222)","rgb(247, 89, 171)","rgb(207, 19, 34)","rgb(212, 56, 13)","rgb(212, 107, 8)","rgb(212, 177, 6)","rgb(56, 158, 13)","rgb(8, 151, 156)","rgb(9, 109, 217)","rgb(29, 57, 196)","rgb(83, 29, 171)","rgb(196, 29, 127)","rgb(130, 0, 20)","rgb(135, 20, 0)","rgb(135, 56, 0)","rgb(97, 71, 0)","rgb(19, 82, 0)","rgb(0, 71, 79)","rgb(0, 58, 140)","rgb(6, 17, 120)","rgb(34, 7, 94)","rgb(120, 6, 80)"].map(function(r){return h(r)}));function m(r){var e=h(r);return"w-e-list-color-".concat(function(r){var e,t,n=7;try{for(var o=s(r),i=o.next();!i.done;i=o.next())n=(31*n+(i.value.codePointAt(0)||0))%2147483647}catch(r){e={error:r}}finally{try{i&&!i.done&&(t=o.return)&&t.call(o)}finally{if(e)throw e.error}}return n.toString(36)}("color:".concat(e)))}function x(r,e){var t=h(e);return!!t&&(!!b.has(t)||!!function(r,e){for(var t,n=(null===(t=null==r?void 0:r.getConfig().styleClassTokens)||void 0===t?void 0:t.color)||[],o=h(e),i=0;i<n.length;i+=1)if(h(n[i])===o)return!0;return!1}(r,e))}var w=[],T=null;function E(r){return r.ordered?"ol":"ul"}function N(e,t,n){if("prev"===n&&0===t)return null;if("next"===n&&t===e.children.length-1)return null;var o="prev"===n?t-1:t+1,i=e.children[o];return r.DomEditor.checkNodeType(i,"list-item")?i:null}var k={type:"list-item",elemToHtml:function(e,t,n){var l="",a="",d=e,s=d.level,c=void 0===s?0:s,u=function(r){return r.ordered?"ol":"ul"}(d),g=function(r){var e=r.ordered;if(void 0===e||!e)return"<ul>";var t=[],n=v(r),o=f(r);return"1"!==n&&t.push('type="'.concat(n,'"')),1!==o&&t.push('start="'.concat(o,'"')),0===t.length?"<ol>":"<ol ".concat(t.join(" "),">")}(d),h=o.get(e),b=h&&Array.isArray(h.children)?h:null,k=n&&Array.isArray(n.children)?n:null,S=function(r){return!!r&&r.children.indexOf(e)>=0},O=k||b;S(k)?O=k:S(b)&&(O=b);var L=n||h;if(null==O)return{html:"<li>".concat(t,"</li>"),prefix:"",suffix:""};T!==O&&(w.length=0,T=O);var A=O.children.indexOf(e);if(A<0)return{html:"<li>".concat(t,"</li>"),prefix:"",suffix:""};var H=N(O,A,"prev"),M=N(O,A,"next"),D=!!M&&(M.level||0)>c;if(H){var C=H.level||0;if(c>C)for(B=0;B<c-C;B+=1)l+=g,w.push(u);else if(c===C){if(!p(H,d)){var j=w.pop()||E(H);l+="</".concat(j,">").concat(g),w.push(u)}}else{for(var z=C-c;z>0;){j=w.pop()||E(H);l+="</".concat(j,"></li>"),z-=1}var P=function(e,t,n){for(var o=t-1;o>=0;o-=1){var i=e.children[o];if(r.DomEditor.checkNodeType(i,"list-item")&&(i.level||0)===n)return i}return null}(O,A,c);if(P&&!p(P,d)){j=w.pop()||E(P);l+="</".concat(j,">").concat(g),w.push(u)}}}else{w.length=0;for(var B=0;B<c+1;B+=1)l+=g,w.push(u)}var I=i(e),V=r.getTextStyleMode(L),_="",R="",q="";if(I)if("class"===V){q=' data-w-e-color="'.concat(I,'"');var X=function(e,t){if(x(e,t))return"class";var n=r.getClassStylePolicy(e),o="preserve-data";"fallback-inline"===n&&(o="inline"),"strict"===n&&(o="throw");var i="[wangeditor] Unsupported list color class token color=".concat(t,". policy=").concat(n),l="".concat(t,"|").concat(o);if(y.has(l)||(y.add(l),r.reportUnsupportedClassStyle(e,{type:"color",value:t,scene:"toHtml",fallback:o,message:i})),"throw"===o)throw new Error(i);return"inline"===o?"inline":"preserve-data"}(L,I);"class"===X?R=' class="'.concat(m(I),'"'):"inline"===X&&(_=' style="color:'.concat(I,'"'))}else _=' style="color:'.concat(I,'"');var U="<li".concat(R).concat(q).concat(_,">").concat(t).concat(D?"":"</li>");if(!M){for(;w.length>0;){var W=w.pop();if(!W)break;a+="</".concat(W,">"),w.length>0&&(a+="</li>")}T=null}return{html:U,prefix:l,suffix:a}}},S='<svg viewBox="0 0 1024 1024"><path d="M384 832h640v128H384z m0-384h640v128H384z m0-384h640v128H384zM192 0v256H128V64H64V0zM128 526.016v50.016h128v64H64v-146.016l128-60V384H64v-64h192v146.016zM256 704v320H64v-64h128v-64H64v-64h128v-64H64v-64z"></path></svg>',O=function(){function t(){this.type="list-item",this.tag="button"}return t.prototype.getListNode=function(e){var t=this.type;return r.DomEditor.getSelectedNodeByType(e,t)},t.prototype.getValue=function(r){return""},t.prototype.isActive=function(r){var e=this.getListNode(r);if(null==e)return!1;var t=e,n=t.ordered,o=void 0!==n&&n;return o===this.ordered&&(!o||v(t)===(this.orderType||"1"))},t.prototype.isDisabled=function(t){return null==t.selection||!!r.DomEditor.getSelectedElems(t).some(function(r){if(e.Editor.isVoid(t,r)&&e.Editor.isBlock(t,r))return!0;var n=r.type;return!!["pre","code","table"].includes(n)})},t.prototype.exec=function(r,t){this.isActive(r)?e.Transforms.setNodes(r,{type:"paragraph",ordered:void 0,level:void 0,start:void 0,orderType:void 0}):e.Transforms.setNodes(r,{type:"list-item",ordered:this.ordered,indent:void 0,start:void 0,orderType:this.ordered?this.orderType:void 0})},t}(),L=function(e){function t(){var t=e.apply(this,u([],c(arguments),!1))||this;return t.ordered=!1,t.title=r.t("listModule.unOrderedList"),t.iconSvg='<svg viewBox="0 0 1024 1024"><path d="M384 64h640v128H384V64z m0 384h640v128H384v-128z m0 384h640v128H384v-128zM0 128a128 128 0 1 1 256 0 128 128 0 0 1-256 0z m0 384a128 128 0 1 1 256 0 128 128 0 0 1-256 0z m0 384a128 128 0 1 1 256 0 128 128 0 0 1-256 0z"></path></svg>',t}return a(t,e),t}(O),A=function(e){function t(){var t=e.apply(this,u([],c(arguments),!1))||this;return t.ordered=!0,t.orderType="a",t.title=r.t("listModule.lowerAlphaList"),t.iconSvg=S,t}return a(t,e),t}(O),H=function(e){function t(){var t=e.apply(this,u([],c(arguments),!1))||this;return t.ordered=!0,t.title=r.t("listModule.orderedList"),t.iconSvg=S,t}return a(t,e),t}(O),M={key:"bulletedList",factory:function(){return new L}},D={key:"numberedList",factory:function(){return new H}},C={key:"numberedListLowerAlpha",factory:function(){return new A}};function j(r){return r.length?r[0].tagName.toLowerCase():""}function z(r){return e.Text.isText(r)&&""===r.text.trim()}function P(r,t,n){t.forEach(function(t){z(t)||(e.Text.isText(t)||n.isInline(t)?r.push(t):e.Element.isElement(t)&&P(r,t.children,n))})}function B(t){return e.Editor.nodes(t,{at:t.selection||void 0,match:function(e){return 1===r.DomEditor.findPath(t,e).length}})}function I(r,e){if(void 0===e&&(e=!1),r<=0)return String(r);for(var t=r,n="";t>0;){var o=(e?65:97)+(t-1)%26;n=String.fromCharCode(o)+n,t=Math.floor((t-1)/26)}return n}function V(r,e){var t,n;if(void 0===e&&(e=!1),r<=0||r>=4e3)return String(r);var o=r,i="";try{for(var l=s([[1e3,"M"],[900,"CM"],[500,"D"],[400,"CD"],[100,"C"],[90,"XC"],[50,"L"],[40,"XL"],[10,"X"],[9,"IX"],[5,"V"],[4,"IV"],[1,"I"]]),a=l.next();!a.done;a=l.next())for(var d=c(a.value,2),u=d[0],f=d[1];o>=u;)i+=f,o-=u}catch(r){t={error:r}}finally{try{a&&!a.done&&(n=l.return)&&n.call(l)}finally{if(t)throw t.error}}return e?i:i.toLowerCase()}return t.append&&(t.fn.append=t.append),t.attr&&(t.fn.attr=t.attr),t.parent&&(t.fn.parent=t.parent),{renderElems:[{type:"list-item",renderElem:function(t,l,a){o.set(t,a);var d=t,s=d.level,c=void 0===s?0:s,u=d.ordered,g=void 0!==u&&u,y={margin:"5px 0 5px ".concat(20*c,"px"),display:"flex",alignItems:"flex-start"},h="";if(g){var b=function(t,n){var o=n,i=o.type,l=o.level,a=void 0===l?0:l,d=o.ordered,s=void 0!==d&&d,c=f(o),u=n,v=r.DomEditor.findPath(t,u);if(0===v[0])return c;for(;v[0]>0;){var g=e.Path.previous(v),y=e.Editor.node(t,g);if(null==y)break;var h=y[0],b=h.level,m=void 0===b?0:b,x=h.type,w=h.ordered;if(x!==i)break;if(m<a)break;if(m===a){if(w!==s||!p(h,o))break;c+=1}u=h,v=g}return c}(a,t);h=function(r,e){switch(e){case"a":return"".concat(I(r),".");case"A":return"".concat(I(r,!0),".");case"i":return"".concat(V(r),".");case"I":return"".concat(V(r,!0),".");default:return"".concat(r,".")}}(b,v(t))}else h=function(r){void 0===r&&(r=0);var e="";switch(r){case 0:e="•";break;case 1:e="◦";break;default:e="▪"}return e}(c);var m=i(t);return n.jsx("div",{style:y},n.jsx("span",{contentEditable:!1,style:{marginRight:"0.5em",color:m},"data-w-e-reserve":!0},h),n.jsx("span",{style:{flex:"1",wordBreak:"break-word"}},l))}}],editorPlugin:function(t){var n=t.deleteBackward,o=t.handleTab,i=t.normalizeNode,l=t.insertBreak,a=t;return a.insertBreak=function(){var n=c(e.Editor.nodes(t,{match:function(e){return r.DomEditor.checkNodeType(e,"list-item")},universal:!0}),1)[0];return n?""!==n[0].children[0].text?l():void e.Transforms.setNodes(a,{type:"paragraph",ordered:void 0,level:void 0,start:void 0,orderType:void 0}):l()},a.deleteBackward=function(o){var i=a.selection;if(null!=i)if(e.Range.isExpanded(i))n(o);else{var l=r.DomEditor.getSelectedNodeByType(a,"list-item");if(null!=l)if(0!==i.focus.offset)n(o);else{var d=l.level,s=void 0===d?0:d;if(s>0){var c=g(t,l,s-1);if(c){var u=c.ordered;e.Transforms.setNodes(a,{level:s-1,ordered:u,start:u?c.start:void 0,orderType:u?c.orderType:void 0})}else e.Transforms.setNodes(a,{level:s-1})}else e.Transforms.setNodes(a,{type:"paragraph",ordered:void 0,level:void 0,start:void 0,orderType:void 0})}else n(o)}else n(o)},a.handleTab=function(){var t,n,i,l,d=a.selection;if(null!=d){if(e.Range.isCollapsed(d)){var u=r.DomEditor.getSelectedNodeByType(a,"list-item");if(null==u)return void o();if(0===d.focus.offset){var f=u.level,v=void 0===f?0:f;return void e.Transforms.setNodes(a,{level:v+1})}}if(e.Range.isExpanded(d)){var p=0,g=!1;try{for(var y=s(B(a)),h=y.next();!h.done;h=y.next()){var b=c(h.value,1)[0];"list-item"===r.DomEditor.getNodeType(b)?p+=1:g=!0}}catch(r){t={error:r}}finally{try{h&&!h.done&&(n=y.return)&&n.call(y)}finally{if(t)throw t.error}}if(g||p<=1)return void o();try{for(var m=s(B(a)),x=m.next();!x.done;x=m.next()){var w=c(x.value,2),T=(b=w[0],w[1]),E=b.level;v=void 0===E?0:E;e.Transforms.setNodes(a,{level:v+1},{at:T})}}catch(r){i={error:r}}finally{try{x&&!x.done&&(l=m.return)&&l.call(m)}finally{if(i)throw i.error}}}else o()}else o()},a.normalizeNode=function(t){var n=c(t,2),o=n[0],l=n[1],d=r.DomEditor.getNodeType(o);return"bulleted-list"!==d&&"numbered-list"!==d||e.Transforms.unwrapNodes(a,{at:l}),i([o,l])},a},menus:[M,D,C],elemsToHtml:[k],parseElemsHtml:[{selector:"ul:not([data-w-e-type]),ol:not([data-w-e-type])",parseElemHtml:function(r,e,t){return e.flat(1/0)}},{selector:"li:not([data-w-e-type])",parseElemHtml:function(n,o,i){var l=t(n),a=[],s=[];o.forEach(function(t){z(t)||(e.Text.isText(t)||i.isInline(t)?a.push(t):r.DomEditor.checkNodeType(t,"list-item")?s.push(t):e.Element.isElement(t)&&P(a,t.children,i))}),0===a.length&&(s.length>0?a.push({text:""}):a.push({text:l.text().replace(/\s+/gm," ")}));var f=function(r){return"ol"===j(r.parent())}(l),v=function(r){for(var e=0,t=r.parent();t.length>0;){var n=j(t);"ul"!==n&&"ol"!==n||(e+=1),t=t.parent()}return Math.max(0,e-1)}(l),p=function(r){var e=r.parent();if("ol"===j(e)){var t=(e.attr("start")||"").trim();if(""!==t){var n=Number.parseInt(t,10);if(!Number.isNaN(n))return n}}}(l),g=function(r){var e=r.parent();if("ol"===j(e)){var t=(e.attr("type")||"").trim();return"1"===t||"a"===t||"A"===t||"i"===t||"I"===t?t:void 0}}(l),y=d(d(d({type:"list-item",ordered:f,level:v},void 0!==p?{start:p}:{}),void 0!==g?{orderType:g}:{}),{children:a});return 0===s.length?y:u([y],c(s),!1)}}]}});
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/locale/index.ts","../src/locale/en.ts","../src/locale/zh-CN.ts","../src/utils/maps.ts","../src/utils/util.ts","../src/module/helpers.ts","../src/module/style-class.ts","../src/module/elem-to-html.ts","../src/constants/svg.ts","../src/module/menu/BaseMenu.ts","../src/module/menu/BulletedListMenu.ts","../src/module/menu/LowerAlphaListMenu.ts","../src/module/menu/NumberedListMenu.ts","../src/module/menu/index.ts","../src/utils/dom.ts","../src/module/plugin.ts","../src/module/render-elem.tsx","../src/module/index.ts","../src/module/parse-elem-html.ts"],"sourcesContent":["/**\n * @description i18n entry\n * @author wangfupeng\n */\n\nimport { i18nAddResources } from '@wangeditor-next/core'\n\nimport enResources from './en'\nimport zhResources from './zh-CN'\n\ni18nAddResources('en', enResources)\ni18nAddResources('zh-CN', zhResources)\n","/**\n * @description i18n en\n * @author wangfupeng\n */\n\nexport default {\n listModule: {\n unOrderedList: 'Unordered list',\n orderedList: 'Ordered list',\n lowerAlphaList: 'Ordered list (a,b,c)',\n },\n}\n","/**\n * @description i18n zh-CN\n * @author wangfupeng\n */\n\nexport default {\n listModule: {\n unOrderedList: '无序列表',\n orderedList: '有序列表',\n lowerAlphaList: '有序列表(a,b,c)',\n },\n}\n","/**\n * @description maps\n * @author wangfupeng\n */\n\nimport { IDomEditor } from '@wangeditor-next/core'\nimport { Element as SlateElement } from 'slate'\n\nexport const ELEM_TO_EDITOR = new WeakMap<SlateElement, IDomEditor>()\n","import { Element as SlateElement, Text } from 'slate'\n\n/**\n * 获取第一个 text-node 的颜色\n * @param elem elem\n */\nexport function getListItemColor(elem: SlateElement): string {\n const children = elem.children || []\n const length = children.length\n\n if (length === 0) { return '' }\n\n let firstTextNode\n\n for (let i = 0; i < length; i += 1) {\n if (firstTextNode) { break } // 已找到第一个 text-node ,则退出\n const child = children[i]\n\n if (Text.isText(child)) { firstTextNode = child }\n }\n\n if (firstTextNode == null) { return '' }\n return firstTextNode.color || ''\n}\n","/**\n * @description table menu helpers\n * @author wangfupeng\n */\n\nimport { DomEditor, IDomEditor } from '@wangeditor-next/core'\nimport { Editor, Path } from 'slate'\n\nimport { ListItemElement, OrderedListType } from './custom-types'\n\nexport function getNormalizedOrderedListStart(elem: ListItemElement): number {\n const { ordered = false, start } = elem\n\n if (!ordered) { return 1 }\n if (typeof start !== 'number' || Number.isNaN(start)) { return 1 }\n return start\n}\n\nexport function getNormalizedOrderedListType(elem: ListItemElement): OrderedListType {\n const { orderType } = elem\n\n if (orderType === 'a'\n || orderType === 'A'\n || orderType === 'i'\n || orderType === 'I') {\n return orderType\n }\n\n return '1'\n}\n\nexport function hasSameListConfig(a: ListItemElement, b: ListItemElement): boolean {\n if (a.ordered !== b.ordered) { return false }\n if (!a.ordered) { return true }\n\n return getNormalizedOrderedListType(a) === getNormalizedOrderedListType(b)\n && getNormalizedOrderedListStart(a) === getNormalizedOrderedListStart(b)\n}\n\n/**\n * 获取上一个同一 level 的 list item\n * @param editor 编辑器实例\n * @param elem elem\n */\nexport function getBrotherListNodeByLevel(\n editor: IDomEditor,\n elem: ListItemElement,\n level?: number,\n): ListItemElement | null {\n const { type, ...otherProps } = elem\n // level 可能是 退格前的值,所以这里需要判断\n const elemLevel = level !== undefined ? level : otherProps.level || 0\n\n const path = DomEditor.findPath(editor, elem)\n let brotherPath = path\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n if (brotherPath.length === 0 || brotherPath[brotherPath.length - 1] === 0) {\n return null // 已经是最后一个节点或没有找到有效的前一个 list 节点\n }\n brotherPath = Path.previous(brotherPath)\n const brotherEntry = Editor.node(editor, brotherPath)\n\n if (!brotherEntry) {\n return null // 没有找到有效的前一个节点\n }\n\n const [brotherElem] = brotherEntry\n const { level: brotherLevel = 0 } = brotherElem as ListItemElement\n const brotherType = DomEditor.getNodeType(brotherElem)\n\n // 验证兄弟节点是否是期望的类型和层级\n if (brotherType !== type) {\n return null\n }\n if (brotherLevel === elemLevel) {\n return brotherElem as ListItemElement\n }\n }\n}\n\nexport function hasSameOrderWithBrother(\n editor: IDomEditor,\n elem: ListItemElement,\n level?: number,\n): boolean {\n const brotherElem = getBrotherListNodeByLevel(editor, elem, level)\n\n return brotherElem ? hasSameListConfig(brotherElem, elem) : false\n}\n","/**\n * @description list style class utils\n */\n\nimport { getClassStylePolicy, IDomEditor, reportUnsupportedClassStyle } from '@wangeditor-next/core'\n\nconst DEFAULT_COLORS = [\n 'rgb(0, 0, 0)',\n 'rgb(38, 38, 38)',\n 'rgb(89, 89, 89)',\n 'rgb(140, 140, 140)',\n 'rgb(191, 191, 191)',\n 'rgb(217, 217, 217)',\n 'rgb(233, 233, 233)',\n 'rgb(245, 245, 245)',\n 'rgb(250, 250, 250)',\n 'rgb(255, 255, 255)',\n 'rgb(225, 60, 57)',\n 'rgb(231, 95, 51)',\n 'rgb(235, 144, 58)',\n 'rgb(245, 219, 77)',\n 'rgb(114, 192, 64)',\n 'rgb(89, 191, 192)',\n 'rgb(66, 144, 247)',\n 'rgb(54, 88, 226)',\n 'rgb(106, 57, 201)',\n 'rgb(216, 68, 147)',\n 'rgb(251, 233, 230)',\n 'rgb(252, 237, 225)',\n 'rgb(252, 239, 212)',\n 'rgb(252, 251, 207)',\n 'rgb(231, 246, 213)',\n 'rgb(218, 244, 240)',\n 'rgb(217, 237, 250)',\n 'rgb(224, 232, 250)',\n 'rgb(237, 225, 248)',\n 'rgb(246, 226, 234)',\n 'rgb(255, 163, 158)',\n 'rgb(255, 187, 150)',\n 'rgb(255, 213, 145)',\n 'rgb(255, 251, 143)',\n 'rgb(183, 235, 143)',\n 'rgb(135, 232, 222)',\n 'rgb(145, 213, 255)',\n 'rgb(173, 198, 255)',\n 'rgb(211, 173, 247)',\n 'rgb(255, 173, 210)',\n 'rgb(255, 77, 79)',\n 'rgb(255, 122, 69)',\n 'rgb(255, 169, 64)',\n 'rgb(255, 236, 61)',\n 'rgb(115, 209, 61)',\n 'rgb(54, 207, 201)',\n 'rgb(64, 169, 255)',\n 'rgb(89, 126, 247)',\n 'rgb(146, 84, 222)',\n 'rgb(247, 89, 171)',\n 'rgb(207, 19, 34)',\n 'rgb(212, 56, 13)',\n 'rgb(212, 107, 8)',\n 'rgb(212, 177, 6)',\n 'rgb(56, 158, 13)',\n 'rgb(8, 151, 156)',\n 'rgb(9, 109, 217)',\n 'rgb(29, 57, 196)',\n 'rgb(83, 29, 171)',\n 'rgb(196, 29, 127)',\n 'rgb(130, 0, 20)',\n 'rgb(135, 20, 0)',\n 'rgb(135, 56, 0)',\n 'rgb(97, 71, 0)',\n 'rgb(19, 82, 0)',\n 'rgb(0, 71, 79)',\n 'rgb(0, 58, 140)',\n 'rgb(6, 17, 120)',\n 'rgb(34, 7, 94)',\n 'rgb(120, 6, 80)',\n]\n\nconst REPORTED_UNSUPPORTED_LIST_COLOR = new Set<string>()\n\nfunction normalizeColorValue(value: string): string {\n return (value || '').trim().replace(/\\s+/g, '').toLowerCase()\n}\n\nconst DEFAULT_COLOR_SET = new Set(DEFAULT_COLORS.map(color => normalizeColorValue(color)))\n\nfunction hashStyleValue(input: string): string {\n const MOD = 2147483647 // 2^31 - 1\n let hash = 7\n\n for (const char of input) {\n hash = (hash * 31 + (char.codePointAt(0) || 0)) % MOD\n }\n\n return hash.toString(36)\n}\n\nexport function genListColorClassName(color: string): string {\n const normalized = normalizeColorValue(color)\n\n return `w-e-list-color-${hashStyleValue(`color:${normalized}`)}`\n}\n\nfunction hasExtraRegisteredColor(editor: IDomEditor | undefined, color: string): boolean {\n const extraTokens = editor?.getConfig().styleClassTokens?.color || []\n const normalizedColor = normalizeColorValue(color)\n\n for (let i = 0; i < extraTokens.length; i += 1) {\n if (normalizeColorValue(extraTokens[i]) === normalizedColor) {\n return true\n }\n }\n\n return false\n}\n\nfunction hasRegisteredListColor(editor: IDomEditor | undefined, color: string): boolean {\n const normalized = normalizeColorValue(color)\n\n if (!normalized) { return false }\n if (DEFAULT_COLOR_SET.has(normalized)) { return true }\n if (hasExtraRegisteredColor(editor, color)) { return true }\n\n return false\n}\n\nexport function resolveListColorAction(\n editor: IDomEditor | undefined,\n color: string,\n): 'class' | 'preserve-data' | 'inline' {\n if (hasRegisteredListColor(editor, color)) {\n return 'class'\n }\n\n const policy = getClassStylePolicy(editor)\n let fallback: 'preserve-data' | 'inline' | 'throw' = 'preserve-data'\n\n if (policy === 'fallback-inline') {\n fallback = 'inline'\n }\n if (policy === 'strict') {\n fallback = 'throw'\n }\n\n const message = `[wangeditor] Unsupported list color class token color=${color}. policy=${policy}`\n const reportKey = `${color}|${fallback}`\n\n if (!REPORTED_UNSUPPORTED_LIST_COLOR.has(reportKey)) {\n REPORTED_UNSUPPORTED_LIST_COLOR.add(reportKey)\n reportUnsupportedClassStyle(editor, {\n type: 'color',\n value: color,\n scene: 'toHtml',\n fallback,\n message,\n })\n }\n\n if (fallback === 'throw') {\n throw new Error(message)\n }\n\n if (fallback === 'inline') {\n return 'inline'\n }\n\n return 'preserve-data'\n}\n","/**\n * @description to html\n * @author wangfupeng\n */\n\nimport { DomEditor, getTextStyleMode, IDomEditor } from '@wangeditor-next/core'\nimport { Element } from 'slate'\n\nimport { ELEM_TO_EDITOR } from '../utils/maps'\nimport { getListItemColor } from '../utils/util'\nimport { ListItemElement } from './custom-types'\nimport {\n getNormalizedOrderedListStart,\n getNormalizedOrderedListType,\n hasSameListConfig,\n} from './helpers'\nimport { genListColorClassName, resolveListColorAction } from './style-class'\n\n// ol ul stack for streaming list-item serialization\nconst CONTAINER_TAG_STACK: Array<string> = []\nlet STACK_EDITOR: IDomEditor | null = null\n\nfunction getContainerTag(elem: ListItemElement): 'ol' | 'ul' {\n return elem.ordered ? 'ol' : 'ul'\n}\n\nfunction getFallbackContainerTag(elem: ListItemElement): string {\n return elem.ordered ? 'ol' : 'ul'\n}\n\nfunction genContainerStartTag(elem: ListItemElement): string {\n const { ordered = false } = elem\n\n if (!ordered) { return '<ul>' }\n\n const attrs: string[] = []\n const orderType = getNormalizedOrderedListType(elem)\n const orderStart = getNormalizedOrderedListStart(elem)\n\n if (orderType !== '1') {\n attrs.push(`type=\"${orderType}\"`)\n }\n if (orderStart !== 1) {\n attrs.push(`start=\"${orderStart}\"`)\n }\n\n if (attrs.length === 0) { return '<ol>' }\n return `<ol ${attrs.join(' ')}>`\n}\n\nfunction getAdjacentListItem(\n editor: IDomEditor,\n index: number,\n direction: 'prev' | 'next',\n): ListItemElement | null {\n if (direction === 'prev' && index === 0) { return null }\n if (direction === 'next' && index === editor.children.length - 1) { return null }\n\n const targetIndex = direction === 'prev' ? index - 1 : index + 1\n const targetNode = editor.children[targetIndex] as any\n\n if (!DomEditor.checkNodeType(targetNode, 'list-item')) { return null }\n return targetNode as ListItemElement\n}\n\nfunction getPrevSameLevelListItem(\n editor: IDomEditor,\n index: number,\n level: number,\n): ListItemElement | null {\n for (let i = index - 1; i >= 0; i -= 1) {\n const node = editor.children[i] as any\n\n if (!DomEditor.checkNodeType(node, 'list-item')) { continue }\n if ((node.level || 0) === level) {\n return node as ListItemElement\n }\n }\n return null\n}\n\nfunction elemToHtml(\n elem: Element,\n childrenHtml: string,\n editor?: IDomEditor,\n): {\n html: string\n prefix?: string\n suffix?: string\n} {\n let startContainerStr = ''\n let endContainerStr = ''\n\n const listItemElem = elem as ListItemElement\n const { level = 0 } = listItemElem\n const containerTag = getContainerTag(listItemElem)\n const containerStartTag = genContainerStartTag(listItemElem)\n const bindEditor = ELEM_TO_EDITOR.get(elem)\n const bindEditorWithChildren = bindEditor && Array.isArray((bindEditor as any).children)\n ? bindEditor\n : null\n const passedEditorWithChildren = editor && Array.isArray((editor as any).children)\n ? editor\n : null\n const editorContainsElem = (candidate: IDomEditor | null | undefined) => (\n !!candidate && candidate.children.indexOf(elem as any) >= 0\n )\n let finalEditor = passedEditorWithChildren || bindEditorWithChildren\n\n if (editorContainsElem(passedEditorWithChildren)) {\n finalEditor = passedEditorWithChildren\n } else if (editorContainsElem(bindEditorWithChildren)) {\n finalEditor = bindEditorWithChildren\n }\n const styleEditor = editor || bindEditor\n\n if (finalEditor == null) {\n return {\n html: `<li>${childrenHtml}</li>`,\n prefix: '',\n suffix: '',\n }\n }\n\n if (STACK_EDITOR !== finalEditor) {\n CONTAINER_TAG_STACK.length = 0\n STACK_EDITOR = finalEditor\n }\n\n const index = finalEditor.children.indexOf(elem as any)\n\n if (index < 0) {\n return {\n html: `<li>${childrenHtml}</li>`,\n prefix: '',\n suffix: '',\n }\n }\n\n const prevItem = getAdjacentListItem(finalEditor, index, 'prev')\n const nextItem = getAdjacentListItem(finalEditor, index, 'next')\n const hasNestedNext = !!nextItem && (nextItem.level || 0) > level\n\n if (!prevItem) {\n // list block start\n CONTAINER_TAG_STACK.length = 0\n for (let i = 0; i < level + 1; i += 1) {\n startContainerStr += containerStartTag\n CONTAINER_TAG_STACK.push(containerTag)\n }\n } else {\n const prevLevel = prevItem.level || 0\n\n if (level > prevLevel) {\n // Enter nested lists inside previous <li>.\n for (let i = 0; i < level - prevLevel; i += 1) {\n startContainerStr += containerStartTag\n CONTAINER_TAG_STACK.push(containerTag)\n }\n } else if (level === prevLevel) {\n // Split same-level lists when ordered/type/start differ.\n if (!hasSameListConfig(prevItem, listItemElem)) {\n const closeTag = CONTAINER_TAG_STACK.pop() || getFallbackContainerTag(prevItem)\n\n startContainerStr += `</${closeTag}>${containerStartTag}`\n CONTAINER_TAG_STACK.push(containerTag)\n }\n } else {\n // Climb up: close nested list containers and parent <li>.\n let diff = prevLevel - level\n\n while (diff > 0) {\n const closeTag = CONTAINER_TAG_STACK.pop() || getFallbackContainerTag(prevItem)\n\n startContainerStr += `</${closeTag}></li>`\n diff -= 1\n }\n\n // Split target-level list container when config changed.\n const brother = getPrevSameLevelListItem(finalEditor, index, level)\n\n if (brother && !hasSameListConfig(brother, listItemElem)) {\n const closeTag = CONTAINER_TAG_STACK.pop() || getFallbackContainerTag(brother)\n\n startContainerStr += `</${closeTag}>${containerStartTag}`\n CONTAINER_TAG_STACK.push(containerTag)\n }\n }\n }\n\n // 获取前缀颜色\n const prefixColor = getListItemColor(elem)\n const textStyleMode = getTextStyleMode(styleEditor)\n let colorStyle = ''\n let colorClass = ''\n let colorData = ''\n\n if (prefixColor) {\n if (textStyleMode === 'class') {\n colorData = ` data-w-e-color=\"${prefixColor}\"`\n const action = resolveListColorAction(styleEditor, prefixColor)\n\n if (action === 'class') {\n colorClass = ` class=\"${genListColorClassName(prefixColor)}\"`\n } else if (action === 'inline') {\n colorStyle = ` style=\"color:${prefixColor}\"`\n }\n } else {\n colorStyle = ` style=\"color:${prefixColor}\"`\n }\n }\n\n const html = `<li${colorClass}${colorData}${colorStyle}>${childrenHtml}${hasNestedNext ? '' : '</li>'}`\n\n if (!nextItem) {\n // list block end\n while (CONTAINER_TAG_STACK.length > 0) {\n const tag = CONTAINER_TAG_STACK.pop()\n\n if (!tag) { break }\n endContainerStr += `</${tag}>`\n if (CONTAINER_TAG_STACK.length > 0) {\n endContainerStr += '</li>'\n }\n }\n STACK_EDITOR = null\n }\n\n return {\n html,\n prefix: startContainerStr,\n suffix: endContainerStr,\n }\n}\n\nconst listItemToHtmlConf = {\n type: 'list-item',\n elemToHtml,\n}\n\nexport default listItemToHtmlConf\n","/**\n * @description icon svg\n * @author wangfupeng\n */\n\n/**\n * 【注意】svg 字符串的长度 ,否则会导致代码体积过大\n * 尽量选择 https://www.iconfont.cn/collections/detail?spm=a313x.7781069.0.da5a778a4&cid=20293\n * 找不到再从 iconfont.com 搜索\n */\n\n// 无序列表\nexport const BULLETED_LIST_SVG = '<svg viewBox=\"0 0 1024 1024\"><path d=\"M384 64h640v128H384V64z m0 384h640v128H384v-128z m0 384h640v128H384v-128zM0 128a128 128 0 1 1 256 0 128 128 0 0 1-256 0z m0 384a128 128 0 1 1 256 0 128 128 0 0 1-256 0z m0 384a128 128 0 1 1 256 0 128 128 0 0 1-256 0z\"></path></svg>'\n\n// 有序列表\nexport const NUMBERED_LIST_SVG = '<svg viewBox=\"0 0 1024 1024\"><path d=\"M384 832h640v128H384z m0-384h640v128H384z m0-384h640v128H384zM192 0v256H128V64H64V0zM128 526.016v50.016h128v64H64v-146.016l128-60V384H64v-64h192v146.016zM256 704v320H64v-64h128v-64H64v-64h128v-64H64v-64z\"></path></svg>'\n","/**\n * @description base menu\n * @author wangfupeng\n */\n\nimport { DomEditor, IButtonMenu, IDomEditor } from '@wangeditor-next/core'\nimport {\n Editor, Element, Node, Transforms,\n} from 'slate'\n\nimport { ListItemElement, OrderedListType } from '../custom-types'\nimport { getNormalizedOrderedListType } from '../helpers'\n\nabstract class BaseMenu implements IButtonMenu {\n readonly type = 'list-item'\n\n abstract readonly ordered: boolean\n\n readonly orderType?: OrderedListType\n\n abstract readonly title: string\n\n abstract readonly iconSvg: string\n\n readonly tag = 'button'\n\n private getListNode(editor: IDomEditor): Node | null {\n const { type } = this\n\n return DomEditor.getSelectedNodeByType(editor, type)\n }\n\n getValue(_editor: IDomEditor): string | boolean {\n return ''\n }\n\n isActive(editor: IDomEditor): boolean {\n const node = this.getListNode(editor)\n\n if (node == null) { return false }\n const listNode = node as ListItemElement\n const { ordered = false } = listNode\n\n if (ordered !== this.ordered) { return false }\n if (!ordered) { return true }\n\n const currentOrderType = getNormalizedOrderedListType(listNode)\n const targetOrderType = this.orderType || '1'\n\n return currentOrderType === targetOrderType\n }\n\n isDisabled(editor: IDomEditor): boolean {\n if (editor.selection == null) { return true }\n\n const selectedElems = DomEditor.getSelectedElems(editor)\n const notMatch = selectedElems.some((elem: Element) => {\n if (Editor.isVoid(editor, elem) && Editor.isBlock(editor, elem)) { return true }\n\n const { type } = elem as Element\n\n if (['pre', 'code', 'table'].includes(type)) { return true }\n return false\n })\n\n if (notMatch) { return true }\n\n return false\n }\n\n exec(editor: IDomEditor, _value: string | boolean): void {\n const active = this.isActive(editor)\n\n if (active) {\n // 如果当前 active ,则转换为 p 标签\n Transforms.setNodes(editor, {\n type: 'paragraph',\n // @ts-ignore\n ordered: undefined,\n level: undefined,\n start: undefined,\n orderType: undefined,\n })\n } else {\n // 否则,转换为 list-item\n Transforms.setNodes(editor, {\n type: 'list-item',\n ordered: this.ordered, // 有序/无序\n indent: undefined,\n start: undefined,\n orderType: this.ordered ? this.orderType : undefined,\n })\n }\n }\n}\n\nexport default BaseMenu\n","/**\n * @description bulleted list menu\n * @author wangfupeng\n */\n\nimport { t } from '@wangeditor-next/core'\n\nimport { BULLETED_LIST_SVG } from '../../constants/svg'\nimport BaseMenu from './BaseMenu'\n\nclass BulletedListMenu extends BaseMenu {\n readonly ordered = false\n\n readonly title = t('listModule.unOrderedList')\n\n readonly iconSvg = BULLETED_LIST_SVG\n}\n\nexport default BulletedListMenu\n","/**\n * @description lower-alpha ordered list menu\n * @author wangfupeng\n */\n\nimport { t } from '@wangeditor-next/core'\n\nimport { NUMBERED_LIST_SVG } from '../../constants/svg'\nimport { OrderedListType } from '../custom-types'\nimport BaseMenu from './BaseMenu'\n\nclass LowerAlphaListMenu extends BaseMenu {\n readonly ordered = true\n\n readonly orderType: OrderedListType = 'a'\n\n readonly title = t('listModule.lowerAlphaList')\n\n readonly iconSvg = NUMBERED_LIST_SVG\n}\n\nexport default LowerAlphaListMenu\n","/**\n * @description numbered list menu\n * @author wangfupeng\n */\n\nimport { t } from '@wangeditor-next/core'\n\nimport { NUMBERED_LIST_SVG } from '../../constants/svg'\nimport BaseMenu from './BaseMenu'\n\nclass NumberedListMenu extends BaseMenu {\n readonly ordered = true\n\n readonly title = t('listModule.orderedList')\n\n readonly iconSvg = NUMBERED_LIST_SVG\n}\n\nexport default NumberedListMenu\n","/**\n * @description menu entry\n * @author wangfupeng\n */\n\nimport BulletedListMenu from './BulletedListMenu'\nimport LowerAlphaListMenu from './LowerAlphaListMenu'\nimport NumberedListMenu from './NumberedListMenu'\n\nexport const bulletedListMenuConf = {\n key: 'bulletedList',\n factory() {\n return new BulletedListMenu()\n },\n}\n\nexport const numberedListMenuConf = {\n key: 'numberedList',\n factory() {\n return new NumberedListMenu()\n },\n}\n\nexport const numberedListLowerAlphaMenuConf = {\n key: 'numberedListLowerAlpha',\n factory() {\n return new LowerAlphaListMenu()\n },\n}\n","/**\n * @description DOM 操作\n * @author wangfupeng\n */\n\nimport $, {\n append, attr, Dom7Array, parent,\n} from 'dom7'\n\n// COMPAT: This is required to prevent TypeScript aliases from doing some very\n// weird things for Slate's types with the same name as globals. (2019/11/27)\n// https://github.com/microsoft/TypeScript/issues/35002\nimport DOMNode = globalThis.Node\nimport DOMComment = globalThis.Comment\nimport DOMElement = globalThis.Element\nimport DOMText = globalThis.Text\nimport DOMRange = globalThis.Range\nimport DOMSelection = globalThis.Selection\nimport DOMStaticRange = globalThis.StaticRange\n\nif (append) { $.fn.append = append }\n// if (on) $.fn.on = on\n// if (focus) $.fn.focus = focus\nif (attr) { $.fn.attr = attr }\n// if (val) $.fn.val = val\n// if (html) $.fn.html = html\nif (parent) { $.fn.parent = parent }\n// if (hasClass) $.fn.hasClass = hasClass\n// if (empty) $.fn.empty = empty\n\nexport default $\nexport {\n DOMComment, DOMElement, DOMNode, DOMRange, DOMSelection, DOMStaticRange, DOMText,\n}\n\n/**\n * 获取 tagName lower-case\n * @param $elem $elem\n */\nexport function getTagName($elem: Dom7Array): string {\n if ($elem.length) { return $elem[0].tagName.toLowerCase() }\n return ''\n}\n","/**\n * @description editor 插件,重写 editor API\n * @author wangfupeng\n */\n\nimport { DomEditor, IDomEditor } from '@wangeditor-next/core'\nimport {\n Editor, Range, Transforms,\n} from 'slate'\n\nimport { ListItemElement } from './custom-types'\nimport { getBrotherListNodeByLevel } from './helpers'\n\n/**\n * 获取选中的 top elems\n * @param editor editor\n */\nfunction getTopSelectedElemsBySelection(editor: IDomEditor) {\n return Editor.nodes(editor, {\n at: editor.selection || undefined,\n match: n => DomEditor.findPath(editor, n).length === 1, // 只匹配顶级元素\n })\n}\n\nfunction withList<T extends IDomEditor>(editor: T): T {\n const {\n deleteBackward, handleTab, normalizeNode, insertBreak,\n } = editor\n const newEditor = editor\n\n // 重写 insertBreak - 空 list 点击回车时删除该空 list\n newEditor.insertBreak = () => {\n const [nodeEntry] = Editor.nodes(editor, {\n match: n => DomEditor.checkNodeType(n, 'list-item'),\n universal: true,\n })\n\n if (!nodeEntry) { return insertBreak() }\n const listElem = nodeEntry[0] as ListItemElement\n\n if (listElem.children[0].text === '') {\n Transforms.setNodes(newEditor, {\n type: 'paragraph',\n // @ts-ignore\n ordered: undefined,\n level: undefined,\n start: undefined,\n orderType: undefined,\n })\n return\n }\n return insertBreak()\n }\n\n // 重写 deleteBackward - 降低 level 或者转换为 p 元素\n newEditor.deleteBackward = unit => {\n const { selection } = newEditor\n\n if (selection == null) {\n deleteBackward(unit)\n return\n }\n\n if (Range.isExpanded(selection)) {\n deleteBackward(unit)\n return\n }\n\n const listItemElem = DomEditor.getSelectedNodeByType(newEditor, 'list-item')\n\n if (listItemElem == null) {\n // 未匹配到 list-item\n deleteBackward(unit)\n return\n }\n\n if (selection.focus.offset === 0) {\n // 选中了当前 list-item 文本的开头,此时按删除键,应该降低 level 或转换为 p 元素\n const { level = 0 } = listItemElem as ListItemElement\n\n if (level > 0) {\n // 如果有兄弟节点,则对齐兄弟节点的列表配置\n const brotherElem = getBrotherListNodeByLevel(\n editor,\n listItemElem as ListItemElement,\n level - 1,\n )\n\n if (brotherElem) {\n const nextOrdered = brotherElem.ordered\n\n Transforms.setNodes(newEditor, {\n level: level - 1,\n ordered: nextOrdered,\n start: nextOrdered ? brotherElem.start : undefined,\n orderType: nextOrdered ? brotherElem.orderType : undefined,\n })\n } else {\n Transforms.setNodes(newEditor, { level: level - 1 })\n }\n } else {\n // 转换为 p 元素\n Transforms.setNodes(newEditor, {\n type: 'paragraph',\n // @ts-ignore\n ordered: undefined,\n level: undefined,\n start: undefined,\n orderType: undefined,\n })\n }\n return\n }\n\n // 其他情况\n deleteBackward(unit)\n }\n\n // 重写 tab - 当选中 list-item 文本开头时,增加 level\n newEditor.handleTab = () => {\n const { selection } = newEditor\n\n if (selection == null) {\n handleTab()\n return\n }\n\n // 选区是合并的,判断单个 list-item 即可\n if (Range.isCollapsed(selection)) {\n const listItemElem = DomEditor.getSelectedNodeByType(newEditor, 'list-item')\n\n if (listItemElem == null) {\n // 未匹配到 list-item\n handleTab()\n return\n }\n\n if (selection.focus.offset === 0) {\n // 选中了当前 list-item 文本的开头,此时按 tab 应该增加 level\n const { level = 0 } = listItemElem as ListItemElement\n\n Transforms.setNodes(newEditor, { level: level + 1 })\n return\n }\n }\n\n // 选区是展开的,要判断多个 list-item\n if (Range.isExpanded(selection)) {\n let listItemNum = 0 // 选中的 list-item 有几个\n let hasOtherElem = false // 是否有其他元素\n\n for (const entry of getTopSelectedElemsBySelection(newEditor)) {\n const [elem] = entry\n const type = DomEditor.getNodeType(elem)\n\n if (type === 'list-item') { listItemNum += 1 } else { hasOtherElem = true }\n }\n\n if (hasOtherElem || listItemNum <= 1) {\n // 选中了其他元素,或者只选中一个 list-item ,则执行默认行为\n handleTab()\n return\n }\n\n // 未选中其他元素,且选中多个 list-item ,则增加 level\n for (const entry of getTopSelectedElemsBySelection(newEditor)) {\n const [elem, path] = entry\n const { level = 0 } = elem as ListItemElement\n\n Transforms.setNodes(newEditor, { level: level + 1 }, { at: path })\n }\n return\n }\n\n // 其他情况\n handleTab()\n }\n\n // 兼容之前的 JSON 格式 `numbered-list` 和 `bulleted-list` (之前的 list 没有嵌套功能)\n newEditor.normalizeNode = ([node, path]) => {\n const type = DomEditor.getNodeType(node)\n\n if (type === 'bulleted-list' || type === 'numbered-list') {\n Transforms.unwrapNodes(newEditor, { at: path })\n }\n\n // 执行默认行为\n return normalizeNode([node, path])\n }\n\n return newEditor\n}\n\nexport default withList\n","/**\n * @description render list elem\n * @author wangfupeng\n */\n\nimport { DomEditor, IDomEditor } from '@wangeditor-next/core'\nimport {\n Editor, Element as SlateElement, Path,\n} from 'slate'\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { jsx, VNode } from 'snabbdom'\n\nimport { ELEM_TO_EDITOR } from '../utils/maps'\nimport { getListItemColor } from '../utils/util'\nimport { ListItemElement } from './custom-types'\nimport {\n getNormalizedOrderedListStart,\n getNormalizedOrderedListType,\n hasSameListConfig,\n} from './helpers'\n\n/**\n * 无序列表:根据 level 获取的前置符号\n * @param level 层级\n */\nfunction genPreSymbol(level = 0): string {\n let s = ''\n\n switch (level) {\n case 0:\n s = '•' // 第一层级\n break\n case 1:\n s = '◦' // 第一层级\n break\n case 2:\n s = '▪' // 第三层级\n break\n default:\n s = '▪' // 其他层级\n }\n return s\n}\n\nfunction genAlphabetIndex(num: number, upper = false): string {\n if (num <= 0) { return String(num) }\n\n let n = num\n let result = ''\n\n while (n > 0) {\n const rem = (n - 1) % 26\n const charCode = (upper ? 65 : 97) + rem\n\n result = String.fromCharCode(charCode) + result\n n = Math.floor((n - 1) / 26)\n }\n\n return result\n}\n\nfunction genRomanIndex(num: number, upper = false): string {\n if (num <= 0 || num >= 4000) { return String(num) }\n\n const romanMap: Array<[number, string]> = [\n [1000, 'M'],\n [900, 'CM'],\n [500, 'D'],\n [400, 'CD'],\n [100, 'C'],\n [90, 'XC'],\n [50, 'L'],\n [40, 'XL'],\n [10, 'X'],\n [9, 'IX'],\n [5, 'V'],\n [4, 'IV'],\n [1, 'I'],\n ]\n\n let n = num\n let result = ''\n\n for (const [value, roman] of romanMap) {\n while (n >= value) {\n result += roman\n n -= value\n }\n }\n\n return upper ? result : result.toLowerCase()\n}\n\nfunction genOrderedPrefix(num: number, orderType: string): string {\n switch (orderType) {\n case 'a':\n return `${genAlphabetIndex(num)}.`\n case 'A':\n return `${genAlphabetIndex(num, true)}.`\n case 'i':\n return `${genRomanIndex(num)}.`\n case 'I':\n return `${genRomanIndex(num, true)}.`\n default:\n return `${num}.`\n }\n}\n\n/**\n * 有序列表:获取前缀 number\n * @param editor editor\n * @param elem listItem elem\n */\nfunction getOrderedItemNumber(editor: IDomEditor, elem: SlateElement): number {\n const listItemElem = elem as ListItemElement\n const { type, level = 0, ordered = false } = listItemElem\n\n let num = getNormalizedOrderedListStart(listItemElem)\n let curElem = elem\n let curPath = DomEditor.findPath(editor, curElem)\n\n // 第一个元素,直接返回起始值\n if (curPath[0] === 0) { return num }\n\n while (curPath[0] > 0) {\n const prevPath = Path.previous(curPath)\n const prevEntry = Editor.node(editor, prevPath)\n\n if (prevEntry == null) { break }\n const prevElem = prevEntry[0] as ListItemElement // 上一个节点\n const { level: prevLevel = 0, type: prevType, ordered: prevOrdered } = prevElem\n\n // type 不一致,退出循环,不再累加 num\n if (prevType !== type) { break }\n // prevLevel 更小,退出循环,不再累加 num\n if (prevLevel < level) { break }\n\n if (prevLevel === level) {\n // level 一样,如果 list 配置不一致,则退出循环,不再累加 num\n if (prevOrdered !== ordered || !hasSameListConfig(prevElem, listItemElem)) { break }\n // level 一样,order 配置一致,则累加 num\n num += 1\n }\n\n // prevLevel 更大,不累加 num ,继续向前\n curElem = prevElem\n curPath = prevPath\n }\n\n return num\n}\n\nfunction renderListElem(\n elemNode: SlateElement,\n children: VNode[] | null,\n editor: IDomEditor,\n): VNode {\n ELEM_TO_EDITOR.set(elemNode, editor) // 记录 elem 和 editor 关系,elem-to-html 时要用\n\n const { level = 0, ordered = false } = elemNode as ListItemElement\n\n // 根据 level 增加 margin-left\n const listStyle = {\n margin: `5px 0 5px ${level * 20}px`,\n display: 'flex',\n alignItems: 'flex-start',\n }\n\n // list-item 前缀\n let prefix = ''\n\n if (ordered) {\n // 有序列表:获取前缀 number\n const orderedNumber = getOrderedItemNumber(editor, elemNode)\n const orderType = getNormalizedOrderedListType(elemNode as ListItemElement)\n\n prefix = genOrderedPrefix(orderedNumber, orderType)\n } else {\n // 无序列表:根据层级,使用不同的前缀符号\n prefix = genPreSymbol(level)\n }\n\n // 获取前缀颜色\n const prefixColor = getListItemColor(elemNode)\n\n const vnode = (\n <div style={listStyle}>\n <span\n contentEditable={false}\n style={{ marginRight: '0.5em', color: prefixColor }}\n data-w-e-reserve\n >\n {prefix}\n </span>\n <span style={{\n flex: '1',\n wordBreak: 'break-word',\n }}>{children}</span>\n </div>\n )\n\n return vnode\n}\n\nconst renderListItemConf = {\n type: 'list-item',\n renderElem: renderListElem,\n}\n\nexport default renderListItemConf\n","/**\n * @description list module entry\n * @author wangfupeng\n */\n\nimport { IModuleConf } from '@wangeditor-next/core'\n\nimport listItemToHtmlConf from './elem-to-html'\nimport {\n bulletedListMenuConf,\n numberedListLowerAlphaMenuConf,\n numberedListMenuConf,\n} from './menu/index'\nimport { parseItemHtmlConf, parseListHtmlConf } from './parse-elem-html'\nimport withList from './plugin'\nimport renderListItemConf from './render-elem'\n\nconst list: Partial<IModuleConf> = {\n renderElems: [renderListItemConf],\n editorPlugin: withList,\n menus: [bulletedListMenuConf, numberedListMenuConf, numberedListLowerAlphaMenuConf],\n elemsToHtml: [listItemToHtmlConf],\n parseElemsHtml: [parseListHtmlConf, parseItemHtmlConf],\n}\n\nexport default list\n","/**\n * @description parse elem html\n * @author wangfupeng\n */\n\nimport { DomEditor, IDomEditor } from '@wangeditor-next/core'\nimport { Dom7Array } from 'dom7'\nimport { Descendant, Text } from 'slate'\n\nimport $, { DOMElement, getTagName } from '../utils/dom'\nimport { ListItemElement, OrderedListType } from './custom-types'\n\n/**\n * 获取 ordered\n * @param $elem list $elem\n */\nfunction getOrdered($elem: Dom7Array): boolean {\n const $list = $elem.parent()\n const listTagName = getTagName($list)\n\n if (listTagName === 'ol') { return true }\n return false\n}\n\nfunction getOrderedStart($elem: Dom7Array): number | undefined {\n const $list = $elem.parent()\n\n if (getTagName($list) !== 'ol') { return undefined }\n const startStr = ($list.attr('start') || '').trim()\n\n if (startStr === '') { return undefined }\n const start = Number.parseInt(startStr, 10)\n\n if (Number.isNaN(start)) { return undefined }\n return start\n}\n\nfunction getOrderedType($elem: Dom7Array): OrderedListType | undefined {\n const $list = $elem.parent()\n\n if (getTagName($list) !== 'ol') { return undefined }\n const orderType = ($list.attr('type') || '').trim()\n\n if (orderType === '1'\n || orderType === 'a'\n || orderType === 'A'\n || orderType === 'i'\n || orderType === 'I') {\n return orderType\n }\n\n return undefined\n}\n\n/**\n * 获取 level\n * @param $elem list $elem\n */\nfunction getLevel($elem: Dom7Array): number {\n let listAncestorCount = 0\n let $cur: Dom7Array = $elem.parent()\n\n while ($cur.length > 0) {\n const tagName = getTagName($cur)\n\n if (tagName === 'ul' || tagName === 'ol') {\n listAncestorCount += 1\n }\n $cur = $cur.parent()\n }\n\n return Math.max(0, listAncestorCount - 1)\n}\n\nfunction parseItemHtml(\n elem: DOMElement,\n children: Descendant[],\n editor: IDomEditor,\n): ListItemElement | ListItemElement[] {\n const $elem = $(elem)\n const normalizedChildren: Descendant[] = []\n const nestedListChildren: ListItemElement[] = []\n\n children.forEach(child => {\n if (Text.isText(child)) {\n normalizedChildren.push(child)\n return\n }\n\n if (editor.isInline(child)) {\n normalizedChildren.push(child)\n return\n }\n\n if (DomEditor.checkNodeType(child, 'list-item')) {\n nestedListChildren.push(child as ListItemElement)\n }\n })\n\n // 无 children ,则用纯文本\n if (normalizedChildren.length === 0) {\n if (nestedListChildren.length > 0) {\n normalizedChildren.push({ text: '' })\n } else {\n normalizedChildren.push({ text: $elem.text().replace(/\\s+/gm, ' ') })\n }\n }\n\n const ordered = getOrdered($elem)\n const level = getLevel($elem)\n const start = getOrderedStart($elem)\n const orderType = getOrderedType($elem)\n\n const currentItem: ListItemElement = {\n type: 'list-item',\n ordered,\n level,\n ...(start !== undefined ? { start } : {}),\n ...(orderType !== undefined ? { orderType } : {}),\n // @ts-ignore\n children: normalizedChildren,\n }\n\n if (nestedListChildren.length === 0) { return currentItem }\n return [currentItem, ...nestedListChildren]\n}\n\nexport const parseItemHtmlConf = {\n selector: 'li:not([data-w-e-type])', // data-w-e-type 属性,留给自定义元素,保证扩展性\n parseElemHtml: parseItemHtml,\n}\n\nfunction parseListHtml(\n _elem: DOMElement,\n children: Descendant[],\n _editor: IDomEditor,\n): ListItemElement[] {\n // @ts-ignore flatten 因为可能有 ul/ol 嵌套,重要!!!\n return children.flat(Infinity)\n}\n\nexport const parseListHtmlConf = {\n selector: 'ul:not([data-w-e-type]),ol:not([data-w-e-type])', // data-w-e-type 属性,留给自定义元素,保证扩展性\n parseElemHtml: parseListHtml,\n}\n"],"names":["i18nAddResources","listModule","unOrderedList","orderedList","lowerAlphaList","ELEM_TO_EDITOR","WeakMap","getListItemColor","elem","firstTextNode","children","length","i","child","Text","isText","color","getNormalizedOrderedListStart","_a","ordered","start","Number","isNaN","getNormalizedOrderedListType","orderType","hasSameListConfig","a","b","getBrotherListNodeByLevel","editor","level","type","otherProps","elemLevel","undefined","brotherPath","DomEditor","findPath","Path","previous","brotherEntry","Editor","node","brotherElem","__read","_b","brotherLevel","getNodeType","REPORTED_UNSUPPORTED_LIST_COLOR","Set","normalizeColorValue","value","trim","replace","toLowerCase","DEFAULT_COLOR_SET","map","genListColorClassName","normalized","concat","input","hash","input_1","__values","input_1_1","next","codePointAt","toString","hashStyleValue","hasRegisteredListColor","has","extraTokens","getConfig","styleClassTokens","normalizedColor","hasExtraRegisteredColor","CONTAINER_TAG_STACK","STACK_EDITOR","getFallbackContainerTag","getAdjacentListItem","index","direction","targetIndex","targetNode","checkNodeType","listItemToHtmlConf","elemToHtml","childrenHtml","startContainerStr","endContainerStr","listItemElem","containerTag","getContainerTag","containerStartTag","attrs","orderStart","push","join","genContainerStartTag","bindEditor","get","bindEditorWithChildren","Array","isArray","passedEditorWithChildren","editorContainsElem","candidate","indexOf","finalEditor","styleEditor","html","prefix","suffix","prevItem","nextItem","hasNestedNext","prevLevel","closeTag","pop","diff","brother","getPrevSameLevelListItem","prefixColor","textStyleMode","getTextStyleMode","colorStyle","colorClass","colorData","action","policy","getClassStylePolicy","fallback","message","reportKey","add","reportUnsupportedClassStyle","scene","Error","resolveListColorAction","tag","NUMBERED_LIST_SVG","BaseMenu","this","prototype","getListNode","getSelectedNodeByType","getValue","_editor","isActive","listNode","isDisabled","selection","getSelectedElems","some","isVoid","isBlock","includes","exec","_value","Transforms","setNodes","indent","BulletedListMenu","_super","_this","title","t","iconSvg","__extends","LowerAlphaListMenu","NumberedListMenu","bulletedListMenuConf","key","factory","numberedListMenuConf","numberedListLowerAlphaMenuConf","getTagName","$elem","tagName","getTopSelectedElemsBySelection","nodes","at","match","n","genAlphabetIndex","num","upper","String","result","charCode","fromCharCode","Math","floor","genRomanIndex","romanMap_1","romanMap_1_1","roman","append","$","fn","attr","parent","renderElems","renderElem","elemNode","set","_c","listStyle","margin","display","alignItems","orderedNumber","curElem","curPath","prevPath","prevEntry","prevElem","prevType","prevOrdered","getOrderedItemNumber","genOrderedPrefix","s","genPreSymbol","jsx","style","contentEditable","marginRight","flex","wordBreak","editorPlugin","deleteBackward","handleTab","normalizeNode","insertBreak","newEditor","nodeEntry","universal","text","unit","Range","isExpanded","focus","offset","nextOrdered","isCollapsed","listItemNum","hasOtherElem","_d","_e","done","_g","_h","_j","path","_k","unwrapNodes","menus","elemsToHtml","parseElemsHtml","selector","parseElemHtml","_elem","flat","Infinity","normalizedChildren","nestedListChildren","forEach","isInline","getOrdered","listAncestorCount","$cur","max","getLevel","$list","startStr","parseInt","getOrderedStart","getOrderedType","currentItem","__spreadArray"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/locale/index.ts","../src/locale/en.ts","../src/locale/zh-CN.ts","../src/utils/maps.ts","../src/utils/util.ts","../src/module/helpers.ts","../src/module/style-class.ts","../src/module/elem-to-html.ts","../src/constants/svg.ts","../src/module/menu/BaseMenu.ts","../src/module/menu/BulletedListMenu.ts","../src/module/menu/LowerAlphaListMenu.ts","../src/module/menu/NumberedListMenu.ts","../src/module/menu/index.ts","../src/utils/dom.ts","../src/module/parse-elem-html.ts","../src/module/plugin.ts","../src/module/render-elem.tsx","../src/module/index.ts"],"sourcesContent":["/**\n * @description i18n entry\n * @author wangfupeng\n */\n\nimport { i18nAddResources } from '@wangeditor-next/core'\n\nimport enResources from './en'\nimport zhResources from './zh-CN'\n\ni18nAddResources('en', enResources)\ni18nAddResources('zh-CN', zhResources)\n","/**\n * @description i18n en\n * @author wangfupeng\n */\n\nexport default {\n listModule: {\n unOrderedList: 'Unordered list',\n orderedList: 'Ordered list',\n lowerAlphaList: 'Ordered list (a,b,c)',\n },\n}\n","/**\n * @description i18n zh-CN\n * @author wangfupeng\n */\n\nexport default {\n listModule: {\n unOrderedList: '无序列表',\n orderedList: '有序列表',\n lowerAlphaList: '有序列表(a,b,c)',\n },\n}\n","/**\n * @description maps\n * @author wangfupeng\n */\n\nimport { IDomEditor } from '@wangeditor-next/core'\nimport { Element as SlateElement } from 'slate'\n\nexport const ELEM_TO_EDITOR = new WeakMap<SlateElement, IDomEditor>()\n","import { Element as SlateElement, Text } from 'slate'\n\n/**\n * 获取第一个 text-node 的颜色\n * @param elem elem\n */\nexport function getListItemColor(elem: SlateElement): string {\n const children = elem.children || []\n const length = children.length\n\n if (length === 0) { return '' }\n\n let firstTextNode\n\n for (let i = 0; i < length; i += 1) {\n if (firstTextNode) { break } // 已找到第一个 text-node ,则退出\n const child = children[i]\n\n if (Text.isText(child)) { firstTextNode = child }\n }\n\n if (firstTextNode == null) { return '' }\n return firstTextNode.color || ''\n}\n","/**\n * @description table menu helpers\n * @author wangfupeng\n */\n\nimport { DomEditor, IDomEditor } from '@wangeditor-next/core'\nimport { Editor, Path } from 'slate'\n\nimport { ListItemElement, OrderedListType } from './custom-types'\n\nexport function getNormalizedOrderedListStart(elem: ListItemElement): number {\n const { ordered = false, start } = elem\n\n if (!ordered) { return 1 }\n if (typeof start !== 'number' || Number.isNaN(start)) { return 1 }\n return start\n}\n\nexport function getNormalizedOrderedListType(elem: ListItemElement): OrderedListType {\n const { orderType } = elem\n\n if (orderType === 'a'\n || orderType === 'A'\n || orderType === 'i'\n || orderType === 'I') {\n return orderType\n }\n\n return '1'\n}\n\nexport function hasSameListConfig(a: ListItemElement, b: ListItemElement): boolean {\n if (a.ordered !== b.ordered) { return false }\n if (!a.ordered) { return true }\n\n return getNormalizedOrderedListType(a) === getNormalizedOrderedListType(b)\n && getNormalizedOrderedListStart(a) === getNormalizedOrderedListStart(b)\n}\n\n/**\n * 获取上一个同一 level 的 list item\n * @param editor 编辑器实例\n * @param elem elem\n */\nexport function getBrotherListNodeByLevel(\n editor: IDomEditor,\n elem: ListItemElement,\n level?: number,\n): ListItemElement | null {\n const { type, ...otherProps } = elem\n // level 可能是 退格前的值,所以这里需要判断\n const elemLevel = level !== undefined ? level : otherProps.level || 0\n\n const path = DomEditor.findPath(editor, elem)\n let brotherPath = path\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n if (brotherPath.length === 0 || brotherPath[brotherPath.length - 1] === 0) {\n return null // 已经是最后一个节点或没有找到有效的前一个 list 节点\n }\n brotherPath = Path.previous(brotherPath)\n const brotherEntry = Editor.node(editor, brotherPath)\n\n if (!brotherEntry) {\n return null // 没有找到有效的前一个节点\n }\n\n const [brotherElem] = brotherEntry\n const { level: brotherLevel = 0 } = brotherElem as ListItemElement\n const brotherType = DomEditor.getNodeType(brotherElem)\n\n // 验证兄弟节点是否是期望的类型和层级\n if (brotherType !== type) {\n return null\n }\n if (brotherLevel === elemLevel) {\n return brotherElem as ListItemElement\n }\n }\n}\n\nexport function hasSameOrderWithBrother(\n editor: IDomEditor,\n elem: ListItemElement,\n level?: number,\n): boolean {\n const brotherElem = getBrotherListNodeByLevel(editor, elem, level)\n\n return brotherElem ? hasSameListConfig(brotherElem, elem) : false\n}\n","/**\n * @description list style class utils\n */\n\nimport { getClassStylePolicy, IDomEditor, reportUnsupportedClassStyle } from '@wangeditor-next/core'\n\nconst DEFAULT_COLORS = [\n 'rgb(0, 0, 0)',\n 'rgb(38, 38, 38)',\n 'rgb(89, 89, 89)',\n 'rgb(140, 140, 140)',\n 'rgb(191, 191, 191)',\n 'rgb(217, 217, 217)',\n 'rgb(233, 233, 233)',\n 'rgb(245, 245, 245)',\n 'rgb(250, 250, 250)',\n 'rgb(255, 255, 255)',\n 'rgb(225, 60, 57)',\n 'rgb(231, 95, 51)',\n 'rgb(235, 144, 58)',\n 'rgb(245, 219, 77)',\n 'rgb(114, 192, 64)',\n 'rgb(89, 191, 192)',\n 'rgb(66, 144, 247)',\n 'rgb(54, 88, 226)',\n 'rgb(106, 57, 201)',\n 'rgb(216, 68, 147)',\n 'rgb(251, 233, 230)',\n 'rgb(252, 237, 225)',\n 'rgb(252, 239, 212)',\n 'rgb(252, 251, 207)',\n 'rgb(231, 246, 213)',\n 'rgb(218, 244, 240)',\n 'rgb(217, 237, 250)',\n 'rgb(224, 232, 250)',\n 'rgb(237, 225, 248)',\n 'rgb(246, 226, 234)',\n 'rgb(255, 163, 158)',\n 'rgb(255, 187, 150)',\n 'rgb(255, 213, 145)',\n 'rgb(255, 251, 143)',\n 'rgb(183, 235, 143)',\n 'rgb(135, 232, 222)',\n 'rgb(145, 213, 255)',\n 'rgb(173, 198, 255)',\n 'rgb(211, 173, 247)',\n 'rgb(255, 173, 210)',\n 'rgb(255, 77, 79)',\n 'rgb(255, 122, 69)',\n 'rgb(255, 169, 64)',\n 'rgb(255, 236, 61)',\n 'rgb(115, 209, 61)',\n 'rgb(54, 207, 201)',\n 'rgb(64, 169, 255)',\n 'rgb(89, 126, 247)',\n 'rgb(146, 84, 222)',\n 'rgb(247, 89, 171)',\n 'rgb(207, 19, 34)',\n 'rgb(212, 56, 13)',\n 'rgb(212, 107, 8)',\n 'rgb(212, 177, 6)',\n 'rgb(56, 158, 13)',\n 'rgb(8, 151, 156)',\n 'rgb(9, 109, 217)',\n 'rgb(29, 57, 196)',\n 'rgb(83, 29, 171)',\n 'rgb(196, 29, 127)',\n 'rgb(130, 0, 20)',\n 'rgb(135, 20, 0)',\n 'rgb(135, 56, 0)',\n 'rgb(97, 71, 0)',\n 'rgb(19, 82, 0)',\n 'rgb(0, 71, 79)',\n 'rgb(0, 58, 140)',\n 'rgb(6, 17, 120)',\n 'rgb(34, 7, 94)',\n 'rgb(120, 6, 80)',\n]\n\nconst REPORTED_UNSUPPORTED_LIST_COLOR = new Set<string>()\n\nfunction normalizeColorValue(value: string): string {\n return (value || '').trim().replace(/\\s+/g, '').toLowerCase()\n}\n\nconst DEFAULT_COLOR_SET = new Set(DEFAULT_COLORS.map(color => normalizeColorValue(color)))\n\nfunction hashStyleValue(input: string): string {\n const MOD = 2147483647 // 2^31 - 1\n let hash = 7\n\n for (const char of input) {\n hash = (hash * 31 + (char.codePointAt(0) || 0)) % MOD\n }\n\n return hash.toString(36)\n}\n\nexport function genListColorClassName(color: string): string {\n const normalized = normalizeColorValue(color)\n\n return `w-e-list-color-${hashStyleValue(`color:${normalized}`)}`\n}\n\nfunction hasExtraRegisteredColor(editor: IDomEditor | undefined, color: string): boolean {\n const extraTokens = editor?.getConfig().styleClassTokens?.color || []\n const normalizedColor = normalizeColorValue(color)\n\n for (let i = 0; i < extraTokens.length; i += 1) {\n if (normalizeColorValue(extraTokens[i]) === normalizedColor) {\n return true\n }\n }\n\n return false\n}\n\nfunction hasRegisteredListColor(editor: IDomEditor | undefined, color: string): boolean {\n const normalized = normalizeColorValue(color)\n\n if (!normalized) { return false }\n if (DEFAULT_COLOR_SET.has(normalized)) { return true }\n if (hasExtraRegisteredColor(editor, color)) { return true }\n\n return false\n}\n\nexport function resolveListColorAction(\n editor: IDomEditor | undefined,\n color: string,\n): 'class' | 'preserve-data' | 'inline' {\n if (hasRegisteredListColor(editor, color)) {\n return 'class'\n }\n\n const policy = getClassStylePolicy(editor)\n let fallback: 'preserve-data' | 'inline' | 'throw' = 'preserve-data'\n\n if (policy === 'fallback-inline') {\n fallback = 'inline'\n }\n if (policy === 'strict') {\n fallback = 'throw'\n }\n\n const message = `[wangeditor] Unsupported list color class token color=${color}. policy=${policy}`\n const reportKey = `${color}|${fallback}`\n\n if (!REPORTED_UNSUPPORTED_LIST_COLOR.has(reportKey)) {\n REPORTED_UNSUPPORTED_LIST_COLOR.add(reportKey)\n reportUnsupportedClassStyle(editor, {\n type: 'color',\n value: color,\n scene: 'toHtml',\n fallback,\n message,\n })\n }\n\n if (fallback === 'throw') {\n throw new Error(message)\n }\n\n if (fallback === 'inline') {\n return 'inline'\n }\n\n return 'preserve-data'\n}\n","/**\n * @description to html\n * @author wangfupeng\n */\n\nimport { DomEditor, getTextStyleMode, IDomEditor } from '@wangeditor-next/core'\nimport { Element } from 'slate'\n\nimport { ELEM_TO_EDITOR } from '../utils/maps'\nimport { getListItemColor } from '../utils/util'\nimport { ListItemElement } from './custom-types'\nimport {\n getNormalizedOrderedListStart,\n getNormalizedOrderedListType,\n hasSameListConfig,\n} from './helpers'\nimport { genListColorClassName, resolveListColorAction } from './style-class'\n\n// ol ul stack for streaming list-item serialization\nconst CONTAINER_TAG_STACK: Array<string> = []\nlet STACK_EDITOR: IDomEditor | null = null\n\nfunction getContainerTag(elem: ListItemElement): 'ol' | 'ul' {\n return elem.ordered ? 'ol' : 'ul'\n}\n\nfunction getFallbackContainerTag(elem: ListItemElement): string {\n return elem.ordered ? 'ol' : 'ul'\n}\n\nfunction genContainerStartTag(elem: ListItemElement): string {\n const { ordered = false } = elem\n\n if (!ordered) { return '<ul>' }\n\n const attrs: string[] = []\n const orderType = getNormalizedOrderedListType(elem)\n const orderStart = getNormalizedOrderedListStart(elem)\n\n if (orderType !== '1') {\n attrs.push(`type=\"${orderType}\"`)\n }\n if (orderStart !== 1) {\n attrs.push(`start=\"${orderStart}\"`)\n }\n\n if (attrs.length === 0) { return '<ol>' }\n return `<ol ${attrs.join(' ')}>`\n}\n\nfunction getAdjacentListItem(\n editor: IDomEditor,\n index: number,\n direction: 'prev' | 'next',\n): ListItemElement | null {\n if (direction === 'prev' && index === 0) { return null }\n if (direction === 'next' && index === editor.children.length - 1) { return null }\n\n const targetIndex = direction === 'prev' ? index - 1 : index + 1\n const targetNode = editor.children[targetIndex] as any\n\n if (!DomEditor.checkNodeType(targetNode, 'list-item')) { return null }\n return targetNode as ListItemElement\n}\n\nfunction getPrevSameLevelListItem(\n editor: IDomEditor,\n index: number,\n level: number,\n): ListItemElement | null {\n for (let i = index - 1; i >= 0; i -= 1) {\n const node = editor.children[i] as any\n\n if (!DomEditor.checkNodeType(node, 'list-item')) { continue }\n if ((node.level || 0) === level) {\n return node as ListItemElement\n }\n }\n return null\n}\n\nfunction elemToHtml(\n elem: Element,\n childrenHtml: string,\n editor?: IDomEditor,\n): {\n html: string\n prefix?: string\n suffix?: string\n} {\n let startContainerStr = ''\n let endContainerStr = ''\n\n const listItemElem = elem as ListItemElement\n const { level = 0 } = listItemElem\n const containerTag = getContainerTag(listItemElem)\n const containerStartTag = genContainerStartTag(listItemElem)\n const bindEditor = ELEM_TO_EDITOR.get(elem)\n const bindEditorWithChildren = bindEditor && Array.isArray((bindEditor as any).children)\n ? bindEditor\n : null\n const passedEditorWithChildren = editor && Array.isArray((editor as any).children)\n ? editor\n : null\n const editorContainsElem = (candidate: IDomEditor | null | undefined) => (\n !!candidate && candidate.children.indexOf(elem as any) >= 0\n )\n let finalEditor = passedEditorWithChildren || bindEditorWithChildren\n\n if (editorContainsElem(passedEditorWithChildren)) {\n finalEditor = passedEditorWithChildren\n } else if (editorContainsElem(bindEditorWithChildren)) {\n finalEditor = bindEditorWithChildren\n }\n const styleEditor = editor || bindEditor\n\n if (finalEditor == null) {\n return {\n html: `<li>${childrenHtml}</li>`,\n prefix: '',\n suffix: '',\n }\n }\n\n if (STACK_EDITOR !== finalEditor) {\n CONTAINER_TAG_STACK.length = 0\n STACK_EDITOR = finalEditor\n }\n\n const index = finalEditor.children.indexOf(elem as any)\n\n if (index < 0) {\n return {\n html: `<li>${childrenHtml}</li>`,\n prefix: '',\n suffix: '',\n }\n }\n\n const prevItem = getAdjacentListItem(finalEditor, index, 'prev')\n const nextItem = getAdjacentListItem(finalEditor, index, 'next')\n const hasNestedNext = !!nextItem && (nextItem.level || 0) > level\n\n if (!prevItem) {\n // list block start\n CONTAINER_TAG_STACK.length = 0\n for (let i = 0; i < level + 1; i += 1) {\n startContainerStr += containerStartTag\n CONTAINER_TAG_STACK.push(containerTag)\n }\n } else {\n const prevLevel = prevItem.level || 0\n\n if (level > prevLevel) {\n // Enter nested lists inside previous <li>.\n for (let i = 0; i < level - prevLevel; i += 1) {\n startContainerStr += containerStartTag\n CONTAINER_TAG_STACK.push(containerTag)\n }\n } else if (level === prevLevel) {\n // Split same-level lists when ordered/type/start differ.\n if (!hasSameListConfig(prevItem, listItemElem)) {\n const closeTag = CONTAINER_TAG_STACK.pop() || getFallbackContainerTag(prevItem)\n\n startContainerStr += `</${closeTag}>${containerStartTag}`\n CONTAINER_TAG_STACK.push(containerTag)\n }\n } else {\n // Climb up: close nested list containers and parent <li>.\n let diff = prevLevel - level\n\n while (diff > 0) {\n const closeTag = CONTAINER_TAG_STACK.pop() || getFallbackContainerTag(prevItem)\n\n startContainerStr += `</${closeTag}></li>`\n diff -= 1\n }\n\n // Split target-level list container when config changed.\n const brother = getPrevSameLevelListItem(finalEditor, index, level)\n\n if (brother && !hasSameListConfig(brother, listItemElem)) {\n const closeTag = CONTAINER_TAG_STACK.pop() || getFallbackContainerTag(brother)\n\n startContainerStr += `</${closeTag}>${containerStartTag}`\n CONTAINER_TAG_STACK.push(containerTag)\n }\n }\n }\n\n // 获取前缀颜色\n const prefixColor = getListItemColor(elem)\n const textStyleMode = getTextStyleMode(styleEditor)\n let colorStyle = ''\n let colorClass = ''\n let colorData = ''\n\n if (prefixColor) {\n if (textStyleMode === 'class') {\n colorData = ` data-w-e-color=\"${prefixColor}\"`\n const action = resolveListColorAction(styleEditor, prefixColor)\n\n if (action === 'class') {\n colorClass = ` class=\"${genListColorClassName(prefixColor)}\"`\n } else if (action === 'inline') {\n colorStyle = ` style=\"color:${prefixColor}\"`\n }\n } else {\n colorStyle = ` style=\"color:${prefixColor}\"`\n }\n }\n\n const html = `<li${colorClass}${colorData}${colorStyle}>${childrenHtml}${hasNestedNext ? '' : '</li>'}`\n\n if (!nextItem) {\n // list block end\n while (CONTAINER_TAG_STACK.length > 0) {\n const tag = CONTAINER_TAG_STACK.pop()\n\n if (!tag) { break }\n endContainerStr += `</${tag}>`\n if (CONTAINER_TAG_STACK.length > 0) {\n endContainerStr += '</li>'\n }\n }\n STACK_EDITOR = null\n }\n\n return {\n html,\n prefix: startContainerStr,\n suffix: endContainerStr,\n }\n}\n\nconst listItemToHtmlConf = {\n type: 'list-item',\n elemToHtml,\n}\n\nexport default listItemToHtmlConf\n","/**\n * @description icon svg\n * @author wangfupeng\n */\n\n/**\n * 【注意】svg 字符串的长度 ,否则会导致代码体积过大\n * 尽量选择 https://www.iconfont.cn/collections/detail?spm=a313x.7781069.0.da5a778a4&cid=20293\n * 找不到再从 iconfont.com 搜索\n */\n\n// 无序列表\nexport const BULLETED_LIST_SVG = '<svg viewBox=\"0 0 1024 1024\"><path d=\"M384 64h640v128H384V64z m0 384h640v128H384v-128z m0 384h640v128H384v-128zM0 128a128 128 0 1 1 256 0 128 128 0 0 1-256 0z m0 384a128 128 0 1 1 256 0 128 128 0 0 1-256 0z m0 384a128 128 0 1 1 256 0 128 128 0 0 1-256 0z\"></path></svg>'\n\n// 有序列表\nexport const NUMBERED_LIST_SVG = '<svg viewBox=\"0 0 1024 1024\"><path d=\"M384 832h640v128H384z m0-384h640v128H384z m0-384h640v128H384zM192 0v256H128V64H64V0zM128 526.016v50.016h128v64H64v-146.016l128-60V384H64v-64h192v146.016zM256 704v320H64v-64h128v-64H64v-64h128v-64H64v-64z\"></path></svg>'\n","/**\n * @description base menu\n * @author wangfupeng\n */\n\nimport { DomEditor, IButtonMenu, IDomEditor } from '@wangeditor-next/core'\nimport {\n Editor, Element, Node, Transforms,\n} from 'slate'\n\nimport { ListItemElement, OrderedListType } from '../custom-types'\nimport { getNormalizedOrderedListType } from '../helpers'\n\nabstract class BaseMenu implements IButtonMenu {\n readonly type = 'list-item'\n\n abstract readonly ordered: boolean\n\n readonly orderType?: OrderedListType\n\n abstract readonly title: string\n\n abstract readonly iconSvg: string\n\n readonly tag = 'button'\n\n private getListNode(editor: IDomEditor): Node | null {\n const { type } = this\n\n return DomEditor.getSelectedNodeByType(editor, type)\n }\n\n getValue(_editor: IDomEditor): string | boolean {\n return ''\n }\n\n isActive(editor: IDomEditor): boolean {\n const node = this.getListNode(editor)\n\n if (node == null) { return false }\n const listNode = node as ListItemElement\n const { ordered = false } = listNode\n\n if (ordered !== this.ordered) { return false }\n if (!ordered) { return true }\n\n const currentOrderType = getNormalizedOrderedListType(listNode)\n const targetOrderType = this.orderType || '1'\n\n return currentOrderType === targetOrderType\n }\n\n isDisabled(editor: IDomEditor): boolean {\n if (editor.selection == null) { return true }\n\n const selectedElems = DomEditor.getSelectedElems(editor)\n const notMatch = selectedElems.some((elem: Element) => {\n if (Editor.isVoid(editor, elem) && Editor.isBlock(editor, elem)) { return true }\n\n const { type } = elem as Element\n\n if (['pre', 'code', 'table'].includes(type)) { return true }\n return false\n })\n\n if (notMatch) { return true }\n\n return false\n }\n\n exec(editor: IDomEditor, _value: string | boolean): void {\n const active = this.isActive(editor)\n\n if (active) {\n // 如果当前 active ,则转换为 p 标签\n Transforms.setNodes(editor, {\n type: 'paragraph',\n // @ts-ignore\n ordered: undefined,\n level: undefined,\n start: undefined,\n orderType: undefined,\n })\n } else {\n // 否则,转换为 list-item\n Transforms.setNodes(editor, {\n type: 'list-item',\n ordered: this.ordered, // 有序/无序\n indent: undefined,\n start: undefined,\n orderType: this.ordered ? this.orderType : undefined,\n })\n }\n }\n}\n\nexport default BaseMenu\n","/**\n * @description bulleted list menu\n * @author wangfupeng\n */\n\nimport { t } from '@wangeditor-next/core'\n\nimport { BULLETED_LIST_SVG } from '../../constants/svg'\nimport BaseMenu from './BaseMenu'\n\nclass BulletedListMenu extends BaseMenu {\n readonly ordered = false\n\n readonly title = t('listModule.unOrderedList')\n\n readonly iconSvg = BULLETED_LIST_SVG\n}\n\nexport default BulletedListMenu\n","/**\n * @description lower-alpha ordered list menu\n * @author wangfupeng\n */\n\nimport { t } from '@wangeditor-next/core'\n\nimport { NUMBERED_LIST_SVG } from '../../constants/svg'\nimport { OrderedListType } from '../custom-types'\nimport BaseMenu from './BaseMenu'\n\nclass LowerAlphaListMenu extends BaseMenu {\n readonly ordered = true\n\n readonly orderType: OrderedListType = 'a'\n\n readonly title = t('listModule.lowerAlphaList')\n\n readonly iconSvg = NUMBERED_LIST_SVG\n}\n\nexport default LowerAlphaListMenu\n","/**\n * @description numbered list menu\n * @author wangfupeng\n */\n\nimport { t } from '@wangeditor-next/core'\n\nimport { NUMBERED_LIST_SVG } from '../../constants/svg'\nimport BaseMenu from './BaseMenu'\n\nclass NumberedListMenu extends BaseMenu {\n readonly ordered = true\n\n readonly title = t('listModule.orderedList')\n\n readonly iconSvg = NUMBERED_LIST_SVG\n}\n\nexport default NumberedListMenu\n","/**\n * @description menu entry\n * @author wangfupeng\n */\n\nimport BulletedListMenu from './BulletedListMenu'\nimport LowerAlphaListMenu from './LowerAlphaListMenu'\nimport NumberedListMenu from './NumberedListMenu'\n\nexport const bulletedListMenuConf = {\n key: 'bulletedList',\n factory() {\n return new BulletedListMenu()\n },\n}\n\nexport const numberedListMenuConf = {\n key: 'numberedList',\n factory() {\n return new NumberedListMenu()\n },\n}\n\nexport const numberedListLowerAlphaMenuConf = {\n key: 'numberedListLowerAlpha',\n factory() {\n return new LowerAlphaListMenu()\n },\n}\n","/**\n * @description DOM 操作\n * @author wangfupeng\n */\n\nimport $, {\n append, attr, Dom7Array, parent,\n} from 'dom7'\n\n// COMPAT: This is required to prevent TypeScript aliases from doing some very\n// weird things for Slate's types with the same name as globals. (2019/11/27)\n// https://github.com/microsoft/TypeScript/issues/35002\nimport DOMNode = globalThis.Node\nimport DOMComment = globalThis.Comment\nimport DOMElement = globalThis.Element\nimport DOMText = globalThis.Text\nimport DOMRange = globalThis.Range\nimport DOMSelection = globalThis.Selection\nimport DOMStaticRange = globalThis.StaticRange\n\nif (append) { $.fn.append = append }\n// if (on) $.fn.on = on\n// if (focus) $.fn.focus = focus\nif (attr) { $.fn.attr = attr }\n// if (val) $.fn.val = val\n// if (html) $.fn.html = html\nif (parent) { $.fn.parent = parent }\n// if (hasClass) $.fn.hasClass = hasClass\n// if (empty) $.fn.empty = empty\n\nexport default $\nexport {\n DOMComment, DOMElement, DOMNode, DOMRange, DOMSelection, DOMStaticRange, DOMText,\n}\n\n/**\n * 获取 tagName lower-case\n * @param $elem $elem\n */\nexport function getTagName($elem: Dom7Array): string {\n if ($elem.length) { return $elem[0].tagName.toLowerCase() }\n return ''\n}\n","/**\n * @description parse elem html\n * @author wangfupeng\n */\n\nimport { DomEditor, IDomEditor } from '@wangeditor-next/core'\nimport { Dom7Array } from 'dom7'\nimport { Descendant, Element as SlateElement, Text } from 'slate'\n\nimport $, { DOMElement, getTagName } from '../utils/dom'\nimport { ListItemElement, OrderedListType } from './custom-types'\n\n/**\n * 获取 ordered\n * @param $elem list $elem\n */\nfunction getOrdered($elem: Dom7Array): boolean {\n const $list = $elem.parent()\n const listTagName = getTagName($list)\n\n if (listTagName === 'ol') { return true }\n return false\n}\n\nfunction getOrderedStart($elem: Dom7Array): number | undefined {\n const $list = $elem.parent()\n\n if (getTagName($list) !== 'ol') { return undefined }\n const startStr = ($list.attr('start') || '').trim()\n\n if (startStr === '') { return undefined }\n const start = Number.parseInt(startStr, 10)\n\n if (Number.isNaN(start)) { return undefined }\n return start\n}\n\nfunction getOrderedType($elem: Dom7Array): OrderedListType | undefined {\n const $list = $elem.parent()\n\n if (getTagName($list) !== 'ol') { return undefined }\n const orderType = ($list.attr('type') || '').trim()\n\n if (orderType === '1'\n || orderType === 'a'\n || orderType === 'A'\n || orderType === 'i'\n || orderType === 'I') {\n return orderType\n }\n\n return undefined\n}\n\n/**\n * 获取 level\n * @param $elem list $elem\n */\nfunction getLevel($elem: Dom7Array): number {\n let listAncestorCount = 0\n let $cur: Dom7Array = $elem.parent()\n\n while ($cur.length > 0) {\n const tagName = getTagName($cur)\n\n if (tagName === 'ul' || tagName === 'ol') {\n listAncestorCount += 1\n }\n $cur = $cur.parent()\n }\n\n return Math.max(0, listAncestorCount - 1)\n}\n\nfunction isStructuralWhitespaceText(child: Descendant): boolean {\n return Text.isText(child) && child.text.trim() === ''\n}\n\nfunction appendTextLikeChildren(\n target: Descendant[],\n children: Descendant[],\n editor: IDomEditor,\n) {\n children.forEach(child => {\n if (isStructuralWhitespaceText(child)) {\n return\n }\n\n if (Text.isText(child)) {\n target.push(child)\n return\n }\n\n if (editor.isInline(child)) {\n target.push(child)\n return\n }\n\n if (SlateElement.isElement(child)) {\n appendTextLikeChildren(target, child.children, editor)\n }\n })\n}\n\nfunction parseItemHtml(\n elem: DOMElement,\n children: Descendant[],\n editor: IDomEditor,\n): ListItemElement | ListItemElement[] {\n const $elem = $(elem)\n const normalizedChildren: Descendant[] = []\n const nestedListChildren: ListItemElement[] = []\n\n children.forEach(child => {\n if (isStructuralWhitespaceText(child)) {\n return\n }\n\n if (Text.isText(child)) {\n normalizedChildren.push(child)\n return\n }\n\n if (editor.isInline(child)) {\n normalizedChildren.push(child)\n return\n }\n\n if (DomEditor.checkNodeType(child, 'list-item')) {\n nestedListChildren.push(child as ListItemElement)\n return\n }\n\n if (SlateElement.isElement(child)) {\n appendTextLikeChildren(normalizedChildren, child.children, editor)\n }\n })\n\n // 无 children ,则用纯文本\n if (normalizedChildren.length === 0) {\n if (nestedListChildren.length > 0) {\n normalizedChildren.push({ text: '' })\n } else {\n normalizedChildren.push({ text: $elem.text().replace(/\\s+/gm, ' ') })\n }\n }\n\n const ordered = getOrdered($elem)\n const level = getLevel($elem)\n const start = getOrderedStart($elem)\n const orderType = getOrderedType($elem)\n\n const currentItem: ListItemElement = {\n type: 'list-item',\n ordered,\n level,\n ...(start !== undefined ? { start } : {}),\n ...(orderType !== undefined ? { orderType } : {}),\n // @ts-ignore\n children: normalizedChildren,\n }\n\n if (nestedListChildren.length === 0) { return currentItem }\n return [currentItem, ...nestedListChildren]\n}\n\nexport const parseItemHtmlConf = {\n selector: 'li:not([data-w-e-type])', // data-w-e-type 属性,留给自定义元素,保证扩展性\n parseElemHtml: parseItemHtml,\n}\n\nfunction parseListHtml(\n _elem: DOMElement,\n children: Descendant[],\n _editor: IDomEditor,\n): ListItemElement[] {\n // @ts-ignore flatten 因为可能有 ul/ol 嵌套,重要!!!\n return children.flat(Infinity)\n}\n\nexport const parseListHtmlConf = {\n selector: 'ul:not([data-w-e-type]),ol:not([data-w-e-type])', // data-w-e-type 属性,留给自定义元素,保证扩展性\n parseElemHtml: parseListHtml,\n}\n","/**\n * @description editor 插件,重写 editor API\n * @author wangfupeng\n */\n\nimport { DomEditor, IDomEditor } from '@wangeditor-next/core'\nimport {\n Editor, Range, Transforms,\n} from 'slate'\n\nimport { ListItemElement } from './custom-types'\nimport { getBrotherListNodeByLevel } from './helpers'\n\n/**\n * 获取选中的 top elems\n * @param editor editor\n */\nfunction getTopSelectedElemsBySelection(editor: IDomEditor) {\n return Editor.nodes(editor, {\n at: editor.selection || undefined,\n match: n => DomEditor.findPath(editor, n).length === 1, // 只匹配顶级元素\n })\n}\n\nfunction withList<T extends IDomEditor>(editor: T): T {\n const {\n deleteBackward, handleTab, normalizeNode, insertBreak,\n } = editor\n const newEditor = editor\n\n // 重写 insertBreak - 空 list 点击回车时删除该空 list\n newEditor.insertBreak = () => {\n const [nodeEntry] = Editor.nodes(editor, {\n match: n => DomEditor.checkNodeType(n, 'list-item'),\n universal: true,\n })\n\n if (!nodeEntry) { return insertBreak() }\n const listElem = nodeEntry[0] as ListItemElement\n\n if (listElem.children[0].text === '') {\n Transforms.setNodes(newEditor, {\n type: 'paragraph',\n // @ts-ignore\n ordered: undefined,\n level: undefined,\n start: undefined,\n orderType: undefined,\n })\n return\n }\n return insertBreak()\n }\n\n // 重写 deleteBackward - 降低 level 或者转换为 p 元素\n newEditor.deleteBackward = unit => {\n const { selection } = newEditor\n\n if (selection == null) {\n deleteBackward(unit)\n return\n }\n\n if (Range.isExpanded(selection)) {\n deleteBackward(unit)\n return\n }\n\n const listItemElem = DomEditor.getSelectedNodeByType(newEditor, 'list-item')\n\n if (listItemElem == null) {\n // 未匹配到 list-item\n deleteBackward(unit)\n return\n }\n\n if (selection.focus.offset === 0) {\n // 选中了当前 list-item 文本的开头,此时按删除键,应该降低 level 或转换为 p 元素\n const { level = 0 } = listItemElem as ListItemElement\n\n if (level > 0) {\n // 如果有兄弟节点,则对齐兄弟节点的列表配置\n const brotherElem = getBrotherListNodeByLevel(\n editor,\n listItemElem as ListItemElement,\n level - 1,\n )\n\n if (brotherElem) {\n const nextOrdered = brotherElem.ordered\n\n Transforms.setNodes(newEditor, {\n level: level - 1,\n ordered: nextOrdered,\n start: nextOrdered ? brotherElem.start : undefined,\n orderType: nextOrdered ? brotherElem.orderType : undefined,\n })\n } else {\n Transforms.setNodes(newEditor, { level: level - 1 })\n }\n } else {\n // 转换为 p 元素\n Transforms.setNodes(newEditor, {\n type: 'paragraph',\n // @ts-ignore\n ordered: undefined,\n level: undefined,\n start: undefined,\n orderType: undefined,\n })\n }\n return\n }\n\n // 其他情况\n deleteBackward(unit)\n }\n\n // 重写 tab - 当选中 list-item 文本开头时,增加 level\n newEditor.handleTab = () => {\n const { selection } = newEditor\n\n if (selection == null) {\n handleTab()\n return\n }\n\n // 选区是合并的,判断单个 list-item 即可\n if (Range.isCollapsed(selection)) {\n const listItemElem = DomEditor.getSelectedNodeByType(newEditor, 'list-item')\n\n if (listItemElem == null) {\n // 未匹配到 list-item\n handleTab()\n return\n }\n\n if (selection.focus.offset === 0) {\n // 选中了当前 list-item 文本的开头,此时按 tab 应该增加 level\n const { level = 0 } = listItemElem as ListItemElement\n\n Transforms.setNodes(newEditor, { level: level + 1 })\n return\n }\n }\n\n // 选区是展开的,要判断多个 list-item\n if (Range.isExpanded(selection)) {\n let listItemNum = 0 // 选中的 list-item 有几个\n let hasOtherElem = false // 是否有其他元素\n\n for (const entry of getTopSelectedElemsBySelection(newEditor)) {\n const [elem] = entry\n const type = DomEditor.getNodeType(elem)\n\n if (type === 'list-item') { listItemNum += 1 } else { hasOtherElem = true }\n }\n\n if (hasOtherElem || listItemNum <= 1) {\n // 选中了其他元素,或者只选中一个 list-item ,则执行默认行为\n handleTab()\n return\n }\n\n // 未选中其他元素,且选中多个 list-item ,则增加 level\n for (const entry of getTopSelectedElemsBySelection(newEditor)) {\n const [elem, path] = entry\n const { level = 0 } = elem as ListItemElement\n\n Transforms.setNodes(newEditor, { level: level + 1 }, { at: path })\n }\n return\n }\n\n // 其他情况\n handleTab()\n }\n\n // 兼容之前的 JSON 格式 `numbered-list` 和 `bulleted-list` (之前的 list 没有嵌套功能)\n newEditor.normalizeNode = ([node, path]) => {\n const type = DomEditor.getNodeType(node)\n\n if (type === 'bulleted-list' || type === 'numbered-list') {\n Transforms.unwrapNodes(newEditor, { at: path })\n }\n\n // 执行默认行为\n return normalizeNode([node, path])\n }\n\n return newEditor\n}\n\nexport default withList\n","/**\n * @description render list elem\n * @author wangfupeng\n */\n\nimport { DomEditor, IDomEditor } from '@wangeditor-next/core'\nimport {\n Editor, Element as SlateElement, Path,\n} from 'slate'\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { jsx, VNode } from 'snabbdom'\n\nimport { ELEM_TO_EDITOR } from '../utils/maps'\nimport { getListItemColor } from '../utils/util'\nimport { ListItemElement } from './custom-types'\nimport {\n getNormalizedOrderedListStart,\n getNormalizedOrderedListType,\n hasSameListConfig,\n} from './helpers'\n\n/**\n * 无序列表:根据 level 获取的前置符号\n * @param level 层级\n */\nfunction genPreSymbol(level = 0): string {\n let s = ''\n\n switch (level) {\n case 0:\n s = '•' // 第一层级\n break\n case 1:\n s = '◦' // 第一层级\n break\n case 2:\n s = '▪' // 第三层级\n break\n default:\n s = '▪' // 其他层级\n }\n return s\n}\n\nfunction genAlphabetIndex(num: number, upper = false): string {\n if (num <= 0) { return String(num) }\n\n let n = num\n let result = ''\n\n while (n > 0) {\n const rem = (n - 1) % 26\n const charCode = (upper ? 65 : 97) + rem\n\n result = String.fromCharCode(charCode) + result\n n = Math.floor((n - 1) / 26)\n }\n\n return result\n}\n\nfunction genRomanIndex(num: number, upper = false): string {\n if (num <= 0 || num >= 4000) { return String(num) }\n\n const romanMap: Array<[number, string]> = [\n [1000, 'M'],\n [900, 'CM'],\n [500, 'D'],\n [400, 'CD'],\n [100, 'C'],\n [90, 'XC'],\n [50, 'L'],\n [40, 'XL'],\n [10, 'X'],\n [9, 'IX'],\n [5, 'V'],\n [4, 'IV'],\n [1, 'I'],\n ]\n\n let n = num\n let result = ''\n\n for (const [value, roman] of romanMap) {\n while (n >= value) {\n result += roman\n n -= value\n }\n }\n\n return upper ? result : result.toLowerCase()\n}\n\nfunction genOrderedPrefix(num: number, orderType: string): string {\n switch (orderType) {\n case 'a':\n return `${genAlphabetIndex(num)}.`\n case 'A':\n return `${genAlphabetIndex(num, true)}.`\n case 'i':\n return `${genRomanIndex(num)}.`\n case 'I':\n return `${genRomanIndex(num, true)}.`\n default:\n return `${num}.`\n }\n}\n\n/**\n * 有序列表:获取前缀 number\n * @param editor editor\n * @param elem listItem elem\n */\nfunction getOrderedItemNumber(editor: IDomEditor, elem: SlateElement): number {\n const listItemElem = elem as ListItemElement\n const { type, level = 0, ordered = false } = listItemElem\n\n let num = getNormalizedOrderedListStart(listItemElem)\n let curElem = elem\n let curPath = DomEditor.findPath(editor, curElem)\n\n // 第一个元素,直接返回起始值\n if (curPath[0] === 0) { return num }\n\n while (curPath[0] > 0) {\n const prevPath = Path.previous(curPath)\n const prevEntry = Editor.node(editor, prevPath)\n\n if (prevEntry == null) { break }\n const prevElem = prevEntry[0] as ListItemElement // 上一个节点\n const { level: prevLevel = 0, type: prevType, ordered: prevOrdered } = prevElem\n\n // type 不一致,退出循环,不再累加 num\n if (prevType !== type) { break }\n // prevLevel 更小,退出循环,不再累加 num\n if (prevLevel < level) { break }\n\n if (prevLevel === level) {\n // level 一样,如果 list 配置不一致,则退出循环,不再累加 num\n if (prevOrdered !== ordered || !hasSameListConfig(prevElem, listItemElem)) { break }\n // level 一样,order 配置一致,则累加 num\n num += 1\n }\n\n // prevLevel 更大,不累加 num ,继续向前\n curElem = prevElem\n curPath = prevPath\n }\n\n return num\n}\n\nfunction renderListElem(\n elemNode: SlateElement,\n children: VNode[] | null,\n editor: IDomEditor,\n): VNode {\n ELEM_TO_EDITOR.set(elemNode, editor) // 记录 elem 和 editor 关系,elem-to-html 时要用\n\n const { level = 0, ordered = false } = elemNode as ListItemElement\n\n // 根据 level 增加 margin-left\n const listStyle = {\n margin: `5px 0 5px ${level * 20}px`,\n display: 'flex',\n alignItems: 'flex-start',\n }\n\n // list-item 前缀\n let prefix = ''\n\n if (ordered) {\n // 有序列表:获取前缀 number\n const orderedNumber = getOrderedItemNumber(editor, elemNode)\n const orderType = getNormalizedOrderedListType(elemNode as ListItemElement)\n\n prefix = genOrderedPrefix(orderedNumber, orderType)\n } else {\n // 无序列表:根据层级,使用不同的前缀符号\n prefix = genPreSymbol(level)\n }\n\n // 获取前缀颜色\n const prefixColor = getListItemColor(elemNode)\n\n const vnode = (\n <div style={listStyle}>\n <span\n contentEditable={false}\n style={{ marginRight: '0.5em', color: prefixColor }}\n data-w-e-reserve\n >\n {prefix}\n </span>\n <span style={{\n flex: '1',\n wordBreak: 'break-word',\n }}>{children}</span>\n </div>\n )\n\n return vnode\n}\n\nconst renderListItemConf = {\n type: 'list-item',\n renderElem: renderListElem,\n}\n\nexport default renderListItemConf\n","/**\n * @description list module entry\n * @author wangfupeng\n */\n\nimport { IModuleConf } from '@wangeditor-next/core'\n\nimport listItemToHtmlConf from './elem-to-html'\nimport {\n bulletedListMenuConf,\n numberedListLowerAlphaMenuConf,\n numberedListMenuConf,\n} from './menu/index'\nimport { parseItemHtmlConf, parseListHtmlConf } from './parse-elem-html'\nimport withList from './plugin'\nimport renderListItemConf from './render-elem'\n\nconst list: Partial<IModuleConf> = {\n renderElems: [renderListItemConf],\n editorPlugin: withList,\n menus: [bulletedListMenuConf, numberedListMenuConf, numberedListLowerAlphaMenuConf],\n elemsToHtml: [listItemToHtmlConf],\n parseElemsHtml: [parseListHtmlConf, parseItemHtmlConf],\n}\n\nexport default list\n"],"names":["i18nAddResources","listModule","unOrderedList","orderedList","lowerAlphaList","ELEM_TO_EDITOR","WeakMap","getListItemColor","elem","firstTextNode","children","length","i","child","Text","isText","color","getNormalizedOrderedListStart","_a","ordered","start","Number","isNaN","getNormalizedOrderedListType","orderType","hasSameListConfig","a","b","getBrotherListNodeByLevel","editor","level","type","otherProps","elemLevel","undefined","brotherPath","DomEditor","findPath","Path","previous","brotherEntry","Editor","node","brotherElem","__read","_b","brotherLevel","getNodeType","REPORTED_UNSUPPORTED_LIST_COLOR","Set","normalizeColorValue","value","trim","replace","toLowerCase","DEFAULT_COLOR_SET","map","genListColorClassName","normalized","concat","input","hash","input_1","__values","input_1_1","next","codePointAt","toString","hashStyleValue","hasRegisteredListColor","has","extraTokens","getConfig","styleClassTokens","normalizedColor","hasExtraRegisteredColor","CONTAINER_TAG_STACK","STACK_EDITOR","getFallbackContainerTag","getAdjacentListItem","index","direction","targetIndex","targetNode","checkNodeType","listItemToHtmlConf","elemToHtml","childrenHtml","startContainerStr","endContainerStr","listItemElem","containerTag","getContainerTag","containerStartTag","attrs","orderStart","push","join","genContainerStartTag","bindEditor","get","bindEditorWithChildren","Array","isArray","passedEditorWithChildren","editorContainsElem","candidate","indexOf","finalEditor","styleEditor","html","prefix","suffix","prevItem","nextItem","hasNestedNext","prevLevel","closeTag","pop","diff","brother","getPrevSameLevelListItem","prefixColor","textStyleMode","getTextStyleMode","colorStyle","colorClass","colorData","action","policy","getClassStylePolicy","fallback","message","reportKey","add","reportUnsupportedClassStyle","scene","Error","resolveListColorAction","tag","NUMBERED_LIST_SVG","BaseMenu","this","prototype","getListNode","getSelectedNodeByType","getValue","_editor","isActive","listNode","isDisabled","selection","getSelectedElems","some","isVoid","isBlock","includes","exec","_value","Transforms","setNodes","indent","BulletedListMenu","_super","_this","title","t","iconSvg","__extends","LowerAlphaListMenu","NumberedListMenu","bulletedListMenuConf","key","factory","numberedListMenuConf","numberedListLowerAlphaMenuConf","getTagName","$elem","tagName","isStructuralWhitespaceText","text","appendTextLikeChildren","target","forEach","isInline","SlateElement","isElement","getTopSelectedElemsBySelection","nodes","at","match","n","genAlphabetIndex","num","upper","String","result","charCode","fromCharCode","Math","floor","genRomanIndex","romanMap_1","romanMap_1_1","roman","append","$","fn","attr","parent","renderElems","renderElem","elemNode","set","_c","listStyle","margin","display","alignItems","orderedNumber","curElem","curPath","prevPath","prevEntry","prevElem","prevType","prevOrdered","getOrderedItemNumber","genOrderedPrefix","s","genPreSymbol","jsx","style","contentEditable","marginRight","flex","wordBreak","editorPlugin","deleteBackward","handleTab","normalizeNode","insertBreak","newEditor","nodeEntry","universal","unit","Range","isExpanded","focus","offset","nextOrdered","isCollapsed","listItemNum","hasOtherElem","_d","_e","done","_g","_h","_j","path","_k","unwrapNodes","menus","elemsToHtml","parseElemsHtml","selector","parseElemHtml","_elem","flat","Infinity","normalizedChildren","nestedListChildren","getOrdered","listAncestorCount","$cur","max","getLevel","$list","startStr","parseInt","getOrderedStart","getOrderedType","currentItem","__spreadArray"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{i18nAddResources as r,DomEditor as e,getClassStylePolicy as t,reportUnsupportedClassStyle as n,getTextStyleMode as o,t as i}from"@wangeditor-next/core";import{Text as l,Path as a,Editor as c,Transforms as u,Range as d}from"slate";import s,{append as f,attr as v,parent as p}from"dom7";import{jsx as g}from"snabbdom";r("en",{listModule:{unOrderedList:"Unordered list",orderedList:"Ordered list",lowerAlphaList:"Ordered list (a,b,c)"}}),r("zh-CN",{listModule:{unOrderedList:"无序列表",orderedList:"有序列表",lowerAlphaList:"有序列表(a,b,c)"}});var y=new WeakMap;function h(r){var e,t=r.children||[],n=t.length;if(0===n)return"";for(var o=0;o<n&&!e;o+=1){var i=t[o];l.isText(i)&&(e=i)}return null==e?"":e.color||""}var b=function(r,e){return b=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,e){r.__proto__=e}||function(r,e){for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&(r[t]=e[t])},b(r,e)};function m(r,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function t(){this.constructor=r}b(r,e),r.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}var w=function(){return w=Object.assign||function(r){for(var e,t=1,n=arguments.length;t<n;t++)for(var o in e=arguments[t])Object.prototype.hasOwnProperty.call(e,o)&&(r[o]=e[o]);return r},w.apply(this,arguments)};function x(r){var e="function"==typeof Symbol&&Symbol.iterator,t=e&&r[e],n=0;if(t)return t.call(r);if(r&&"number"==typeof r.length)return{next:function(){return r&&n>=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function N(r,e){var t="function"==typeof Symbol&&r[Symbol.iterator];if(!t)return r;var n,o,i=t.call(r),l=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)l.push(n.value)}catch(r){o={error:r}}finally{try{n&&!n.done&&(t=i.return)&&t.call(i)}finally{if(o)throw o.error}}return l}function T(r,e,t){if(t||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return r.concat(n||Array.prototype.slice.call(e))}function k(r){var e=r.ordered,t=void 0!==e&&e,n=r.start;return t?"number"!=typeof n||Number.isNaN(n)?1:n:1}function O(r){var e=r.orderType;return"a"===e||"A"===e||"i"===e||"I"===e?e:"1"}function S(r,e){return r.ordered===e.ordered&&(!r.ordered||O(r)===O(e)&&k(r)===k(e))}function L(r,t,n){for(var o=t.type,i=function(r,e){var t={};for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&e.indexOf(n)<0&&(t[n]=r[n]);if(null!=r&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(n=Object.getOwnPropertySymbols(r);o<n.length;o++)e.indexOf(n[o])<0&&Object.prototype.propertyIsEnumerable.call(r,n[o])&&(t[n[o]]=r[n[o]])}return t}(t,["type"]),l=void 0!==n?n:i.level||0,u=e.findPath(r,t);;){if(0===u.length||0===u[u.length-1])return null;u=a.previous(u);var d=c.node(r,u);if(!d)return null;var s=N(d,1)[0],f=s.level,v=void 0===f?0:f;if(e.getNodeType(s)!==o)return null;if(v===l)return s}}"function"==typeof SuppressedError&&SuppressedError;var H=new Set;function A(r){return(r||"").trim().replace(/\s+/g,"").toLowerCase()}var E=new Set(["rgb(0, 0, 0)","rgb(38, 38, 38)","rgb(89, 89, 89)","rgb(140, 140, 140)","rgb(191, 191, 191)","rgb(217, 217, 217)","rgb(233, 233, 233)","rgb(245, 245, 245)","rgb(250, 250, 250)","rgb(255, 255, 255)","rgb(225, 60, 57)","rgb(231, 95, 51)","rgb(235, 144, 58)","rgb(245, 219, 77)","rgb(114, 192, 64)","rgb(89, 191, 192)","rgb(66, 144, 247)","rgb(54, 88, 226)","rgb(106, 57, 201)","rgb(216, 68, 147)","rgb(251, 233, 230)","rgb(252, 237, 225)","rgb(252, 239, 212)","rgb(252, 251, 207)","rgb(231, 246, 213)","rgb(218, 244, 240)","rgb(217, 237, 250)","rgb(224, 232, 250)","rgb(237, 225, 248)","rgb(246, 226, 234)","rgb(255, 163, 158)","rgb(255, 187, 150)","rgb(255, 213, 145)","rgb(255, 251, 143)","rgb(183, 235, 143)","rgb(135, 232, 222)","rgb(145, 213, 255)","rgb(173, 198, 255)","rgb(211, 173, 247)","rgb(255, 173, 210)","rgb(255, 77, 79)","rgb(255, 122, 69)","rgb(255, 169, 64)","rgb(255, 236, 61)","rgb(115, 209, 61)","rgb(54, 207, 201)","rgb(64, 169, 255)","rgb(89, 126, 247)","rgb(146, 84, 222)","rgb(247, 89, 171)","rgb(207, 19, 34)","rgb(212, 56, 13)","rgb(212, 107, 8)","rgb(212, 177, 6)","rgb(56, 158, 13)","rgb(8, 151, 156)","rgb(9, 109, 217)","rgb(29, 57, 196)","rgb(83, 29, 171)","rgb(196, 29, 127)","rgb(130, 0, 20)","rgb(135, 20, 0)","rgb(135, 56, 0)","rgb(97, 71, 0)","rgb(19, 82, 0)","rgb(0, 71, 79)","rgb(0, 58, 140)","rgb(6, 17, 120)","rgb(34, 7, 94)","rgb(120, 6, 80)"].map(function(r){return A(r)}));function M(r){var e=A(r);return"w-e-list-color-".concat(function(r){var e,t,n=7;try{for(var o=x(r),i=o.next();!i.done;i=o.next())n=(31*n+(i.value.codePointAt(0)||0))%2147483647}catch(r){e={error:r}}finally{try{i&&!i.done&&(t=o.return)&&t.call(o)}finally{if(e)throw e.error}}return n.toString(36)}("color:".concat(e)))}function z(r,e){var t=A(e);return!!t&&(!!E.has(t)||!!function(r,e){for(var t,n=(null===(t=null==r?void 0:r.getConfig().styleClassTokens)||void 0===t?void 0:t.color)||[],o=A(e),i=0;i<n.length;i+=1)if(A(n[i])===o)return!0;return!1}(r,e))}var C=[],j=null;function B(r){return r.ordered?"ol":"ul"}function P(r,t,n){if("prev"===n&&0===t)return null;if("next"===n&&t===r.children.length-1)return null;var o="prev"===n?t-1:t+1,i=r.children[o];return e.checkNodeType(i,"list-item")?i:null}var I={type:"list-item",elemToHtml:function(r,i,l){var a="",c="",u=r,d=u.level,s=void 0===d?0:d,f=function(r){return r.ordered?"ol":"ul"}(u),v=function(r){var e=r.ordered;if(void 0===e||!e)return"<ul>";var t=[],n=O(r),o=k(r);return"1"!==n&&t.push('type="'.concat(n,'"')),1!==o&&t.push('start="'.concat(o,'"')),0===t.length?"<ol>":"<ol ".concat(t.join(" "),">")}(u),p=y.get(r),g=p&&Array.isArray(p.children)?p:null,b=l&&Array.isArray(l.children)?l:null,m=function(e){return!!e&&e.children.indexOf(r)>=0},w=b||g;m(b)?w=b:m(g)&&(w=g);var x=l||p;if(null==w)return{html:"<li>".concat(i,"</li>"),prefix:"",suffix:""};j!==w&&(C.length=0,j=w);var N=w.children.indexOf(r);if(N<0)return{html:"<li>".concat(i,"</li>"),prefix:"",suffix:""};var T=P(w,N,"prev"),L=P(w,N,"next"),A=!!L&&(L.level||0)>s;if(T){var E=T.level||0;if(s>E)for(X=0;X<s-E;X+=1)a+=v,C.push(f);else if(s===E){if(!S(T,u)){var I=C.pop()||B(T);a+="</".concat(I,">").concat(v),C.push(f)}}else{for(var V=E-s;V>0;){I=C.pop()||B(T);a+="</".concat(I,"></li>"),V-=1}var _=function(r,t,n){for(var o=t-1;o>=0;o-=1){var i=r.children[o];if(e.checkNodeType(i,"list-item")&&(i.level||0)===n)return i}return null}(w,N,s);if(_&&!S(_,u)){I=C.pop()||B(_);a+="</".concat(I,">").concat(v),C.push(f)}}}else{C.length=0;for(var X=0;X<s+1;X+=1)a+=v,C.push(f)}var D=h(r),U=o(x),R="",W="",q="";if(D)if("class"===U){q=' data-w-e-color="'.concat(D,'"');var F=function(r,e){if(z(r,e))return"class";var o=t(r),i="preserve-data";"fallback-inline"===o&&(i="inline"),"strict"===o&&(i="throw");var l="[wangeditor] Unsupported list color class token color=".concat(e,". policy=").concat(o),a="".concat(e,"|").concat(i);if(H.has(a)||(H.add(a),n(r,{type:"color",value:e,scene:"toHtml",fallback:i,message:l})),"throw"===i)throw new Error(l);return"inline"===i?"inline":"preserve-data"}(x,D);"class"===F?W=' class="'.concat(M(D),'"'):"inline"===F&&(R=' style="color:'.concat(D,'"'))}else R=' style="color:'.concat(D,'"');var G="<li".concat(W).concat(q).concat(R,">").concat(i).concat(A?"":"</li>");if(!L){for(;C.length>0;){var J=C.pop();if(!J)break;c+="</".concat(J,">"),C.length>0&&(c+="</li>")}j=null}return{html:G,prefix:a,suffix:c}}},V='<svg viewBox="0 0 1024 1024"><path d="M384 832h640v128H384z m0-384h640v128H384z m0-384h640v128H384zM192 0v256H128V64H64V0zM128 526.016v50.016h128v64H64v-146.016l128-60V384H64v-64h192v146.016zM256 704v320H64v-64h128v-64H64v-64h128v-64H64v-64z"></path></svg>',_=function(){function r(){this.type="list-item",this.tag="button"}return r.prototype.getListNode=function(r){var t=this.type;return e.getSelectedNodeByType(r,t)},r.prototype.getValue=function(r){return""},r.prototype.isActive=function(r){var e=this.getListNode(r);if(null==e)return!1;var t=e,n=t.ordered,o=void 0!==n&&n;return o===this.ordered&&(!o||O(t)===(this.orderType||"1"))},r.prototype.isDisabled=function(r){return null==r.selection||!!e.getSelectedElems(r).some(function(e){if(c.isVoid(r,e)&&c.isBlock(r,e))return!0;var t=e.type;return!!["pre","code","table"].includes(t)})},r.prototype.exec=function(r,e){this.isActive(r)?u.setNodes(r,{type:"paragraph",ordered:void 0,level:void 0,start:void 0,orderType:void 0}):u.setNodes(r,{type:"list-item",ordered:this.ordered,indent:void 0,start:void 0,orderType:this.ordered?this.orderType:void 0})},r}(),X=function(r){function e(){var e=r.apply(this,T([],N(arguments),!1))||this;return e.ordered=!1,e.title=i("listModule.unOrderedList"),e.iconSvg='<svg viewBox="0 0 1024 1024"><path d="M384 64h640v128H384V64z m0 384h640v128H384v-128z m0 384h640v128H384v-128zM0 128a128 128 0 1 1 256 0 128 128 0 0 1-256 0z m0 384a128 128 0 1 1 256 0 128 128 0 0 1-256 0z m0 384a128 128 0 1 1 256 0 128 128 0 0 1-256 0z"></path></svg>',e}return m(e,r),e}(_),D=function(r){function e(){var e=r.apply(this,T([],N(arguments),!1))||this;return e.ordered=!0,e.orderType="a",e.title=i("listModule.lowerAlphaList"),e.iconSvg=V,e}return m(e,r),e}(_),U=function(r){function e(){var e=r.apply(this,T([],N(arguments),!1))||this;return e.ordered=!0,e.title=i("listModule.orderedList"),e.iconSvg=V,e}return m(e,r),e}(_),R={key:"bulletedList",factory:function(){return new X}},W={key:"numberedList",factory:function(){return new U}},q={key:"numberedListLowerAlpha",factory:function(){return new D}};function F(r){return r.length?r[0].tagName.toLowerCase():""}function G(r){return c.nodes(r,{at:r.selection||void 0,match:function(t){return 1===e.findPath(r,t).length}})}function J(r,e){if(void 0===e&&(e=!1),r<=0)return String(r);for(var t=r,n="";t>0;){var o=(e?65:97)+(t-1)%26;n=String.fromCharCode(o)+n,t=Math.floor((t-1)/26)}return n}function K(r,e){var t,n;if(void 0===e&&(e=!1),r<=0||r>=4e3)return String(r);var o=r,i="";try{for(var l=x([[1e3,"M"],[900,"CM"],[500,"D"],[400,"CD"],[100,"C"],[90,"XC"],[50,"L"],[40,"XL"],[10,"X"],[9,"IX"],[5,"V"],[4,"IV"],[1,"I"]]),a=l.next();!a.done;a=l.next())for(var c=N(a.value,2),u=c[0],d=c[1];o>=u;)i+=d,o-=u}catch(r){t={error:r}}finally{try{a&&!a.done&&(n=l.return)&&n.call(l)}finally{if(t)throw t.error}}return e?i:i.toLowerCase()}f&&(s.fn.append=f),v&&(s.fn.attr=v),p&&(s.fn.parent=p);var Q={renderElems:[{type:"list-item",renderElem:function(r,t,n){y.set(r,n);var o=r,i=o.level,l=void 0===i?0:i,u=o.ordered,d=void 0!==u&&u,s={margin:"5px 0 5px ".concat(20*l,"px"),display:"flex",alignItems:"flex-start"},f="";if(d){var v=function(r,t){var n=t,o=n.type,i=n.level,l=void 0===i?0:i,u=n.ordered,d=void 0!==u&&u,s=k(n),f=t,v=e.findPath(r,f);if(0===v[0])return s;for(;v[0]>0;){var p=a.previous(v),g=c.node(r,p);if(null==g)break;var y=g[0],h=y.level,b=void 0===h?0:h,m=y.type,w=y.ordered;if(m!==o)break;if(b<l)break;if(b===l){if(w!==d||!S(y,n))break;s+=1}f=y,v=p}return s}(n,r);f=function(r,e){switch(e){case"a":return"".concat(J(r),".");case"A":return"".concat(J(r,!0),".");case"i":return"".concat(K(r),".");case"I":return"".concat(K(r,!0),".");default:return"".concat(r,".")}}(v,O(r))}else f=function(r){void 0===r&&(r=0);var e="";switch(r){case 0:e="•";break;case 1:e="◦";break;default:e="▪"}return e}(l);var p=h(r);return g("div",{style:s},g("span",{contentEditable:!1,style:{marginRight:"0.5em",color:p},"data-w-e-reserve":!0},f),g("span",{style:{flex:"1",wordBreak:"break-word"}},t))}}],editorPlugin:function(r){var t=r.deleteBackward,n=r.handleTab,o=r.normalizeNode,i=r.insertBreak,l=r;return l.insertBreak=function(){var t=N(c.nodes(r,{match:function(r){return e.checkNodeType(r,"list-item")},universal:!0}),1)[0];return t?""!==t[0].children[0].text?i():void u.setNodes(l,{type:"paragraph",ordered:void 0,level:void 0,start:void 0,orderType:void 0}):i()},l.deleteBackward=function(n){var o=l.selection;if(null!=o)if(d.isExpanded(o))t(n);else{var i=e.getSelectedNodeByType(l,"list-item");if(null!=i)if(0!==o.focus.offset)t(n);else{var a=i.level,c=void 0===a?0:a;if(c>0){var s=L(r,i,c-1);if(s){var f=s.ordered;u.setNodes(l,{level:c-1,ordered:f,start:f?s.start:void 0,orderType:f?s.orderType:void 0})}else u.setNodes(l,{level:c-1})}else u.setNodes(l,{type:"paragraph",ordered:void 0,level:void 0,start:void 0,orderType:void 0})}else t(n)}else t(n)},l.handleTab=function(){var r,t,o,i,a=l.selection;if(null!=a){if(d.isCollapsed(a)){var c=e.getSelectedNodeByType(l,"list-item");if(null==c)return void n();if(0===a.focus.offset){var s=c.level,f=void 0===s?0:s;return void u.setNodes(l,{level:f+1})}}if(d.isExpanded(a)){var v=0,p=!1;try{for(var g=x(G(l)),y=g.next();!y.done;y=g.next()){var h=N(y.value,1)[0];"list-item"===e.getNodeType(h)?v+=1:p=!0}}catch(e){r={error:e}}finally{try{y&&!y.done&&(t=g.return)&&t.call(g)}finally{if(r)throw r.error}}if(p||v<=1)return void n();try{for(var b=x(G(l)),m=b.next();!m.done;m=b.next()){var w=N(m.value,2),T=(h=w[0],w[1]),k=h.level;f=void 0===k?0:k;u.setNodes(l,{level:f+1},{at:T})}}catch(r){o={error:r}}finally{try{m&&!m.done&&(i=b.return)&&i.call(b)}finally{if(o)throw o.error}}}else n()}else n()},l.normalizeNode=function(r){var t=N(r,2),n=t[0],i=t[1],a=e.getNodeType(n);return"bulleted-list"!==a&&"numbered-list"!==a||u.unwrapNodes(l,{at:i}),o([n,i])},l},menus:[R,W,q],elemsToHtml:[I],parseElemsHtml:[{selector:"ul:not([data-w-e-type]),ol:not([data-w-e-type])",parseElemHtml:function(r,e,t){return e.flat(1/0)}},{selector:"li:not([data-w-e-type])",parseElemHtml:function(r,t,n){var o=s(r),i=[],a=[];t.forEach(function(r){l.isText(r)||n.isInline(r)?i.push(r):e.checkNodeType(r,"list-item")&&a.push(r)}),0===i.length&&(a.length>0?i.push({text:""}):i.push({text:o.text().replace(/\s+/gm," ")}));var c=function(r){return"ol"===F(r.parent())}(o),u=function(r){for(var e=0,t=r.parent();t.length>0;){var n=F(t);"ul"!==n&&"ol"!==n||(e+=1),t=t.parent()}return Math.max(0,e-1)}(o),d=function(r){var e=r.parent();if("ol"===F(e)){var t=(e.attr("start")||"").trim();if(""!==t){var n=Number.parseInt(t,10);if(!Number.isNaN(n))return n}}}(o),f=function(r){var e=r.parent();if("ol"===F(e)){var t=(e.attr("type")||"").trim();return"1"===t||"a"===t||"A"===t||"i"===t||"I"===t?t:void 0}}(o),v=w(w(w({type:"list-item",ordered:c,level:u},void 0!==d?{start:d}:{}),void 0!==f?{orderType:f}:{}),{children:i});return 0===a.length?v:T([v],N(a),!1)}}]};export{Q as default};
1
+ import{i18nAddResources as r,DomEditor as e,getClassStylePolicy as t,reportUnsupportedClassStyle as n,getTextStyleMode as o,t as i}from"@wangeditor-next/core";import{Text as l,Path as a,Editor as c,Transforms as u,Element as d,Range as s}from"slate";import f,{append as v,attr as p,parent as g}from"dom7";import{jsx as h}from"snabbdom";r("en",{listModule:{unOrderedList:"Unordered list",orderedList:"Ordered list",lowerAlphaList:"Ordered list (a,b,c)"}}),r("zh-CN",{listModule:{unOrderedList:"无序列表",orderedList:"有序列表",lowerAlphaList:"有序列表(a,b,c)"}});var y=new WeakMap;function b(r){var e,t=r.children||[],n=t.length;if(0===n)return"";for(var o=0;o<n&&!e;o+=1){var i=t[o];l.isText(i)&&(e=i)}return null==e?"":e.color||""}var m=function(r,e){return m=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,e){r.__proto__=e}||function(r,e){for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&(r[t]=e[t])},m(r,e)};function w(r,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function t(){this.constructor=r}m(r,e),r.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}var x=function(){return x=Object.assign||function(r){for(var e,t=1,n=arguments.length;t<n;t++)for(var o in e=arguments[t])Object.prototype.hasOwnProperty.call(e,o)&&(r[o]=e[o]);return r},x.apply(this,arguments)};function N(r){var e="function"==typeof Symbol&&Symbol.iterator,t=e&&r[e],n=0;if(t)return t.call(r);if(r&&"number"==typeof r.length)return{next:function(){return r&&n>=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function T(r,e){var t="function"==typeof Symbol&&r[Symbol.iterator];if(!t)return r;var n,o,i=t.call(r),l=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)l.push(n.value)}catch(r){o={error:r}}finally{try{n&&!n.done&&(t=i.return)&&t.call(i)}finally{if(o)throw o.error}}return l}function k(r,e,t){if(t||2===arguments.length)for(var n,o=0,i=e.length;o<i;o++)!n&&o in e||(n||(n=Array.prototype.slice.call(e,0,o)),n[o]=e[o]);return r.concat(n||Array.prototype.slice.call(e))}function O(r){var e=r.ordered,t=void 0!==e&&e,n=r.start;return t?"number"!=typeof n||Number.isNaN(n)?1:n:1}function S(r){var e=r.orderType;return"a"===e||"A"===e||"i"===e||"I"===e?e:"1"}function L(r,e){return r.ordered===e.ordered&&(!r.ordered||S(r)===S(e)&&O(r)===O(e))}function E(r,t,n){for(var o=t.type,i=function(r,e){var t={};for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&e.indexOf(n)<0&&(t[n]=r[n]);if(null!=r&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(n=Object.getOwnPropertySymbols(r);o<n.length;o++)e.indexOf(n[o])<0&&Object.prototype.propertyIsEnumerable.call(r,n[o])&&(t[n[o]]=r[n[o]])}return t}(t,["type"]),l=void 0!==n?n:i.level||0,u=e.findPath(r,t);;){if(0===u.length||0===u[u.length-1])return null;u=a.previous(u);var d=c.node(r,u);if(!d)return null;var s=T(d,1)[0],f=s.level,v=void 0===f?0:f;if(e.getNodeType(s)!==o)return null;if(v===l)return s}}"function"==typeof SuppressedError&&SuppressedError;var H=new Set;function A(r){return(r||"").trim().replace(/\s+/g,"").toLowerCase()}var M=new Set(["rgb(0, 0, 0)","rgb(38, 38, 38)","rgb(89, 89, 89)","rgb(140, 140, 140)","rgb(191, 191, 191)","rgb(217, 217, 217)","rgb(233, 233, 233)","rgb(245, 245, 245)","rgb(250, 250, 250)","rgb(255, 255, 255)","rgb(225, 60, 57)","rgb(231, 95, 51)","rgb(235, 144, 58)","rgb(245, 219, 77)","rgb(114, 192, 64)","rgb(89, 191, 192)","rgb(66, 144, 247)","rgb(54, 88, 226)","rgb(106, 57, 201)","rgb(216, 68, 147)","rgb(251, 233, 230)","rgb(252, 237, 225)","rgb(252, 239, 212)","rgb(252, 251, 207)","rgb(231, 246, 213)","rgb(218, 244, 240)","rgb(217, 237, 250)","rgb(224, 232, 250)","rgb(237, 225, 248)","rgb(246, 226, 234)","rgb(255, 163, 158)","rgb(255, 187, 150)","rgb(255, 213, 145)","rgb(255, 251, 143)","rgb(183, 235, 143)","rgb(135, 232, 222)","rgb(145, 213, 255)","rgb(173, 198, 255)","rgb(211, 173, 247)","rgb(255, 173, 210)","rgb(255, 77, 79)","rgb(255, 122, 69)","rgb(255, 169, 64)","rgb(255, 236, 61)","rgb(115, 209, 61)","rgb(54, 207, 201)","rgb(64, 169, 255)","rgb(89, 126, 247)","rgb(146, 84, 222)","rgb(247, 89, 171)","rgb(207, 19, 34)","rgb(212, 56, 13)","rgb(212, 107, 8)","rgb(212, 177, 6)","rgb(56, 158, 13)","rgb(8, 151, 156)","rgb(9, 109, 217)","rgb(29, 57, 196)","rgb(83, 29, 171)","rgb(196, 29, 127)","rgb(130, 0, 20)","rgb(135, 20, 0)","rgb(135, 56, 0)","rgb(97, 71, 0)","rgb(19, 82, 0)","rgb(0, 71, 79)","rgb(0, 58, 140)","rgb(6, 17, 120)","rgb(34, 7, 94)","rgb(120, 6, 80)"].map(function(r){return A(r)}));function z(r){var e=A(r);return"w-e-list-color-".concat(function(r){var e,t,n=7;try{for(var o=N(r),i=o.next();!i.done;i=o.next())n=(31*n+(i.value.codePointAt(0)||0))%2147483647}catch(r){e={error:r}}finally{try{i&&!i.done&&(t=o.return)&&t.call(o)}finally{if(e)throw e.error}}return n.toString(36)}("color:".concat(e)))}function C(r,e){var t=A(e);return!!t&&(!!M.has(t)||!!function(r,e){for(var t,n=(null===(t=null==r?void 0:r.getConfig().styleClassTokens)||void 0===t?void 0:t.color)||[],o=A(e),i=0;i<n.length;i+=1)if(A(n[i])===o)return!0;return!1}(r,e))}var j=[],B=null;function I(r){return r.ordered?"ol":"ul"}function P(r,t,n){if("prev"===n&&0===t)return null;if("next"===n&&t===r.children.length-1)return null;var o="prev"===n?t-1:t+1,i=r.children[o];return e.checkNodeType(i,"list-item")?i:null}var V={type:"list-item",elemToHtml:function(r,i,l){var a="",c="",u=r,d=u.level,s=void 0===d?0:d,f=function(r){return r.ordered?"ol":"ul"}(u),v=function(r){var e=r.ordered;if(void 0===e||!e)return"<ul>";var t=[],n=S(r),o=O(r);return"1"!==n&&t.push('type="'.concat(n,'"')),1!==o&&t.push('start="'.concat(o,'"')),0===t.length?"<ol>":"<ol ".concat(t.join(" "),">")}(u),p=y.get(r),g=p&&Array.isArray(p.children)?p:null,h=l&&Array.isArray(l.children)?l:null,m=function(e){return!!e&&e.children.indexOf(r)>=0},w=h||g;m(h)?w=h:m(g)&&(w=g);var x=l||p;if(null==w)return{html:"<li>".concat(i,"</li>"),prefix:"",suffix:""};B!==w&&(j.length=0,B=w);var N=w.children.indexOf(r);if(N<0)return{html:"<li>".concat(i,"</li>"),prefix:"",suffix:""};var T=P(w,N,"prev"),k=P(w,N,"next"),E=!!k&&(k.level||0)>s;if(T){var A=T.level||0;if(s>A)for(X=0;X<s-A;X+=1)a+=v,j.push(f);else if(s===A){if(!L(T,u)){var M=j.pop()||I(T);a+="</".concat(M,">").concat(v),j.push(f)}}else{for(var V=A-s;V>0;){M=j.pop()||I(T);a+="</".concat(M,"></li>"),V-=1}var _=function(r,t,n){for(var o=t-1;o>=0;o-=1){var i=r.children[o];if(e.checkNodeType(i,"list-item")&&(i.level||0)===n)return i}return null}(w,N,s);if(_&&!L(_,u)){M=j.pop()||I(_);a+="</".concat(M,">").concat(v),j.push(f)}}}else{j.length=0;for(var X=0;X<s+1;X+=1)a+=v,j.push(f)}var D=b(r),U=o(x),R="",W="",q="";if(D)if("class"===U){q=' data-w-e-color="'.concat(D,'"');var F=function(r,e){if(C(r,e))return"class";var o=t(r),i="preserve-data";"fallback-inline"===o&&(i="inline"),"strict"===o&&(i="throw");var l="[wangeditor] Unsupported list color class token color=".concat(e,". policy=").concat(o),a="".concat(e,"|").concat(i);if(H.has(a)||(H.add(a),n(r,{type:"color",value:e,scene:"toHtml",fallback:i,message:l})),"throw"===i)throw new Error(l);return"inline"===i?"inline":"preserve-data"}(x,D);"class"===F?W=' class="'.concat(z(D),'"'):"inline"===F&&(R=' style="color:'.concat(D,'"'))}else R=' style="color:'.concat(D,'"');var G="<li".concat(W).concat(q).concat(R,">").concat(i).concat(E?"":"</li>");if(!k){for(;j.length>0;){var J=j.pop();if(!J)break;c+="</".concat(J,">"),j.length>0&&(c+="</li>")}B=null}return{html:G,prefix:a,suffix:c}}},_='<svg viewBox="0 0 1024 1024"><path d="M384 832h640v128H384z m0-384h640v128H384z m0-384h640v128H384zM192 0v256H128V64H64V0zM128 526.016v50.016h128v64H64v-146.016l128-60V384H64v-64h192v146.016zM256 704v320H64v-64h128v-64H64v-64h128v-64H64v-64z"></path></svg>',X=function(){function r(){this.type="list-item",this.tag="button"}return r.prototype.getListNode=function(r){var t=this.type;return e.getSelectedNodeByType(r,t)},r.prototype.getValue=function(r){return""},r.prototype.isActive=function(r){var e=this.getListNode(r);if(null==e)return!1;var t=e,n=t.ordered,o=void 0!==n&&n;return o===this.ordered&&(!o||S(t)===(this.orderType||"1"))},r.prototype.isDisabled=function(r){return null==r.selection||!!e.getSelectedElems(r).some(function(e){if(c.isVoid(r,e)&&c.isBlock(r,e))return!0;var t=e.type;return!!["pre","code","table"].includes(t)})},r.prototype.exec=function(r,e){this.isActive(r)?u.setNodes(r,{type:"paragraph",ordered:void 0,level:void 0,start:void 0,orderType:void 0}):u.setNodes(r,{type:"list-item",ordered:this.ordered,indent:void 0,start:void 0,orderType:this.ordered?this.orderType:void 0})},r}(),D=function(r){function e(){var e=r.apply(this,k([],T(arguments),!1))||this;return e.ordered=!1,e.title=i("listModule.unOrderedList"),e.iconSvg='<svg viewBox="0 0 1024 1024"><path d="M384 64h640v128H384V64z m0 384h640v128H384v-128z m0 384h640v128H384v-128zM0 128a128 128 0 1 1 256 0 128 128 0 0 1-256 0z m0 384a128 128 0 1 1 256 0 128 128 0 0 1-256 0z m0 384a128 128 0 1 1 256 0 128 128 0 0 1-256 0z"></path></svg>',e}return w(e,r),e}(X),U=function(r){function e(){var e=r.apply(this,k([],T(arguments),!1))||this;return e.ordered=!0,e.orderType="a",e.title=i("listModule.lowerAlphaList"),e.iconSvg=_,e}return w(e,r),e}(X),R=function(r){function e(){var e=r.apply(this,k([],T(arguments),!1))||this;return e.ordered=!0,e.title=i("listModule.orderedList"),e.iconSvg=_,e}return w(e,r),e}(X),W={key:"bulletedList",factory:function(){return new D}},q={key:"numberedList",factory:function(){return new R}},F={key:"numberedListLowerAlpha",factory:function(){return new U}};function G(r){return r.length?r[0].tagName.toLowerCase():""}function J(r){return l.isText(r)&&""===r.text.trim()}function K(r,e,t){e.forEach(function(e){J(e)||(l.isText(e)||t.isInline(e)?r.push(e):d.isElement(e)&&K(r,e.children,t))})}function Q(r){return c.nodes(r,{at:r.selection||void 0,match:function(t){return 1===e.findPath(r,t).length}})}function Y(r,e){if(void 0===e&&(e=!1),r<=0)return String(r);for(var t=r,n="";t>0;){var o=(e?65:97)+(t-1)%26;n=String.fromCharCode(o)+n,t=Math.floor((t-1)/26)}return n}function Z(r,e){var t,n;if(void 0===e&&(e=!1),r<=0||r>=4e3)return String(r);var o=r,i="";try{for(var l=N([[1e3,"M"],[900,"CM"],[500,"D"],[400,"CD"],[100,"C"],[90,"XC"],[50,"L"],[40,"XL"],[10,"X"],[9,"IX"],[5,"V"],[4,"IV"],[1,"I"]]),a=l.next();!a.done;a=l.next())for(var c=T(a.value,2),u=c[0],d=c[1];o>=u;)i+=d,o-=u}catch(r){t={error:r}}finally{try{a&&!a.done&&(n=l.return)&&n.call(l)}finally{if(t)throw t.error}}return e?i:i.toLowerCase()}v&&(f.fn.append=v),p&&(f.fn.attr=p),g&&(f.fn.parent=g);var $={renderElems:[{type:"list-item",renderElem:function(r,t,n){y.set(r,n);var o=r,i=o.level,l=void 0===i?0:i,u=o.ordered,d=void 0!==u&&u,s={margin:"5px 0 5px ".concat(20*l,"px"),display:"flex",alignItems:"flex-start"},f="";if(d){var v=function(r,t){var n=t,o=n.type,i=n.level,l=void 0===i?0:i,u=n.ordered,d=void 0!==u&&u,s=O(n),f=t,v=e.findPath(r,f);if(0===v[0])return s;for(;v[0]>0;){var p=a.previous(v),g=c.node(r,p);if(null==g)break;var h=g[0],y=h.level,b=void 0===y?0:y,m=h.type,w=h.ordered;if(m!==o)break;if(b<l)break;if(b===l){if(w!==d||!L(h,n))break;s+=1}f=h,v=p}return s}(n,r);f=function(r,e){switch(e){case"a":return"".concat(Y(r),".");case"A":return"".concat(Y(r,!0),".");case"i":return"".concat(Z(r),".");case"I":return"".concat(Z(r,!0),".");default:return"".concat(r,".")}}(v,S(r))}else f=function(r){void 0===r&&(r=0);var e="";switch(r){case 0:e="•";break;case 1:e="◦";break;default:e="▪"}return e}(l);var p=b(r);return h("div",{style:s},h("span",{contentEditable:!1,style:{marginRight:"0.5em",color:p},"data-w-e-reserve":!0},f),h("span",{style:{flex:"1",wordBreak:"break-word"}},t))}}],editorPlugin:function(r){var t=r.deleteBackward,n=r.handleTab,o=r.normalizeNode,i=r.insertBreak,l=r;return l.insertBreak=function(){var t=T(c.nodes(r,{match:function(r){return e.checkNodeType(r,"list-item")},universal:!0}),1)[0];return t?""!==t[0].children[0].text?i():void u.setNodes(l,{type:"paragraph",ordered:void 0,level:void 0,start:void 0,orderType:void 0}):i()},l.deleteBackward=function(n){var o=l.selection;if(null!=o)if(s.isExpanded(o))t(n);else{var i=e.getSelectedNodeByType(l,"list-item");if(null!=i)if(0!==o.focus.offset)t(n);else{var a=i.level,c=void 0===a?0:a;if(c>0){var d=E(r,i,c-1);if(d){var f=d.ordered;u.setNodes(l,{level:c-1,ordered:f,start:f?d.start:void 0,orderType:f?d.orderType:void 0})}else u.setNodes(l,{level:c-1})}else u.setNodes(l,{type:"paragraph",ordered:void 0,level:void 0,start:void 0,orderType:void 0})}else t(n)}else t(n)},l.handleTab=function(){var r,t,o,i,a=l.selection;if(null!=a){if(s.isCollapsed(a)){var c=e.getSelectedNodeByType(l,"list-item");if(null==c)return void n();if(0===a.focus.offset){var d=c.level,f=void 0===d?0:d;return void u.setNodes(l,{level:f+1})}}if(s.isExpanded(a)){var v=0,p=!1;try{for(var g=N(Q(l)),h=g.next();!h.done;h=g.next()){var y=T(h.value,1)[0];"list-item"===e.getNodeType(y)?v+=1:p=!0}}catch(e){r={error:e}}finally{try{h&&!h.done&&(t=g.return)&&t.call(g)}finally{if(r)throw r.error}}if(p||v<=1)return void n();try{for(var b=N(Q(l)),m=b.next();!m.done;m=b.next()){var w=T(m.value,2),x=(y=w[0],w[1]),k=y.level;f=void 0===k?0:k;u.setNodes(l,{level:f+1},{at:x})}}catch(r){o={error:r}}finally{try{m&&!m.done&&(i=b.return)&&i.call(b)}finally{if(o)throw o.error}}}else n()}else n()},l.normalizeNode=function(r){var t=T(r,2),n=t[0],i=t[1],a=e.getNodeType(n);return"bulleted-list"!==a&&"numbered-list"!==a||u.unwrapNodes(l,{at:i}),o([n,i])},l},menus:[W,q,F],elemsToHtml:[V],parseElemsHtml:[{selector:"ul:not([data-w-e-type]),ol:not([data-w-e-type])",parseElemHtml:function(r,e,t){return e.flat(1/0)}},{selector:"li:not([data-w-e-type])",parseElemHtml:function(r,t,n){var o=f(r),i=[],a=[];t.forEach(function(r){J(r)||(l.isText(r)||n.isInline(r)?i.push(r):e.checkNodeType(r,"list-item")?a.push(r):d.isElement(r)&&K(i,r.children,n))}),0===i.length&&(a.length>0?i.push({text:""}):i.push({text:o.text().replace(/\s+/gm," ")}));var c=function(r){return"ol"===G(r.parent())}(o),u=function(r){for(var e=0,t=r.parent();t.length>0;){var n=G(t);"ul"!==n&&"ol"!==n||(e+=1),t=t.parent()}return Math.max(0,e-1)}(o),s=function(r){var e=r.parent();if("ol"===G(e)){var t=(e.attr("start")||"").trim();if(""!==t){var n=Number.parseInt(t,10);if(!Number.isNaN(n))return n}}}(o),v=function(r){var e=r.parent();if("ol"===G(e)){var t=(e.attr("type")||"").trim();return"1"===t||"a"===t||"A"===t||"i"===t||"I"===t?t:void 0}}(o),p=x(x(x({type:"list-item",ordered:c,level:u},void 0!==s?{start:s}:{}),void 0!==v?{orderType:v}:{}),{children:i});return 0===a.length?p:k([p],T(a),!1)}}]};export{$ as default};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/locale/index.ts","../src/locale/en.ts","../src/locale/zh-CN.ts","../src/utils/maps.ts","../src/utils/util.ts","../src/module/helpers.ts","../src/module/style-class.ts","../src/module/elem-to-html.ts","../src/constants/svg.ts","../src/module/menu/BaseMenu.ts","../src/module/menu/BulletedListMenu.ts","../src/module/menu/LowerAlphaListMenu.ts","../src/module/menu/NumberedListMenu.ts","../src/module/menu/index.ts","../src/utils/dom.ts","../src/module/plugin.ts","../src/module/render-elem.tsx","../src/module/index.ts","../src/module/parse-elem-html.ts"],"sourcesContent":["/**\n * @description i18n entry\n * @author wangfupeng\n */\n\nimport { i18nAddResources } from '@wangeditor-next/core'\n\nimport enResources from './en'\nimport zhResources from './zh-CN'\n\ni18nAddResources('en', enResources)\ni18nAddResources('zh-CN', zhResources)\n","/**\n * @description i18n en\n * @author wangfupeng\n */\n\nexport default {\n listModule: {\n unOrderedList: 'Unordered list',\n orderedList: 'Ordered list',\n lowerAlphaList: 'Ordered list (a,b,c)',\n },\n}\n","/**\n * @description i18n zh-CN\n * @author wangfupeng\n */\n\nexport default {\n listModule: {\n unOrderedList: '无序列表',\n orderedList: '有序列表',\n lowerAlphaList: '有序列表(a,b,c)',\n },\n}\n","/**\n * @description maps\n * @author wangfupeng\n */\n\nimport { IDomEditor } from '@wangeditor-next/core'\nimport { Element as SlateElement } from 'slate'\n\nexport const ELEM_TO_EDITOR = new WeakMap<SlateElement, IDomEditor>()\n","import { Element as SlateElement, Text } from 'slate'\n\n/**\n * 获取第一个 text-node 的颜色\n * @param elem elem\n */\nexport function getListItemColor(elem: SlateElement): string {\n const children = elem.children || []\n const length = children.length\n\n if (length === 0) { return '' }\n\n let firstTextNode\n\n for (let i = 0; i < length; i += 1) {\n if (firstTextNode) { break } // 已找到第一个 text-node ,则退出\n const child = children[i]\n\n if (Text.isText(child)) { firstTextNode = child }\n }\n\n if (firstTextNode == null) { return '' }\n return firstTextNode.color || ''\n}\n","/**\n * @description table menu helpers\n * @author wangfupeng\n */\n\nimport { DomEditor, IDomEditor } from '@wangeditor-next/core'\nimport { Editor, Path } from 'slate'\n\nimport { ListItemElement, OrderedListType } from './custom-types'\n\nexport function getNormalizedOrderedListStart(elem: ListItemElement): number {\n const { ordered = false, start } = elem\n\n if (!ordered) { return 1 }\n if (typeof start !== 'number' || Number.isNaN(start)) { return 1 }\n return start\n}\n\nexport function getNormalizedOrderedListType(elem: ListItemElement): OrderedListType {\n const { orderType } = elem\n\n if (orderType === 'a'\n || orderType === 'A'\n || orderType === 'i'\n || orderType === 'I') {\n return orderType\n }\n\n return '1'\n}\n\nexport function hasSameListConfig(a: ListItemElement, b: ListItemElement): boolean {\n if (a.ordered !== b.ordered) { return false }\n if (!a.ordered) { return true }\n\n return getNormalizedOrderedListType(a) === getNormalizedOrderedListType(b)\n && getNormalizedOrderedListStart(a) === getNormalizedOrderedListStart(b)\n}\n\n/**\n * 获取上一个同一 level 的 list item\n * @param editor 编辑器实例\n * @param elem elem\n */\nexport function getBrotherListNodeByLevel(\n editor: IDomEditor,\n elem: ListItemElement,\n level?: number,\n): ListItemElement | null {\n const { type, ...otherProps } = elem\n // level 可能是 退格前的值,所以这里需要判断\n const elemLevel = level !== undefined ? level : otherProps.level || 0\n\n const path = DomEditor.findPath(editor, elem)\n let brotherPath = path\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n if (brotherPath.length === 0 || brotherPath[brotherPath.length - 1] === 0) {\n return null // 已经是最后一个节点或没有找到有效的前一个 list 节点\n }\n brotherPath = Path.previous(brotherPath)\n const brotherEntry = Editor.node(editor, brotherPath)\n\n if (!brotherEntry) {\n return null // 没有找到有效的前一个节点\n }\n\n const [brotherElem] = brotherEntry\n const { level: brotherLevel = 0 } = brotherElem as ListItemElement\n const brotherType = DomEditor.getNodeType(brotherElem)\n\n // 验证兄弟节点是否是期望的类型和层级\n if (brotherType !== type) {\n return null\n }\n if (brotherLevel === elemLevel) {\n return brotherElem as ListItemElement\n }\n }\n}\n\nexport function hasSameOrderWithBrother(\n editor: IDomEditor,\n elem: ListItemElement,\n level?: number,\n): boolean {\n const brotherElem = getBrotherListNodeByLevel(editor, elem, level)\n\n return brotherElem ? hasSameListConfig(brotherElem, elem) : false\n}\n","/**\n * @description list style class utils\n */\n\nimport { getClassStylePolicy, IDomEditor, reportUnsupportedClassStyle } from '@wangeditor-next/core'\n\nconst DEFAULT_COLORS = [\n 'rgb(0, 0, 0)',\n 'rgb(38, 38, 38)',\n 'rgb(89, 89, 89)',\n 'rgb(140, 140, 140)',\n 'rgb(191, 191, 191)',\n 'rgb(217, 217, 217)',\n 'rgb(233, 233, 233)',\n 'rgb(245, 245, 245)',\n 'rgb(250, 250, 250)',\n 'rgb(255, 255, 255)',\n 'rgb(225, 60, 57)',\n 'rgb(231, 95, 51)',\n 'rgb(235, 144, 58)',\n 'rgb(245, 219, 77)',\n 'rgb(114, 192, 64)',\n 'rgb(89, 191, 192)',\n 'rgb(66, 144, 247)',\n 'rgb(54, 88, 226)',\n 'rgb(106, 57, 201)',\n 'rgb(216, 68, 147)',\n 'rgb(251, 233, 230)',\n 'rgb(252, 237, 225)',\n 'rgb(252, 239, 212)',\n 'rgb(252, 251, 207)',\n 'rgb(231, 246, 213)',\n 'rgb(218, 244, 240)',\n 'rgb(217, 237, 250)',\n 'rgb(224, 232, 250)',\n 'rgb(237, 225, 248)',\n 'rgb(246, 226, 234)',\n 'rgb(255, 163, 158)',\n 'rgb(255, 187, 150)',\n 'rgb(255, 213, 145)',\n 'rgb(255, 251, 143)',\n 'rgb(183, 235, 143)',\n 'rgb(135, 232, 222)',\n 'rgb(145, 213, 255)',\n 'rgb(173, 198, 255)',\n 'rgb(211, 173, 247)',\n 'rgb(255, 173, 210)',\n 'rgb(255, 77, 79)',\n 'rgb(255, 122, 69)',\n 'rgb(255, 169, 64)',\n 'rgb(255, 236, 61)',\n 'rgb(115, 209, 61)',\n 'rgb(54, 207, 201)',\n 'rgb(64, 169, 255)',\n 'rgb(89, 126, 247)',\n 'rgb(146, 84, 222)',\n 'rgb(247, 89, 171)',\n 'rgb(207, 19, 34)',\n 'rgb(212, 56, 13)',\n 'rgb(212, 107, 8)',\n 'rgb(212, 177, 6)',\n 'rgb(56, 158, 13)',\n 'rgb(8, 151, 156)',\n 'rgb(9, 109, 217)',\n 'rgb(29, 57, 196)',\n 'rgb(83, 29, 171)',\n 'rgb(196, 29, 127)',\n 'rgb(130, 0, 20)',\n 'rgb(135, 20, 0)',\n 'rgb(135, 56, 0)',\n 'rgb(97, 71, 0)',\n 'rgb(19, 82, 0)',\n 'rgb(0, 71, 79)',\n 'rgb(0, 58, 140)',\n 'rgb(6, 17, 120)',\n 'rgb(34, 7, 94)',\n 'rgb(120, 6, 80)',\n]\n\nconst REPORTED_UNSUPPORTED_LIST_COLOR = new Set<string>()\n\nfunction normalizeColorValue(value: string): string {\n return (value || '').trim().replace(/\\s+/g, '').toLowerCase()\n}\n\nconst DEFAULT_COLOR_SET = new Set(DEFAULT_COLORS.map(color => normalizeColorValue(color)))\n\nfunction hashStyleValue(input: string): string {\n const MOD = 2147483647 // 2^31 - 1\n let hash = 7\n\n for (const char of input) {\n hash = (hash * 31 + (char.codePointAt(0) || 0)) % MOD\n }\n\n return hash.toString(36)\n}\n\nexport function genListColorClassName(color: string): string {\n const normalized = normalizeColorValue(color)\n\n return `w-e-list-color-${hashStyleValue(`color:${normalized}`)}`\n}\n\nfunction hasExtraRegisteredColor(editor: IDomEditor | undefined, color: string): boolean {\n const extraTokens = editor?.getConfig().styleClassTokens?.color || []\n const normalizedColor = normalizeColorValue(color)\n\n for (let i = 0; i < extraTokens.length; i += 1) {\n if (normalizeColorValue(extraTokens[i]) === normalizedColor) {\n return true\n }\n }\n\n return false\n}\n\nfunction hasRegisteredListColor(editor: IDomEditor | undefined, color: string): boolean {\n const normalized = normalizeColorValue(color)\n\n if (!normalized) { return false }\n if (DEFAULT_COLOR_SET.has(normalized)) { return true }\n if (hasExtraRegisteredColor(editor, color)) { return true }\n\n return false\n}\n\nexport function resolveListColorAction(\n editor: IDomEditor | undefined,\n color: string,\n): 'class' | 'preserve-data' | 'inline' {\n if (hasRegisteredListColor(editor, color)) {\n return 'class'\n }\n\n const policy = getClassStylePolicy(editor)\n let fallback: 'preserve-data' | 'inline' | 'throw' = 'preserve-data'\n\n if (policy === 'fallback-inline') {\n fallback = 'inline'\n }\n if (policy === 'strict') {\n fallback = 'throw'\n }\n\n const message = `[wangeditor] Unsupported list color class token color=${color}. policy=${policy}`\n const reportKey = `${color}|${fallback}`\n\n if (!REPORTED_UNSUPPORTED_LIST_COLOR.has(reportKey)) {\n REPORTED_UNSUPPORTED_LIST_COLOR.add(reportKey)\n reportUnsupportedClassStyle(editor, {\n type: 'color',\n value: color,\n scene: 'toHtml',\n fallback,\n message,\n })\n }\n\n if (fallback === 'throw') {\n throw new Error(message)\n }\n\n if (fallback === 'inline') {\n return 'inline'\n }\n\n return 'preserve-data'\n}\n","/**\n * @description to html\n * @author wangfupeng\n */\n\nimport { DomEditor, getTextStyleMode, IDomEditor } from '@wangeditor-next/core'\nimport { Element } from 'slate'\n\nimport { ELEM_TO_EDITOR } from '../utils/maps'\nimport { getListItemColor } from '../utils/util'\nimport { ListItemElement } from './custom-types'\nimport {\n getNormalizedOrderedListStart,\n getNormalizedOrderedListType,\n hasSameListConfig,\n} from './helpers'\nimport { genListColorClassName, resolveListColorAction } from './style-class'\n\n// ol ul stack for streaming list-item serialization\nconst CONTAINER_TAG_STACK: Array<string> = []\nlet STACK_EDITOR: IDomEditor | null = null\n\nfunction getContainerTag(elem: ListItemElement): 'ol' | 'ul' {\n return elem.ordered ? 'ol' : 'ul'\n}\n\nfunction getFallbackContainerTag(elem: ListItemElement): string {\n return elem.ordered ? 'ol' : 'ul'\n}\n\nfunction genContainerStartTag(elem: ListItemElement): string {\n const { ordered = false } = elem\n\n if (!ordered) { return '<ul>' }\n\n const attrs: string[] = []\n const orderType = getNormalizedOrderedListType(elem)\n const orderStart = getNormalizedOrderedListStart(elem)\n\n if (orderType !== '1') {\n attrs.push(`type=\"${orderType}\"`)\n }\n if (orderStart !== 1) {\n attrs.push(`start=\"${orderStart}\"`)\n }\n\n if (attrs.length === 0) { return '<ol>' }\n return `<ol ${attrs.join(' ')}>`\n}\n\nfunction getAdjacentListItem(\n editor: IDomEditor,\n index: number,\n direction: 'prev' | 'next',\n): ListItemElement | null {\n if (direction === 'prev' && index === 0) { return null }\n if (direction === 'next' && index === editor.children.length - 1) { return null }\n\n const targetIndex = direction === 'prev' ? index - 1 : index + 1\n const targetNode = editor.children[targetIndex] as any\n\n if (!DomEditor.checkNodeType(targetNode, 'list-item')) { return null }\n return targetNode as ListItemElement\n}\n\nfunction getPrevSameLevelListItem(\n editor: IDomEditor,\n index: number,\n level: number,\n): ListItemElement | null {\n for (let i = index - 1; i >= 0; i -= 1) {\n const node = editor.children[i] as any\n\n if (!DomEditor.checkNodeType(node, 'list-item')) { continue }\n if ((node.level || 0) === level) {\n return node as ListItemElement\n }\n }\n return null\n}\n\nfunction elemToHtml(\n elem: Element,\n childrenHtml: string,\n editor?: IDomEditor,\n): {\n html: string\n prefix?: string\n suffix?: string\n} {\n let startContainerStr = ''\n let endContainerStr = ''\n\n const listItemElem = elem as ListItemElement\n const { level = 0 } = listItemElem\n const containerTag = getContainerTag(listItemElem)\n const containerStartTag = genContainerStartTag(listItemElem)\n const bindEditor = ELEM_TO_EDITOR.get(elem)\n const bindEditorWithChildren = bindEditor && Array.isArray((bindEditor as any).children)\n ? bindEditor\n : null\n const passedEditorWithChildren = editor && Array.isArray((editor as any).children)\n ? editor\n : null\n const editorContainsElem = (candidate: IDomEditor | null | undefined) => (\n !!candidate && candidate.children.indexOf(elem as any) >= 0\n )\n let finalEditor = passedEditorWithChildren || bindEditorWithChildren\n\n if (editorContainsElem(passedEditorWithChildren)) {\n finalEditor = passedEditorWithChildren\n } else if (editorContainsElem(bindEditorWithChildren)) {\n finalEditor = bindEditorWithChildren\n }\n const styleEditor = editor || bindEditor\n\n if (finalEditor == null) {\n return {\n html: `<li>${childrenHtml}</li>`,\n prefix: '',\n suffix: '',\n }\n }\n\n if (STACK_EDITOR !== finalEditor) {\n CONTAINER_TAG_STACK.length = 0\n STACK_EDITOR = finalEditor\n }\n\n const index = finalEditor.children.indexOf(elem as any)\n\n if (index < 0) {\n return {\n html: `<li>${childrenHtml}</li>`,\n prefix: '',\n suffix: '',\n }\n }\n\n const prevItem = getAdjacentListItem(finalEditor, index, 'prev')\n const nextItem = getAdjacentListItem(finalEditor, index, 'next')\n const hasNestedNext = !!nextItem && (nextItem.level || 0) > level\n\n if (!prevItem) {\n // list block start\n CONTAINER_TAG_STACK.length = 0\n for (let i = 0; i < level + 1; i += 1) {\n startContainerStr += containerStartTag\n CONTAINER_TAG_STACK.push(containerTag)\n }\n } else {\n const prevLevel = prevItem.level || 0\n\n if (level > prevLevel) {\n // Enter nested lists inside previous <li>.\n for (let i = 0; i < level - prevLevel; i += 1) {\n startContainerStr += containerStartTag\n CONTAINER_TAG_STACK.push(containerTag)\n }\n } else if (level === prevLevel) {\n // Split same-level lists when ordered/type/start differ.\n if (!hasSameListConfig(prevItem, listItemElem)) {\n const closeTag = CONTAINER_TAG_STACK.pop() || getFallbackContainerTag(prevItem)\n\n startContainerStr += `</${closeTag}>${containerStartTag}`\n CONTAINER_TAG_STACK.push(containerTag)\n }\n } else {\n // Climb up: close nested list containers and parent <li>.\n let diff = prevLevel - level\n\n while (diff > 0) {\n const closeTag = CONTAINER_TAG_STACK.pop() || getFallbackContainerTag(prevItem)\n\n startContainerStr += `</${closeTag}></li>`\n diff -= 1\n }\n\n // Split target-level list container when config changed.\n const brother = getPrevSameLevelListItem(finalEditor, index, level)\n\n if (brother && !hasSameListConfig(brother, listItemElem)) {\n const closeTag = CONTAINER_TAG_STACK.pop() || getFallbackContainerTag(brother)\n\n startContainerStr += `</${closeTag}>${containerStartTag}`\n CONTAINER_TAG_STACK.push(containerTag)\n }\n }\n }\n\n // 获取前缀颜色\n const prefixColor = getListItemColor(elem)\n const textStyleMode = getTextStyleMode(styleEditor)\n let colorStyle = ''\n let colorClass = ''\n let colorData = ''\n\n if (prefixColor) {\n if (textStyleMode === 'class') {\n colorData = ` data-w-e-color=\"${prefixColor}\"`\n const action = resolveListColorAction(styleEditor, prefixColor)\n\n if (action === 'class') {\n colorClass = ` class=\"${genListColorClassName(prefixColor)}\"`\n } else if (action === 'inline') {\n colorStyle = ` style=\"color:${prefixColor}\"`\n }\n } else {\n colorStyle = ` style=\"color:${prefixColor}\"`\n }\n }\n\n const html = `<li${colorClass}${colorData}${colorStyle}>${childrenHtml}${hasNestedNext ? '' : '</li>'}`\n\n if (!nextItem) {\n // list block end\n while (CONTAINER_TAG_STACK.length > 0) {\n const tag = CONTAINER_TAG_STACK.pop()\n\n if (!tag) { break }\n endContainerStr += `</${tag}>`\n if (CONTAINER_TAG_STACK.length > 0) {\n endContainerStr += '</li>'\n }\n }\n STACK_EDITOR = null\n }\n\n return {\n html,\n prefix: startContainerStr,\n suffix: endContainerStr,\n }\n}\n\nconst listItemToHtmlConf = {\n type: 'list-item',\n elemToHtml,\n}\n\nexport default listItemToHtmlConf\n","/**\n * @description icon svg\n * @author wangfupeng\n */\n\n/**\n * 【注意】svg 字符串的长度 ,否则会导致代码体积过大\n * 尽量选择 https://www.iconfont.cn/collections/detail?spm=a313x.7781069.0.da5a778a4&cid=20293\n * 找不到再从 iconfont.com 搜索\n */\n\n// 无序列表\nexport const BULLETED_LIST_SVG = '<svg viewBox=\"0 0 1024 1024\"><path d=\"M384 64h640v128H384V64z m0 384h640v128H384v-128z m0 384h640v128H384v-128zM0 128a128 128 0 1 1 256 0 128 128 0 0 1-256 0z m0 384a128 128 0 1 1 256 0 128 128 0 0 1-256 0z m0 384a128 128 0 1 1 256 0 128 128 0 0 1-256 0z\"></path></svg>'\n\n// 有序列表\nexport const NUMBERED_LIST_SVG = '<svg viewBox=\"0 0 1024 1024\"><path d=\"M384 832h640v128H384z m0-384h640v128H384z m0-384h640v128H384zM192 0v256H128V64H64V0zM128 526.016v50.016h128v64H64v-146.016l128-60V384H64v-64h192v146.016zM256 704v320H64v-64h128v-64H64v-64h128v-64H64v-64z\"></path></svg>'\n","/**\n * @description base menu\n * @author wangfupeng\n */\n\nimport { DomEditor, IButtonMenu, IDomEditor } from '@wangeditor-next/core'\nimport {\n Editor, Element, Node, Transforms,\n} from 'slate'\n\nimport { ListItemElement, OrderedListType } from '../custom-types'\nimport { getNormalizedOrderedListType } from '../helpers'\n\nabstract class BaseMenu implements IButtonMenu {\n readonly type = 'list-item'\n\n abstract readonly ordered: boolean\n\n readonly orderType?: OrderedListType\n\n abstract readonly title: string\n\n abstract readonly iconSvg: string\n\n readonly tag = 'button'\n\n private getListNode(editor: IDomEditor): Node | null {\n const { type } = this\n\n return DomEditor.getSelectedNodeByType(editor, type)\n }\n\n getValue(_editor: IDomEditor): string | boolean {\n return ''\n }\n\n isActive(editor: IDomEditor): boolean {\n const node = this.getListNode(editor)\n\n if (node == null) { return false }\n const listNode = node as ListItemElement\n const { ordered = false } = listNode\n\n if (ordered !== this.ordered) { return false }\n if (!ordered) { return true }\n\n const currentOrderType = getNormalizedOrderedListType(listNode)\n const targetOrderType = this.orderType || '1'\n\n return currentOrderType === targetOrderType\n }\n\n isDisabled(editor: IDomEditor): boolean {\n if (editor.selection == null) { return true }\n\n const selectedElems = DomEditor.getSelectedElems(editor)\n const notMatch = selectedElems.some((elem: Element) => {\n if (Editor.isVoid(editor, elem) && Editor.isBlock(editor, elem)) { return true }\n\n const { type } = elem as Element\n\n if (['pre', 'code', 'table'].includes(type)) { return true }\n return false\n })\n\n if (notMatch) { return true }\n\n return false\n }\n\n exec(editor: IDomEditor, _value: string | boolean): void {\n const active = this.isActive(editor)\n\n if (active) {\n // 如果当前 active ,则转换为 p 标签\n Transforms.setNodes(editor, {\n type: 'paragraph',\n // @ts-ignore\n ordered: undefined,\n level: undefined,\n start: undefined,\n orderType: undefined,\n })\n } else {\n // 否则,转换为 list-item\n Transforms.setNodes(editor, {\n type: 'list-item',\n ordered: this.ordered, // 有序/无序\n indent: undefined,\n start: undefined,\n orderType: this.ordered ? this.orderType : undefined,\n })\n }\n }\n}\n\nexport default BaseMenu\n","/**\n * @description bulleted list menu\n * @author wangfupeng\n */\n\nimport { t } from '@wangeditor-next/core'\n\nimport { BULLETED_LIST_SVG } from '../../constants/svg'\nimport BaseMenu from './BaseMenu'\n\nclass BulletedListMenu extends BaseMenu {\n readonly ordered = false\n\n readonly title = t('listModule.unOrderedList')\n\n readonly iconSvg = BULLETED_LIST_SVG\n}\n\nexport default BulletedListMenu\n","/**\n * @description lower-alpha ordered list menu\n * @author wangfupeng\n */\n\nimport { t } from '@wangeditor-next/core'\n\nimport { NUMBERED_LIST_SVG } from '../../constants/svg'\nimport { OrderedListType } from '../custom-types'\nimport BaseMenu from './BaseMenu'\n\nclass LowerAlphaListMenu extends BaseMenu {\n readonly ordered = true\n\n readonly orderType: OrderedListType = 'a'\n\n readonly title = t('listModule.lowerAlphaList')\n\n readonly iconSvg = NUMBERED_LIST_SVG\n}\n\nexport default LowerAlphaListMenu\n","/**\n * @description numbered list menu\n * @author wangfupeng\n */\n\nimport { t } from '@wangeditor-next/core'\n\nimport { NUMBERED_LIST_SVG } from '../../constants/svg'\nimport BaseMenu from './BaseMenu'\n\nclass NumberedListMenu extends BaseMenu {\n readonly ordered = true\n\n readonly title = t('listModule.orderedList')\n\n readonly iconSvg = NUMBERED_LIST_SVG\n}\n\nexport default NumberedListMenu\n","/**\n * @description menu entry\n * @author wangfupeng\n */\n\nimport BulletedListMenu from './BulletedListMenu'\nimport LowerAlphaListMenu from './LowerAlphaListMenu'\nimport NumberedListMenu from './NumberedListMenu'\n\nexport const bulletedListMenuConf = {\n key: 'bulletedList',\n factory() {\n return new BulletedListMenu()\n },\n}\n\nexport const numberedListMenuConf = {\n key: 'numberedList',\n factory() {\n return new NumberedListMenu()\n },\n}\n\nexport const numberedListLowerAlphaMenuConf = {\n key: 'numberedListLowerAlpha',\n factory() {\n return new LowerAlphaListMenu()\n },\n}\n","/**\n * @description DOM 操作\n * @author wangfupeng\n */\n\nimport $, {\n append, attr, Dom7Array, parent,\n} from 'dom7'\n\n// COMPAT: This is required to prevent TypeScript aliases from doing some very\n// weird things for Slate's types with the same name as globals. (2019/11/27)\n// https://github.com/microsoft/TypeScript/issues/35002\nimport DOMNode = globalThis.Node\nimport DOMComment = globalThis.Comment\nimport DOMElement = globalThis.Element\nimport DOMText = globalThis.Text\nimport DOMRange = globalThis.Range\nimport DOMSelection = globalThis.Selection\nimport DOMStaticRange = globalThis.StaticRange\n\nif (append) { $.fn.append = append }\n// if (on) $.fn.on = on\n// if (focus) $.fn.focus = focus\nif (attr) { $.fn.attr = attr }\n// if (val) $.fn.val = val\n// if (html) $.fn.html = html\nif (parent) { $.fn.parent = parent }\n// if (hasClass) $.fn.hasClass = hasClass\n// if (empty) $.fn.empty = empty\n\nexport default $\nexport {\n DOMComment, DOMElement, DOMNode, DOMRange, DOMSelection, DOMStaticRange, DOMText,\n}\n\n/**\n * 获取 tagName lower-case\n * @param $elem $elem\n */\nexport function getTagName($elem: Dom7Array): string {\n if ($elem.length) { return $elem[0].tagName.toLowerCase() }\n return ''\n}\n","/**\n * @description editor 插件,重写 editor API\n * @author wangfupeng\n */\n\nimport { DomEditor, IDomEditor } from '@wangeditor-next/core'\nimport {\n Editor, Range, Transforms,\n} from 'slate'\n\nimport { ListItemElement } from './custom-types'\nimport { getBrotherListNodeByLevel } from './helpers'\n\n/**\n * 获取选中的 top elems\n * @param editor editor\n */\nfunction getTopSelectedElemsBySelection(editor: IDomEditor) {\n return Editor.nodes(editor, {\n at: editor.selection || undefined,\n match: n => DomEditor.findPath(editor, n).length === 1, // 只匹配顶级元素\n })\n}\n\nfunction withList<T extends IDomEditor>(editor: T): T {\n const {\n deleteBackward, handleTab, normalizeNode, insertBreak,\n } = editor\n const newEditor = editor\n\n // 重写 insertBreak - 空 list 点击回车时删除该空 list\n newEditor.insertBreak = () => {\n const [nodeEntry] = Editor.nodes(editor, {\n match: n => DomEditor.checkNodeType(n, 'list-item'),\n universal: true,\n })\n\n if (!nodeEntry) { return insertBreak() }\n const listElem = nodeEntry[0] as ListItemElement\n\n if (listElem.children[0].text === '') {\n Transforms.setNodes(newEditor, {\n type: 'paragraph',\n // @ts-ignore\n ordered: undefined,\n level: undefined,\n start: undefined,\n orderType: undefined,\n })\n return\n }\n return insertBreak()\n }\n\n // 重写 deleteBackward - 降低 level 或者转换为 p 元素\n newEditor.deleteBackward = unit => {\n const { selection } = newEditor\n\n if (selection == null) {\n deleteBackward(unit)\n return\n }\n\n if (Range.isExpanded(selection)) {\n deleteBackward(unit)\n return\n }\n\n const listItemElem = DomEditor.getSelectedNodeByType(newEditor, 'list-item')\n\n if (listItemElem == null) {\n // 未匹配到 list-item\n deleteBackward(unit)\n return\n }\n\n if (selection.focus.offset === 0) {\n // 选中了当前 list-item 文本的开头,此时按删除键,应该降低 level 或转换为 p 元素\n const { level = 0 } = listItemElem as ListItemElement\n\n if (level > 0) {\n // 如果有兄弟节点,则对齐兄弟节点的列表配置\n const brotherElem = getBrotherListNodeByLevel(\n editor,\n listItemElem as ListItemElement,\n level - 1,\n )\n\n if (brotherElem) {\n const nextOrdered = brotherElem.ordered\n\n Transforms.setNodes(newEditor, {\n level: level - 1,\n ordered: nextOrdered,\n start: nextOrdered ? brotherElem.start : undefined,\n orderType: nextOrdered ? brotherElem.orderType : undefined,\n })\n } else {\n Transforms.setNodes(newEditor, { level: level - 1 })\n }\n } else {\n // 转换为 p 元素\n Transforms.setNodes(newEditor, {\n type: 'paragraph',\n // @ts-ignore\n ordered: undefined,\n level: undefined,\n start: undefined,\n orderType: undefined,\n })\n }\n return\n }\n\n // 其他情况\n deleteBackward(unit)\n }\n\n // 重写 tab - 当选中 list-item 文本开头时,增加 level\n newEditor.handleTab = () => {\n const { selection } = newEditor\n\n if (selection == null) {\n handleTab()\n return\n }\n\n // 选区是合并的,判断单个 list-item 即可\n if (Range.isCollapsed(selection)) {\n const listItemElem = DomEditor.getSelectedNodeByType(newEditor, 'list-item')\n\n if (listItemElem == null) {\n // 未匹配到 list-item\n handleTab()\n return\n }\n\n if (selection.focus.offset === 0) {\n // 选中了当前 list-item 文本的开头,此时按 tab 应该增加 level\n const { level = 0 } = listItemElem as ListItemElement\n\n Transforms.setNodes(newEditor, { level: level + 1 })\n return\n }\n }\n\n // 选区是展开的,要判断多个 list-item\n if (Range.isExpanded(selection)) {\n let listItemNum = 0 // 选中的 list-item 有几个\n let hasOtherElem = false // 是否有其他元素\n\n for (const entry of getTopSelectedElemsBySelection(newEditor)) {\n const [elem] = entry\n const type = DomEditor.getNodeType(elem)\n\n if (type === 'list-item') { listItemNum += 1 } else { hasOtherElem = true }\n }\n\n if (hasOtherElem || listItemNum <= 1) {\n // 选中了其他元素,或者只选中一个 list-item ,则执行默认行为\n handleTab()\n return\n }\n\n // 未选中其他元素,且选中多个 list-item ,则增加 level\n for (const entry of getTopSelectedElemsBySelection(newEditor)) {\n const [elem, path] = entry\n const { level = 0 } = elem as ListItemElement\n\n Transforms.setNodes(newEditor, { level: level + 1 }, { at: path })\n }\n return\n }\n\n // 其他情况\n handleTab()\n }\n\n // 兼容之前的 JSON 格式 `numbered-list` 和 `bulleted-list` (之前的 list 没有嵌套功能)\n newEditor.normalizeNode = ([node, path]) => {\n const type = DomEditor.getNodeType(node)\n\n if (type === 'bulleted-list' || type === 'numbered-list') {\n Transforms.unwrapNodes(newEditor, { at: path })\n }\n\n // 执行默认行为\n return normalizeNode([node, path])\n }\n\n return newEditor\n}\n\nexport default withList\n","/**\n * @description render list elem\n * @author wangfupeng\n */\n\nimport { DomEditor, IDomEditor } from '@wangeditor-next/core'\nimport {\n Editor, Element as SlateElement, Path,\n} from 'slate'\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { jsx, VNode } from 'snabbdom'\n\nimport { ELEM_TO_EDITOR } from '../utils/maps'\nimport { getListItemColor } from '../utils/util'\nimport { ListItemElement } from './custom-types'\nimport {\n getNormalizedOrderedListStart,\n getNormalizedOrderedListType,\n hasSameListConfig,\n} from './helpers'\n\n/**\n * 无序列表:根据 level 获取的前置符号\n * @param level 层级\n */\nfunction genPreSymbol(level = 0): string {\n let s = ''\n\n switch (level) {\n case 0:\n s = '•' // 第一层级\n break\n case 1:\n s = '◦' // 第一层级\n break\n case 2:\n s = '▪' // 第三层级\n break\n default:\n s = '▪' // 其他层级\n }\n return s\n}\n\nfunction genAlphabetIndex(num: number, upper = false): string {\n if (num <= 0) { return String(num) }\n\n let n = num\n let result = ''\n\n while (n > 0) {\n const rem = (n - 1) % 26\n const charCode = (upper ? 65 : 97) + rem\n\n result = String.fromCharCode(charCode) + result\n n = Math.floor((n - 1) / 26)\n }\n\n return result\n}\n\nfunction genRomanIndex(num: number, upper = false): string {\n if (num <= 0 || num >= 4000) { return String(num) }\n\n const romanMap: Array<[number, string]> = [\n [1000, 'M'],\n [900, 'CM'],\n [500, 'D'],\n [400, 'CD'],\n [100, 'C'],\n [90, 'XC'],\n [50, 'L'],\n [40, 'XL'],\n [10, 'X'],\n [9, 'IX'],\n [5, 'V'],\n [4, 'IV'],\n [1, 'I'],\n ]\n\n let n = num\n let result = ''\n\n for (const [value, roman] of romanMap) {\n while (n >= value) {\n result += roman\n n -= value\n }\n }\n\n return upper ? result : result.toLowerCase()\n}\n\nfunction genOrderedPrefix(num: number, orderType: string): string {\n switch (orderType) {\n case 'a':\n return `${genAlphabetIndex(num)}.`\n case 'A':\n return `${genAlphabetIndex(num, true)}.`\n case 'i':\n return `${genRomanIndex(num)}.`\n case 'I':\n return `${genRomanIndex(num, true)}.`\n default:\n return `${num}.`\n }\n}\n\n/**\n * 有序列表:获取前缀 number\n * @param editor editor\n * @param elem listItem elem\n */\nfunction getOrderedItemNumber(editor: IDomEditor, elem: SlateElement): number {\n const listItemElem = elem as ListItemElement\n const { type, level = 0, ordered = false } = listItemElem\n\n let num = getNormalizedOrderedListStart(listItemElem)\n let curElem = elem\n let curPath = DomEditor.findPath(editor, curElem)\n\n // 第一个元素,直接返回起始值\n if (curPath[0] === 0) { return num }\n\n while (curPath[0] > 0) {\n const prevPath = Path.previous(curPath)\n const prevEntry = Editor.node(editor, prevPath)\n\n if (prevEntry == null) { break }\n const prevElem = prevEntry[0] as ListItemElement // 上一个节点\n const { level: prevLevel = 0, type: prevType, ordered: prevOrdered } = prevElem\n\n // type 不一致,退出循环,不再累加 num\n if (prevType !== type) { break }\n // prevLevel 更小,退出循环,不再累加 num\n if (prevLevel < level) { break }\n\n if (prevLevel === level) {\n // level 一样,如果 list 配置不一致,则退出循环,不再累加 num\n if (prevOrdered !== ordered || !hasSameListConfig(prevElem, listItemElem)) { break }\n // level 一样,order 配置一致,则累加 num\n num += 1\n }\n\n // prevLevel 更大,不累加 num ,继续向前\n curElem = prevElem\n curPath = prevPath\n }\n\n return num\n}\n\nfunction renderListElem(\n elemNode: SlateElement,\n children: VNode[] | null,\n editor: IDomEditor,\n): VNode {\n ELEM_TO_EDITOR.set(elemNode, editor) // 记录 elem 和 editor 关系,elem-to-html 时要用\n\n const { level = 0, ordered = false } = elemNode as ListItemElement\n\n // 根据 level 增加 margin-left\n const listStyle = {\n margin: `5px 0 5px ${level * 20}px`,\n display: 'flex',\n alignItems: 'flex-start',\n }\n\n // list-item 前缀\n let prefix = ''\n\n if (ordered) {\n // 有序列表:获取前缀 number\n const orderedNumber = getOrderedItemNumber(editor, elemNode)\n const orderType = getNormalizedOrderedListType(elemNode as ListItemElement)\n\n prefix = genOrderedPrefix(orderedNumber, orderType)\n } else {\n // 无序列表:根据层级,使用不同的前缀符号\n prefix = genPreSymbol(level)\n }\n\n // 获取前缀颜色\n const prefixColor = getListItemColor(elemNode)\n\n const vnode = (\n <div style={listStyle}>\n <span\n contentEditable={false}\n style={{ marginRight: '0.5em', color: prefixColor }}\n data-w-e-reserve\n >\n {prefix}\n </span>\n <span style={{\n flex: '1',\n wordBreak: 'break-word',\n }}>{children}</span>\n </div>\n )\n\n return vnode\n}\n\nconst renderListItemConf = {\n type: 'list-item',\n renderElem: renderListElem,\n}\n\nexport default renderListItemConf\n","/**\n * @description list module entry\n * @author wangfupeng\n */\n\nimport { IModuleConf } from '@wangeditor-next/core'\n\nimport listItemToHtmlConf from './elem-to-html'\nimport {\n bulletedListMenuConf,\n numberedListLowerAlphaMenuConf,\n numberedListMenuConf,\n} from './menu/index'\nimport { parseItemHtmlConf, parseListHtmlConf } from './parse-elem-html'\nimport withList from './plugin'\nimport renderListItemConf from './render-elem'\n\nconst list: Partial<IModuleConf> = {\n renderElems: [renderListItemConf],\n editorPlugin: withList,\n menus: [bulletedListMenuConf, numberedListMenuConf, numberedListLowerAlphaMenuConf],\n elemsToHtml: [listItemToHtmlConf],\n parseElemsHtml: [parseListHtmlConf, parseItemHtmlConf],\n}\n\nexport default list\n","/**\n * @description parse elem html\n * @author wangfupeng\n */\n\nimport { DomEditor, IDomEditor } from '@wangeditor-next/core'\nimport { Dom7Array } from 'dom7'\nimport { Descendant, Text } from 'slate'\n\nimport $, { DOMElement, getTagName } from '../utils/dom'\nimport { ListItemElement, OrderedListType } from './custom-types'\n\n/**\n * 获取 ordered\n * @param $elem list $elem\n */\nfunction getOrdered($elem: Dom7Array): boolean {\n const $list = $elem.parent()\n const listTagName = getTagName($list)\n\n if (listTagName === 'ol') { return true }\n return false\n}\n\nfunction getOrderedStart($elem: Dom7Array): number | undefined {\n const $list = $elem.parent()\n\n if (getTagName($list) !== 'ol') { return undefined }\n const startStr = ($list.attr('start') || '').trim()\n\n if (startStr === '') { return undefined }\n const start = Number.parseInt(startStr, 10)\n\n if (Number.isNaN(start)) { return undefined }\n return start\n}\n\nfunction getOrderedType($elem: Dom7Array): OrderedListType | undefined {\n const $list = $elem.parent()\n\n if (getTagName($list) !== 'ol') { return undefined }\n const orderType = ($list.attr('type') || '').trim()\n\n if (orderType === '1'\n || orderType === 'a'\n || orderType === 'A'\n || orderType === 'i'\n || orderType === 'I') {\n return orderType\n }\n\n return undefined\n}\n\n/**\n * 获取 level\n * @param $elem list $elem\n */\nfunction getLevel($elem: Dom7Array): number {\n let listAncestorCount = 0\n let $cur: Dom7Array = $elem.parent()\n\n while ($cur.length > 0) {\n const tagName = getTagName($cur)\n\n if (tagName === 'ul' || tagName === 'ol') {\n listAncestorCount += 1\n }\n $cur = $cur.parent()\n }\n\n return Math.max(0, listAncestorCount - 1)\n}\n\nfunction parseItemHtml(\n elem: DOMElement,\n children: Descendant[],\n editor: IDomEditor,\n): ListItemElement | ListItemElement[] {\n const $elem = $(elem)\n const normalizedChildren: Descendant[] = []\n const nestedListChildren: ListItemElement[] = []\n\n children.forEach(child => {\n if (Text.isText(child)) {\n normalizedChildren.push(child)\n return\n }\n\n if (editor.isInline(child)) {\n normalizedChildren.push(child)\n return\n }\n\n if (DomEditor.checkNodeType(child, 'list-item')) {\n nestedListChildren.push(child as ListItemElement)\n }\n })\n\n // 无 children ,则用纯文本\n if (normalizedChildren.length === 0) {\n if (nestedListChildren.length > 0) {\n normalizedChildren.push({ text: '' })\n } else {\n normalizedChildren.push({ text: $elem.text().replace(/\\s+/gm, ' ') })\n }\n }\n\n const ordered = getOrdered($elem)\n const level = getLevel($elem)\n const start = getOrderedStart($elem)\n const orderType = getOrderedType($elem)\n\n const currentItem: ListItemElement = {\n type: 'list-item',\n ordered,\n level,\n ...(start !== undefined ? { start } : {}),\n ...(orderType !== undefined ? { orderType } : {}),\n // @ts-ignore\n children: normalizedChildren,\n }\n\n if (nestedListChildren.length === 0) { return currentItem }\n return [currentItem, ...nestedListChildren]\n}\n\nexport const parseItemHtmlConf = {\n selector: 'li:not([data-w-e-type])', // data-w-e-type 属性,留给自定义元素,保证扩展性\n parseElemHtml: parseItemHtml,\n}\n\nfunction parseListHtml(\n _elem: DOMElement,\n children: Descendant[],\n _editor: IDomEditor,\n): ListItemElement[] {\n // @ts-ignore flatten 因为可能有 ul/ol 嵌套,重要!!!\n return children.flat(Infinity)\n}\n\nexport const parseListHtmlConf = {\n selector: 'ul:not([data-w-e-type]),ol:not([data-w-e-type])', // data-w-e-type 属性,留给自定义元素,保证扩展性\n parseElemHtml: parseListHtml,\n}\n"],"names":["i18nAddResources","listModule","unOrderedList","orderedList","lowerAlphaList","ELEM_TO_EDITOR","WeakMap","getListItemColor","elem","firstTextNode","children","length","i","child","Text","isText","color","getNormalizedOrderedListStart","_a","ordered","start","Number","isNaN","getNormalizedOrderedListType","orderType","hasSameListConfig","a","b","getBrotherListNodeByLevel","editor","level","type","otherProps","elemLevel","undefined","brotherPath","DomEditor","findPath","Path","previous","brotherEntry","Editor","node","brotherElem","__read","_b","brotherLevel","getNodeType","REPORTED_UNSUPPORTED_LIST_COLOR","Set","normalizeColorValue","value","trim","replace","toLowerCase","DEFAULT_COLOR_SET","map","genListColorClassName","normalized","concat","input","hash","input_1","__values","input_1_1","next","codePointAt","toString","hashStyleValue","hasRegisteredListColor","has","extraTokens","getConfig","styleClassTokens","normalizedColor","hasExtraRegisteredColor","CONTAINER_TAG_STACK","STACK_EDITOR","getFallbackContainerTag","getAdjacentListItem","index","direction","targetIndex","targetNode","checkNodeType","listItemToHtmlConf","elemToHtml","childrenHtml","startContainerStr","endContainerStr","listItemElem","containerTag","getContainerTag","containerStartTag","attrs","orderStart","push","join","genContainerStartTag","bindEditor","get","bindEditorWithChildren","Array","isArray","passedEditorWithChildren","editorContainsElem","candidate","indexOf","finalEditor","styleEditor","html","prefix","suffix","prevItem","nextItem","hasNestedNext","prevLevel","closeTag","pop","diff","brother","getPrevSameLevelListItem","prefixColor","textStyleMode","getTextStyleMode","colorStyle","colorClass","colorData","action","policy","getClassStylePolicy","fallback","message","reportKey","add","reportUnsupportedClassStyle","scene","Error","resolveListColorAction","tag","NUMBERED_LIST_SVG","BaseMenu","this","prototype","getListNode","getSelectedNodeByType","getValue","_editor","isActive","listNode","isDisabled","selection","getSelectedElems","some","isVoid","isBlock","includes","exec","_value","Transforms","setNodes","indent","BulletedListMenu","_super","_this","title","t","iconSvg","__extends","LowerAlphaListMenu","NumberedListMenu","bulletedListMenuConf","key","factory","numberedListMenuConf","numberedListLowerAlphaMenuConf","getTagName","$elem","tagName","getTopSelectedElemsBySelection","nodes","at","match","n","genAlphabetIndex","num","upper","String","result","charCode","fromCharCode","Math","floor","genRomanIndex","romanMap_1","romanMap_1_1","roman","append","$","fn","attr","parent","list","renderElems","renderElem","elemNode","set","_c","listStyle","margin","display","alignItems","orderedNumber","curElem","curPath","prevPath","prevEntry","prevElem","prevType","prevOrdered","getOrderedItemNumber","genOrderedPrefix","s","genPreSymbol","jsx","style","contentEditable","marginRight","flex","wordBreak","editorPlugin","deleteBackward","handleTab","normalizeNode","insertBreak","newEditor","nodeEntry","universal","text","unit","Range","isExpanded","focus","offset","nextOrdered","isCollapsed","listItemNum","hasOtherElem","_d","_e","done","_g","_h","_j","path","_k","unwrapNodes","menus","elemsToHtml","parseElemsHtml","selector","parseElemHtml","_elem","flat","Infinity","normalizedChildren","nestedListChildren","forEach","isInline","getOrdered","listAncestorCount","$cur","max","getLevel","$list","startStr","parseInt","getOrderedStart","getOrderedType","currentItem","__spreadArray"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/locale/index.ts","../src/locale/en.ts","../src/locale/zh-CN.ts","../src/utils/maps.ts","../src/utils/util.ts","../src/module/helpers.ts","../src/module/style-class.ts","../src/module/elem-to-html.ts","../src/constants/svg.ts","../src/module/menu/BaseMenu.ts","../src/module/menu/BulletedListMenu.ts","../src/module/menu/LowerAlphaListMenu.ts","../src/module/menu/NumberedListMenu.ts","../src/module/menu/index.ts","../src/utils/dom.ts","../src/module/parse-elem-html.ts","../src/module/plugin.ts","../src/module/render-elem.tsx","../src/module/index.ts"],"sourcesContent":["/**\n * @description i18n entry\n * @author wangfupeng\n */\n\nimport { i18nAddResources } from '@wangeditor-next/core'\n\nimport enResources from './en'\nimport zhResources from './zh-CN'\n\ni18nAddResources('en', enResources)\ni18nAddResources('zh-CN', zhResources)\n","/**\n * @description i18n en\n * @author wangfupeng\n */\n\nexport default {\n listModule: {\n unOrderedList: 'Unordered list',\n orderedList: 'Ordered list',\n lowerAlphaList: 'Ordered list (a,b,c)',\n },\n}\n","/**\n * @description i18n zh-CN\n * @author wangfupeng\n */\n\nexport default {\n listModule: {\n unOrderedList: '无序列表',\n orderedList: '有序列表',\n lowerAlphaList: '有序列表(a,b,c)',\n },\n}\n","/**\n * @description maps\n * @author wangfupeng\n */\n\nimport { IDomEditor } from '@wangeditor-next/core'\nimport { Element as SlateElement } from 'slate'\n\nexport const ELEM_TO_EDITOR = new WeakMap<SlateElement, IDomEditor>()\n","import { Element as SlateElement, Text } from 'slate'\n\n/**\n * 获取第一个 text-node 的颜色\n * @param elem elem\n */\nexport function getListItemColor(elem: SlateElement): string {\n const children = elem.children || []\n const length = children.length\n\n if (length === 0) { return '' }\n\n let firstTextNode\n\n for (let i = 0; i < length; i += 1) {\n if (firstTextNode) { break } // 已找到第一个 text-node ,则退出\n const child = children[i]\n\n if (Text.isText(child)) { firstTextNode = child }\n }\n\n if (firstTextNode == null) { return '' }\n return firstTextNode.color || ''\n}\n","/**\n * @description table menu helpers\n * @author wangfupeng\n */\n\nimport { DomEditor, IDomEditor } from '@wangeditor-next/core'\nimport { Editor, Path } from 'slate'\n\nimport { ListItemElement, OrderedListType } from './custom-types'\n\nexport function getNormalizedOrderedListStart(elem: ListItemElement): number {\n const { ordered = false, start } = elem\n\n if (!ordered) { return 1 }\n if (typeof start !== 'number' || Number.isNaN(start)) { return 1 }\n return start\n}\n\nexport function getNormalizedOrderedListType(elem: ListItemElement): OrderedListType {\n const { orderType } = elem\n\n if (orderType === 'a'\n || orderType === 'A'\n || orderType === 'i'\n || orderType === 'I') {\n return orderType\n }\n\n return '1'\n}\n\nexport function hasSameListConfig(a: ListItemElement, b: ListItemElement): boolean {\n if (a.ordered !== b.ordered) { return false }\n if (!a.ordered) { return true }\n\n return getNormalizedOrderedListType(a) === getNormalizedOrderedListType(b)\n && getNormalizedOrderedListStart(a) === getNormalizedOrderedListStart(b)\n}\n\n/**\n * 获取上一个同一 level 的 list item\n * @param editor 编辑器实例\n * @param elem elem\n */\nexport function getBrotherListNodeByLevel(\n editor: IDomEditor,\n elem: ListItemElement,\n level?: number,\n): ListItemElement | null {\n const { type, ...otherProps } = elem\n // level 可能是 退格前的值,所以这里需要判断\n const elemLevel = level !== undefined ? level : otherProps.level || 0\n\n const path = DomEditor.findPath(editor, elem)\n let brotherPath = path\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n if (brotherPath.length === 0 || brotherPath[brotherPath.length - 1] === 0) {\n return null // 已经是最后一个节点或没有找到有效的前一个 list 节点\n }\n brotherPath = Path.previous(brotherPath)\n const brotherEntry = Editor.node(editor, brotherPath)\n\n if (!brotherEntry) {\n return null // 没有找到有效的前一个节点\n }\n\n const [brotherElem] = brotherEntry\n const { level: brotherLevel = 0 } = brotherElem as ListItemElement\n const brotherType = DomEditor.getNodeType(brotherElem)\n\n // 验证兄弟节点是否是期望的类型和层级\n if (brotherType !== type) {\n return null\n }\n if (brotherLevel === elemLevel) {\n return brotherElem as ListItemElement\n }\n }\n}\n\nexport function hasSameOrderWithBrother(\n editor: IDomEditor,\n elem: ListItemElement,\n level?: number,\n): boolean {\n const brotherElem = getBrotherListNodeByLevel(editor, elem, level)\n\n return brotherElem ? hasSameListConfig(brotherElem, elem) : false\n}\n","/**\n * @description list style class utils\n */\n\nimport { getClassStylePolicy, IDomEditor, reportUnsupportedClassStyle } from '@wangeditor-next/core'\n\nconst DEFAULT_COLORS = [\n 'rgb(0, 0, 0)',\n 'rgb(38, 38, 38)',\n 'rgb(89, 89, 89)',\n 'rgb(140, 140, 140)',\n 'rgb(191, 191, 191)',\n 'rgb(217, 217, 217)',\n 'rgb(233, 233, 233)',\n 'rgb(245, 245, 245)',\n 'rgb(250, 250, 250)',\n 'rgb(255, 255, 255)',\n 'rgb(225, 60, 57)',\n 'rgb(231, 95, 51)',\n 'rgb(235, 144, 58)',\n 'rgb(245, 219, 77)',\n 'rgb(114, 192, 64)',\n 'rgb(89, 191, 192)',\n 'rgb(66, 144, 247)',\n 'rgb(54, 88, 226)',\n 'rgb(106, 57, 201)',\n 'rgb(216, 68, 147)',\n 'rgb(251, 233, 230)',\n 'rgb(252, 237, 225)',\n 'rgb(252, 239, 212)',\n 'rgb(252, 251, 207)',\n 'rgb(231, 246, 213)',\n 'rgb(218, 244, 240)',\n 'rgb(217, 237, 250)',\n 'rgb(224, 232, 250)',\n 'rgb(237, 225, 248)',\n 'rgb(246, 226, 234)',\n 'rgb(255, 163, 158)',\n 'rgb(255, 187, 150)',\n 'rgb(255, 213, 145)',\n 'rgb(255, 251, 143)',\n 'rgb(183, 235, 143)',\n 'rgb(135, 232, 222)',\n 'rgb(145, 213, 255)',\n 'rgb(173, 198, 255)',\n 'rgb(211, 173, 247)',\n 'rgb(255, 173, 210)',\n 'rgb(255, 77, 79)',\n 'rgb(255, 122, 69)',\n 'rgb(255, 169, 64)',\n 'rgb(255, 236, 61)',\n 'rgb(115, 209, 61)',\n 'rgb(54, 207, 201)',\n 'rgb(64, 169, 255)',\n 'rgb(89, 126, 247)',\n 'rgb(146, 84, 222)',\n 'rgb(247, 89, 171)',\n 'rgb(207, 19, 34)',\n 'rgb(212, 56, 13)',\n 'rgb(212, 107, 8)',\n 'rgb(212, 177, 6)',\n 'rgb(56, 158, 13)',\n 'rgb(8, 151, 156)',\n 'rgb(9, 109, 217)',\n 'rgb(29, 57, 196)',\n 'rgb(83, 29, 171)',\n 'rgb(196, 29, 127)',\n 'rgb(130, 0, 20)',\n 'rgb(135, 20, 0)',\n 'rgb(135, 56, 0)',\n 'rgb(97, 71, 0)',\n 'rgb(19, 82, 0)',\n 'rgb(0, 71, 79)',\n 'rgb(0, 58, 140)',\n 'rgb(6, 17, 120)',\n 'rgb(34, 7, 94)',\n 'rgb(120, 6, 80)',\n]\n\nconst REPORTED_UNSUPPORTED_LIST_COLOR = new Set<string>()\n\nfunction normalizeColorValue(value: string): string {\n return (value || '').trim().replace(/\\s+/g, '').toLowerCase()\n}\n\nconst DEFAULT_COLOR_SET = new Set(DEFAULT_COLORS.map(color => normalizeColorValue(color)))\n\nfunction hashStyleValue(input: string): string {\n const MOD = 2147483647 // 2^31 - 1\n let hash = 7\n\n for (const char of input) {\n hash = (hash * 31 + (char.codePointAt(0) || 0)) % MOD\n }\n\n return hash.toString(36)\n}\n\nexport function genListColorClassName(color: string): string {\n const normalized = normalizeColorValue(color)\n\n return `w-e-list-color-${hashStyleValue(`color:${normalized}`)}`\n}\n\nfunction hasExtraRegisteredColor(editor: IDomEditor | undefined, color: string): boolean {\n const extraTokens = editor?.getConfig().styleClassTokens?.color || []\n const normalizedColor = normalizeColorValue(color)\n\n for (let i = 0; i < extraTokens.length; i += 1) {\n if (normalizeColorValue(extraTokens[i]) === normalizedColor) {\n return true\n }\n }\n\n return false\n}\n\nfunction hasRegisteredListColor(editor: IDomEditor | undefined, color: string): boolean {\n const normalized = normalizeColorValue(color)\n\n if (!normalized) { return false }\n if (DEFAULT_COLOR_SET.has(normalized)) { return true }\n if (hasExtraRegisteredColor(editor, color)) { return true }\n\n return false\n}\n\nexport function resolveListColorAction(\n editor: IDomEditor | undefined,\n color: string,\n): 'class' | 'preserve-data' | 'inline' {\n if (hasRegisteredListColor(editor, color)) {\n return 'class'\n }\n\n const policy = getClassStylePolicy(editor)\n let fallback: 'preserve-data' | 'inline' | 'throw' = 'preserve-data'\n\n if (policy === 'fallback-inline') {\n fallback = 'inline'\n }\n if (policy === 'strict') {\n fallback = 'throw'\n }\n\n const message = `[wangeditor] Unsupported list color class token color=${color}. policy=${policy}`\n const reportKey = `${color}|${fallback}`\n\n if (!REPORTED_UNSUPPORTED_LIST_COLOR.has(reportKey)) {\n REPORTED_UNSUPPORTED_LIST_COLOR.add(reportKey)\n reportUnsupportedClassStyle(editor, {\n type: 'color',\n value: color,\n scene: 'toHtml',\n fallback,\n message,\n })\n }\n\n if (fallback === 'throw') {\n throw new Error(message)\n }\n\n if (fallback === 'inline') {\n return 'inline'\n }\n\n return 'preserve-data'\n}\n","/**\n * @description to html\n * @author wangfupeng\n */\n\nimport { DomEditor, getTextStyleMode, IDomEditor } from '@wangeditor-next/core'\nimport { Element } from 'slate'\n\nimport { ELEM_TO_EDITOR } from '../utils/maps'\nimport { getListItemColor } from '../utils/util'\nimport { ListItemElement } from './custom-types'\nimport {\n getNormalizedOrderedListStart,\n getNormalizedOrderedListType,\n hasSameListConfig,\n} from './helpers'\nimport { genListColorClassName, resolveListColorAction } from './style-class'\n\n// ol ul stack for streaming list-item serialization\nconst CONTAINER_TAG_STACK: Array<string> = []\nlet STACK_EDITOR: IDomEditor | null = null\n\nfunction getContainerTag(elem: ListItemElement): 'ol' | 'ul' {\n return elem.ordered ? 'ol' : 'ul'\n}\n\nfunction getFallbackContainerTag(elem: ListItemElement): string {\n return elem.ordered ? 'ol' : 'ul'\n}\n\nfunction genContainerStartTag(elem: ListItemElement): string {\n const { ordered = false } = elem\n\n if (!ordered) { return '<ul>' }\n\n const attrs: string[] = []\n const orderType = getNormalizedOrderedListType(elem)\n const orderStart = getNormalizedOrderedListStart(elem)\n\n if (orderType !== '1') {\n attrs.push(`type=\"${orderType}\"`)\n }\n if (orderStart !== 1) {\n attrs.push(`start=\"${orderStart}\"`)\n }\n\n if (attrs.length === 0) { return '<ol>' }\n return `<ol ${attrs.join(' ')}>`\n}\n\nfunction getAdjacentListItem(\n editor: IDomEditor,\n index: number,\n direction: 'prev' | 'next',\n): ListItemElement | null {\n if (direction === 'prev' && index === 0) { return null }\n if (direction === 'next' && index === editor.children.length - 1) { return null }\n\n const targetIndex = direction === 'prev' ? index - 1 : index + 1\n const targetNode = editor.children[targetIndex] as any\n\n if (!DomEditor.checkNodeType(targetNode, 'list-item')) { return null }\n return targetNode as ListItemElement\n}\n\nfunction getPrevSameLevelListItem(\n editor: IDomEditor,\n index: number,\n level: number,\n): ListItemElement | null {\n for (let i = index - 1; i >= 0; i -= 1) {\n const node = editor.children[i] as any\n\n if (!DomEditor.checkNodeType(node, 'list-item')) { continue }\n if ((node.level || 0) === level) {\n return node as ListItemElement\n }\n }\n return null\n}\n\nfunction elemToHtml(\n elem: Element,\n childrenHtml: string,\n editor?: IDomEditor,\n): {\n html: string\n prefix?: string\n suffix?: string\n} {\n let startContainerStr = ''\n let endContainerStr = ''\n\n const listItemElem = elem as ListItemElement\n const { level = 0 } = listItemElem\n const containerTag = getContainerTag(listItemElem)\n const containerStartTag = genContainerStartTag(listItemElem)\n const bindEditor = ELEM_TO_EDITOR.get(elem)\n const bindEditorWithChildren = bindEditor && Array.isArray((bindEditor as any).children)\n ? bindEditor\n : null\n const passedEditorWithChildren = editor && Array.isArray((editor as any).children)\n ? editor\n : null\n const editorContainsElem = (candidate: IDomEditor | null | undefined) => (\n !!candidate && candidate.children.indexOf(elem as any) >= 0\n )\n let finalEditor = passedEditorWithChildren || bindEditorWithChildren\n\n if (editorContainsElem(passedEditorWithChildren)) {\n finalEditor = passedEditorWithChildren\n } else if (editorContainsElem(bindEditorWithChildren)) {\n finalEditor = bindEditorWithChildren\n }\n const styleEditor = editor || bindEditor\n\n if (finalEditor == null) {\n return {\n html: `<li>${childrenHtml}</li>`,\n prefix: '',\n suffix: '',\n }\n }\n\n if (STACK_EDITOR !== finalEditor) {\n CONTAINER_TAG_STACK.length = 0\n STACK_EDITOR = finalEditor\n }\n\n const index = finalEditor.children.indexOf(elem as any)\n\n if (index < 0) {\n return {\n html: `<li>${childrenHtml}</li>`,\n prefix: '',\n suffix: '',\n }\n }\n\n const prevItem = getAdjacentListItem(finalEditor, index, 'prev')\n const nextItem = getAdjacentListItem(finalEditor, index, 'next')\n const hasNestedNext = !!nextItem && (nextItem.level || 0) > level\n\n if (!prevItem) {\n // list block start\n CONTAINER_TAG_STACK.length = 0\n for (let i = 0; i < level + 1; i += 1) {\n startContainerStr += containerStartTag\n CONTAINER_TAG_STACK.push(containerTag)\n }\n } else {\n const prevLevel = prevItem.level || 0\n\n if (level > prevLevel) {\n // Enter nested lists inside previous <li>.\n for (let i = 0; i < level - prevLevel; i += 1) {\n startContainerStr += containerStartTag\n CONTAINER_TAG_STACK.push(containerTag)\n }\n } else if (level === prevLevel) {\n // Split same-level lists when ordered/type/start differ.\n if (!hasSameListConfig(prevItem, listItemElem)) {\n const closeTag = CONTAINER_TAG_STACK.pop() || getFallbackContainerTag(prevItem)\n\n startContainerStr += `</${closeTag}>${containerStartTag}`\n CONTAINER_TAG_STACK.push(containerTag)\n }\n } else {\n // Climb up: close nested list containers and parent <li>.\n let diff = prevLevel - level\n\n while (diff > 0) {\n const closeTag = CONTAINER_TAG_STACK.pop() || getFallbackContainerTag(prevItem)\n\n startContainerStr += `</${closeTag}></li>`\n diff -= 1\n }\n\n // Split target-level list container when config changed.\n const brother = getPrevSameLevelListItem(finalEditor, index, level)\n\n if (brother && !hasSameListConfig(brother, listItemElem)) {\n const closeTag = CONTAINER_TAG_STACK.pop() || getFallbackContainerTag(brother)\n\n startContainerStr += `</${closeTag}>${containerStartTag}`\n CONTAINER_TAG_STACK.push(containerTag)\n }\n }\n }\n\n // 获取前缀颜色\n const prefixColor = getListItemColor(elem)\n const textStyleMode = getTextStyleMode(styleEditor)\n let colorStyle = ''\n let colorClass = ''\n let colorData = ''\n\n if (prefixColor) {\n if (textStyleMode === 'class') {\n colorData = ` data-w-e-color=\"${prefixColor}\"`\n const action = resolveListColorAction(styleEditor, prefixColor)\n\n if (action === 'class') {\n colorClass = ` class=\"${genListColorClassName(prefixColor)}\"`\n } else if (action === 'inline') {\n colorStyle = ` style=\"color:${prefixColor}\"`\n }\n } else {\n colorStyle = ` style=\"color:${prefixColor}\"`\n }\n }\n\n const html = `<li${colorClass}${colorData}${colorStyle}>${childrenHtml}${hasNestedNext ? '' : '</li>'}`\n\n if (!nextItem) {\n // list block end\n while (CONTAINER_TAG_STACK.length > 0) {\n const tag = CONTAINER_TAG_STACK.pop()\n\n if (!tag) { break }\n endContainerStr += `</${tag}>`\n if (CONTAINER_TAG_STACK.length > 0) {\n endContainerStr += '</li>'\n }\n }\n STACK_EDITOR = null\n }\n\n return {\n html,\n prefix: startContainerStr,\n suffix: endContainerStr,\n }\n}\n\nconst listItemToHtmlConf = {\n type: 'list-item',\n elemToHtml,\n}\n\nexport default listItemToHtmlConf\n","/**\n * @description icon svg\n * @author wangfupeng\n */\n\n/**\n * 【注意】svg 字符串的长度 ,否则会导致代码体积过大\n * 尽量选择 https://www.iconfont.cn/collections/detail?spm=a313x.7781069.0.da5a778a4&cid=20293\n * 找不到再从 iconfont.com 搜索\n */\n\n// 无序列表\nexport const BULLETED_LIST_SVG = '<svg viewBox=\"0 0 1024 1024\"><path d=\"M384 64h640v128H384V64z m0 384h640v128H384v-128z m0 384h640v128H384v-128zM0 128a128 128 0 1 1 256 0 128 128 0 0 1-256 0z m0 384a128 128 0 1 1 256 0 128 128 0 0 1-256 0z m0 384a128 128 0 1 1 256 0 128 128 0 0 1-256 0z\"></path></svg>'\n\n// 有序列表\nexport const NUMBERED_LIST_SVG = '<svg viewBox=\"0 0 1024 1024\"><path d=\"M384 832h640v128H384z m0-384h640v128H384z m0-384h640v128H384zM192 0v256H128V64H64V0zM128 526.016v50.016h128v64H64v-146.016l128-60V384H64v-64h192v146.016zM256 704v320H64v-64h128v-64H64v-64h128v-64H64v-64z\"></path></svg>'\n","/**\n * @description base menu\n * @author wangfupeng\n */\n\nimport { DomEditor, IButtonMenu, IDomEditor } from '@wangeditor-next/core'\nimport {\n Editor, Element, Node, Transforms,\n} from 'slate'\n\nimport { ListItemElement, OrderedListType } from '../custom-types'\nimport { getNormalizedOrderedListType } from '../helpers'\n\nabstract class BaseMenu implements IButtonMenu {\n readonly type = 'list-item'\n\n abstract readonly ordered: boolean\n\n readonly orderType?: OrderedListType\n\n abstract readonly title: string\n\n abstract readonly iconSvg: string\n\n readonly tag = 'button'\n\n private getListNode(editor: IDomEditor): Node | null {\n const { type } = this\n\n return DomEditor.getSelectedNodeByType(editor, type)\n }\n\n getValue(_editor: IDomEditor): string | boolean {\n return ''\n }\n\n isActive(editor: IDomEditor): boolean {\n const node = this.getListNode(editor)\n\n if (node == null) { return false }\n const listNode = node as ListItemElement\n const { ordered = false } = listNode\n\n if (ordered !== this.ordered) { return false }\n if (!ordered) { return true }\n\n const currentOrderType = getNormalizedOrderedListType(listNode)\n const targetOrderType = this.orderType || '1'\n\n return currentOrderType === targetOrderType\n }\n\n isDisabled(editor: IDomEditor): boolean {\n if (editor.selection == null) { return true }\n\n const selectedElems = DomEditor.getSelectedElems(editor)\n const notMatch = selectedElems.some((elem: Element) => {\n if (Editor.isVoid(editor, elem) && Editor.isBlock(editor, elem)) { return true }\n\n const { type } = elem as Element\n\n if (['pre', 'code', 'table'].includes(type)) { return true }\n return false\n })\n\n if (notMatch) { return true }\n\n return false\n }\n\n exec(editor: IDomEditor, _value: string | boolean): void {\n const active = this.isActive(editor)\n\n if (active) {\n // 如果当前 active ,则转换为 p 标签\n Transforms.setNodes(editor, {\n type: 'paragraph',\n // @ts-ignore\n ordered: undefined,\n level: undefined,\n start: undefined,\n orderType: undefined,\n })\n } else {\n // 否则,转换为 list-item\n Transforms.setNodes(editor, {\n type: 'list-item',\n ordered: this.ordered, // 有序/无序\n indent: undefined,\n start: undefined,\n orderType: this.ordered ? this.orderType : undefined,\n })\n }\n }\n}\n\nexport default BaseMenu\n","/**\n * @description bulleted list menu\n * @author wangfupeng\n */\n\nimport { t } from '@wangeditor-next/core'\n\nimport { BULLETED_LIST_SVG } from '../../constants/svg'\nimport BaseMenu from './BaseMenu'\n\nclass BulletedListMenu extends BaseMenu {\n readonly ordered = false\n\n readonly title = t('listModule.unOrderedList')\n\n readonly iconSvg = BULLETED_LIST_SVG\n}\n\nexport default BulletedListMenu\n","/**\n * @description lower-alpha ordered list menu\n * @author wangfupeng\n */\n\nimport { t } from '@wangeditor-next/core'\n\nimport { NUMBERED_LIST_SVG } from '../../constants/svg'\nimport { OrderedListType } from '../custom-types'\nimport BaseMenu from './BaseMenu'\n\nclass LowerAlphaListMenu extends BaseMenu {\n readonly ordered = true\n\n readonly orderType: OrderedListType = 'a'\n\n readonly title = t('listModule.lowerAlphaList')\n\n readonly iconSvg = NUMBERED_LIST_SVG\n}\n\nexport default LowerAlphaListMenu\n","/**\n * @description numbered list menu\n * @author wangfupeng\n */\n\nimport { t } from '@wangeditor-next/core'\n\nimport { NUMBERED_LIST_SVG } from '../../constants/svg'\nimport BaseMenu from './BaseMenu'\n\nclass NumberedListMenu extends BaseMenu {\n readonly ordered = true\n\n readonly title = t('listModule.orderedList')\n\n readonly iconSvg = NUMBERED_LIST_SVG\n}\n\nexport default NumberedListMenu\n","/**\n * @description menu entry\n * @author wangfupeng\n */\n\nimport BulletedListMenu from './BulletedListMenu'\nimport LowerAlphaListMenu from './LowerAlphaListMenu'\nimport NumberedListMenu from './NumberedListMenu'\n\nexport const bulletedListMenuConf = {\n key: 'bulletedList',\n factory() {\n return new BulletedListMenu()\n },\n}\n\nexport const numberedListMenuConf = {\n key: 'numberedList',\n factory() {\n return new NumberedListMenu()\n },\n}\n\nexport const numberedListLowerAlphaMenuConf = {\n key: 'numberedListLowerAlpha',\n factory() {\n return new LowerAlphaListMenu()\n },\n}\n","/**\n * @description DOM 操作\n * @author wangfupeng\n */\n\nimport $, {\n append, attr, Dom7Array, parent,\n} from 'dom7'\n\n// COMPAT: This is required to prevent TypeScript aliases from doing some very\n// weird things for Slate's types with the same name as globals. (2019/11/27)\n// https://github.com/microsoft/TypeScript/issues/35002\nimport DOMNode = globalThis.Node\nimport DOMComment = globalThis.Comment\nimport DOMElement = globalThis.Element\nimport DOMText = globalThis.Text\nimport DOMRange = globalThis.Range\nimport DOMSelection = globalThis.Selection\nimport DOMStaticRange = globalThis.StaticRange\n\nif (append) { $.fn.append = append }\n// if (on) $.fn.on = on\n// if (focus) $.fn.focus = focus\nif (attr) { $.fn.attr = attr }\n// if (val) $.fn.val = val\n// if (html) $.fn.html = html\nif (parent) { $.fn.parent = parent }\n// if (hasClass) $.fn.hasClass = hasClass\n// if (empty) $.fn.empty = empty\n\nexport default $\nexport {\n DOMComment, DOMElement, DOMNode, DOMRange, DOMSelection, DOMStaticRange, DOMText,\n}\n\n/**\n * 获取 tagName lower-case\n * @param $elem $elem\n */\nexport function getTagName($elem: Dom7Array): string {\n if ($elem.length) { return $elem[0].tagName.toLowerCase() }\n return ''\n}\n","/**\n * @description parse elem html\n * @author wangfupeng\n */\n\nimport { DomEditor, IDomEditor } from '@wangeditor-next/core'\nimport { Dom7Array } from 'dom7'\nimport { Descendant, Element as SlateElement, Text } from 'slate'\n\nimport $, { DOMElement, getTagName } from '../utils/dom'\nimport { ListItemElement, OrderedListType } from './custom-types'\n\n/**\n * 获取 ordered\n * @param $elem list $elem\n */\nfunction getOrdered($elem: Dom7Array): boolean {\n const $list = $elem.parent()\n const listTagName = getTagName($list)\n\n if (listTagName === 'ol') { return true }\n return false\n}\n\nfunction getOrderedStart($elem: Dom7Array): number | undefined {\n const $list = $elem.parent()\n\n if (getTagName($list) !== 'ol') { return undefined }\n const startStr = ($list.attr('start') || '').trim()\n\n if (startStr === '') { return undefined }\n const start = Number.parseInt(startStr, 10)\n\n if (Number.isNaN(start)) { return undefined }\n return start\n}\n\nfunction getOrderedType($elem: Dom7Array): OrderedListType | undefined {\n const $list = $elem.parent()\n\n if (getTagName($list) !== 'ol') { return undefined }\n const orderType = ($list.attr('type') || '').trim()\n\n if (orderType === '1'\n || orderType === 'a'\n || orderType === 'A'\n || orderType === 'i'\n || orderType === 'I') {\n return orderType\n }\n\n return undefined\n}\n\n/**\n * 获取 level\n * @param $elem list $elem\n */\nfunction getLevel($elem: Dom7Array): number {\n let listAncestorCount = 0\n let $cur: Dom7Array = $elem.parent()\n\n while ($cur.length > 0) {\n const tagName = getTagName($cur)\n\n if (tagName === 'ul' || tagName === 'ol') {\n listAncestorCount += 1\n }\n $cur = $cur.parent()\n }\n\n return Math.max(0, listAncestorCount - 1)\n}\n\nfunction isStructuralWhitespaceText(child: Descendant): boolean {\n return Text.isText(child) && child.text.trim() === ''\n}\n\nfunction appendTextLikeChildren(\n target: Descendant[],\n children: Descendant[],\n editor: IDomEditor,\n) {\n children.forEach(child => {\n if (isStructuralWhitespaceText(child)) {\n return\n }\n\n if (Text.isText(child)) {\n target.push(child)\n return\n }\n\n if (editor.isInline(child)) {\n target.push(child)\n return\n }\n\n if (SlateElement.isElement(child)) {\n appendTextLikeChildren(target, child.children, editor)\n }\n })\n}\n\nfunction parseItemHtml(\n elem: DOMElement,\n children: Descendant[],\n editor: IDomEditor,\n): ListItemElement | ListItemElement[] {\n const $elem = $(elem)\n const normalizedChildren: Descendant[] = []\n const nestedListChildren: ListItemElement[] = []\n\n children.forEach(child => {\n if (isStructuralWhitespaceText(child)) {\n return\n }\n\n if (Text.isText(child)) {\n normalizedChildren.push(child)\n return\n }\n\n if (editor.isInline(child)) {\n normalizedChildren.push(child)\n return\n }\n\n if (DomEditor.checkNodeType(child, 'list-item')) {\n nestedListChildren.push(child as ListItemElement)\n return\n }\n\n if (SlateElement.isElement(child)) {\n appendTextLikeChildren(normalizedChildren, child.children, editor)\n }\n })\n\n // 无 children ,则用纯文本\n if (normalizedChildren.length === 0) {\n if (nestedListChildren.length > 0) {\n normalizedChildren.push({ text: '' })\n } else {\n normalizedChildren.push({ text: $elem.text().replace(/\\s+/gm, ' ') })\n }\n }\n\n const ordered = getOrdered($elem)\n const level = getLevel($elem)\n const start = getOrderedStart($elem)\n const orderType = getOrderedType($elem)\n\n const currentItem: ListItemElement = {\n type: 'list-item',\n ordered,\n level,\n ...(start !== undefined ? { start } : {}),\n ...(orderType !== undefined ? { orderType } : {}),\n // @ts-ignore\n children: normalizedChildren,\n }\n\n if (nestedListChildren.length === 0) { return currentItem }\n return [currentItem, ...nestedListChildren]\n}\n\nexport const parseItemHtmlConf = {\n selector: 'li:not([data-w-e-type])', // data-w-e-type 属性,留给自定义元素,保证扩展性\n parseElemHtml: parseItemHtml,\n}\n\nfunction parseListHtml(\n _elem: DOMElement,\n children: Descendant[],\n _editor: IDomEditor,\n): ListItemElement[] {\n // @ts-ignore flatten 因为可能有 ul/ol 嵌套,重要!!!\n return children.flat(Infinity)\n}\n\nexport const parseListHtmlConf = {\n selector: 'ul:not([data-w-e-type]),ol:not([data-w-e-type])', // data-w-e-type 属性,留给自定义元素,保证扩展性\n parseElemHtml: parseListHtml,\n}\n","/**\n * @description editor 插件,重写 editor API\n * @author wangfupeng\n */\n\nimport { DomEditor, IDomEditor } from '@wangeditor-next/core'\nimport {\n Editor, Range, Transforms,\n} from 'slate'\n\nimport { ListItemElement } from './custom-types'\nimport { getBrotherListNodeByLevel } from './helpers'\n\n/**\n * 获取选中的 top elems\n * @param editor editor\n */\nfunction getTopSelectedElemsBySelection(editor: IDomEditor) {\n return Editor.nodes(editor, {\n at: editor.selection || undefined,\n match: n => DomEditor.findPath(editor, n).length === 1, // 只匹配顶级元素\n })\n}\n\nfunction withList<T extends IDomEditor>(editor: T): T {\n const {\n deleteBackward, handleTab, normalizeNode, insertBreak,\n } = editor\n const newEditor = editor\n\n // 重写 insertBreak - 空 list 点击回车时删除该空 list\n newEditor.insertBreak = () => {\n const [nodeEntry] = Editor.nodes(editor, {\n match: n => DomEditor.checkNodeType(n, 'list-item'),\n universal: true,\n })\n\n if (!nodeEntry) { return insertBreak() }\n const listElem = nodeEntry[0] as ListItemElement\n\n if (listElem.children[0].text === '') {\n Transforms.setNodes(newEditor, {\n type: 'paragraph',\n // @ts-ignore\n ordered: undefined,\n level: undefined,\n start: undefined,\n orderType: undefined,\n })\n return\n }\n return insertBreak()\n }\n\n // 重写 deleteBackward - 降低 level 或者转换为 p 元素\n newEditor.deleteBackward = unit => {\n const { selection } = newEditor\n\n if (selection == null) {\n deleteBackward(unit)\n return\n }\n\n if (Range.isExpanded(selection)) {\n deleteBackward(unit)\n return\n }\n\n const listItemElem = DomEditor.getSelectedNodeByType(newEditor, 'list-item')\n\n if (listItemElem == null) {\n // 未匹配到 list-item\n deleteBackward(unit)\n return\n }\n\n if (selection.focus.offset === 0) {\n // 选中了当前 list-item 文本的开头,此时按删除键,应该降低 level 或转换为 p 元素\n const { level = 0 } = listItemElem as ListItemElement\n\n if (level > 0) {\n // 如果有兄弟节点,则对齐兄弟节点的列表配置\n const brotherElem = getBrotherListNodeByLevel(\n editor,\n listItemElem as ListItemElement,\n level - 1,\n )\n\n if (brotherElem) {\n const nextOrdered = brotherElem.ordered\n\n Transforms.setNodes(newEditor, {\n level: level - 1,\n ordered: nextOrdered,\n start: nextOrdered ? brotherElem.start : undefined,\n orderType: nextOrdered ? brotherElem.orderType : undefined,\n })\n } else {\n Transforms.setNodes(newEditor, { level: level - 1 })\n }\n } else {\n // 转换为 p 元素\n Transforms.setNodes(newEditor, {\n type: 'paragraph',\n // @ts-ignore\n ordered: undefined,\n level: undefined,\n start: undefined,\n orderType: undefined,\n })\n }\n return\n }\n\n // 其他情况\n deleteBackward(unit)\n }\n\n // 重写 tab - 当选中 list-item 文本开头时,增加 level\n newEditor.handleTab = () => {\n const { selection } = newEditor\n\n if (selection == null) {\n handleTab()\n return\n }\n\n // 选区是合并的,判断单个 list-item 即可\n if (Range.isCollapsed(selection)) {\n const listItemElem = DomEditor.getSelectedNodeByType(newEditor, 'list-item')\n\n if (listItemElem == null) {\n // 未匹配到 list-item\n handleTab()\n return\n }\n\n if (selection.focus.offset === 0) {\n // 选中了当前 list-item 文本的开头,此时按 tab 应该增加 level\n const { level = 0 } = listItemElem as ListItemElement\n\n Transforms.setNodes(newEditor, { level: level + 1 })\n return\n }\n }\n\n // 选区是展开的,要判断多个 list-item\n if (Range.isExpanded(selection)) {\n let listItemNum = 0 // 选中的 list-item 有几个\n let hasOtherElem = false // 是否有其他元素\n\n for (const entry of getTopSelectedElemsBySelection(newEditor)) {\n const [elem] = entry\n const type = DomEditor.getNodeType(elem)\n\n if (type === 'list-item') { listItemNum += 1 } else { hasOtherElem = true }\n }\n\n if (hasOtherElem || listItemNum <= 1) {\n // 选中了其他元素,或者只选中一个 list-item ,则执行默认行为\n handleTab()\n return\n }\n\n // 未选中其他元素,且选中多个 list-item ,则增加 level\n for (const entry of getTopSelectedElemsBySelection(newEditor)) {\n const [elem, path] = entry\n const { level = 0 } = elem as ListItemElement\n\n Transforms.setNodes(newEditor, { level: level + 1 }, { at: path })\n }\n return\n }\n\n // 其他情况\n handleTab()\n }\n\n // 兼容之前的 JSON 格式 `numbered-list` 和 `bulleted-list` (之前的 list 没有嵌套功能)\n newEditor.normalizeNode = ([node, path]) => {\n const type = DomEditor.getNodeType(node)\n\n if (type === 'bulleted-list' || type === 'numbered-list') {\n Transforms.unwrapNodes(newEditor, { at: path })\n }\n\n // 执行默认行为\n return normalizeNode([node, path])\n }\n\n return newEditor\n}\n\nexport default withList\n","/**\n * @description render list elem\n * @author wangfupeng\n */\n\nimport { DomEditor, IDomEditor } from '@wangeditor-next/core'\nimport {\n Editor, Element as SlateElement, Path,\n} from 'slate'\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { jsx, VNode } from 'snabbdom'\n\nimport { ELEM_TO_EDITOR } from '../utils/maps'\nimport { getListItemColor } from '../utils/util'\nimport { ListItemElement } from './custom-types'\nimport {\n getNormalizedOrderedListStart,\n getNormalizedOrderedListType,\n hasSameListConfig,\n} from './helpers'\n\n/**\n * 无序列表:根据 level 获取的前置符号\n * @param level 层级\n */\nfunction genPreSymbol(level = 0): string {\n let s = ''\n\n switch (level) {\n case 0:\n s = '•' // 第一层级\n break\n case 1:\n s = '◦' // 第一层级\n break\n case 2:\n s = '▪' // 第三层级\n break\n default:\n s = '▪' // 其他层级\n }\n return s\n}\n\nfunction genAlphabetIndex(num: number, upper = false): string {\n if (num <= 0) { return String(num) }\n\n let n = num\n let result = ''\n\n while (n > 0) {\n const rem = (n - 1) % 26\n const charCode = (upper ? 65 : 97) + rem\n\n result = String.fromCharCode(charCode) + result\n n = Math.floor((n - 1) / 26)\n }\n\n return result\n}\n\nfunction genRomanIndex(num: number, upper = false): string {\n if (num <= 0 || num >= 4000) { return String(num) }\n\n const romanMap: Array<[number, string]> = [\n [1000, 'M'],\n [900, 'CM'],\n [500, 'D'],\n [400, 'CD'],\n [100, 'C'],\n [90, 'XC'],\n [50, 'L'],\n [40, 'XL'],\n [10, 'X'],\n [9, 'IX'],\n [5, 'V'],\n [4, 'IV'],\n [1, 'I'],\n ]\n\n let n = num\n let result = ''\n\n for (const [value, roman] of romanMap) {\n while (n >= value) {\n result += roman\n n -= value\n }\n }\n\n return upper ? result : result.toLowerCase()\n}\n\nfunction genOrderedPrefix(num: number, orderType: string): string {\n switch (orderType) {\n case 'a':\n return `${genAlphabetIndex(num)}.`\n case 'A':\n return `${genAlphabetIndex(num, true)}.`\n case 'i':\n return `${genRomanIndex(num)}.`\n case 'I':\n return `${genRomanIndex(num, true)}.`\n default:\n return `${num}.`\n }\n}\n\n/**\n * 有序列表:获取前缀 number\n * @param editor editor\n * @param elem listItem elem\n */\nfunction getOrderedItemNumber(editor: IDomEditor, elem: SlateElement): number {\n const listItemElem = elem as ListItemElement\n const { type, level = 0, ordered = false } = listItemElem\n\n let num = getNormalizedOrderedListStart(listItemElem)\n let curElem = elem\n let curPath = DomEditor.findPath(editor, curElem)\n\n // 第一个元素,直接返回起始值\n if (curPath[0] === 0) { return num }\n\n while (curPath[0] > 0) {\n const prevPath = Path.previous(curPath)\n const prevEntry = Editor.node(editor, prevPath)\n\n if (prevEntry == null) { break }\n const prevElem = prevEntry[0] as ListItemElement // 上一个节点\n const { level: prevLevel = 0, type: prevType, ordered: prevOrdered } = prevElem\n\n // type 不一致,退出循环,不再累加 num\n if (prevType !== type) { break }\n // prevLevel 更小,退出循环,不再累加 num\n if (prevLevel < level) { break }\n\n if (prevLevel === level) {\n // level 一样,如果 list 配置不一致,则退出循环,不再累加 num\n if (prevOrdered !== ordered || !hasSameListConfig(prevElem, listItemElem)) { break }\n // level 一样,order 配置一致,则累加 num\n num += 1\n }\n\n // prevLevel 更大,不累加 num ,继续向前\n curElem = prevElem\n curPath = prevPath\n }\n\n return num\n}\n\nfunction renderListElem(\n elemNode: SlateElement,\n children: VNode[] | null,\n editor: IDomEditor,\n): VNode {\n ELEM_TO_EDITOR.set(elemNode, editor) // 记录 elem 和 editor 关系,elem-to-html 时要用\n\n const { level = 0, ordered = false } = elemNode as ListItemElement\n\n // 根据 level 增加 margin-left\n const listStyle = {\n margin: `5px 0 5px ${level * 20}px`,\n display: 'flex',\n alignItems: 'flex-start',\n }\n\n // list-item 前缀\n let prefix = ''\n\n if (ordered) {\n // 有序列表:获取前缀 number\n const orderedNumber = getOrderedItemNumber(editor, elemNode)\n const orderType = getNormalizedOrderedListType(elemNode as ListItemElement)\n\n prefix = genOrderedPrefix(orderedNumber, orderType)\n } else {\n // 无序列表:根据层级,使用不同的前缀符号\n prefix = genPreSymbol(level)\n }\n\n // 获取前缀颜色\n const prefixColor = getListItemColor(elemNode)\n\n const vnode = (\n <div style={listStyle}>\n <span\n contentEditable={false}\n style={{ marginRight: '0.5em', color: prefixColor }}\n data-w-e-reserve\n >\n {prefix}\n </span>\n <span style={{\n flex: '1',\n wordBreak: 'break-word',\n }}>{children}</span>\n </div>\n )\n\n return vnode\n}\n\nconst renderListItemConf = {\n type: 'list-item',\n renderElem: renderListElem,\n}\n\nexport default renderListItemConf\n","/**\n * @description list module entry\n * @author wangfupeng\n */\n\nimport { IModuleConf } from '@wangeditor-next/core'\n\nimport listItemToHtmlConf from './elem-to-html'\nimport {\n bulletedListMenuConf,\n numberedListLowerAlphaMenuConf,\n numberedListMenuConf,\n} from './menu/index'\nimport { parseItemHtmlConf, parseListHtmlConf } from './parse-elem-html'\nimport withList from './plugin'\nimport renderListItemConf from './render-elem'\n\nconst list: Partial<IModuleConf> = {\n renderElems: [renderListItemConf],\n editorPlugin: withList,\n menus: [bulletedListMenuConf, numberedListMenuConf, numberedListLowerAlphaMenuConf],\n elemsToHtml: [listItemToHtmlConf],\n parseElemsHtml: [parseListHtmlConf, parseItemHtmlConf],\n}\n\nexport default list\n"],"names":["i18nAddResources","listModule","unOrderedList","orderedList","lowerAlphaList","ELEM_TO_EDITOR","WeakMap","getListItemColor","elem","firstTextNode","children","length","i","child","Text","isText","color","getNormalizedOrderedListStart","_a","ordered","start","Number","isNaN","getNormalizedOrderedListType","orderType","hasSameListConfig","a","b","getBrotherListNodeByLevel","editor","level","type","otherProps","elemLevel","undefined","brotherPath","DomEditor","findPath","Path","previous","brotherEntry","Editor","node","brotherElem","__read","_b","brotherLevel","getNodeType","REPORTED_UNSUPPORTED_LIST_COLOR","Set","normalizeColorValue","value","trim","replace","toLowerCase","DEFAULT_COLOR_SET","map","genListColorClassName","normalized","concat","input","hash","input_1","__values","input_1_1","next","codePointAt","toString","hashStyleValue","hasRegisteredListColor","has","extraTokens","getConfig","styleClassTokens","normalizedColor","hasExtraRegisteredColor","CONTAINER_TAG_STACK","STACK_EDITOR","getFallbackContainerTag","getAdjacentListItem","index","direction","targetIndex","targetNode","checkNodeType","listItemToHtmlConf","elemToHtml","childrenHtml","startContainerStr","endContainerStr","listItemElem","containerTag","getContainerTag","containerStartTag","attrs","orderStart","push","join","genContainerStartTag","bindEditor","get","bindEditorWithChildren","Array","isArray","passedEditorWithChildren","editorContainsElem","candidate","indexOf","finalEditor","styleEditor","html","prefix","suffix","prevItem","nextItem","hasNestedNext","prevLevel","closeTag","pop","diff","brother","getPrevSameLevelListItem","prefixColor","textStyleMode","getTextStyleMode","colorStyle","colorClass","colorData","action","policy","getClassStylePolicy","fallback","message","reportKey","add","reportUnsupportedClassStyle","scene","Error","resolveListColorAction","tag","NUMBERED_LIST_SVG","BaseMenu","this","prototype","getListNode","getSelectedNodeByType","getValue","_editor","isActive","listNode","isDisabled","selection","getSelectedElems","some","isVoid","isBlock","includes","exec","_value","Transforms","setNodes","indent","BulletedListMenu","_super","_this","title","t","iconSvg","__extends","LowerAlphaListMenu","NumberedListMenu","bulletedListMenuConf","key","factory","numberedListMenuConf","numberedListLowerAlphaMenuConf","getTagName","$elem","tagName","isStructuralWhitespaceText","text","appendTextLikeChildren","target","forEach","isInline","SlateElement","isElement","getTopSelectedElemsBySelection","nodes","at","match","n","genAlphabetIndex","num","upper","String","result","charCode","fromCharCode","Math","floor","genRomanIndex","romanMap_1","romanMap_1_1","roman","append","$","fn","attr","parent","list","renderElems","renderElem","elemNode","set","_c","listStyle","margin","display","alignItems","orderedNumber","curElem","curPath","prevPath","prevEntry","prevElem","prevType","prevOrdered","getOrderedItemNumber","genOrderedPrefix","s","genPreSymbol","jsx","style","contentEditable","marginRight","flex","wordBreak","editorPlugin","deleteBackward","handleTab","normalizeNode","insertBreak","newEditor","nodeEntry","universal","unit","Range","isExpanded","focus","offset","nextOrdered","isCollapsed","listItemNum","hasOtherElem","_d","_e","done","_g","_h","_j","path","_k","unwrapNodes","menus","elemsToHtml","parseElemsHtml","selector","parseElemHtml","_elem","flat","Infinity","normalizedChildren","nestedListChildren","getOrdered","listAncestorCount","$cur","max","getLevel","$list","startStr","parseInt","getOrderedStart","getOrderedType","currentItem","__spreadArray"],"mappings":"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"}
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@wangeditor-next/list-module",
3
- "version": "3.0.1",
3
+ "version": "3.0.3",
4
4
  "description": "wangEditor list module",
5
5
  "author": "cycleccc <2991205548@qq.com>",
6
6
  "type": "module",
7
- "homepage": "https://github.com/wangeditor-next/wangeditor-next#readme",
7
+ "homepage": "https://github.com/wangeditor-next/wangEditor-next#readme",
8
8
  "license": "MIT",
9
9
  "types": "dist/list-module/src/index.d.ts",
10
10
  "main": "dist/index.js",
@@ -32,10 +32,10 @@
32
32
  "url": "git+https://github.com/wangeditor-next/wangEditor-next.git"
33
33
  },
34
34
  "bugs": {
35
- "url": "https://github.com/wangeditor-next/wangeditor-next/issues"
35
+ "url": "https://github.com/wangeditor-next/wangEditor-next/issues"
36
36
  },
37
37
  "peerDependencies": {
38
- "@wangeditor-next/core": "1.9.1",
38
+ "@wangeditor-next/core": ">=1.9.5",
39
39
  "dom7": "^3.0.0 || ^4.0.0",
40
40
  "slate": "^0.124.0",
41
41
  "snabbdom": "^3.6.0"