@wangeditor-next/plugin-link-card 6.2.0 → 6.3.0

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.
package/README.md CHANGED
@@ -42,6 +42,10 @@ const editorConfig: Partial<IEditorConfig> = {
42
42
  'convertToLinkCard' // 增加 '转为链接卡片'菜单
43
43
  ],
44
44
  },
45
+ // 选中链接卡片时,要弹出的菜单
46
+ 'link-card': {
47
+ menuKeys: ['convertToLink'],
48
+ },
45
49
  },
46
50
 
47
51
  MENU_CONF: {
@@ -76,6 +80,8 @@ const editorConfig: Partial<IEditorConfig> = {
76
80
 
77
81
  一个 link-card 节点产出的 HTML 格式如下
78
82
 
83
+ 如果原链接设置了 `target`,会额外输出并在“转为链接”时恢复 `data-target` 属性。
84
+
79
85
  ```html
80
86
  <div data-w-e-type="link-card" data-w-e-is-void data-title="百度新闻" data-link="http://news.baidu.com/"
81
87
  data-iconImgSrc="https://news-bos.cdn.bcebos.com/mvideo/log-news.png">
@@ -12,6 +12,7 @@ declare class EditLinkMenu implements IModalMenu {
12
12
  readonly showModal = true;
13
13
  readonly modalWidth = 300;
14
14
  private $content;
15
+ private textInputId;
15
16
  private urlInputId;
16
17
  private buttonId;
17
18
  private getSelectedLinkElem;
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("@wangeditor-next/editor"),require("snabbdom")):"function"==typeof define&&define.amd?define(["@wangeditor-next/editor","snabbdom"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).WangEditorLinkCardPlugin=t(e.wangEditor,e.snabbdom)}(this,function(e,t){"use strict";e.i18nAddResources("en",{linkCard:{toCard:"To Card"}}),e.i18nAddResources("zh-CN",{linkCard:{toCard:"转为卡片"}});var n={type:"link-card",elemToHtml:function(e,t){var n=e,r=n.title,i=void 0===r?"":r,o=n.link,a=void 0===o?"":o,c=n.iconImgSrc,l=void 0===c?"":c;return'<div data-w-e-type="link-card" data-w-e-is-void data-title="'.concat(i,'" data-link="').concat(a,'" data-iconImgSrc="').concat(l,'">\n <div class="info-container">\n <div class="title-container"><p>').concat(i,'</p></div>\n <div class="link-container"><span>').concat(a,'</span></div>\n </div>\n <div class="icon-container">\n <img src="').concat(l,'"/>\n </div>\n </div>')}};function r(e,t,n,r){return new(n||(n=Promise))(function(i,o){function a(e){try{l(r.next(e))}catch(e){o(e)}}function c(e){try{l(r.throw(e))}catch(e){o(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n(function(e){e(t)})).then(a,c)}l((r=r.apply(e,t||[])).next())})}function i(e,t){var n,r,i,o={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]},a=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return a.next=c(0),a.throw=c(1),a.return=c(2),"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function c(c){return function(l){return function(c){if(n)throw new TypeError("Generator is already executing.");for(;a&&(a=0,c[0]&&(o=0)),o;)try{if(n=1,r&&(i=2&c[0]?r.return:c[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,c[1])).done)return i;switch(r=0,i&&(c=[2&c[0],i.value]),c[0]){case 0:case 1:i=c;break;case 4:return o.label++,{value:c[1],done:!1};case 5:o.label++,r=c[1],c=[0];continue;case 7:c=o.ops.pop(),o.trys.pop();continue;default:if(!(i=o.trys,(i=i.length>0&&i[i.length-1])||6!==c[0]&&2!==c[0])){o=0;continue}if(3===c[0]&&(!i||c[1]>i[0]&&c[1]<i[3])){o.label=c[1];break}if(6===c[0]&&o.label<i[1]){o.label=i[1],i=c;break}if(i&&o.label<i[2]){o.label=i[2],o.ops.push(c);break}i[2]&&o.ops.pop(),o.trys.pop();continue}c=t.call(e,o)}catch(e){c=[6,e],r=0}finally{n=i=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}([c,l])}}}"function"==typeof SuppressedError&&SuppressedError;var o=function(){function t(){this.title=e.t("linkCard.toCard"),this.iconSvg="",this.tag="button"}return t.prototype.getSelectedLinkElem=function(t){var n=e.DomEditor.getSelectedNodeByType(t,"link");return null==n?null:n},t.prototype.getValue=function(e){return""},t.prototype.isActive=function(e){return!1},t.prototype.isDisabled=function(e){return null==e.selection||null==this.getSelectedLinkElem(e)},t.prototype.exec=function(t,n){return r(this,void 0,void 0,function(){var n,r,o,a,c,l,u,d,s,f;return i(this,function(i){switch(i.label){case 0:if(this.isDisabled(t))return[2];if(null==(n=this.getSelectedLinkElem(t)))return[2];if("function"!=typeof(r=t.getMenuConfig("convertToLinkCard").getLinkCardInfo))return[2];o=n.url,a=e.SlateNode.string(n),i.label=1;case 1:return i.trys.push([1,3,,4]),[4,r(a,o)];case 2:return c=i.sent(),l=c.title,u=c.iconImgSrc,d=e.DomEditor.findPath(t,n),e.SlateTransforms.removeNodes(t,{at:d}),e.SlateTransforms.splitNodes(t,{always:!0}),s={type:"link-card",link:o,title:l,iconImgSrc:u,children:[{text:""}]},e.SlateTransforms.insertNodes(t,s),[3,4];case 3:return f=i.sent(),console.error("Convert to link-cart error",f),[3,4];case 4:return[2]}})})},t}();return{editorPlugin:function(t){var n=t.isVoid,r=t.normalizeNode,i=t;return i.isVoid=function(t){return"link-card"===e.DomEditor.getNodeType(t)||n(t)},i.normalizeNode=function(t){var n=function(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,i,o=n.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(r=o.next()).done;)a.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return a}(t,2),o=n[0],a=n[1];if("link-card"!==e.DomEditor.getNodeType(o))return r([o,a]);var c=(i.children||[])[a[0]+1]||{},l=e.DomEditor.getNodeType(c);if("paragraph"!==l&&"blockquote"!==l&&!l.startsWith("header")){var u=[a[0]+1];e.SlateTransforms.insertNodes(i,{type:"paragraph",children:[{text:""}]},{at:u})}},i},renderElems:[{type:"link-card",renderElem:function(n,r,i){var o=e.DomEditor.isNodeSelected(i,n),a=n,c=a.title,l=a.link,u=a.iconImgSrc,d=t.h("div",{props:{className:"w-e-textarea-link-card-text-container"}},[t.h("p",{props:{className:"w-e-link-card-title"}},c),t.h("span",{props:{className:"w-e-link-card-url",title:l}},l)]),s=t.h("div",{props:{className:"w-e-textarea-link-card-icon-container"}},[t.h("img",{props:{src:u||"data:image/png;base64,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"}})]);return t.h("div",{props:{contentEditable:!1,className:"w-e-textarea-link-card-container"},dataset:{selected:o?"true":"",href:l},on:{mousedown:function(e){return e.preventDefault()},click:function(e){o||window.open(l,"_blank","noopener,noreferrer")}}},[d,s])}}],elemsToHtml:[n],parseElemsHtml:[{selector:'div[data-w-e-type="link-card"]',parseElemHtml:function(e,t,n){return{type:"link-card",link:e.getAttribute("data-link")||"",title:e.getAttribute("data-title")||"",iconImgSrc:e.getAttribute("data-iconImgSrc")||"",children:[{text:""}]}}}],menus:[{key:"convertToLinkCard",factory:function(){return new o},config:{getLinkCardInfo:function(e,t){return r(this,void 0,void 0,function(){return i(this,function(t){return[2,new Promise(function(t){setTimeout(function(){t({title:e,iconImgSrc:""})},100)})]})})}}}]}});
1
+ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("@wangeditor-next/editor"),require("snabbdom")):"function"==typeof define&&define.amd?define(["@wangeditor-next/editor","snabbdom"],e):(t="undefined"!=typeof globalThis?globalThis:t||self).WangEditorLinkCardPlugin=e(t.wangEditor,t.snabbdom)}(this,function(t,e){"use strict";t.i18nAddResources("en",{linkCard:{toCard:"To Card",toLink:"To Link"}}),t.i18nAddResources("zh-CN",{linkCard:{toCard:"转为卡片",toLink:"转为链接"}});var n={type:"link-card",elemToHtml:function(t,e){var n=t,r=n.title,i=void 0===r?"":r,o=n.link,a=void 0===o?"":o,l=n.target,c=n.iconImgSrc,u=void 0===c?"":c,s=l?' data-target="'.concat(l,'"'):"";return'<div data-w-e-type="link-card" data-w-e-is-void data-title="'.concat(i,'" data-link="').concat(a,'"').concat(s,' data-iconImgSrc="').concat(u,'">\n <div class="info-container">\n <div class="title-container"><p>').concat(i,'</p></div>\n <div class="link-container"><span>').concat(a,'</span></div>\n </div>\n <div class="icon-container">\n <img src="').concat(u,'"/>\n </div>\n </div>')}},r=function(){return r=Object.assign||function(t){for(var e,n=1,r=arguments.length;n<r;n++)for(var i in e=arguments[n])Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i]);return t},r.apply(this,arguments)};function i(t,e,n,r){return new(n||(n=Promise))(function(i,o){function a(t){try{c(r.next(t))}catch(t){o(t)}}function l(t){try{c(r.throw(t))}catch(t){o(t)}}function c(t){var e;t.done?i(t.value):(e=t.value,e instanceof n?e:new n(function(t){t(e)})).then(a,l)}c((r=r.apply(t,e||[])).next())})}function o(t,e){var n,r,i,o={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]},a=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return a.next=l(0),a.throw=l(1),a.return=l(2),"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function l(l){return function(c){return function(l){if(n)throw new TypeError("Generator is already executing.");for(;a&&(a=0,l[0]&&(o=0)),o;)try{if(n=1,r&&(i=2&l[0]?r.return:l[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,l[1])).done)return i;switch(r=0,i&&(l=[2&l[0],i.value]),l[0]){case 0:case 1:i=l;break;case 4:return o.label++,{value:l[1],done:!1};case 5:o.label++,r=l[1],l=[0];continue;case 7:l=o.ops.pop(),o.trys.pop();continue;default:if(!(i=o.trys,(i=i.length>0&&i[i.length-1])||6!==l[0]&&2!==l[0])){o=0;continue}if(3===l[0]&&(!i||l[1]>i[0]&&l[1]<i[3])){o.label=l[1];break}if(6===l[0]&&o.label<i[1]){o.label=i[1],i=l;break}if(i&&o.label<i[2]){o.label=i[2],o.ops.push(l);break}i[2]&&o.ops.pop(),o.trys.pop();continue}l=e.call(t,o)}catch(t){l=[6,t],r=0}finally{n=i=0}if(5&l[0])throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}([l,c])}}}function a(t,e){var n="function"==typeof Symbol&&t[Symbol.iterator];if(!n)return t;var r,i,o=n.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(r=o.next()).done;)a.push(r.value)}catch(t){i={error:t}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return a}"function"==typeof SuppressedError&&SuppressedError;var l=function(){function e(){this.title=t.t("linkCard.toLink"),this.iconSvg="",this.tag="button"}return e.prototype.getSelectedLinkCardElem=function(e){var n=t.DomEditor.getSelectedNodeByType(e,"link-card");return null==n?null:n},e.prototype.getValue=function(t){return""},e.prototype.isActive=function(t){return!1},e.prototype.isDisabled=function(t){return null==t.selection||null==this.getSelectedLinkCardElem(t)},e.prototype.exec=function(e,n){if(!this.isDisabled(e)){var i=this.getSelectedLinkCardElem(e);if(null!=i){var o=a(t.SlateEditor.nodes(e,{at:e.selection,match:function(e){return t.DomEditor.checkNodeType(e,"link-card")},mode:"lowest",universal:!0}),1)[0];if(null!=o){var l=o[1],c=i.link,u=i.title,s=i.target,d=r(r({type:"link",url:c},s?{target:s}:{}),{children:[{text:u||c}]}),f={type:"paragraph",children:[d]};t.SlateEditor.withoutNormalizing(e,function(){t.SlateTransforms.removeNodes(e,{at:l}),t.SlateTransforms.insertNodes(e,f,{at:l})});var p=a(t.SlateEditor.nodes(e,{at:[],match:function(t){return t===d},mode:"all",universal:!0}),1)[0];if(null!=p){var A=p[1];t.SlateTransforms.select(e,{anchor:t.SlateEditor.start(e,A),focus:t.SlateEditor.end(e,A)})}}}}},e}(),c=function(){function e(){this.title=t.t("linkCard.toCard"),this.iconSvg="",this.tag="button"}return e.prototype.getSelectedLinkElem=function(e){var n=t.DomEditor.getSelectedNodeByType(e,"link");return null==n?null:n},e.prototype.getValue=function(t){return""},e.prototype.isActive=function(t){return!1},e.prototype.isDisabled=function(t){return null==t.selection||null==this.getSelectedLinkElem(t)},e.prototype.exec=function(e,n){return i(this,void 0,void 0,function(){var n,i,l,c,u,s,d,f,p,A,g,h,v,m;return o(this,function(o){switch(o.label){case 0:if(this.isDisabled(e))return[2];if(null==(n=this.getSelectedLinkElem(e)))return[2];if("function"!=typeof(i=e.getMenuConfig("convertToLinkCard").getLinkCardInfo))return[2];if(l=n.url,c=n.target,u=t.SlateNode.string(n),s=a(t.SlateEditor.nodes(e,{at:e.selection,match:function(e){return t.DomEditor.checkNodeType(e,"link")},mode:"lowest",universal:!0}),1),null==(d=s[0]))return[2];f=t.SlateEditor.pathRef(e,d[1]),o.label=1;case 1:return o.trys.push([1,3,4,5]),[4,i(u,l)];case 2:return p=o.sent(),A=p.title,g=p.iconImgSrc,null==(h=f.current)?[2]:(t.SlateTransforms.removeNodes(e,{at:h}),t.SlateTransforms.splitNodes(e,{always:!0}),v=r(r({type:"link-card",link:l,title:A},c?{target:c}:{}),{iconImgSrc:g,children:[{text:""}]}),t.SlateTransforms.insertNodes(e,v),[3,5]);case 3:return m=o.sent(),console.error("Convert to link-cart error",m),[3,5];case 4:return f.unref(),[7];case 5:return[2]}})})},e}();return{editorPlugin:function(e){var n=e.isVoid,r=e.normalizeNode,i=e;return i.isVoid=function(e){return"link-card"===t.DomEditor.getNodeType(e)||n(e)},i.normalizeNode=function(e){var n=a(e,2),o=n[0],l=n[1];if("link-card"!==t.DomEditor.getNodeType(o))return r([o,l]);var c=(i.children||[])[l[0]+1]||{},u=t.DomEditor.getNodeType(c);if("paragraph"!==u&&"blockquote"!==u&&!u.startsWith("header")){var s=[l[0]+1];t.SlateTransforms.insertNodes(i,{type:"paragraph",children:[{text:""}]},{at:s})}},i},renderElems:[{type:"link-card",renderElem:function(n,r,i){var o=t.DomEditor.isNodeSelected(i,n),a=n,l=a.title,c=a.link,u=a.iconImgSrc,s=e.h("div",{props:{className:"w-e-textarea-link-card-text-container"}},[e.h("p",{props:{className:"w-e-link-card-title"}},l),e.h("span",{props:{className:"w-e-link-card-url",title:c}},c)]),d=e.h("div",{props:{className:"w-e-textarea-link-card-icon-container"}},[e.h("img",{props:{src:u||"data:image/png;base64,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"}})]);return e.h("div",{props:{contentEditable:!1,className:"w-e-textarea-link-card-container"},dataset:{selected:o?"true":"",href:c},on:{mousedown:function(t){return t.preventDefault()},click:function(t){o||window.open(c,"_blank","noopener,noreferrer")}}},[s,d])}}],elemsToHtml:[n],parseElemsHtml:[{selector:'div[data-w-e-type="link-card"]',parseElemHtml:function(t,e,n){var i=t.getAttribute("data-link")||"",o=t.getAttribute("data-title")||"",a=t.getAttribute("data-target")||void 0,l=t.getAttribute("data-iconImgSrc")||"";return r(r({type:"link-card",link:i,title:o},a?{target:a}:{}),{iconImgSrc:l,children:[{text:""}]})}}],menus:[{key:"convertToLinkCard",factory:function(){return new c},config:{getLinkCardInfo:function(t,e){return i(this,void 0,void 0,function(){return o(this,function(e){return[2,new Promise(function(e){setTimeout(function(){e({title:t,iconImgSrc:""})},100)})]})})}}},{key:"convertToLink",factory:function(){return new l}}]}});
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/module/local.ts","../src/module/elem-to-html.ts","../src/module/menu/ConvertToLinkCard.ts","../src/module/index.ts","../src/module/plugin.ts","../src/module/render-elem.ts","../src/module/parse-elem-html.ts","../src/module/menu/index.ts","../src/module/menu/config.ts"],"sourcesContent":["/**\n * @description 多语言\n * @author wangfupeng\n */\n\nimport { i18nAddResources } from '@wangeditor-next/editor'\n\ni18nAddResources('en', {\n linkCard: {\n toCard: 'To Card',\n // delete: 'Delete',\n },\n})\n\ni18nAddResources('zh-CN', {\n linkCard: {\n toCard: '转为卡片',\n // delete: '删除',\n },\n})\n","/**\n * @description elem to html\n * @author wangfupeng\n */\n\nimport { SlateElement } from '@wangeditor-next/editor'\n\nimport { LinkCardElement } from './custom-types'\n\n// 生成 html 的函数\nfunction linkCardToHtml(elem: SlateElement, _childrenHtml: string): string {\n const { title = '', link = '', iconImgSrc = '' } = elem as LinkCardElement\n const html = `<div data-w-e-type=\"link-card\" data-w-e-is-void data-title=\"${title}\" data-link=\"${link}\" data-iconImgSrc=\"${iconImgSrc}\">\n <div class=\"info-container\">\n <div class=\"title-container\"><p>${title}</p></div>\n <div class=\"link-container\"><span>${link}</span></div>\n </div>\n <div class=\"icon-container\">\n <img src=\"${iconImgSrc}\"/>\n </div>\n </div>`\n\n return html\n}\n\n// 配置\nconst conf = {\n type: 'link-card', // 节点 type ,重要!!!\n elemToHtml: linkCardToHtml,\n}\n\nexport default conf\n","/**\n * @description convert link elem to link-card\n * @author wangfupeng\n */\n\nimport {\n DomEditor,\n IButtonMenu, IDomEditor,\n SlateNode,\n SlateTransforms,\n t,\n} from '@wangeditor-next/editor'\n\nimport { LinkCardElement, LinkElement } from '../custom-types'\n\nclass ConvertToLinkCard implements IButtonMenu {\n readonly title = t('linkCard.toCard')\n\n readonly iconSvg = '' // 无 icon\n\n readonly tag = 'button'\n\n private getSelectedLinkElem(editor: IDomEditor): LinkElement | null {\n const node = DomEditor.getSelectedNodeByType(editor, 'link')\n\n if (node == null) { return null }\n return node as LinkElement\n }\n\n getValue(_editor: IDomEditor): string | boolean {\n return ''\n }\n\n isActive(_editor: IDomEditor): boolean {\n // 无需 active\n return false\n }\n\n isDisabled(editor: IDomEditor): boolean {\n if (editor.selection == null) { return true }\n\n const linkElem = this.getSelectedLinkElem(editor)\n\n if (linkElem == null) {\n // 选区未处于 link node ,则禁用\n return true\n }\n return false\n }\n\n async exec(editor: IDomEditor, _value: string | boolean) {\n if (this.isDisabled(editor)) { return }\n\n const linkElem = this.getSelectedLinkElem(editor)\n\n if (linkElem == null) { return }\n\n const { getLinkCardInfo } = editor.getMenuConfig('convertToLinkCard')\n\n if (typeof getLinkCardInfo !== 'function') { return }\n\n const { url } = linkElem\n const text = SlateNode.string(linkElem)\n\n try {\n const { title, iconImgSrc } = await getLinkCardInfo(text, url) // 异步生成 link-card 信息\n\n const linkPath = DomEditor.findPath(editor, linkElem)\n\n SlateTransforms.removeNodes(editor, { at: linkPath })\n SlateTransforms.splitNodes(editor, { always: true })\n\n const linkCard: LinkCardElement = {\n type: 'link-card',\n link: url,\n title,\n iconImgSrc,\n children: [{ text: '' }],\n }\n\n SlateTransforms.insertNodes(editor, linkCard)\n } catch (err) {\n console.error('Convert to link-cart error', err)\n }\n }\n}\n\nexport default ConvertToLinkCard\n","/**\n * @description module entry\n * @author wangfupeng\n */\n\nimport './local' // 多语言\n\nimport { IModuleConf } from '@wangeditor-next/editor'\n\nimport elemToHtmlConf from './elem-to-html'\nimport { convertToLinkCardMenuConf } from './menu/index'\nimport parseHtmlConf from './parse-elem-html'\nimport withLinkCard from './plugin'\nimport renderElemConf from './render-elem'\n\nconst module: Partial<IModuleConf> = {\n editorPlugin: withLinkCard,\n renderElems: [renderElemConf],\n elemsToHtml: [elemToHtmlConf],\n parseElemsHtml: [parseHtmlConf],\n menus: [convertToLinkCardMenuConf],\n}\n\nexport default module\n","/**\n * @description link-card plugin\n * @author wangfupeng\n */\n\nimport { DomEditor, IDomEditor, SlateTransforms } from '@wangeditor-next/editor'\n\nfunction withLinkCard<T extends IDomEditor>(editor: T) {\n const { isVoid, normalizeNode } = editor\n const newEditor = editor\n\n // 重写 isVoid\n newEditor.isVoid = elem => {\n const type = DomEditor.getNodeType(elem)\n\n if (type === 'link-card') {\n return true\n }\n\n return isVoid(elem)\n }\n\n // 重新 normalize\n newEditor.normalizeNode = ([node, path]) => {\n const type = DomEditor.getNodeType(node)\n\n if (type !== 'link-card') {\n // 未命中 link-card ,执行默认的 normalizeNode\n return normalizeNode([node, path])\n }\n\n // editor 顶级 node\n const topLevelNodes = newEditor.children || []\n\n // --------------------- link-card 后面必须跟一个 p header blockquote(否则后面无法继续输入文字) ---------------------\n const nextNode = topLevelNodes[path[0] + 1] || {}\n const nextNodeType = DomEditor.getNodeType(nextNode)\n\n if (\n nextNodeType !== 'paragraph'\n && nextNodeType !== 'blockquote'\n && !nextNodeType.startsWith('header')\n ) {\n // link-card node 后面不是 p 或 header ,则插入一个空 p\n const p = { type: 'paragraph', children: [{ text: '' }] }\n const insertPath = [path[0] + 1]\n\n SlateTransforms.insertNodes(newEditor, p, {\n at: insertPath, // 在 link-card 后面插入\n })\n }\n }\n\n return newEditor\n}\n\nexport default withLinkCard\n","/**\n * @description render elem\n * @author wangfupeng\n */\n\nimport { DomEditor, IDomEditor, SlateElement } from '@wangeditor-next/editor'\nimport { h, VNode } from 'snabbdom'\n\nimport { LinkCardElement } from './custom-types'\n\nconst DEFAULT_ICON_IMG_SRC = 'data:image/png;base64,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'\n\nfunction renderLinkCard(elem: SlateElement, children: VNode[] | null, editor: IDomEditor): VNode {\n const selected = DomEditor.isNodeSelected(editor, elem) // 当前节点是否选中\n const { title, link, iconImgSrc } = elem as LinkCardElement\n\n // 文字部分\n const infoVnode = h(\n 'div',\n {\n props: {\n className: 'w-e-textarea-link-card-text-container',\n },\n },\n [\n h('p', { props: { className: 'w-e-link-card-title' } }, title),\n h('span', {\n props: {\n className: 'w-e-link-card-url',\n title: link,\n },\n }, link),\n ],\n )\n\n // 图片部分\n const iconVnode = h(\n 'div',\n {\n props: {\n className: 'w-e-textarea-link-card-icon-container',\n },\n },\n [h('img', { props: { src: iconImgSrc || DEFAULT_ICON_IMG_SRC } })],\n )\n\n // 容器\n const vnode = h(\n 'div',\n {\n props: {\n contentEditable: false,\n className: 'w-e-textarea-link-card-container',\n },\n dataset: {\n selected: selected ? 'true' : '', // 标记为 选中\n href: link,\n },\n on: {\n mousedown: event => event.preventDefault(),\n click: _event => {\n if (!selected) {\n window.open(link, '_blank', 'noopener,noreferrer')\n }\n },\n },\n },\n [infoVnode, iconVnode],\n )\n\n return vnode\n}\n\nconst conf = {\n type: 'link-card', // 节点 type ,重要!!!\n renderElem: renderLinkCard,\n}\n\nexport default conf\n","/**\n * @description parse elem html\n * @author wangfupeng\n */\n\nimport { IDomEditor, SlateDescendant, SlateElement } from '@wangeditor-next/editor'\n\nimport { DOMElement } from '../utils/dom'\nimport { LinkCardElement } from './custom-types'\n\nfunction parseHtml(\n elem: DOMElement,\n _children: SlateDescendant[],\n _editor: IDomEditor,\n): SlateElement {\n const link = elem.getAttribute('data-link') || ''\n const title = elem.getAttribute('data-title') || ''\n const iconImgSrc = elem.getAttribute('data-iconImgSrc') || ''\n\n return {\n type: 'link-card',\n link,\n title,\n iconImgSrc,\n children: [{ text: '' }], // void node 必须有一个空白 text\n } as LinkCardElement\n}\n\nconst parseHtmlConf = {\n selector: 'div[data-w-e-type=\"link-card\"]',\n parseElemHtml: parseHtml,\n}\n\nexport default parseHtmlConf\n","/**\n * @description menu index\n * @author wangfupeng\n */\n\nimport { genConvertToLinkCardConfig } from './config'\nimport ConvertToLinkCard from './ConvertToLinkCard'\n\nexport const convertToLinkCardMenuConf = {\n key: 'convertToLinkCard',\n factory() {\n return new ConvertToLinkCard()\n },\n\n // 默认的菜单菜单配置,将存储在 editorConfig.MENU_CONF[key] 中\n // 创建编辑器时,可通过 editorConfig.MENU_CONF[key] = {...} 来修改\n config: genConvertToLinkCardConfig(),\n}\n","/**\n * @description menu config\n * @author wangfupeng\n */\n\nexport function genConvertToLinkCardConfig() {\n return {\n /**\n * 异步获取 link-card 信息(可能需要在服务端获取)\n * @param linkText link text\n * @param linkUrl link url\n * @returns link-card info\n */\n async getLinkCardInfo(\n linkText: string,\n _linkUrl: string,\n ): Promise<{ title: string; iconImgSrc: string }> {\n // 该函数,用户自定义配置\n // 1. 使用 iframe 加载 linkUrl 来获取 title 和 iconImgSrc\n // 2. 但有些网页禁止跨域 iframe 加载(即 X-Frame-Options),此时需要在服务端获取\n\n return new Promise(resolve => {\n setTimeout(() => {\n const info = { title: linkText, iconImgSrc: '' }\n\n resolve(info)\n }, 100)\n })\n },\n }\n}\n"],"names":["i18nAddResources","linkCard","toCard","conf","type","elemToHtml","elem","_childrenHtml","_a","_b","title","_c","link","_d","iconImgSrc","concat","ConvertToLinkCard","this","t","iconSvg","tag","prototype","getSelectedLinkElem","editor","node","DomEditor","getSelectedNodeByType","getValue","_editor","isActive","isDisabled","selection","exec","_value","linkElem","getLinkCardInfo","getMenuConfig","url","text","SlateNode","string","sent","linkPath","findPath","SlateTransforms","removeNodes","at","splitNodes","always","children","insertNodes","console","error","err_1","editorPlugin","isVoid","normalizeNode","newEditor","getNodeType","__read","path","nextNode","nextNodeType","startsWith","insertPath","renderElems","renderElem","selected","isNodeSelected","infoVnode","h","props","className","iconVnode","src","contentEditable","dataset","href","on","mousedown","event","preventDefault","click","_event","window","open","elemsToHtml","elemToHtmlConf","parseElemsHtml","selector","parseElemHtml","_children","getAttribute","menus","key","factory","config","linkText","_linkUrl","Promise","resolve","setTimeout"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/module/local.ts","../src/module/elem-to-html.ts","../src/module/menu/ConvertToLink.ts","../src/module/menu/ConvertToLinkCard.ts","../src/module/index.ts","../src/module/plugin.ts","../src/module/render-elem.ts","../src/module/parse-elem-html.ts","../src/module/menu/index.ts","../src/module/menu/config.ts"],"sourcesContent":["/**\n * @description 多语言\n * @author wangfupeng\n */\n\nimport { i18nAddResources } from '@wangeditor-next/editor'\n\ni18nAddResources('en', {\n linkCard: {\n toCard: 'To Card',\n toLink: 'To Link',\n // delete: 'Delete',\n },\n})\n\ni18nAddResources('zh-CN', {\n linkCard: {\n toCard: '转为卡片',\n toLink: '转为链接',\n // delete: '删除',\n },\n})\n","/**\n * @description elem to html\n * @author wangfupeng\n */\n\nimport { SlateElement } from '@wangeditor-next/editor'\n\nimport { LinkCardElement } from './custom-types'\n\n// 生成 html 的函数\nfunction linkCardToHtml(elem: SlateElement, _childrenHtml: string): string {\n const { title = '', link = '', target, iconImgSrc = '' } = elem as LinkCardElement\n const targetAttr = target ? ` data-target=\"${target}\"` : ''\n const html = `<div data-w-e-type=\"link-card\" data-w-e-is-void data-title=\"${title}\" data-link=\"${link}\"${targetAttr} data-iconImgSrc=\"${iconImgSrc}\">\n <div class=\"info-container\">\n <div class=\"title-container\"><p>${title}</p></div>\n <div class=\"link-container\"><span>${link}</span></div>\n </div>\n <div class=\"icon-container\">\n <img src=\"${iconImgSrc}\"/>\n </div>\n </div>`\n\n return html\n}\n\n// 配置\nconst conf = {\n type: 'link-card', // 节点 type ,重要!!!\n elemToHtml: linkCardToHtml,\n}\n\nexport default conf\n","/**\n * @description convert link-card elem to link\n * @author wangfupeng\n */\n\nimport {\n DomEditor,\n IButtonMenu,\n IDomEditor,\n SlateEditor,\n SlateTransforms,\n t,\n} from '@wangeditor-next/editor'\n\nimport { LinkCardElement, LinkElement } from '../custom-types'\n\nclass ConvertToLink implements IButtonMenu {\n readonly title = t('linkCard.toLink')\n\n readonly iconSvg = ''\n\n readonly tag = 'button'\n\n private getSelectedLinkCardElem(editor: IDomEditor): LinkCardElement | null {\n const node = DomEditor.getSelectedNodeByType(editor, 'link-card')\n\n if (node == null) {\n return null\n }\n return node as LinkCardElement\n }\n\n getValue(_editor: IDomEditor): string | boolean {\n return ''\n }\n\n isActive(_editor: IDomEditor): boolean {\n return false\n }\n\n isDisabled(editor: IDomEditor): boolean {\n return editor.selection == null || this.getSelectedLinkCardElem(editor) == null\n }\n\n exec(editor: IDomEditor, _value: string | boolean) {\n if (this.isDisabled(editor)) {\n return\n }\n\n const linkCardElem = this.getSelectedLinkCardElem(editor)\n\n if (linkCardElem == null) {\n return\n }\n\n const [linkCardEntry] = SlateEditor.nodes(editor, {\n at: editor.selection!,\n match: node => DomEditor.checkNodeType(node, 'link-card'),\n mode: 'lowest',\n universal: true,\n })\n\n if (linkCardEntry == null) {\n return\n }\n\n const linkCardPath = linkCardEntry[1]\n const { link: url, title, target } = linkCardElem\n const linkElem: LinkElement = {\n type: 'link',\n url,\n ...(target ? { target } : {}),\n children: [{ text: title || url }],\n }\n const paragraph = { type: 'paragraph', children: [linkElem] }\n\n SlateEditor.withoutNormalizing(editor, () => {\n SlateTransforms.removeNodes(editor, { at: linkCardPath })\n SlateTransforms.insertNodes(editor, paragraph, { at: linkCardPath })\n })\n\n const [linkEntry] = SlateEditor.nodes(editor, {\n at: [],\n match: node => node === linkElem,\n mode: 'all',\n universal: true,\n })\n\n if (linkEntry != null) {\n const linkPath = linkEntry[1]\n\n SlateTransforms.select(editor, {\n anchor: SlateEditor.start(editor, linkPath),\n focus: SlateEditor.end(editor, linkPath),\n })\n }\n }\n}\n\nexport default ConvertToLink\n","/**\n * @description convert link elem to link-card\n * @author wangfupeng\n */\n\nimport {\n DomEditor,\n IButtonMenu, IDomEditor,\n SlateEditor,\n SlateNode,\n SlateTransforms,\n t,\n} from '@wangeditor-next/editor'\n\nimport { LinkCardElement, LinkElement } from '../custom-types'\n\nclass ConvertToLinkCard implements IButtonMenu {\n readonly title = t('linkCard.toCard')\n\n readonly iconSvg = '' // 无 icon\n\n readonly tag = 'button'\n\n private getSelectedLinkElem(editor: IDomEditor): LinkElement | null {\n const node = DomEditor.getSelectedNodeByType(editor, 'link')\n\n if (node == null) { return null }\n return node as LinkElement\n }\n\n getValue(_editor: IDomEditor): string | boolean {\n return ''\n }\n\n isActive(_editor: IDomEditor): boolean {\n // 无需 active\n return false\n }\n\n isDisabled(editor: IDomEditor): boolean {\n if (editor.selection == null) { return true }\n\n const linkElem = this.getSelectedLinkElem(editor)\n\n if (linkElem == null) {\n // 选区未处于 link node ,则禁用\n return true\n }\n return false\n }\n\n async exec(editor: IDomEditor, _value: string | boolean) {\n if (this.isDisabled(editor)) { return }\n\n const linkElem = this.getSelectedLinkElem(editor)\n\n if (linkElem == null) { return }\n\n const { getLinkCardInfo } = editor.getMenuConfig('convertToLinkCard')\n\n if (typeof getLinkCardInfo !== 'function') { return }\n\n const { url, target } = linkElem\n const text = SlateNode.string(linkElem)\n const [linkEntry] = SlateEditor.nodes(editor, {\n at: editor.selection!,\n match: node => DomEditor.checkNodeType(node, 'link'),\n mode: 'lowest',\n universal: true,\n })\n\n if (linkEntry == null) {\n return\n }\n\n const linkPathRef = SlateEditor.pathRef(editor, linkEntry[1])\n\n try {\n const { title, iconImgSrc } = await getLinkCardInfo(text, url) // 异步生成 link-card 信息\n const linkPath = linkPathRef.current\n\n if (linkPath == null) { return }\n\n SlateTransforms.removeNodes(editor, { at: linkPath })\n SlateTransforms.splitNodes(editor, { always: true })\n\n const linkCard: LinkCardElement = {\n type: 'link-card',\n link: url,\n title,\n ...(target ? { target } : {}),\n iconImgSrc,\n children: [{ text: '' }],\n }\n\n SlateTransforms.insertNodes(editor, linkCard)\n } catch (err) {\n console.error('Convert to link-cart error', err)\n } finally {\n linkPathRef.unref()\n }\n }\n}\n\nexport default ConvertToLinkCard\n","/**\n * @description module entry\n * @author wangfupeng\n */\n\nimport './local' // 多语言\n\nimport { IModuleConf } from '@wangeditor-next/editor'\n\nimport elemToHtmlConf from './elem-to-html'\nimport { convertToLinkCardMenuConf, convertToLinkMenuConf } from './menu/index'\nimport parseHtmlConf from './parse-elem-html'\nimport withLinkCard from './plugin'\nimport renderElemConf from './render-elem'\n\nconst module: Partial<IModuleConf> = {\n editorPlugin: withLinkCard,\n renderElems: [renderElemConf],\n elemsToHtml: [elemToHtmlConf],\n parseElemsHtml: [parseHtmlConf],\n menus: [convertToLinkCardMenuConf, convertToLinkMenuConf],\n}\n\nexport default module\n","/**\n * @description link-card plugin\n * @author wangfupeng\n */\n\nimport { DomEditor, IDomEditor, SlateTransforms } from '@wangeditor-next/editor'\n\nfunction withLinkCard<T extends IDomEditor>(editor: T) {\n const { isVoid, normalizeNode } = editor\n const newEditor = editor\n\n // 重写 isVoid\n newEditor.isVoid = elem => {\n const type = DomEditor.getNodeType(elem)\n\n if (type === 'link-card') {\n return true\n }\n\n return isVoid(elem)\n }\n\n // 重新 normalize\n newEditor.normalizeNode = ([node, path]) => {\n const type = DomEditor.getNodeType(node)\n\n if (type !== 'link-card') {\n // 未命中 link-card ,执行默认的 normalizeNode\n return normalizeNode([node, path])\n }\n\n // editor 顶级 node\n const topLevelNodes = newEditor.children || []\n\n // --------------------- link-card 后面必须跟一个 p header blockquote(否则后面无法继续输入文字) ---------------------\n const nextNode = topLevelNodes[path[0] + 1] || {}\n const nextNodeType = DomEditor.getNodeType(nextNode)\n\n if (\n nextNodeType !== 'paragraph'\n && nextNodeType !== 'blockquote'\n && !nextNodeType.startsWith('header')\n ) {\n // link-card node 后面不是 p 或 header ,则插入一个空 p\n const p = { type: 'paragraph', children: [{ text: '' }] }\n const insertPath = [path[0] + 1]\n\n SlateTransforms.insertNodes(newEditor, p, {\n at: insertPath, // 在 link-card 后面插入\n })\n }\n }\n\n return newEditor\n}\n\nexport default withLinkCard\n","/**\n * @description render elem\n * @author wangfupeng\n */\n\nimport { DomEditor, IDomEditor, SlateElement } from '@wangeditor-next/editor'\nimport { h, VNode } from 'snabbdom'\n\nimport { LinkCardElement } from './custom-types'\n\nconst DEFAULT_ICON_IMG_SRC = 'data:image/png;base64,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'\n\nfunction renderLinkCard(elem: SlateElement, children: VNode[] | null, editor: IDomEditor): VNode {\n const selected = DomEditor.isNodeSelected(editor, elem) // 当前节点是否选中\n const { title, link, iconImgSrc } = elem as LinkCardElement\n\n // 文字部分\n const infoVnode = h(\n 'div',\n {\n props: {\n className: 'w-e-textarea-link-card-text-container',\n },\n },\n [\n h('p', { props: { className: 'w-e-link-card-title' } }, title),\n h('span', {\n props: {\n className: 'w-e-link-card-url',\n title: link,\n },\n }, link),\n ],\n )\n\n // 图片部分\n const iconVnode = h(\n 'div',\n {\n props: {\n className: 'w-e-textarea-link-card-icon-container',\n },\n },\n [h('img', { props: { src: iconImgSrc || DEFAULT_ICON_IMG_SRC } })],\n )\n\n // 容器\n const vnode = h(\n 'div',\n {\n props: {\n contentEditable: false,\n className: 'w-e-textarea-link-card-container',\n },\n dataset: {\n selected: selected ? 'true' : '', // 标记为 选中\n href: link,\n },\n on: {\n mousedown: event => event.preventDefault(),\n click: _event => {\n if (!selected) {\n window.open(link, '_blank', 'noopener,noreferrer')\n }\n },\n },\n },\n [infoVnode, iconVnode],\n )\n\n return vnode\n}\n\nconst conf = {\n type: 'link-card', // 节点 type ,重要!!!\n renderElem: renderLinkCard,\n}\n\nexport default conf\n","/**\n * @description parse elem html\n * @author wangfupeng\n */\n\nimport { IDomEditor, SlateDescendant, SlateElement } from '@wangeditor-next/editor'\n\nimport { DOMElement } from '../utils/dom'\nimport { LinkCardElement } from './custom-types'\n\nfunction parseHtml(\n elem: DOMElement,\n _children: SlateDescendant[],\n _editor: IDomEditor,\n): SlateElement {\n const link = elem.getAttribute('data-link') || ''\n const title = elem.getAttribute('data-title') || ''\n const target = elem.getAttribute('data-target') || undefined\n const iconImgSrc = elem.getAttribute('data-iconImgSrc') || ''\n\n return {\n type: 'link-card',\n link,\n title,\n ...(target ? { target } : {}),\n iconImgSrc,\n children: [{ text: '' }], // void node 必须有一个空白 text\n } as LinkCardElement\n}\n\nconst parseHtmlConf = {\n selector: 'div[data-w-e-type=\"link-card\"]',\n parseElemHtml: parseHtml,\n}\n\nexport default parseHtmlConf\n","/**\n * @description menu index\n * @author wangfupeng\n */\n\nimport { genConvertToLinkCardConfig } from './config'\nimport ConvertToLink from './ConvertToLink'\nimport ConvertToLinkCard from './ConvertToLinkCard'\n\nexport const convertToLinkCardMenuConf = {\n key: 'convertToLinkCard',\n factory() {\n return new ConvertToLinkCard()\n },\n\n // 默认的菜单菜单配置,将存储在 editorConfig.MENU_CONF[key] 中\n // 创建编辑器时,可通过 editorConfig.MENU_CONF[key] = {...} 来修改\n config: genConvertToLinkCardConfig(),\n}\n\nexport const convertToLinkMenuConf = {\n key: 'convertToLink',\n factory() {\n return new ConvertToLink()\n },\n}\n","/**\n * @description menu config\n * @author wangfupeng\n */\n\nexport function genConvertToLinkCardConfig() {\n return {\n /**\n * 异步获取 link-card 信息(可能需要在服务端获取)\n * @param linkText link text\n * @param linkUrl link url\n * @returns link-card info\n */\n async getLinkCardInfo(\n linkText: string,\n _linkUrl: string,\n ): Promise<{ title: string; iconImgSrc: string }> {\n // 该函数,用户自定义配置\n // 1. 使用 iframe 加载 linkUrl 来获取 title 和 iconImgSrc\n // 2. 但有些网页禁止跨域 iframe 加载(即 X-Frame-Options),此时需要在服务端获取\n\n return new Promise(resolve => {\n setTimeout(() => {\n const info = { title: linkText, iconImgSrc: '' }\n\n resolve(info)\n }, 100)\n })\n },\n }\n}\n"],"names":["i18nAddResources","linkCard","toCard","toLink","conf","type","elemToHtml","elem","_childrenHtml","_a","_b","title","_c","link","target","_d","iconImgSrc","targetAttr","concat","ConvertToLink","this","t","iconSvg","tag","prototype","getSelectedLinkCardElem","editor","node","DomEditor","getSelectedNodeByType","getValue","_editor","isActive","isDisabled","selection","exec","_value","linkCardElem","linkCardEntry","__read","SlateEditor","nodes","at","match","checkNodeType","mode","universal","linkCardPath","url","linkElem","__assign","children","text","paragraph","withoutNormalizing","SlateTransforms","removeNodes","insertNodes","linkEntry","linkPath","select","anchor","start","focus","end","ConvertToLinkCard","getSelectedLinkElem","getLinkCardInfo","getMenuConfig","SlateNode","string","linkPathRef","pathRef","sent","current","splitNodes","always","console","error","err_1","unref","editorPlugin","isVoid","normalizeNode","newEditor","getNodeType","path","nextNode","nextNodeType","startsWith","insertPath","renderElems","renderElem","selected","isNodeSelected","infoVnode","h","props","className","iconVnode","src","contentEditable","dataset","href","on","mousedown","event","preventDefault","click","_event","window","open","elemsToHtml","elemToHtmlConf","parseElemsHtml","selector","parseElemHtml","_children","getAttribute","undefined","menus","key","factory","config","linkText","_linkUrl","Promise","resolve","setTimeout"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{i18nAddResources as t,t as e,DomEditor as n,SlateTransforms as r,SlateNode as i}from"@wangeditor-next/editor";import{h as o}from"snabbdom";t("en",{linkCard:{toCard:"To Card"}}),t("zh-CN",{linkCard:{toCard:"转为卡片"}});var a={type:"link-card",elemToHtml:function(t,e){var n=t,r=n.title,i=void 0===r?"":r,o=n.link,a=void 0===o?"":o,c=n.iconImgSrc,l=void 0===c?"":c;return'<div data-w-e-type="link-card" data-w-e-is-void data-title="'.concat(i,'" data-link="').concat(a,'" data-iconImgSrc="').concat(l,'">\n <div class="info-container">\n <div class="title-container"><p>').concat(i,'</p></div>\n <div class="link-container"><span>').concat(a,'</span></div>\n </div>\n <div class="icon-container">\n <img src="').concat(l,'"/>\n </div>\n </div>')}};function c(t,e,n,r){return new(n||(n=Promise))(function(i,o){function a(t){try{l(r.next(t))}catch(t){o(t)}}function c(t){try{l(r.throw(t))}catch(t){o(t)}}function l(t){var e;t.done?i(t.value):(e=t.value,e instanceof n?e:new n(function(t){t(e)})).then(a,c)}l((r=r.apply(t,e||[])).next())})}function l(t,e){var n,r,i,o={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]},a=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return a.next=c(0),a.throw=c(1),a.return=c(2),"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function c(c){return function(l){return function(c){if(n)throw new TypeError("Generator is already executing.");for(;a&&(a=0,c[0]&&(o=0)),o;)try{if(n=1,r&&(i=2&c[0]?r.return:c[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,c[1])).done)return i;switch(r=0,i&&(c=[2&c[0],i.value]),c[0]){case 0:case 1:i=c;break;case 4:return o.label++,{value:c[1],done:!1};case 5:o.label++,r=c[1],c=[0];continue;case 7:c=o.ops.pop(),o.trys.pop();continue;default:if(!(i=o.trys,(i=i.length>0&&i[i.length-1])||6!==c[0]&&2!==c[0])){o=0;continue}if(3===c[0]&&(!i||c[1]>i[0]&&c[1]<i[3])){o.label=c[1];break}if(6===c[0]&&o.label<i[1]){o.label=i[1],i=c;break}if(i&&o.label<i[2]){o.label=i[2],o.ops.push(c);break}i[2]&&o.ops.pop(),o.trys.pop();continue}c=e.call(t,o)}catch(t){c=[6,t],r=0}finally{n=i=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}([c,l])}}}"function"==typeof SuppressedError&&SuppressedError;var u=function(){function t(){this.title=e("linkCard.toCard"),this.iconSvg="",this.tag="button"}return t.prototype.getSelectedLinkElem=function(t){var e=n.getSelectedNodeByType(t,"link");return null==e?null:e},t.prototype.getValue=function(t){return""},t.prototype.isActive=function(t){return!1},t.prototype.isDisabled=function(t){return null==t.selection||null==this.getSelectedLinkElem(t)},t.prototype.exec=function(t,e){return c(this,void 0,void 0,function(){var e,o,a,c,u,s,d,p,A,f;return l(this,function(l){switch(l.label){case 0:if(this.isDisabled(t))return[2];if(null==(e=this.getSelectedLinkElem(t)))return[2];if("function"!=typeof(o=t.getMenuConfig("convertToLinkCard").getLinkCardInfo))return[2];a=e.url,c=i.string(e),l.label=1;case 1:return l.trys.push([1,3,,4]),[4,o(c,a)];case 2:return u=l.sent(),s=u.title,d=u.iconImgSrc,p=n.findPath(t,e),r.removeNodes(t,{at:p}),r.splitNodes(t,{always:!0}),A={type:"link-card",link:a,title:s,iconImgSrc:d,children:[{text:""}]},r.insertNodes(t,A),[3,4];case 3:return f=l.sent(),console.error("Convert to link-cart error",f),[3,4];case 4:return[2]}})})},t}();var s={editorPlugin:function(t){var e=t.isVoid,i=t.normalizeNode,o=t;return o.isVoid=function(t){return"link-card"===n.getNodeType(t)||e(t)},o.normalizeNode=function(t){var e=function(t,e){var n="function"==typeof Symbol&&t[Symbol.iterator];if(!n)return t;var r,i,o=n.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(r=o.next()).done;)a.push(r.value)}catch(t){i={error:t}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return a}(t,2),a=e[0],c=e[1];if("link-card"!==n.getNodeType(a))return i([a,c]);var l=(o.children||[])[c[0]+1]||{},u=n.getNodeType(l);if("paragraph"!==u&&"blockquote"!==u&&!u.startsWith("header")){var s=[c[0]+1];r.insertNodes(o,{type:"paragraph",children:[{text:""}]},{at:s})}},o},renderElems:[{type:"link-card",renderElem:function(t,e,r){var i=n.isNodeSelected(r,t),a=t,c=a.title,l=a.link,u=a.iconImgSrc,s=o("div",{props:{className:"w-e-textarea-link-card-text-container"}},[o("p",{props:{className:"w-e-link-card-title"}},c),o("span",{props:{className:"w-e-link-card-url",title:l}},l)]),d=o("div",{props:{className:"w-e-textarea-link-card-icon-container"}},[o("img",{props:{src:u||"data:image/png;base64,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"}})]);return o("div",{props:{contentEditable:!1,className:"w-e-textarea-link-card-container"},dataset:{selected:i?"true":"",href:l},on:{mousedown:function(t){return t.preventDefault()},click:function(t){i||window.open(l,"_blank","noopener,noreferrer")}}},[s,d])}}],elemsToHtml:[a],parseElemsHtml:[{selector:'div[data-w-e-type="link-card"]',parseElemHtml:function(t,e,n){return{type:"link-card",link:t.getAttribute("data-link")||"",title:t.getAttribute("data-title")||"",iconImgSrc:t.getAttribute("data-iconImgSrc")||"",children:[{text:""}]}}}],menus:[{key:"convertToLinkCard",factory:function(){return new u},config:{getLinkCardInfo:function(t,e){return c(this,void 0,void 0,function(){return l(this,function(e){return[2,new Promise(function(e){setTimeout(function(){e({title:t,iconImgSrc:""})},100)})]})})}}}]};export{s as default};
1
+ import{i18nAddResources as t,t as e,DomEditor as n,SlateEditor as r,SlateTransforms as i,SlateNode as o}from"@wangeditor-next/editor";import{h as a}from"snabbdom";t("en",{linkCard:{toCard:"To Card",toLink:"To Link"}}),t("zh-CN",{linkCard:{toCard:"转为卡片",toLink:"转为链接"}});var c={type:"link-card",elemToHtml:function(t,e){var n=t,r=n.title,i=void 0===r?"":r,o=n.link,a=void 0===o?"":o,c=n.target,l=n.iconImgSrc,u=void 0===l?"":l,s=c?' data-target="'.concat(c,'"'):"";return'<div data-w-e-type="link-card" data-w-e-is-void data-title="'.concat(i,'" data-link="').concat(a,'"').concat(s,' data-iconImgSrc="').concat(u,'">\n <div class="info-container">\n <div class="title-container"><p>').concat(i,'</p></div>\n <div class="link-container"><span>').concat(a,'</span></div>\n </div>\n <div class="icon-container">\n <img src="').concat(u,'"/>\n </div>\n </div>')}},l=function(){return l=Object.assign||function(t){for(var e,n=1,r=arguments.length;n<r;n++)for(var i in e=arguments[n])Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i]);return t},l.apply(this,arguments)};function u(t,e,n,r){return new(n||(n=Promise))(function(i,o){function a(t){try{l(r.next(t))}catch(t){o(t)}}function c(t){try{l(r.throw(t))}catch(t){o(t)}}function l(t){var e;t.done?i(t.value):(e=t.value,e instanceof n?e:new n(function(t){t(e)})).then(a,c)}l((r=r.apply(t,e||[])).next())})}function s(t,e){var n,r,i,o={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]},a=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return a.next=c(0),a.throw=c(1),a.return=c(2),"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function c(c){return function(l){return function(c){if(n)throw new TypeError("Generator is already executing.");for(;a&&(a=0,c[0]&&(o=0)),o;)try{if(n=1,r&&(i=2&c[0]?r.return:c[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,c[1])).done)return i;switch(r=0,i&&(c=[2&c[0],i.value]),c[0]){case 0:case 1:i=c;break;case 4:return o.label++,{value:c[1],done:!1};case 5:o.label++,r=c[1],c=[0];continue;case 7:c=o.ops.pop(),o.trys.pop();continue;default:if(!(i=o.trys,(i=i.length>0&&i[i.length-1])||6!==c[0]&&2!==c[0])){o=0;continue}if(3===c[0]&&(!i||c[1]>i[0]&&c[1]<i[3])){o.label=c[1];break}if(6===c[0]&&o.label<i[1]){o.label=i[1],i=c;break}if(i&&o.label<i[2]){o.label=i[2],o.ops.push(c);break}i[2]&&o.ops.pop(),o.trys.pop();continue}c=e.call(t,o)}catch(t){c=[6,t],r=0}finally{n=i=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}([c,l])}}}function d(t,e){var n="function"==typeof Symbol&&t[Symbol.iterator];if(!n)return t;var r,i,o=n.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(r=o.next()).done;)a.push(r.value)}catch(t){i={error:t}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return a}"function"==typeof SuppressedError&&SuppressedError;var p=function(){function t(){this.title=e("linkCard.toLink"),this.iconSvg="",this.tag="button"}return t.prototype.getSelectedLinkCardElem=function(t){var e=n.getSelectedNodeByType(t,"link-card");return null==e?null:e},t.prototype.getValue=function(t){return""},t.prototype.isActive=function(t){return!1},t.prototype.isDisabled=function(t){return null==t.selection||null==this.getSelectedLinkCardElem(t)},t.prototype.exec=function(t,e){if(!this.isDisabled(t)){var o=this.getSelectedLinkCardElem(t);if(null!=o){var a=d(r.nodes(t,{at:t.selection,match:function(t){return n.checkNodeType(t,"link-card")},mode:"lowest",universal:!0}),1)[0];if(null!=a){var c=a[1],u=o.link,s=o.title,p=o.target,f=l(l({type:"link",url:u},p?{target:p}:{}),{children:[{text:s||u}]}),A={type:"paragraph",children:[f]};r.withoutNormalizing(t,function(){i.removeNodes(t,{at:c}),i.insertNodes(t,A,{at:c})});var g=d(r.nodes(t,{at:[],match:function(t){return t===f},mode:"all",universal:!0}),1)[0];if(null!=g){var v=g[1];i.select(t,{anchor:r.start(t,v),focus:r.end(t,v)})}}}}},t}(),f=function(){function t(){this.title=e("linkCard.toCard"),this.iconSvg="",this.tag="button"}return t.prototype.getSelectedLinkElem=function(t){var e=n.getSelectedNodeByType(t,"link");return null==e?null:e},t.prototype.getValue=function(t){return""},t.prototype.isActive=function(t){return!1},t.prototype.isDisabled=function(t){return null==t.selection||null==this.getSelectedLinkElem(t)},t.prototype.exec=function(t,e){return u(this,void 0,void 0,function(){var e,a,c,u,p,f,A,g,v,h,y,k,m,b;return s(this,function(s){switch(s.label){case 0:if(this.isDisabled(t))return[2];if(null==(e=this.getSelectedLinkElem(t)))return[2];if("function"!=typeof(a=t.getMenuConfig("convertToLinkCard").getLinkCardInfo))return[2];if(c=e.url,u=e.target,p=o.string(e),f=d(r.nodes(t,{at:t.selection,match:function(t){return n.checkNodeType(t,"link")},mode:"lowest",universal:!0}),1),null==(A=f[0]))return[2];g=r.pathRef(t,A[1]),s.label=1;case 1:return s.trys.push([1,3,4,5]),[4,a(p,c)];case 2:return v=s.sent(),h=v.title,y=v.iconImgSrc,null==(k=g.current)?[2]:(i.removeNodes(t,{at:k}),i.splitNodes(t,{always:!0}),m=l(l({type:"link-card",link:c,title:h},u?{target:u}:{}),{iconImgSrc:y,children:[{text:""}]}),i.insertNodes(t,m),[3,5]);case 3:return b=s.sent(),console.error("Convert to link-cart error",b),[3,5];case 4:return g.unref(),[7];case 5:return[2]}})})},t}();var A={editorPlugin:function(t){var e=t.isVoid,r=t.normalizeNode,o=t;return o.isVoid=function(t){return"link-card"===n.getNodeType(t)||e(t)},o.normalizeNode=function(t){var e=d(t,2),a=e[0],c=e[1];if("link-card"!==n.getNodeType(a))return r([a,c]);var l=(o.children||[])[c[0]+1]||{},u=n.getNodeType(l);if("paragraph"!==u&&"blockquote"!==u&&!u.startsWith("header")){var s=[c[0]+1];i.insertNodes(o,{type:"paragraph",children:[{text:""}]},{at:s})}},o},renderElems:[{type:"link-card",renderElem:function(t,e,r){var i=n.isNodeSelected(r,t),o=t,c=o.title,l=o.link,u=o.iconImgSrc,s=a("div",{props:{className:"w-e-textarea-link-card-text-container"}},[a("p",{props:{className:"w-e-link-card-title"}},c),a("span",{props:{className:"w-e-link-card-url",title:l}},l)]),d=a("div",{props:{className:"w-e-textarea-link-card-icon-container"}},[a("img",{props:{src:u||"data:image/png;base64,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"}})]);return a("div",{props:{contentEditable:!1,className:"w-e-textarea-link-card-container"},dataset:{selected:i?"true":"",href:l},on:{mousedown:function(t){return t.preventDefault()},click:function(t){i||window.open(l,"_blank","noopener,noreferrer")}}},[s,d])}}],elemsToHtml:[c],parseElemsHtml:[{selector:'div[data-w-e-type="link-card"]',parseElemHtml:function(t,e,n){var r=t.getAttribute("data-link")||"",i=t.getAttribute("data-title")||"",o=t.getAttribute("data-target")||void 0,a=t.getAttribute("data-iconImgSrc")||"";return l(l({type:"link-card",link:r,title:i},o?{target:o}:{}),{iconImgSrc:a,children:[{text:""}]})}}],menus:[{key:"convertToLinkCard",factory:function(){return new f},config:{getLinkCardInfo:function(t,e){return u(this,void 0,void 0,function(){return s(this,function(e){return[2,new Promise(function(e){setTimeout(function(){e({title:t,iconImgSrc:""})},100)})]})})}}},{key:"convertToLink",factory:function(){return new p}}]};export{A as default};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/module/local.ts","../src/module/elem-to-html.ts","../src/module/menu/ConvertToLinkCard.ts","../src/module/render-elem.ts","../src/module/index.ts","../src/module/plugin.ts","../src/module/parse-elem-html.ts","../src/module/menu/index.ts","../src/module/menu/config.ts"],"sourcesContent":["/**\n * @description 多语言\n * @author wangfupeng\n */\n\nimport { i18nAddResources } from '@wangeditor-next/editor'\n\ni18nAddResources('en', {\n linkCard: {\n toCard: 'To Card',\n // delete: 'Delete',\n },\n})\n\ni18nAddResources('zh-CN', {\n linkCard: {\n toCard: '转为卡片',\n // delete: '删除',\n },\n})\n","/**\n * @description elem to html\n * @author wangfupeng\n */\n\nimport { SlateElement } from '@wangeditor-next/editor'\n\nimport { LinkCardElement } from './custom-types'\n\n// 生成 html 的函数\nfunction linkCardToHtml(elem: SlateElement, _childrenHtml: string): string {\n const { title = '', link = '', iconImgSrc = '' } = elem as LinkCardElement\n const html = `<div data-w-e-type=\"link-card\" data-w-e-is-void data-title=\"${title}\" data-link=\"${link}\" data-iconImgSrc=\"${iconImgSrc}\">\n <div class=\"info-container\">\n <div class=\"title-container\"><p>${title}</p></div>\n <div class=\"link-container\"><span>${link}</span></div>\n </div>\n <div class=\"icon-container\">\n <img src=\"${iconImgSrc}\"/>\n </div>\n </div>`\n\n return html\n}\n\n// 配置\nconst conf = {\n type: 'link-card', // 节点 type ,重要!!!\n elemToHtml: linkCardToHtml,\n}\n\nexport default conf\n","/**\n * @description convert link elem to link-card\n * @author wangfupeng\n */\n\nimport {\n DomEditor,\n IButtonMenu, IDomEditor,\n SlateNode,\n SlateTransforms,\n t,\n} from '@wangeditor-next/editor'\n\nimport { LinkCardElement, LinkElement } from '../custom-types'\n\nclass ConvertToLinkCard implements IButtonMenu {\n readonly title = t('linkCard.toCard')\n\n readonly iconSvg = '' // 无 icon\n\n readonly tag = 'button'\n\n private getSelectedLinkElem(editor: IDomEditor): LinkElement | null {\n const node = DomEditor.getSelectedNodeByType(editor, 'link')\n\n if (node == null) { return null }\n return node as LinkElement\n }\n\n getValue(_editor: IDomEditor): string | boolean {\n return ''\n }\n\n isActive(_editor: IDomEditor): boolean {\n // 无需 active\n return false\n }\n\n isDisabled(editor: IDomEditor): boolean {\n if (editor.selection == null) { return true }\n\n const linkElem = this.getSelectedLinkElem(editor)\n\n if (linkElem == null) {\n // 选区未处于 link node ,则禁用\n return true\n }\n return false\n }\n\n async exec(editor: IDomEditor, _value: string | boolean) {\n if (this.isDisabled(editor)) { return }\n\n const linkElem = this.getSelectedLinkElem(editor)\n\n if (linkElem == null) { return }\n\n const { getLinkCardInfo } = editor.getMenuConfig('convertToLinkCard')\n\n if (typeof getLinkCardInfo !== 'function') { return }\n\n const { url } = linkElem\n const text = SlateNode.string(linkElem)\n\n try {\n const { title, iconImgSrc } = await getLinkCardInfo(text, url) // 异步生成 link-card 信息\n\n const linkPath = DomEditor.findPath(editor, linkElem)\n\n SlateTransforms.removeNodes(editor, { at: linkPath })\n SlateTransforms.splitNodes(editor, { always: true })\n\n const linkCard: LinkCardElement = {\n type: 'link-card',\n link: url,\n title,\n iconImgSrc,\n children: [{ text: '' }],\n }\n\n SlateTransforms.insertNodes(editor, linkCard)\n } catch (err) {\n console.error('Convert to link-cart error', err)\n }\n }\n}\n\nexport default ConvertToLinkCard\n","/**\n * @description render elem\n * @author wangfupeng\n */\n\nimport { DomEditor, IDomEditor, SlateElement } from '@wangeditor-next/editor'\nimport { h, VNode } from 'snabbdom'\n\nimport { LinkCardElement } from './custom-types'\n\nconst DEFAULT_ICON_IMG_SRC = 'data:image/png;base64,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'\n\nfunction renderLinkCard(elem: SlateElement, children: VNode[] | null, editor: IDomEditor): VNode {\n const selected = DomEditor.isNodeSelected(editor, elem) // 当前节点是否选中\n const { title, link, iconImgSrc } = elem as LinkCardElement\n\n // 文字部分\n const infoVnode = h(\n 'div',\n {\n props: {\n className: 'w-e-textarea-link-card-text-container',\n },\n },\n [\n h('p', { props: { className: 'w-e-link-card-title' } }, title),\n h('span', {\n props: {\n className: 'w-e-link-card-url',\n title: link,\n },\n }, link),\n ],\n )\n\n // 图片部分\n const iconVnode = h(\n 'div',\n {\n props: {\n className: 'w-e-textarea-link-card-icon-container',\n },\n },\n [h('img', { props: { src: iconImgSrc || DEFAULT_ICON_IMG_SRC } })],\n )\n\n // 容器\n const vnode = h(\n 'div',\n {\n props: {\n contentEditable: false,\n className: 'w-e-textarea-link-card-container',\n },\n dataset: {\n selected: selected ? 'true' : '', // 标记为 选中\n href: link,\n },\n on: {\n mousedown: event => event.preventDefault(),\n click: _event => {\n if (!selected) {\n window.open(link, '_blank', 'noopener,noreferrer')\n }\n },\n },\n },\n [infoVnode, iconVnode],\n )\n\n return vnode\n}\n\nconst conf = {\n type: 'link-card', // 节点 type ,重要!!!\n renderElem: renderLinkCard,\n}\n\nexport default conf\n","/**\n * @description module entry\n * @author wangfupeng\n */\n\nimport './local' // 多语言\n\nimport { IModuleConf } from '@wangeditor-next/editor'\n\nimport elemToHtmlConf from './elem-to-html'\nimport { convertToLinkCardMenuConf } from './menu/index'\nimport parseHtmlConf from './parse-elem-html'\nimport withLinkCard from './plugin'\nimport renderElemConf from './render-elem'\n\nconst module: Partial<IModuleConf> = {\n editorPlugin: withLinkCard,\n renderElems: [renderElemConf],\n elemsToHtml: [elemToHtmlConf],\n parseElemsHtml: [parseHtmlConf],\n menus: [convertToLinkCardMenuConf],\n}\n\nexport default module\n","/**\n * @description link-card plugin\n * @author wangfupeng\n */\n\nimport { DomEditor, IDomEditor, SlateTransforms } from '@wangeditor-next/editor'\n\nfunction withLinkCard<T extends IDomEditor>(editor: T) {\n const { isVoid, normalizeNode } = editor\n const newEditor = editor\n\n // 重写 isVoid\n newEditor.isVoid = elem => {\n const type = DomEditor.getNodeType(elem)\n\n if (type === 'link-card') {\n return true\n }\n\n return isVoid(elem)\n }\n\n // 重新 normalize\n newEditor.normalizeNode = ([node, path]) => {\n const type = DomEditor.getNodeType(node)\n\n if (type !== 'link-card') {\n // 未命中 link-card ,执行默认的 normalizeNode\n return normalizeNode([node, path])\n }\n\n // editor 顶级 node\n const topLevelNodes = newEditor.children || []\n\n // --------------------- link-card 后面必须跟一个 p header blockquote(否则后面无法继续输入文字) ---------------------\n const nextNode = topLevelNodes[path[0] + 1] || {}\n const nextNodeType = DomEditor.getNodeType(nextNode)\n\n if (\n nextNodeType !== 'paragraph'\n && nextNodeType !== 'blockquote'\n && !nextNodeType.startsWith('header')\n ) {\n // link-card node 后面不是 p 或 header ,则插入一个空 p\n const p = { type: 'paragraph', children: [{ text: '' }] }\n const insertPath = [path[0] + 1]\n\n SlateTransforms.insertNodes(newEditor, p, {\n at: insertPath, // 在 link-card 后面插入\n })\n }\n }\n\n return newEditor\n}\n\nexport default withLinkCard\n","/**\n * @description parse elem html\n * @author wangfupeng\n */\n\nimport { IDomEditor, SlateDescendant, SlateElement } from '@wangeditor-next/editor'\n\nimport { DOMElement } from '../utils/dom'\nimport { LinkCardElement } from './custom-types'\n\nfunction parseHtml(\n elem: DOMElement,\n _children: SlateDescendant[],\n _editor: IDomEditor,\n): SlateElement {\n const link = elem.getAttribute('data-link') || ''\n const title = elem.getAttribute('data-title') || ''\n const iconImgSrc = elem.getAttribute('data-iconImgSrc') || ''\n\n return {\n type: 'link-card',\n link,\n title,\n iconImgSrc,\n children: [{ text: '' }], // void node 必须有一个空白 text\n } as LinkCardElement\n}\n\nconst parseHtmlConf = {\n selector: 'div[data-w-e-type=\"link-card\"]',\n parseElemHtml: parseHtml,\n}\n\nexport default parseHtmlConf\n","/**\n * @description menu index\n * @author wangfupeng\n */\n\nimport { genConvertToLinkCardConfig } from './config'\nimport ConvertToLinkCard from './ConvertToLinkCard'\n\nexport const convertToLinkCardMenuConf = {\n key: 'convertToLinkCard',\n factory() {\n return new ConvertToLinkCard()\n },\n\n // 默认的菜单菜单配置,将存储在 editorConfig.MENU_CONF[key] 中\n // 创建编辑器时,可通过 editorConfig.MENU_CONF[key] = {...} 来修改\n config: genConvertToLinkCardConfig(),\n}\n","/**\n * @description menu config\n * @author wangfupeng\n */\n\nexport function genConvertToLinkCardConfig() {\n return {\n /**\n * 异步获取 link-card 信息(可能需要在服务端获取)\n * @param linkText link text\n * @param linkUrl link url\n * @returns link-card info\n */\n async getLinkCardInfo(\n linkText: string,\n _linkUrl: string,\n ): Promise<{ title: string; iconImgSrc: string }> {\n // 该函数,用户自定义配置\n // 1. 使用 iframe 加载 linkUrl 来获取 title 和 iconImgSrc\n // 2. 但有些网页禁止跨域 iframe 加载(即 X-Frame-Options),此时需要在服务端获取\n\n return new Promise(resolve => {\n setTimeout(() => {\n const info = { title: linkText, iconImgSrc: '' }\n\n resolve(info)\n }, 100)\n })\n },\n }\n}\n"],"names":["i18nAddResources","linkCard","toCard","conf","type","elemToHtml","elem","_childrenHtml","_a","_b","title","_c","link","_d","iconImgSrc","concat","ConvertToLinkCard","this","t","iconSvg","tag","prototype","getSelectedLinkElem","editor","node","DomEditor","getSelectedNodeByType","getValue","_editor","isActive","isDisabled","selection","exec","_value","linkElem","getLinkCardInfo","getMenuConfig","url","text","SlateNode","string","sent","linkPath","findPath","SlateTransforms","removeNodes","at","splitNodes","always","children","insertNodes","console","error","err_1","module","editorPlugin","isVoid","normalizeNode","newEditor","getNodeType","__read","path","nextNode","nextNodeType","startsWith","insertPath","renderElems","renderElem","selected","isNodeSelected","infoVnode","h","props","className","iconVnode","src","contentEditable","dataset","href","on","mousedown","event","preventDefault","click","_event","window","open","elemsToHtml","elemToHtmlConf","parseElemsHtml","selector","parseElemHtml","_children","getAttribute","menus","key","factory","config","linkText","_linkUrl","Promise","resolve","setTimeout"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/module/local.ts","../src/module/elem-to-html.ts","../src/module/menu/ConvertToLink.ts","../src/module/menu/ConvertToLinkCard.ts","../src/module/render-elem.ts","../src/module/index.ts","../src/module/plugin.ts","../src/module/parse-elem-html.ts","../src/module/menu/index.ts","../src/module/menu/config.ts"],"sourcesContent":["/**\n * @description 多语言\n * @author wangfupeng\n */\n\nimport { i18nAddResources } from '@wangeditor-next/editor'\n\ni18nAddResources('en', {\n linkCard: {\n toCard: 'To Card',\n toLink: 'To Link',\n // delete: 'Delete',\n },\n})\n\ni18nAddResources('zh-CN', {\n linkCard: {\n toCard: '转为卡片',\n toLink: '转为链接',\n // delete: '删除',\n },\n})\n","/**\n * @description elem to html\n * @author wangfupeng\n */\n\nimport { SlateElement } from '@wangeditor-next/editor'\n\nimport { LinkCardElement } from './custom-types'\n\n// 生成 html 的函数\nfunction linkCardToHtml(elem: SlateElement, _childrenHtml: string): string {\n const { title = '', link = '', target, iconImgSrc = '' } = elem as LinkCardElement\n const targetAttr = target ? ` data-target=\"${target}\"` : ''\n const html = `<div data-w-e-type=\"link-card\" data-w-e-is-void data-title=\"${title}\" data-link=\"${link}\"${targetAttr} data-iconImgSrc=\"${iconImgSrc}\">\n <div class=\"info-container\">\n <div class=\"title-container\"><p>${title}</p></div>\n <div class=\"link-container\"><span>${link}</span></div>\n </div>\n <div class=\"icon-container\">\n <img src=\"${iconImgSrc}\"/>\n </div>\n </div>`\n\n return html\n}\n\n// 配置\nconst conf = {\n type: 'link-card', // 节点 type ,重要!!!\n elemToHtml: linkCardToHtml,\n}\n\nexport default conf\n","/**\n * @description convert link-card elem to link\n * @author wangfupeng\n */\n\nimport {\n DomEditor,\n IButtonMenu,\n IDomEditor,\n SlateEditor,\n SlateTransforms,\n t,\n} from '@wangeditor-next/editor'\n\nimport { LinkCardElement, LinkElement } from '../custom-types'\n\nclass ConvertToLink implements IButtonMenu {\n readonly title = t('linkCard.toLink')\n\n readonly iconSvg = ''\n\n readonly tag = 'button'\n\n private getSelectedLinkCardElem(editor: IDomEditor): LinkCardElement | null {\n const node = DomEditor.getSelectedNodeByType(editor, 'link-card')\n\n if (node == null) {\n return null\n }\n return node as LinkCardElement\n }\n\n getValue(_editor: IDomEditor): string | boolean {\n return ''\n }\n\n isActive(_editor: IDomEditor): boolean {\n return false\n }\n\n isDisabled(editor: IDomEditor): boolean {\n return editor.selection == null || this.getSelectedLinkCardElem(editor) == null\n }\n\n exec(editor: IDomEditor, _value: string | boolean) {\n if (this.isDisabled(editor)) {\n return\n }\n\n const linkCardElem = this.getSelectedLinkCardElem(editor)\n\n if (linkCardElem == null) {\n return\n }\n\n const [linkCardEntry] = SlateEditor.nodes(editor, {\n at: editor.selection!,\n match: node => DomEditor.checkNodeType(node, 'link-card'),\n mode: 'lowest',\n universal: true,\n })\n\n if (linkCardEntry == null) {\n return\n }\n\n const linkCardPath = linkCardEntry[1]\n const { link: url, title, target } = linkCardElem\n const linkElem: LinkElement = {\n type: 'link',\n url,\n ...(target ? { target } : {}),\n children: [{ text: title || url }],\n }\n const paragraph = { type: 'paragraph', children: [linkElem] }\n\n SlateEditor.withoutNormalizing(editor, () => {\n SlateTransforms.removeNodes(editor, { at: linkCardPath })\n SlateTransforms.insertNodes(editor, paragraph, { at: linkCardPath })\n })\n\n const [linkEntry] = SlateEditor.nodes(editor, {\n at: [],\n match: node => node === linkElem,\n mode: 'all',\n universal: true,\n })\n\n if (linkEntry != null) {\n const linkPath = linkEntry[1]\n\n SlateTransforms.select(editor, {\n anchor: SlateEditor.start(editor, linkPath),\n focus: SlateEditor.end(editor, linkPath),\n })\n }\n }\n}\n\nexport default ConvertToLink\n","/**\n * @description convert link elem to link-card\n * @author wangfupeng\n */\n\nimport {\n DomEditor,\n IButtonMenu, IDomEditor,\n SlateEditor,\n SlateNode,\n SlateTransforms,\n t,\n} from '@wangeditor-next/editor'\n\nimport { LinkCardElement, LinkElement } from '../custom-types'\n\nclass ConvertToLinkCard implements IButtonMenu {\n readonly title = t('linkCard.toCard')\n\n readonly iconSvg = '' // 无 icon\n\n readonly tag = 'button'\n\n private getSelectedLinkElem(editor: IDomEditor): LinkElement | null {\n const node = DomEditor.getSelectedNodeByType(editor, 'link')\n\n if (node == null) { return null }\n return node as LinkElement\n }\n\n getValue(_editor: IDomEditor): string | boolean {\n return ''\n }\n\n isActive(_editor: IDomEditor): boolean {\n // 无需 active\n return false\n }\n\n isDisabled(editor: IDomEditor): boolean {\n if (editor.selection == null) { return true }\n\n const linkElem = this.getSelectedLinkElem(editor)\n\n if (linkElem == null) {\n // 选区未处于 link node ,则禁用\n return true\n }\n return false\n }\n\n async exec(editor: IDomEditor, _value: string | boolean) {\n if (this.isDisabled(editor)) { return }\n\n const linkElem = this.getSelectedLinkElem(editor)\n\n if (linkElem == null) { return }\n\n const { getLinkCardInfo } = editor.getMenuConfig('convertToLinkCard')\n\n if (typeof getLinkCardInfo !== 'function') { return }\n\n const { url, target } = linkElem\n const text = SlateNode.string(linkElem)\n const [linkEntry] = SlateEditor.nodes(editor, {\n at: editor.selection!,\n match: node => DomEditor.checkNodeType(node, 'link'),\n mode: 'lowest',\n universal: true,\n })\n\n if (linkEntry == null) {\n return\n }\n\n const linkPathRef = SlateEditor.pathRef(editor, linkEntry[1])\n\n try {\n const { title, iconImgSrc } = await getLinkCardInfo(text, url) // 异步生成 link-card 信息\n const linkPath = linkPathRef.current\n\n if (linkPath == null) { return }\n\n SlateTransforms.removeNodes(editor, { at: linkPath })\n SlateTransforms.splitNodes(editor, { always: true })\n\n const linkCard: LinkCardElement = {\n type: 'link-card',\n link: url,\n title,\n ...(target ? { target } : {}),\n iconImgSrc,\n children: [{ text: '' }],\n }\n\n SlateTransforms.insertNodes(editor, linkCard)\n } catch (err) {\n console.error('Convert to link-cart error', err)\n } finally {\n linkPathRef.unref()\n }\n }\n}\n\nexport default ConvertToLinkCard\n","/**\n * @description render elem\n * @author wangfupeng\n */\n\nimport { DomEditor, IDomEditor, SlateElement } from '@wangeditor-next/editor'\nimport { h, VNode } from 'snabbdom'\n\nimport { LinkCardElement } from './custom-types'\n\nconst DEFAULT_ICON_IMG_SRC = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAABnhJREFUeF7tW11SIzcQVtuj52xOEDhBdk+wcILACQInWPwwcvG08ERZ8wCcIOwJwp4g5gRxThA4QeAVbCvVLo1L09PSSDMDrAumyi8eSdP9qf/VAvHGH3jj/It3AN4l4BkR0Fp/BoAdY8yWEML9uV+9FUKsfgBwa4yZKqVunpGsytK9qsD5+fmHp6en34UQe0KInY5MTIUQ11LKb6PR6L7jWt7pvQBQFAXu8hfL+HPQeg0Al3meIyi9Pp0AsIx/7WG3Y5maAsBpn0C0AsCK+h+JO35njLkCAARs/RhjTgHgQAjxSywKVjUO+1CNZAAmk8keACDzH2IJRibH4/EJjtdaG3eeUgoQ0MfHxyMKTsP698aYw/F4fB1LBzcuCYDJZHIOAEeeDz4IIX4i7x4AYM8VWQ6Aco5VKWSotg7z32qaMeZiPB6P2oIQBYAV+b+EEB+ZD6Fol7vnvkdAdpRSM3dOCAArIbgGGjsXhBkAjFCFPKoyk1LutlGJRgACzD9Y9E+01hdCCPQC7nOolEKCK08TABYEtAmoZhVbgWo0mUxOrBRSKWkFQhCAEPPl7p6dnW0Nh8N/CZ+XSilWVWIAsCDUQF0sFtvHx8e3WmtOSnBaMghBALTWf1OxB4B/sizbKcWtKIorYwwGP+VzJ6X86BPHWAAs+Kg+a+8AAN/yPEfpEAh8lmXXxphfCfgzpdSnWJvgBcAj1jdSyr2SOc/us6JfEhQLgE8VSinA9xYkNJqfYyWQAsMCYF3dn+5guvP4ju4+jsnznDOU66VSALAgYJ7ASkEJwnw+n1JJMMbsx7jIGgAWVdTptZ/nmLfj/iOGqvGjqQAwm3Evpdx2VQxpYUCojePUogaA1hp3HpMZ9/nEuDNqqe+UUpjxBZ9UADgpEELU1MwaRrRZ68e1GT6iKgDYQAT9vbvIKM9ztMiVR2uN49YZnxvthRBoA4B1fW4IjSnzLv1OURRHxphzQv9uKHeoAECZatrNDXnPglXSvgaA2/0NYbCRTADwSsEaAK01upPfGlfbzAHflVLUrq04WQHAWfTN5NNPtZTyZy44WwFAjUfIn3NgYUobC1gbI1iunTK3KIqZGxtgMsUZ8xXhWmvMvtbRVMiiU1sRE/y44KQwwXgeGhR5dZuJZG+UUrU6ZQlApUghhKj5/ZIYxtV49YuTio4AUDvlDbu5uICTVGCsfzCgocjG+v82YkwBpPFA07e11o0SA3TRpuiJUZfG8LcvFWDCYlasHWmtZKocYCgBjYMIAxV7EfKxfasAI61BAGI2F+iONjFEawRN4xlDViuKxnqQVABixiMAmPm5SYzXAFqP0ZqBl57PGMJbpdR2JVegVjl2NzZ1HPUEKAHUBW4qb1F0vwNAotZ3CaDBQigKfGkj1tWNMkawFuS1cYObFAfgOaZb3K3FDe+BUEy0FIoEY8vPPeUCjTvq0hoT5XLJUC1YcBdNTUj6jARTv02DPC5qTU6Htda0HL7Z6XDXgggeSKacxXWsB1TOKkN5SFJBhClyBJnqyETrXCLlu4z4+0tib74oatXg7ZbFbWUYe/0qx2JR2cUGDIo6GOGM4QbwFkNisGrU5XA0upTetSbIHI6yTHU+HA3Ygpjj8WAA1SUSZKpWz3M8jkRaj4Dl5EqbGm1De8UGiQcp5RZtkHh6eqJtfLVxnL5Et8hwHVhMg1RjUJTiy61EVmqWtGzv62SLzVFSm6SmUsr9H6xJCtNdeuTlbdOjUhA81KQHjHbybLFY7GO/nnWftE3uVkr5qac2OQx91xVr2iY3HA6R+UpTVupZZWOjJNeBJYTACwy72Df0io2SqPOVhm2umavJTzYea3s6sHDdewC4yPP89CVbZYui+Iq9yX0wj0w0AlB6Bo8k4Gu85zMaDAYnpFdvLSUpcYCt41V2F3dWCIENUNg/XOtEa7PzJU1RADg+nGuKLl8jw/QOAUrJfmy7fOAuArd2+d1ogxftBkN6Y4nELnDare2dBgAnWZZdomH0XZiYz+dfjDGrSxWRD3arH8R0g4bWS5KAciHrexGElKYqvBaHHqPCJIKDjHCi7SMcvUGWZUdt7gckucGmnbCnr8gQbVZumtr2/Q0C9uqXpij1Fgi0zCkSkQLCd+txfqxrc5QD6zIPjDHYk9dVKnC3r7Msu+pD1L3qlLINqWNRMpbL5c5gMNhyrs/S63F35bXZ5XJ5OxgMpn2KeBPN/wMl1UqMouKZkwAAAABJRU5ErkJggg=='\n\nfunction renderLinkCard(elem: SlateElement, children: VNode[] | null, editor: IDomEditor): VNode {\n const selected = DomEditor.isNodeSelected(editor, elem) // 当前节点是否选中\n const { title, link, iconImgSrc } = elem as LinkCardElement\n\n // 文字部分\n const infoVnode = h(\n 'div',\n {\n props: {\n className: 'w-e-textarea-link-card-text-container',\n },\n },\n [\n h('p', { props: { className: 'w-e-link-card-title' } }, title),\n h('span', {\n props: {\n className: 'w-e-link-card-url',\n title: link,\n },\n }, link),\n ],\n )\n\n // 图片部分\n const iconVnode = h(\n 'div',\n {\n props: {\n className: 'w-e-textarea-link-card-icon-container',\n },\n },\n [h('img', { props: { src: iconImgSrc || DEFAULT_ICON_IMG_SRC } })],\n )\n\n // 容器\n const vnode = h(\n 'div',\n {\n props: {\n contentEditable: false,\n className: 'w-e-textarea-link-card-container',\n },\n dataset: {\n selected: selected ? 'true' : '', // 标记为 选中\n href: link,\n },\n on: {\n mousedown: event => event.preventDefault(),\n click: _event => {\n if (!selected) {\n window.open(link, '_blank', 'noopener,noreferrer')\n }\n },\n },\n },\n [infoVnode, iconVnode],\n )\n\n return vnode\n}\n\nconst conf = {\n type: 'link-card', // 节点 type ,重要!!!\n renderElem: renderLinkCard,\n}\n\nexport default conf\n","/**\n * @description module entry\n * @author wangfupeng\n */\n\nimport './local' // 多语言\n\nimport { IModuleConf } from '@wangeditor-next/editor'\n\nimport elemToHtmlConf from './elem-to-html'\nimport { convertToLinkCardMenuConf, convertToLinkMenuConf } from './menu/index'\nimport parseHtmlConf from './parse-elem-html'\nimport withLinkCard from './plugin'\nimport renderElemConf from './render-elem'\n\nconst module: Partial<IModuleConf> = {\n editorPlugin: withLinkCard,\n renderElems: [renderElemConf],\n elemsToHtml: [elemToHtmlConf],\n parseElemsHtml: [parseHtmlConf],\n menus: [convertToLinkCardMenuConf, convertToLinkMenuConf],\n}\n\nexport default module\n","/**\n * @description link-card plugin\n * @author wangfupeng\n */\n\nimport { DomEditor, IDomEditor, SlateTransforms } from '@wangeditor-next/editor'\n\nfunction withLinkCard<T extends IDomEditor>(editor: T) {\n const { isVoid, normalizeNode } = editor\n const newEditor = editor\n\n // 重写 isVoid\n newEditor.isVoid = elem => {\n const type = DomEditor.getNodeType(elem)\n\n if (type === 'link-card') {\n return true\n }\n\n return isVoid(elem)\n }\n\n // 重新 normalize\n newEditor.normalizeNode = ([node, path]) => {\n const type = DomEditor.getNodeType(node)\n\n if (type !== 'link-card') {\n // 未命中 link-card ,执行默认的 normalizeNode\n return normalizeNode([node, path])\n }\n\n // editor 顶级 node\n const topLevelNodes = newEditor.children || []\n\n // --------------------- link-card 后面必须跟一个 p header blockquote(否则后面无法继续输入文字) ---------------------\n const nextNode = topLevelNodes[path[0] + 1] || {}\n const nextNodeType = DomEditor.getNodeType(nextNode)\n\n if (\n nextNodeType !== 'paragraph'\n && nextNodeType !== 'blockquote'\n && !nextNodeType.startsWith('header')\n ) {\n // link-card node 后面不是 p 或 header ,则插入一个空 p\n const p = { type: 'paragraph', children: [{ text: '' }] }\n const insertPath = [path[0] + 1]\n\n SlateTransforms.insertNodes(newEditor, p, {\n at: insertPath, // 在 link-card 后面插入\n })\n }\n }\n\n return newEditor\n}\n\nexport default withLinkCard\n","/**\n * @description parse elem html\n * @author wangfupeng\n */\n\nimport { IDomEditor, SlateDescendant, SlateElement } from '@wangeditor-next/editor'\n\nimport { DOMElement } from '../utils/dom'\nimport { LinkCardElement } from './custom-types'\n\nfunction parseHtml(\n elem: DOMElement,\n _children: SlateDescendant[],\n _editor: IDomEditor,\n): SlateElement {\n const link = elem.getAttribute('data-link') || ''\n const title = elem.getAttribute('data-title') || ''\n const target = elem.getAttribute('data-target') || undefined\n const iconImgSrc = elem.getAttribute('data-iconImgSrc') || ''\n\n return {\n type: 'link-card',\n link,\n title,\n ...(target ? { target } : {}),\n iconImgSrc,\n children: [{ text: '' }], // void node 必须有一个空白 text\n } as LinkCardElement\n}\n\nconst parseHtmlConf = {\n selector: 'div[data-w-e-type=\"link-card\"]',\n parseElemHtml: parseHtml,\n}\n\nexport default parseHtmlConf\n","/**\n * @description menu index\n * @author wangfupeng\n */\n\nimport { genConvertToLinkCardConfig } from './config'\nimport ConvertToLink from './ConvertToLink'\nimport ConvertToLinkCard from './ConvertToLinkCard'\n\nexport const convertToLinkCardMenuConf = {\n key: 'convertToLinkCard',\n factory() {\n return new ConvertToLinkCard()\n },\n\n // 默认的菜单菜单配置,将存储在 editorConfig.MENU_CONF[key] 中\n // 创建编辑器时,可通过 editorConfig.MENU_CONF[key] = {...} 来修改\n config: genConvertToLinkCardConfig(),\n}\n\nexport const convertToLinkMenuConf = {\n key: 'convertToLink',\n factory() {\n return new ConvertToLink()\n },\n}\n","/**\n * @description menu config\n * @author wangfupeng\n */\n\nexport function genConvertToLinkCardConfig() {\n return {\n /**\n * 异步获取 link-card 信息(可能需要在服务端获取)\n * @param linkText link text\n * @param linkUrl link url\n * @returns link-card info\n */\n async getLinkCardInfo(\n linkText: string,\n _linkUrl: string,\n ): Promise<{ title: string; iconImgSrc: string }> {\n // 该函数,用户自定义配置\n // 1. 使用 iframe 加载 linkUrl 来获取 title 和 iconImgSrc\n // 2. 但有些网页禁止跨域 iframe 加载(即 X-Frame-Options),此时需要在服务端获取\n\n return new Promise(resolve => {\n setTimeout(() => {\n const info = { title: linkText, iconImgSrc: '' }\n\n resolve(info)\n }, 100)\n })\n },\n }\n}\n"],"names":["i18nAddResources","linkCard","toCard","toLink","conf","type","elemToHtml","elem","_childrenHtml","_a","_b","title","_c","link","target","_d","iconImgSrc","targetAttr","concat","ConvertToLink","this","t","iconSvg","tag","prototype","getSelectedLinkCardElem","editor","node","DomEditor","getSelectedNodeByType","getValue","_editor","isActive","isDisabled","selection","exec","_value","linkCardElem","linkCardEntry","__read","SlateEditor","nodes","at","match","checkNodeType","mode","universal","linkCardPath","url","linkElem","__assign","children","text","paragraph","withoutNormalizing","SlateTransforms","removeNodes","insertNodes","linkEntry","linkPath","select","anchor","start","focus","end","ConvertToLinkCard","getSelectedLinkElem","getLinkCardInfo","getMenuConfig","SlateNode","string","linkPathRef","pathRef","sent","current","splitNodes","always","console","error","err_1","unref","module","editorPlugin","isVoid","normalizeNode","newEditor","getNodeType","path","nextNode","nextNodeType","startsWith","insertPath","renderElems","renderElem","selected","isNodeSelected","infoVnode","h","props","className","iconVnode","src","contentEditable","dataset","href","on","mousedown","event","preventDefault","click","_event","window","open","elemsToHtml","elemToHtmlConf","parseElemsHtml","selector","parseElemHtml","_children","getAttribute","undefined","menus","key","factory","config","linkText","_linkUrl","Promise","resolve","setTimeout"],"mappings":"mKAOAA,EAAiB,KAAM,CACrBC,SAAU,CACRC,OAAQ,UACRC,OAAQ,aAKZH,EAAiB,QAAS,CACxBC,SAAU,CACRC,OAAQ,OACRC,OAAQ,UCSZ,IAAMC,EAAO,CACXC,KAAM,YACNC,WAnBF,SAAwBC,EAAoBC,GACpC,IAAAC,EAAqDF,EAAnDG,EAAAD,EAAAE,MAAAA,OAAK,IAAAD,EAAG,GAAEA,EAAEE,EAAAH,EAAAI,KAAAA,aAAO,GAAED,EAAEE,EAAML,EAAAK,OAAEC,EAAAN,EAAAO,WAAAA,OAAU,IAAAD,EAAG,GAAEA,EAChDE,EAAaH,EAAS,iBAAAI,OAAiBJ,EAAM,KAAM,GAWzD,MAVa,+DAAAI,OAA+DP,EAAK,iBAAAO,OAAgBL,EAAI,KAAAK,OAAID,EAAU,sBAAAC,OAAqBF,yFAElGL,EAAK,wDAAAO,OACHL,EAAI,iFAAAK,OAG5BF,8BAKlB,q8DCRA,IAAAG,EAAA,WAAA,SAAAA,IACWC,KAAAT,MAAQU,EAAE,mBAEVD,KAAAE,QAAU,GAEVF,KAAAG,IAAM,QA4EjB,CAAA,OA1EUJ,EAAAK,UAAAC,wBAAR,SAAgCC,GAC9B,IAAMC,EAAOC,EAAUC,sBAAsBH,EAAQ,aAErD,OAAY,MAARC,EACK,KAEFA,CACT,EAEAR,EAAAK,UAAAM,SAAA,SAASC,GACP,MAAO,EACT,EAEAZ,EAAAK,UAAAQ,SAAA,SAASD,GACP,OAAO,CACT,EAEAZ,EAAAK,UAAAS,WAAA,SAAWP,GACT,OAA2B,MAApBA,EAAOQ,WAA6D,MAAxCd,KAAKK,wBAAwBC,EAClE,EAEAP,EAAAK,UAAAW,KAAA,SAAKT,EAAoBU,GACvB,IAAIhB,KAAKa,WAAWP,GAApB,CAIA,IAAMW,EAAejB,KAAKK,wBAAwBC,GAElD,GAAoB,MAAhBW,EAAJ,CAIM,IAACC,EAADC,EAAkBC,EAAYC,MAAMf,EAAQ,CAChDgB,GAAIhB,EAAOQ,UACXS,MAAO,SAAAhB,GAAQ,OAAAC,EAAUgB,cAAcjB,EAAM,YAA9B,EACfkB,KAAM,SACNC,WAAW,IACX,GALkB,GAOpB,GAAqB,MAAjBR,EAAJ,CAIA,IAAMS,EAAeT,EAAc,GACrBU,EAAuBX,EAAYxB,KAA9BF,EAAkB0B,EAAY1B,MAAvBG,EAAWuB,SAC/BY,EAAQC,EAAAA,EAAA,CACZ7C,KAAM,OACN2C,IAAGA,GACClC,EAAS,CAAEA,OAAMA,GAAK,CAAA,GAAG,CAC7BqC,SAAU,CAAC,CAAEC,KAAMzC,GAASqC,MAExBK,EAAY,CAAEhD,KAAM,YAAa8C,SAAU,CAACF,IAElDT,EAAYc,mBAAmB5B,EAAQ,WACrC6B,EAAgBC,YAAY9B,EAAQ,CAAEgB,GAAIK,IAC1CQ,EAAgBE,YAAY/B,EAAQ2B,EAAW,CAAEX,GAAIK,GACvD,GAEM,IAACW,EAADnB,EAAcC,EAAYC,MAAMf,EAAQ,CAC5CgB,GAAI,GACJC,MAAO,SAAAhB,GAAQ,OAAAA,IAASsB,CAAT,EACfJ,KAAM,MACNC,WAAW,IACX,GALc,GAOhB,GAAiB,MAAbY,EAAmB,CACrB,IAAMC,EAAWD,EAAU,GAE3BH,EAAgBK,OAAOlC,EAAQ,CAC7BmC,OAAQrB,EAAYsB,MAAMpC,EAAQiC,GAClCI,MAAOvB,EAAYwB,IAAItC,EAAQiC,IAEnC,CA/BA,CAXA,CANA,CAiDF,EACFxC,CAAA,CAjFA,GCAA8C,EAAA,WAAA,SAAAA,IACW7C,KAAAT,MAAQU,EAAE,mBAEVD,KAAAE,QAAU,GAEVF,KAAAG,IAAM,QAiFjB,CAAA,OA/EU0C,EAAAzC,UAAA0C,oBAAR,SAA4BxC,GAC1B,IAAMC,EAAOC,EAAUC,sBAAsBH,EAAQ,QAErD,OAAY,MAARC,EAAuB,KACpBA,CACT,EAEAsC,EAAAzC,UAAAM,SAAA,SAASC,GACP,MAAO,EACT,EAEAkC,EAAAzC,UAAAQ,SAAA,SAASD,GAEP,OAAO,CACT,EAEAkC,EAAAzC,UAAAS,WAAA,SAAWP,GACT,OAAwB,MAApBA,EAAOQ,WAIK,MAFCd,KAAK8C,oBAAoBxC,EAO5C,EAEMuC,EAAAzC,UAAAW,KAAN,SAAWT,EAAoBU,2HAC7B,GAAIhB,KAAKa,WAAWP,GAAW,MAAA,CAAA,GAI/B,GAAgB,OAFVuB,EAAW7B,KAAK8C,oBAAoBxC,IAElB,MAAA,CAAA,GAIxB,GAA+B,mBAFvByC,EAAoBzC,EAAO0C,cAAc,sCAEJ,MAAA,CAAA,GAW7C,GATQpB,EAAgBC,EAAQD,IAAnBlC,EAAWmC,SAClBG,EAAOiB,EAAUC,OAAOrB,GACxBxC,EAAA8B,EAAcC,EAAYC,MAAMf,EAAQ,CAC5CgB,GAAIhB,EAAOQ,UACXS,MAAO,SAAAhB,GAAQ,OAAAC,EAAUgB,cAAcjB,EAAM,OAA9B,EACfkB,KAAM,SACNC,WAAW,IACX,GAEe,OAPVY,EAASjD,EAAA,IAQd,MAAA,CAAA,GAGI8D,EAAc/B,EAAYgC,QAAQ9C,EAAQgC,EAAU,qBAG1B,8BAAA,CAAA,EAAMS,EAAgBf,EAAMJ,WAG1D,OAHMtC,EAAwBE,EAAA6D,OAAtB9D,EAAKD,EAAAC,MAAEK,EAAUN,EAAAM,WAGT,OAFV2C,EAAWY,EAAYG,SAEL,CAAA,IAExBnB,EAAgBC,YAAY9B,EAAQ,CAAEgB,GAAIiB,IAC1CJ,EAAgBoB,WAAWjD,EAAQ,CAAEkD,QAAQ,IAEvC3E,OACJI,KAAM,YACNQ,KAAMmC,EACNrC,MAAKA,GACDG,EAAS,CAAEA,OAAMA,GAAK,CAAA,GAAG,CAC7BE,aACAmC,SAAU,CAAC,CAAEC,KAAM,OAGrBG,EAAgBE,YAAY/B,EAAQzB,mCAEpC4E,QAAQC,MAAM,6BAA8BC,uBAE5CR,EAAYS,iCAEf,EACHf,CAAA,CAtFA,GCyDA,IC1DMgB,EAA+B,CACnCC,aCTF,SAA4CxD,GAClC,IAAAyD,EAA0BzD,EAAMyD,OAAxBC,EAAkB1D,EAAM0D,cAClCC,EAAY3D,EA4ClB,OAzCA2D,EAAUF,OAAS,SAAA5E,GAGjB,MAAa,cAFAqB,EAAU0D,YAAY/E,IAM5B4E,EAAO5E,EAChB,EAGA8E,EAAUD,cAAgB,SAAC3E,GAAA,IAAAC,EAAA6B,OAACZ,EAAIjB,EAAA,GAAE6E,EAAI7E,EAAA,GAGpC,GAAa,cAFAkB,EAAU0D,YAAY3D,GAIjC,OAAOyD,EAAc,CAACzD,EAAM4D,IAI9B,IAGMC,GAHgBH,EAAUlC,UAAY,IAGboC,EAAK,GAAK,IAAM,CAAA,EACzCE,EAAe7D,EAAU0D,YAAYE,GAE3C,GACmB,cAAjBC,GACoB,eAAjBA,IACCA,EAAaC,WAAW,UAC5B,CAEA,IACMC,EAAa,CAACJ,EAAK,GAAK,GAE9BhC,EAAgBE,YAAY4B,EAHlB,CAAEhF,KAAM,YAAa8C,SAAU,CAAC,CAAEC,KAAM,MAGR,CACxCV,GAAIiD,GAER,CACF,EAEON,CACT,EDrCEO,YAAa,CDwDF,CACXvF,KAAM,YACNwF,WA/DF,SAAwBtF,EAAoB4C,EAA0BzB,GACpE,IAAMoE,EAAWlE,EAAUmE,eAAerE,EAAQnB,GAC5CE,EAA8BF,EAA5BI,EAAKF,EAAAE,MAAEE,EAAIJ,EAAAI,KAAEG,EAAUP,EAAAO,WAGzBgF,EAAYC,EAChB,MACA,CACEC,MAAO,CACLC,UAAW,0CAGf,CACEF,EAAE,IAAK,CAAEC,MAAO,CAAEC,UAAW,wBAA2BxF,GACxDsF,EAAE,OAAQ,CACRC,MAAO,CACLC,UAAW,oBACXxF,MAAOE,IAERA,KAKDuF,EAAYH,EAChB,MACA,CACEC,MAAO,CACLC,UAAW,0CAGf,CAACF,EAAE,MAAO,CAAEC,MAAO,CAAEG,IAAKrF,GAjCD,8xEA4D3B,OAvBciF,EACZ,MACA,CACEC,MAAO,CACLI,iBAAiB,EACjBH,UAAW,oCAEbI,QAAS,CACPT,SAAUA,EAAW,OAAS,GAC9BU,KAAM3F,GAER4F,GAAI,CACFC,UAAW,SAAAC,GAAS,OAAAA,EAAMC,gBAAN,EACpBC,MAAO,SAAAC,GACAhB,GACHiB,OAAOC,KAAKnG,EAAM,SAAU,sBAEhC,IAGJ,CAACmF,EAAWI,GAIhB,ICrDEa,YAAa,CAACC,GACdC,eAAgB,CEWI,CACpBC,SAAU,iCACVC,cAtBF,SACE9G,EACA+G,EACAvF,GAEA,IAAMlB,EAAON,EAAKgH,aAAa,cAAgB,GACzC5G,EAAQJ,EAAKgH,aAAa,eAAiB,GAC3CzG,EAASP,EAAKgH,aAAa,qBAAkBC,EAC7CxG,EAAaT,EAAKgH,aAAa,oBAAsB,GAE3D,OAAOrE,KACL7C,KAAM,YACNQ,KAAIA,EACJF,MAAKA,GACDG,EAAS,CAAEA,OAAMA,GAAK,CAAA,GAAG,CAC7BE,aACAmC,SAAU,CAAC,CAAEC,KAAM,MAEvB,IFREqE,MAAO,CGXgC,CACvCC,IAAK,oBACLC,QAAO,WACL,OAAO,IAAI1D,CACb,EAIA2D,OCXO,CAOCzD,gBAAe,SACnB0D,EACAC,oEAMA,MAAA,CAAA,EAAO,IAAIC,QAAQ,SAAAC,GACjBC,WAAW,WAGTD,EAFa,CAAErH,MAAOkH,EAAU7G,WAAY,IAG9C,EAAG,IACL,OACD,IDRgC,CACnC0G,IAAK,gBACLC,QAAO,WACL,OAAO,IAAIxG,CACb"}
@@ -10,6 +10,7 @@ export type LinkCardElement = {
10
10
  type: 'link-card';
11
11
  title: string;
12
12
  link: string;
13
+ target?: string;
13
14
  iconImgSrc?: string;
14
15
  children: EmptyText[];
15
16
  };
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @description convert link-card elem to link
3
+ * @author wangfupeng
4
+ */
5
+ import { IButtonMenu, IDomEditor } from '@wangeditor-next/editor';
6
+ declare class ConvertToLink implements IButtonMenu {
7
+ readonly title: string;
8
+ readonly iconSvg = "";
9
+ readonly tag = "button";
10
+ private getSelectedLinkCardElem;
11
+ getValue(_editor: IDomEditor): string | boolean;
12
+ isActive(_editor: IDomEditor): boolean;
13
+ isDisabled(editor: IDomEditor): boolean;
14
+ exec(editor: IDomEditor, _value: string | boolean): void;
15
+ }
16
+ export default ConvertToLink;
@@ -2,6 +2,7 @@
2
2
  * @description menu index
3
3
  * @author wangfupeng
4
4
  */
5
+ import ConvertToLink from './ConvertToLink';
5
6
  import ConvertToLinkCard from './ConvertToLinkCard';
6
7
  export declare const convertToLinkCardMenuConf: {
7
8
  key: string;
@@ -13,3 +14,7 @@ export declare const convertToLinkCardMenuConf: {
13
14
  }>;
14
15
  };
15
16
  };
17
+ export declare const convertToLinkMenuConf: {
18
+ key: string;
19
+ factory(): ConvertToLink;
20
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wangeditor-next/plugin-link-card",
3
- "version": "6.2.0",
3
+ "version": "6.3.0",
4
4
  "description": "wangEditor link card plugin",
5
5
  "author": "cycleccc <2991205548@qq.com>",
6
6
  "type": "module",
@@ -37,7 +37,7 @@
37
37
  "dom7": "^3.0.0 || ^4.0.0",
38
38
  "slate": "^0.124.0",
39
39
  "snabbdom": "^3.6.0",
40
- "@wangeditor-next/editor": "^6.2.0"
40
+ "@wangeditor-next/editor": "^6.3.0"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@wangeditor-next-shared/rollup-config": "^0.0.2"