@wangeditor-next/list-module 1.3.0 → 2.0.1
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/LICENSE +21 -21
- package/README.md +3 -3
- package/dist/basic-modules/src/modules/image/custom-types.d.ts +22 -0
- package/dist/core/src/config/index.d.ts +13 -0
- package/dist/core/src/config/interface.d.ts +270 -0
- package/dist/core/src/config/register.d.ts +12 -0
- package/dist/core/src/config/style-mode.d.ts +8 -0
- package/dist/core/src/constants/index.d.ts +1 -0
- package/dist/core/src/constants/svg.d.ts +12 -0
- package/dist/core/src/create/bind-node-relation.d.ts +15 -0
- package/dist/core/src/create/create-editor.d.ts +10 -0
- package/dist/core/src/create/create-toolbar.d.ts +14 -0
- package/dist/core/src/create/helper.d.ts +37 -0
- package/dist/core/src/create/index.d.ts +7 -0
- package/dist/core/src/editor/dom-editor.d.ts +153 -0
- package/dist/core/src/editor/interface.d.ts +73 -0
- package/dist/core/src/editor/plugins/with-config.d.ts +7 -0
- package/dist/core/src/editor/plugins/with-content.d.ts +7 -0
- package/dist/core/src/editor/plugins/with-dom.d.ts +10 -0
- package/dist/core/src/editor/plugins/with-emitter.d.ts +7 -0
- package/dist/core/src/editor/plugins/with-event-data.d.ts +7 -0
- package/dist/core/src/editor/plugins/with-max-length.d.ts +7 -0
- package/dist/core/src/editor/plugins/with-selection.d.ts +7 -0
- package/dist/core/src/i18n/index.d.ts +32 -0
- package/dist/core/src/index.d.ts +43 -0
- package/dist/core/src/menus/bar/HoverBar.d.ts +48 -0
- package/dist/core/src/menus/bar/Toolbar.d.ts +36 -0
- package/dist/core/src/menus/bar-item/BaseButton.d.ts +26 -0
- package/dist/core/src/menus/bar-item/DropPanelButton.d.ts +14 -0
- package/dist/core/src/menus/bar-item/GroupButton.d.ts +17 -0
- package/dist/core/src/menus/bar-item/ModalButton.d.ts +25 -0
- package/dist/core/src/menus/bar-item/Select.d.ts +22 -0
- package/dist/core/src/menus/bar-item/SimpleButton.d.ts +11 -0
- package/dist/core/src/menus/bar-item/index.d.ts +24 -0
- package/dist/core/src/menus/bar-item/tooltip.d.ts +6 -0
- package/dist/core/src/menus/helpers/helpers.d.ts +18 -0
- package/dist/core/src/menus/helpers/position.d.ts +36 -0
- package/dist/core/src/menus/index.d.ts +9 -0
- package/dist/core/src/menus/interface.d.ts +65 -0
- package/dist/core/src/menus/panel-and-modal/BaseClass.d.ts +26 -0
- package/dist/core/src/menus/panel-and-modal/DropPanel.d.ts +14 -0
- package/dist/core/src/menus/panel-and-modal/Modal.d.ts +44 -0
- package/dist/core/src/menus/panel-and-modal/SelectList.d.ts +20 -0
- package/dist/core/src/menus/register.d.ts +15 -0
- package/dist/core/src/parse-html/helper.d.ts +10 -0
- package/dist/core/src/parse-html/index.d.ts +35 -0
- package/dist/core/src/parse-html/parse-common-elem-html.d.ts +15 -0
- package/dist/core/src/parse-html/parse-elem-html.d.ts +15 -0
- package/dist/core/src/parse-html/parse-text-elem-html.d.ts +16 -0
- package/dist/core/src/render/element/getRenderElem.d.ts +11 -0
- package/dist/core/src/render/element/renderElement.d.ts +9 -0
- package/dist/core/src/render/element/renderStyle.d.ts +15 -0
- package/dist/core/src/render/helper.d.ts +7 -0
- package/dist/core/src/render/index.d.ts +27 -0
- package/dist/core/src/render/node2Vnode.d.ts +15 -0
- package/dist/core/src/render/text/genVnode.d.ts +9 -0
- package/dist/core/src/render/text/renderStyle.d.ts +15 -0
- package/dist/core/src/render/text/renderText.d.ts +9 -0
- package/dist/core/src/text-area/TextArea.d.ts +52 -0
- package/dist/core/src/text-area/event-handlers/beforeInput.d.ts +8 -0
- package/dist/core/src/text-area/event-handlers/blur.d.ts +8 -0
- package/dist/core/src/text-area/event-handlers/click.d.ts +8 -0
- package/dist/core/src/text-area/event-handlers/composition.d.ts +27 -0
- package/dist/core/src/text-area/event-handlers/copy.d.ts +8 -0
- package/dist/core/src/text-area/event-handlers/cut.d.ts +8 -0
- package/dist/core/src/text-area/event-handlers/drag.d.ts +9 -0
- package/dist/core/src/text-area/event-handlers/drop.d.ts +8 -0
- package/dist/core/src/text-area/event-handlers/focus.d.ts +8 -0
- package/dist/core/src/text-area/event-handlers/index.d.ts +35 -0
- package/dist/core/src/text-area/event-handlers/keydown.d.ts +8 -0
- package/dist/core/src/text-area/event-handlers/keypress.d.ts +8 -0
- package/dist/core/src/text-area/event-handlers/paste.d.ts +8 -0
- package/dist/core/src/text-area/helpers.d.ts +30 -0
- package/dist/core/src/text-area/place-holder.d.ts +18 -0
- package/dist/core/src/text-area/syncSelection.d.ts +19 -0
- package/dist/core/src/text-area/update-view.d.ts +13 -0
- package/dist/core/src/to-html/elem2html.d.ts +8 -0
- package/dist/core/src/to-html/index.d.ts +32 -0
- package/dist/core/src/to-html/node2html.d.ts +8 -0
- package/dist/core/src/to-html/text2html.d.ts +8 -0
- package/dist/core/src/upload/createUploader.d.ts +12 -0
- package/dist/core/src/upload/createUppyUploader.d.ts +7 -0
- package/dist/core/src/upload/interface.d.ts +72 -0
- package/dist/core/src/utils/dom.d.ts +103 -0
- package/dist/core/src/utils/hotkeys.d.ts +35 -0
- package/dist/core/src/utils/key.d.ts +11 -0
- package/dist/core/src/utils/line.d.ts +14 -0
- package/dist/core/src/utils/sanitize-html.d.ts +5 -0
- package/dist/core/src/utils/ua.d.ts +14 -0
- package/dist/core/src/utils/util.d.ts +28 -0
- package/dist/core/src/utils/vdom.d.ts +34 -0
- package/dist/core/src/utils/weak-maps.d.ts +60 -0
- package/dist/css/style.css +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +2 -0
- package/dist/index.mjs.map +1 -0
- package/dist/list-module/src/constants/svg.d.ts +11 -0
- package/dist/list-module/src/index.d.ts +8 -0
- package/dist/list-module/src/locale/en.d.ts +11 -0
- package/dist/list-module/src/locale/index.d.ts +5 -0
- package/dist/list-module/src/locale/zh-CN.d.ts +11 -0
- package/dist/list-module/src/module/custom-types.d.ts +11 -0
- package/dist/list-module/src/module/elem-to-html.d.ts +16 -0
- package/dist/list-module/src/module/helpers.d.ts +13 -0
- package/dist/list-module/src/module/index.d.ts +7 -0
- package/dist/list-module/src/module/menu/BaseMenu.d.ts +18 -0
- package/dist/list-module/src/module/menu/BulletedListMenu.d.ts +11 -0
- package/dist/list-module/src/module/menu/NumberedListMenu.d.ts +11 -0
- package/dist/list-module/src/module/menu/index.d.ts +14 -0
- package/dist/list-module/src/module/parse-elem-html.d.ts +19 -0
- package/dist/list-module/src/module/plugin.d.ts +7 -0
- package/dist/list-module/src/module/render-elem.d.ts +13 -0
- package/dist/list-module/src/module/style-class.d.ts +6 -0
- package/dist/list-module/src/utils/dom.d.ts +19 -0
- package/dist/list-module/src/utils/maps.d.ts +6 -0
- package/dist/list-module/src/utils/util.d.ts +6 -0
- package/dist/table-module/src/utils/has-common.d.ts +7 -0
- package/dist/table-module/src/utils/index.d.ts +5 -0
- package/dist/table-module/src/utils/is-of-type.d.ts +6 -0
- package/dist/table-module/src/utils/matrices.d.ts +9 -0
- package/dist/table-module/src/utils/options.d.ts +25 -0
- package/dist/table-module/src/utils/point.d.ts +7 -0
- package/dist/table-module/src/utils/types.d.ts +19 -0
- package/dist/video-module/src/module/custom-types.d.ts +23 -0
- package/package.json +29 -23
- package/CHANGELOG.md +0 -115
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description to-html entry
|
|
3
|
+
* @author wangfupeng
|
|
4
|
+
*/
|
|
5
|
+
import { Descendant, Element as SlateElement } from 'slate';
|
|
6
|
+
import { IDomEditor } from '../editor/interface';
|
|
7
|
+
export type styleToHtmlFnType = (node: Descendant, elemHtml: string, editor?: IDomEditor) => string;
|
|
8
|
+
export declare const STYLE_TO_HTML_FN_LIST: styleToHtmlFnType[];
|
|
9
|
+
/**
|
|
10
|
+
* 注册 toHtml 处理文本样式的函数
|
|
11
|
+
* @param fn 处理 toHtml 文本样式的函数
|
|
12
|
+
*/
|
|
13
|
+
export declare function registerStyleToHtmlHandler(fn: styleToHtmlFnType): void;
|
|
14
|
+
interface IElemToHtmlRes {
|
|
15
|
+
html: string;
|
|
16
|
+
prefix?: string;
|
|
17
|
+
suffix?: string;
|
|
18
|
+
}
|
|
19
|
+
export type ElemToHtmlFnType = (elemNode: SlateElement, childrenHtml: string, editor?: IDomEditor) => string | IElemToHtmlRes;
|
|
20
|
+
export declare const ELEM_TO_HTML_CONF: {
|
|
21
|
+
[key: string]: ElemToHtmlFnType;
|
|
22
|
+
};
|
|
23
|
+
export interface IElemToHtmlConf {
|
|
24
|
+
type: string;
|
|
25
|
+
elemToHtml: ElemToHtmlFnType;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 注册 elem to html 函数
|
|
29
|
+
* @param conf { type, elemToHtml } ,type 即 node.type
|
|
30
|
+
*/
|
|
31
|
+
export declare function registerElemToHtmlConf(conf: IElemToHtmlConf): void;
|
|
32
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description gen uploader
|
|
3
|
+
* @author wangfupeng
|
|
4
|
+
*/
|
|
5
|
+
import type Uppy from '@uppy/core';
|
|
6
|
+
import type { IDomEditor } from '../editor/interface';
|
|
7
|
+
import type { IUploadAdapter, IUploadConfig, IUploader } from './interface';
|
|
8
|
+
type IUploadConfigWithAdapter = IUploadConfig & {
|
|
9
|
+
uploadAdapter: IUploadAdapter;
|
|
10
|
+
};
|
|
11
|
+
declare function createUploader<T extends IUploadConfig>(config: T, editor?: IDomEditor): T extends IUploadConfigWithAdapter ? IUploader : Uppy;
|
|
12
|
+
export default createUploader;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description upload interface
|
|
3
|
+
* @author wangfupeng
|
|
4
|
+
*/
|
|
5
|
+
import type { IDomEditor } from '../editor/interface';
|
|
6
|
+
export type IUploadHeaders = Record<string, string | number>;
|
|
7
|
+
export interface IUploadResultFile {
|
|
8
|
+
name: string;
|
|
9
|
+
type?: string;
|
|
10
|
+
size?: number;
|
|
11
|
+
[key: string]: any;
|
|
12
|
+
}
|
|
13
|
+
export interface IUploadFile {
|
|
14
|
+
name: string;
|
|
15
|
+
type: string;
|
|
16
|
+
size: number;
|
|
17
|
+
data: Blob | File;
|
|
18
|
+
source?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface IUploader {
|
|
21
|
+
addFiles: (files: IUploadFile[]) => void;
|
|
22
|
+
upload: () => Promise<unknown>;
|
|
23
|
+
destroy?: () => void;
|
|
24
|
+
}
|
|
25
|
+
type FilesType = Record<string, any>;
|
|
26
|
+
type InsertFn = (src: string, poster?: string, alt?: string, href?: string) => void | Promise<void>;
|
|
27
|
+
export interface IUploadAdapterContext {
|
|
28
|
+
config: IUploadConfig;
|
|
29
|
+
editor?: IDomEditor;
|
|
30
|
+
}
|
|
31
|
+
export type IUploadAdapter = (context: IUploadAdapterContext) => IUploader;
|
|
32
|
+
interface IBaseUploadConfig {
|
|
33
|
+
fieldName?: string;
|
|
34
|
+
maxFileSize?: number;
|
|
35
|
+
maxNumberOfFiles?: number;
|
|
36
|
+
meta?: Record<string, unknown>;
|
|
37
|
+
metaWithUrl: boolean;
|
|
38
|
+
headers?: IUploadHeaders | ((file: IUploadResultFile) => IUploadHeaders) | undefined;
|
|
39
|
+
withCredentials?: boolean;
|
|
40
|
+
timeout?: number;
|
|
41
|
+
onBeforeUpload?: (files: FilesType) => boolean | FilesType;
|
|
42
|
+
onSuccess: (file: IUploadResultFile, response: any) => void;
|
|
43
|
+
onProgress?: (progress: number) => void;
|
|
44
|
+
onFailed: (file: IUploadResultFile, response: any) => void;
|
|
45
|
+
onError: (file: IUploadResultFile, error: any, res: any) => void;
|
|
46
|
+
allowedFileTypes?: string[];
|
|
47
|
+
customInsert?: (res: any, insertFn: InsertFn) => void;
|
|
48
|
+
customUpload?: (files: File, insertFn: InsertFn, editor: IDomEditor) => void;
|
|
49
|
+
customBrowseAndUpload?: (insertFn: InsertFn) => void;
|
|
50
|
+
uploadAdapter?: IUploadAdapter;
|
|
51
|
+
uppyConfig?: Record<string, any>;
|
|
52
|
+
xhrConfig?: Record<string, any>;
|
|
53
|
+
}
|
|
54
|
+
interface IUploadConfigWithCustomUpload extends IBaseUploadConfig {
|
|
55
|
+
server?: string;
|
|
56
|
+
customUpload: (files: File, insertFn: InsertFn, editor: IDomEditor) => void;
|
|
57
|
+
}
|
|
58
|
+
interface IUploadConfigWithUploadAdapter extends IBaseUploadConfig {
|
|
59
|
+
server?: string;
|
|
60
|
+
uploadAdapter: IUploadAdapter;
|
|
61
|
+
customUpload?: (files: File, insertFn: InsertFn, editor: IDomEditor) => void;
|
|
62
|
+
}
|
|
63
|
+
interface IUploadConfigWithoutCustomUpload extends IBaseUploadConfig {
|
|
64
|
+
server: string;
|
|
65
|
+
customUpload?: never;
|
|
66
|
+
uploadAdapter?: never;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* 配置参考 https://uppy.io/docs/uppy/
|
|
70
|
+
*/
|
|
71
|
+
export type IUploadConfig = IUploadConfigWithCustomUpload | IUploadConfigWithUploadAdapter | IUploadConfigWithoutCustomUpload;
|
|
72
|
+
export {};
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description DOM 操作 part1 - DOM7 文档 https://framework7.io/docs/dom7.html
|
|
3
|
+
* @author wangfupeng
|
|
4
|
+
*/
|
|
5
|
+
import $, { Dom7Array } from 'dom7';
|
|
6
|
+
import DOMNode = globalThis.Node;
|
|
7
|
+
import DOMComment = globalThis.Comment;
|
|
8
|
+
import DOMElement = globalThis.Element;
|
|
9
|
+
import DOMText = globalThis.Text;
|
|
10
|
+
import DOMRange = globalThis.Range;
|
|
11
|
+
import DOMSelection = globalThis.Selection;
|
|
12
|
+
import DOMStaticRange = globalThis.StaticRange;
|
|
13
|
+
export { Dom7Array } from 'dom7';
|
|
14
|
+
export default $;
|
|
15
|
+
export declare enum NodeType {
|
|
16
|
+
ELEMENT_NODE = 1,
|
|
17
|
+
TEXT_NODE = 3,
|
|
18
|
+
CDATA_SECTION_NODE = 4,
|
|
19
|
+
PROCESSING_INSTRUCTION_NODE = 7,
|
|
20
|
+
COMMENT_NODE = 8,
|
|
21
|
+
DOCUMENT_NODE = 9,
|
|
22
|
+
DOCUMENT_TYPE_NODE = 10,
|
|
23
|
+
DOCUMENT_FRAGMENT_NODE = 11
|
|
24
|
+
}
|
|
25
|
+
export declare const isDocument: (value: any) => value is Document;
|
|
26
|
+
export declare const isShadowRoot: (value: any) => value is ShadowRoot;
|
|
27
|
+
export declare const isDataTransfer: (value: any) => value is DataTransfer;
|
|
28
|
+
export declare const isUnprocessedListElement: (el: Element) => boolean;
|
|
29
|
+
export declare const isHTMLElememt: (value: any) => value is HTMLElement;
|
|
30
|
+
export { DOMComment, DOMElement, DOMNode, DOMRange, DOMSelection, DOMStaticRange, DOMText, };
|
|
31
|
+
export type DOMPoint = [Node, number];
|
|
32
|
+
/**
|
|
33
|
+
* Returns the host window of a DOM node
|
|
34
|
+
*/
|
|
35
|
+
export declare const getDefaultView: (value: any) => Window | null;
|
|
36
|
+
/**
|
|
37
|
+
* Check if a value is a DOM node.
|
|
38
|
+
*/
|
|
39
|
+
export declare const isDOMNode: (value: any) => value is DOMNode;
|
|
40
|
+
/**
|
|
41
|
+
* Check if a DOM node is a comment node.
|
|
42
|
+
*/
|
|
43
|
+
export declare const isDOMComment: (value: any) => value is DOMComment;
|
|
44
|
+
/**
|
|
45
|
+
* Check if a DOM node is an element node.
|
|
46
|
+
*/
|
|
47
|
+
export declare const isDOMElement: (value: any) => value is DOMElement;
|
|
48
|
+
/**
|
|
49
|
+
* Check if a value is a DOM selection.
|
|
50
|
+
*/
|
|
51
|
+
export declare const isDOMSelection: (value: any) => value is DOMSelection;
|
|
52
|
+
/**
|
|
53
|
+
* Check if a DOM node is an element node.
|
|
54
|
+
*/
|
|
55
|
+
export declare const isDOMText: (value: any) => value is DOMText;
|
|
56
|
+
/**
|
|
57
|
+
* Checks whether a paste event is a plaintext-only event.
|
|
58
|
+
*/
|
|
59
|
+
export declare const isPlainTextOnlyPaste: (event: ClipboardEvent) => boolean | null;
|
|
60
|
+
/**
|
|
61
|
+
* Normalize a DOM point so that it always refers to a text node.
|
|
62
|
+
*/
|
|
63
|
+
export declare const normalizeDOMPoint: (domPoint: DOMPoint) => DOMPoint;
|
|
64
|
+
/**
|
|
65
|
+
* Determines wether the active element is nested within a shadowRoot
|
|
66
|
+
*/
|
|
67
|
+
export declare const hasShadowRoot: () => boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Get the element with the specified id
|
|
70
|
+
*/
|
|
71
|
+
export declare const getElementById: (id: string) => null | HTMLElement;
|
|
72
|
+
/**
|
|
73
|
+
* Get the nearest editable child and index at `index` in a `parent`, preferring `direction`.
|
|
74
|
+
*/
|
|
75
|
+
export declare const getEditableChildAndIndex: (parent: DOMElement, index: number, direction: "forward" | "backward") => [DOMNode, number];
|
|
76
|
+
/**
|
|
77
|
+
* Get the nearest editable child at `index` in a `parent`, preferring
|
|
78
|
+
* `direction`.
|
|
79
|
+
*/
|
|
80
|
+
export declare const getEditableChild: (parent: DOMElement, index: number, direction: "forward" | "backward") => DOMNode;
|
|
81
|
+
/**
|
|
82
|
+
* Get a plaintext representation of the content of a node, accounting for block
|
|
83
|
+
* elements which get a newline appended.
|
|
84
|
+
*
|
|
85
|
+
* The domNode must be attached to the DOM.
|
|
86
|
+
*/
|
|
87
|
+
export declare const getPlainText: (domNode: DOMNode) => string;
|
|
88
|
+
/**
|
|
89
|
+
* 在下级节点中找到第一个 void elem
|
|
90
|
+
* @param elem elem
|
|
91
|
+
*/
|
|
92
|
+
export declare function getFirstVoidChild(elem: DOMElement): DOMElement | null;
|
|
93
|
+
/**
|
|
94
|
+
* 遍历一个 elem 内所有的 text node ,执行函数
|
|
95
|
+
* @param elem elem
|
|
96
|
+
* @param handler handler
|
|
97
|
+
*/
|
|
98
|
+
export declare function walkTextNodes(elem: DOMElement, handler: (textNode: DOMNode, parent: DOMElement) => void): void;
|
|
99
|
+
/**
|
|
100
|
+
* 获取 tagName lower-case
|
|
101
|
+
* @param $elem $elem
|
|
102
|
+
*/
|
|
103
|
+
export declare function getTagName($elem: Dom7Array): string;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description 快捷键
|
|
3
|
+
* @author wangfupeng
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Hotkeys.
|
|
7
|
+
*/
|
|
8
|
+
declare const _default: {
|
|
9
|
+
isBold: (event: KeyboardEvent) => boolean;
|
|
10
|
+
isCompose: (event: KeyboardEvent) => boolean;
|
|
11
|
+
isMoveBackward: (event: KeyboardEvent) => boolean;
|
|
12
|
+
isMoveForward: (event: KeyboardEvent) => boolean;
|
|
13
|
+
isDeleteBackward: (event: KeyboardEvent) => boolean;
|
|
14
|
+
isDeleteForward: (event: KeyboardEvent) => boolean;
|
|
15
|
+
isDeleteLineBackward: (event: KeyboardEvent) => boolean;
|
|
16
|
+
isDeleteLineForward: (event: KeyboardEvent) => boolean;
|
|
17
|
+
isDeleteWordBackward: (event: KeyboardEvent) => boolean;
|
|
18
|
+
isDeleteWordForward: (event: KeyboardEvent) => boolean;
|
|
19
|
+
isExtendBackward: (event: KeyboardEvent) => boolean;
|
|
20
|
+
isExtendForward: (event: KeyboardEvent) => boolean;
|
|
21
|
+
isExtendLineBackward: (event: KeyboardEvent) => boolean;
|
|
22
|
+
isExtendLineForward: (event: KeyboardEvent) => boolean;
|
|
23
|
+
isItalic: (event: KeyboardEvent) => boolean;
|
|
24
|
+
isMoveLineBackward: (event: KeyboardEvent) => boolean;
|
|
25
|
+
isMoveLineForward: (event: KeyboardEvent) => boolean;
|
|
26
|
+
isMoveWordBackward: (event: KeyboardEvent) => boolean;
|
|
27
|
+
isMoveWordForward: (event: KeyboardEvent) => boolean;
|
|
28
|
+
isRedo: (event: KeyboardEvent) => boolean;
|
|
29
|
+
isSplitBlock: (event: KeyboardEvent) => boolean;
|
|
30
|
+
isTransposeCharacter: (event: KeyboardEvent) => boolean;
|
|
31
|
+
isUndo: (event: KeyboardEvent) => boolean;
|
|
32
|
+
isTab: (event: KeyboardEvent) => boolean;
|
|
33
|
+
isSelectAll: (event: KeyboardEvent) => boolean;
|
|
34
|
+
};
|
|
35
|
+
export default _default;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An auto-incrementing identifier for keys.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* A class that keeps track of a key string. We use a full class here because we
|
|
6
|
+
* want to be able to use them as keys in `WeakMap` objects.
|
|
7
|
+
*/
|
|
8
|
+
export declare class Key {
|
|
9
|
+
id: string;
|
|
10
|
+
constructor();
|
|
11
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description Utilities for single-line deletion
|
|
3
|
+
*/
|
|
4
|
+
import { Range } from 'slate';
|
|
5
|
+
import { IDomEditor } from '../editor/interface';
|
|
6
|
+
/**
|
|
7
|
+
* A helper utility that returns the end portion of a `Range`
|
|
8
|
+
* which is located on a single line.
|
|
9
|
+
*
|
|
10
|
+
* @param {Editor} editor The editor object to compare against
|
|
11
|
+
* @param {Range} parentRange The parent range to compare against
|
|
12
|
+
* @returns {Range} A valid portion of the parentRange which is one a single line
|
|
13
|
+
*/
|
|
14
|
+
export declare const findCurrentLineRange: (editor: IDomEditor, parentRange: Range) => Range;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description 通过 UA 判断浏览器
|
|
3
|
+
* @author wangfupeng
|
|
4
|
+
*/
|
|
5
|
+
export declare const IS_IOS: boolean;
|
|
6
|
+
export declare const IS_APPLE: boolean;
|
|
7
|
+
export declare const IS_FIREFOX: boolean;
|
|
8
|
+
export declare const IS_FIREFOX_LEGACY: boolean;
|
|
9
|
+
export declare const IS_SAFARI: boolean;
|
|
10
|
+
export declare const IS_EDGE_LEGACY: boolean;
|
|
11
|
+
export declare const IS_CHROME_LEGACY: boolean;
|
|
12
|
+
export declare const IS_CHROME: boolean;
|
|
13
|
+
export declare const IS_QQBROWSER: boolean;
|
|
14
|
+
export declare const HAS_BEFORE_INPUT_SUPPORT: boolean;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description 工具函数
|
|
3
|
+
* @author wangfupeng
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* 获取随机数字符串
|
|
7
|
+
* @param prefix 前缀
|
|
8
|
+
* @returns 随机数字符串
|
|
9
|
+
*/
|
|
10
|
+
export declare function genRandomStr(prefix?: string): string;
|
|
11
|
+
export declare function promiseResolveThen(fn: Function): void;
|
|
12
|
+
/**
|
|
13
|
+
* 追加 url query 参数
|
|
14
|
+
* @param url url
|
|
15
|
+
* @param data data
|
|
16
|
+
*/
|
|
17
|
+
export declare function addQueryToUrl(url: string, data: object): string;
|
|
18
|
+
/**
|
|
19
|
+
* 替换 html 特殊字符,如 > 替换为 >
|
|
20
|
+
* @param str html str
|
|
21
|
+
*/
|
|
22
|
+
export declare function replaceHtmlSpecialSymbols(str: string): string;
|
|
23
|
+
/**
|
|
24
|
+
*【反转】替换 html 特殊字符,如 > 替换为 >
|
|
25
|
+
* @param str html str
|
|
26
|
+
*/
|
|
27
|
+
export declare function deReplaceHtmlSpecialSymbols(str: string): string;
|
|
28
|
+
export declare const toString: (val: unknown) => string;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description vdom 相关方法
|
|
3
|
+
* @author wangfupeng
|
|
4
|
+
*/
|
|
5
|
+
import { VNode, VNodeStyle, Props, Dataset } from 'snabbdom';
|
|
6
|
+
export type PatchFn = (oldVnode: VNode | Element, vnode: VNode) => VNode;
|
|
7
|
+
/**
|
|
8
|
+
* 创建 snabbdom patch
|
|
9
|
+
* @returns snabbdom patch 函数
|
|
10
|
+
*/
|
|
11
|
+
export declare function genPatchFn(): PatchFn;
|
|
12
|
+
/**
|
|
13
|
+
* 整理 vnode.data ,将暴露出来的零散属性(如 id className data-xxx)放在 data.props 或 data.dataset
|
|
14
|
+
* @param vnode vnode
|
|
15
|
+
*/
|
|
16
|
+
export declare function normalizeVnodeData(vnode: VNode): void;
|
|
17
|
+
/**
|
|
18
|
+
* 给 vnode 添加 prop
|
|
19
|
+
* @param vnode vnode
|
|
20
|
+
* @param newProp { key: val }
|
|
21
|
+
*/
|
|
22
|
+
export declare function addVnodeProp(vnode: VNode, newProp: Props): void;
|
|
23
|
+
/**
|
|
24
|
+
* 给 vnode 添加 dataset
|
|
25
|
+
* @param vnode vnode
|
|
26
|
+
* @param newDataset { key: val }
|
|
27
|
+
*/
|
|
28
|
+
export declare function addVnodeDataset(vnode: VNode, newDataset: Dataset): void;
|
|
29
|
+
/**
|
|
30
|
+
* 给 vnode 添加样式
|
|
31
|
+
* @param vnode vnode
|
|
32
|
+
* @param newStyle { key: val }
|
|
33
|
+
*/
|
|
34
|
+
export declare function addVnodeStyle(vnode: VNode, newStyle: VNodeStyle): void;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description 对象关联关系(部分参考 slate-react weak-maps.ts)
|
|
3
|
+
* @author wangfupeng
|
|
4
|
+
*/
|
|
5
|
+
import { Emitter } from 'event-emitter';
|
|
6
|
+
import { Ancestor, Editor, Node, Path, Range } from 'slate';
|
|
7
|
+
import { VNode } from 'snabbdom';
|
|
8
|
+
import { IEditorConfig } from '../config/interface';
|
|
9
|
+
import { IDomEditor } from '../editor/interface';
|
|
10
|
+
import HoverBar from '../menus/bar/HoverBar';
|
|
11
|
+
import Toolbar from '../menus/bar/Toolbar';
|
|
12
|
+
import { IBarItem } from '../menus/bar-item/index';
|
|
13
|
+
import PanelAndModal from '../menus/panel-and-modal/BaseClass';
|
|
14
|
+
import TextArea from '../text-area/TextArea';
|
|
15
|
+
import { PatchFn } from '../utils/vdom';
|
|
16
|
+
import { Key } from './key';
|
|
17
|
+
export declare const EDITOR_TO_TEXTAREA: WeakMap<IDomEditor, TextArea>;
|
|
18
|
+
export declare const TEXTAREA_TO_EDITOR: WeakMap<TextArea, IDomEditor>;
|
|
19
|
+
export declare const TOOLBAR_TO_EDITOR: WeakMap<Toolbar, IDomEditor>;
|
|
20
|
+
export declare const EDITOR_TO_TOOLBAR: WeakMap<IDomEditor, Toolbar>;
|
|
21
|
+
export declare const HOVER_BAR_TO_EDITOR: WeakMap<HoverBar, IDomEditor>;
|
|
22
|
+
export declare const EDITOR_TO_HOVER_BAR: WeakMap<IDomEditor, HoverBar>;
|
|
23
|
+
export declare const BAR_ITEM_TO_EDITOR: WeakMap<IBarItem, IDomEditor>;
|
|
24
|
+
export declare const EDITOR_TO_PANEL_AND_MODAL: WeakMap<IDomEditor, Set<PanelAndModal>>;
|
|
25
|
+
export declare const PANEL_OR_MODAL_TO_EDITOR: WeakMap<PanelAndModal, IDomEditor>;
|
|
26
|
+
export declare const EDITOR_TO_CONFIG: WeakMap<IDomEditor, IEditorConfig>;
|
|
27
|
+
export declare const IS_FIRST_PATCH: WeakMap<TextArea, boolean>;
|
|
28
|
+
export declare const TEXTAREA_TO_PATCH_FN: WeakMap<TextArea, PatchFn>;
|
|
29
|
+
export declare const TEXTAREA_TO_VNODE: WeakMap<TextArea, VNode>;
|
|
30
|
+
export declare const NODE_TO_VNODE: WeakMap<Node, [number, VNode]>;
|
|
31
|
+
export declare const NODE_TO_HTML: WeakMap<Node, String>;
|
|
32
|
+
/**
|
|
33
|
+
* Two weak maps that allow us rebuild a path given a node. They are populated
|
|
34
|
+
* at render time such that after a render occurs we can always backtrack.
|
|
35
|
+
*/
|
|
36
|
+
export declare const NODE_TO_INDEX: WeakMap<Node, number>;
|
|
37
|
+
export declare const NODE_TO_PARENT: WeakMap<Node, Ancestor>;
|
|
38
|
+
/**
|
|
39
|
+
* Weak maps that allow us to go between Slate nodes and DOM nodes. These
|
|
40
|
+
* are used to resolve DOM event-related logic into Slate actions.
|
|
41
|
+
*/
|
|
42
|
+
export declare const EDITOR_TO_ELEMENT: WeakMap<Editor, HTMLElement>;
|
|
43
|
+
export declare const EDITOR_TO_PLACEHOLDER: WeakMap<Editor, string>;
|
|
44
|
+
export declare const ELEMENT_TO_NODE: WeakMap<HTMLElement, Node>;
|
|
45
|
+
export declare const KEY_TO_ELEMENT: WeakMap<Key, HTMLElement>;
|
|
46
|
+
export declare const NODE_TO_ELEMENT: WeakMap<Node, HTMLElement>;
|
|
47
|
+
export declare const NODE_TO_KEY: WeakMap<Node, Key>;
|
|
48
|
+
export declare const EDITOR_TO_WINDOW: WeakMap<Editor, Window>;
|
|
49
|
+
/**
|
|
50
|
+
* Weak maps for storing editor-related state.
|
|
51
|
+
*/
|
|
52
|
+
export declare const IS_FOCUSED: WeakMap<Editor, boolean>;
|
|
53
|
+
export declare const IS_DRAGGING: WeakMap<Editor, boolean>;
|
|
54
|
+
export declare const IS_CLICKING: WeakMap<Editor, boolean>;
|
|
55
|
+
export declare const CHANGING_NODE_PATH: WeakMap<Editor, Path>;
|
|
56
|
+
export declare const EDITOR_TO_SELECTION: WeakMap<Editor, Range>;
|
|
57
|
+
export declare const EDITOR_TO_EMITTER: WeakMap<Editor, Emitter>;
|
|
58
|
+
export declare const EDITOR_TO_CAN_PASTE: WeakMap<Editor, boolean>;
|
|
59
|
+
export declare const EDITOR_TO_PENDING_COMPOSITION_END: WeakMap<Editor, boolean>;
|
|
60
|
+
export declare const EDITOR_TO_PENDING_SELECTION: WeakMap<Editor, Range | null>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.w-e-list-color-ewtzuf{color:#000}.w-e-list-color-4xvty2{color:#262626}.w-e-list-color-sqycuk{color:#595959}.w-e-list-color-3z8psd{color:#8c8c8c}.w-e-list-color-wksmh8{color:#bfbfbf}.w-e-list-color-paasa7{color:#d9d9d9}.w-e-list-color-6bm9m5{color:#e9e9e9}.w-e-list-color-l91prz{color:#f5f5f5}.w-e-list-color-k3jp27{color:#fafafa}.w-e-list-color-67tap4{color:#fff}.w-e-list-color-tunwkj{color:#e13c39}.w-e-list-color-s85xre{color:#e75f33}.w-e-list-color-xx8cx7{color:#eb903a}.w-e-list-color-8hp23z{color:#f5db4d}.w-e-list-color-vbyzhj{color:#72c040}.w-e-list-color-a0scch{color:#59bfc0}.w-e-list-color-786vrv{color:#4290f7}.w-e-list-color-jztut9{color:#3658e2}.w-e-list-color-wh1hr9{color:#6a39c9}.w-e-list-color-enuf5u{color:#d84493}.w-e-list-color-ofga0e{color:#fbe9e6}.w-e-list-color-n2n1ob{color:#fcede1}.w-e-list-color-o0q9nf{color:#fcefd4}.w-e-list-color-e2ltc0{color:#fcfbcf}.w-e-list-color-sx4s4b{color:#e7f6d5}.w-e-list-color-t4t3jr{color:#daf4f0}.w-e-list-color-j4jejh{color:#d9edfa}.w-e-list-color-wb7pdv{color:#e0e8fa}.w-e-list-color-f3wgv5{color:#ede1f8}.w-e-list-color-omv2nm{color:#f6e2ea}.w-e-list-color-qn194t{color:#ffa39e}.w-e-list-color-mdg9z8{color:#ffbb96}.w-e-list-color-hl8b9g{color:#ffd591}.w-e-list-color-4bm5ce{color:#fffb8f}.w-e-list-color-xyf4ks{color:#b7eb8f}.w-e-list-color-wj8ykc{color:#87e8de}.w-e-list-color-9gfdr3{color:#91d5ff}.w-e-list-color-hsaivy{color:#adc6ff}.w-e-list-color-v3pqyx{color:#d3adf7}.w-e-list-color-5sw276{color:#ffadd2}.w-e-list-color-bsc56c{color:#ff4d4f}.w-e-list-color-qg254p{color:#ff7a45}.w-e-list-color-sg36qp{color:#ffa940}.w-e-list-color-6556xy{color:#ffec3d}.w-e-list-color-byp7re{color:#73d13d}.w-e-list-color-eyz4ng{color:#36cfc9}.w-e-list-color-9xmyha{color:#40a9ff}.w-e-list-color-g6x347{color:#597ef7}.w-e-list-color-qkkoll{color:#9254de}.w-e-list-color-4uljq8{color:#f759ab}.w-e-list-color-2zmrji{color:#cf1322}.w-e-list-color-8epkxl{color:#d4380d}.w-e-list-color-6ff92a{color:#d46b08}.w-e-list-color-6j9t63{color:#d4b106}.w-e-list-color-xsysfa{color:#389e0d}.w-e-list-color-qic72q{color:#08979c}.w-e-list-color-oounuc{color:#096dd9}.w-e-list-color-dcs2ck{color:#1d39c4}.w-e-list-color-nkq71x{color:#531dab}.w-e-list-color-v640ve{color:#c41d7f}.w-e-list-color-beewzy{color:#820014}.w-e-list-color-dsgatp{color:#871400}.w-e-list-color-du7iiy{color:#873800}.w-e-list-color-aoputq{color:#614700}.w-e-list-color-mkf87m{color:#135200}.w-e-list-color-l4iwsq{color:#00474f}.w-e-list-color-p38mu9{color:#003a8c}.w-e-list-color-z5ty33{color:#061178}.w-e-list-color-6t1egh{color:#22075e}.w-e-list-color-i6ncxa{color:#780650}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r(require("@wangeditor-next/core"),require("slate"),require("dom7"),require("snabbdom")):"function"==typeof define&&define.amd?define(["@wangeditor-next/core","slate","dom7","snabbdom"],r):(e="undefined"!=typeof globalThis?globalThis:e||self).WangEditorListModule=r(e.core,e.slate,e.$,e.snabbdom)}(this,function(e,r,t,o){"use strict";e.i18nAddResources("en",{listModule:{unOrderedList:"Unordered list",orderedList:"Ordered list"}}),e.i18nAddResources("zh-CN",{listModule:{unOrderedList:"无序列表",orderedList:"有序列表"}});var n=function(e,r){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,r){e.__proto__=r}||function(e,r){for(var t in r)Object.prototype.hasOwnProperty.call(r,t)&&(e[t]=r[t])},n(e,r)};function i(e,r){if("function"!=typeof r&&null!==r)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");function t(){this.constructor=e}n(e,r),e.prototype=null===r?Object.create(r):(t.prototype=r.prototype,new t)}function l(e){var r="function"==typeof Symbol&&Symbol.iterator,t=r&&e[r],o=0;if(t)return t.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&o>=e.length&&(e=void 0),{value:e&&e[o++],done:!e}}};throw new TypeError(r?"Object is not iterable.":"Symbol.iterator is not defined.")}function a(e,r){var t="function"==typeof Symbol&&e[Symbol.iterator];if(!t)return e;var o,n,i=t.call(e),l=[];try{for(;(void 0===r||r-- >0)&&!(o=i.next()).done;)l.push(o.value)}catch(e){n={error:e}}finally{try{o&&!o.done&&(t=i.return)&&t.call(i)}finally{if(n)throw n.error}}return l}function d(e,r,t){if(t||2===arguments.length)for(var o,n=0,i=r.length;n<i;n++)!o&&n in r||(o||(o=Array.prototype.slice.call(r,0,n)),o[n]=r[n]);return e.concat(o||Array.prototype.slice.call(r))}"function"==typeof SuppressedError&&SuppressedError;var s=new WeakMap;function u(e){var t,o=e.children||[],n=o.length;if(0===n)return"";for(var i=0;i<n&&!t;i+=1){var l=o[i];r.Text.isText(l)&&(t=l)}return null==t?"":t.color||""}function c(t,o,n){for(var i=o.type,l=function(e,r){var t={};for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&r.indexOf(o)<0&&(t[o]=e[o]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(o=Object.getOwnPropertySymbols(e);n<o.length;n++)r.indexOf(o[n])<0&&Object.prototype.propertyIsEnumerable.call(e,o[n])&&(t[o[n]]=e[o[n]])}return t}(o,["type"]),d=void 0!==n?n:l.level||0,s=e.DomEditor.findPath(t,o);;){if(0===s.length||0===s[s.length-1])return null;s=r.Path.previous(s);var u=r.Editor.node(t,s);if(!u)return null;var c=a(u,1)[0],f=c.level,v=void 0===f?0:f;if(e.DomEditor.getNodeType(c)!==i)return null;if(v===d)return c}}function f(e,r,t){var o=c(e,r,t);return!!o&&o.ordered===r.ordered}var v=new Set;function p(e){return(e||"").trim().replace(/\s+/g,"").toLowerCase()}var g=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(e){return p(e)}));function b(e){var r=p(e);return"w-e-list-color-".concat(function(e){var r,t,o=7;try{for(var n=l(e),i=n.next();!i.done;i=n.next())o=(31*o+(i.value.codePointAt(0)||0))%2147483647}catch(e){r={error:e}}finally{try{i&&!i.done&&(t=n.return)&&t.call(n)}finally{if(r)throw r.error}}return o.toString(36)}("color:".concat(r)))}function y(e,r){var t=p(r);return!!t&&(!!g.has(t)||!!function(e,r){for(var t,o=(null===(t=null==e?void 0:e.getConfig().styleClassTokens)||void 0===t?void 0:t.color)||[],n=p(r),i=0;i<o.length;i+=1)if(p(o[i])===n)return!0;return!1}(e,r))}var m=[];var h={type:"list-item",elemToHtml:function(t,o,n){var i="",l="",d=t.ordered,c=void 0!==d&&d?"ol":"ul",p=function(t){var o=s.get(t);if(null==o)return 0;var n=t,i=n.type,l=n.ordered,d=void 0!==l&&l,u=n.level,c=void 0===u?0:u,v=e.DomEditor.findPath(o,t);if(0===v[0])return c+1;var p=r.Path.previous(v),g=r.Editor.node(o,p);if(!g)return 0;var b=a(g,1)[0];if(e.DomEditor.getNodeType(b)!==i)return c+1;var y=b,m=y.ordered,h=void 0!==m&&m,w=y.level,x=void 0===w?0:w;return x<c?c-x:x>c?f(o,t)?0:1:x===c?h===d?0:1:0}(t);if(p>0)for(var g=0;g<p;g+=1)i+="<".concat(c,">"),m.push(c);var h=function(t){var o=s.get(t);if(null==o)return 0;var n=t,i=n.type,l=n.ordered,d=void 0!==l&&l,u=n.level,c=void 0===u?0:u,v=e.DomEditor.findPath(o,t);if(v[0]===o.children.length-1)return c+1;var p=r.Path.next(v),g=r.Editor.node(o,p);if(!g)return 0;var b=a(g,1)[0];if(e.DomEditor.getNodeType(b)!==i)return c+1;var y=b,m=y.ordered,h=void 0!==m&&m,w=y.level,x=void 0===w?0:w;return x<c?f(o,b)?c-x:c-x+1:x>c?0:x===c?h===d?0:1:0}(t);if(h>0)for(g=0;g<h;g+=1){var w=m.pop();l+="</".concat(w,">")}var x=u(t),E=e.getTextStyleMode(n),T="",N="",S="";if(x)if("class"===E){S=' data-w-e-color="'.concat(x,'"');var k=function(r,t){if(y(r,t))return"class";var o=e.getClassStylePolicy(r),n="preserve-data";"fallback-inline"===o&&(n="inline"),"strict"===o&&(n="throw");var i="[wangeditor] Unsupported list color class token color=".concat(t,". policy=").concat(o),l="".concat(t,"|").concat(n);if(v.has(l)||(v.add(l),e.reportUnsupportedClassStyle(r,{type:"color",value:t,scene:"toHtml",fallback:n,message:i})),"throw"===n)throw new Error(i);return"inline"===n?"inline":"preserve-data"}(n,x);"class"===k?N=' class="'.concat(b(x),'"'):"inline"===k&&(T=' style="color:'.concat(x,'"'))}else T=' style="color:'.concat(x,'"');return{html:"<li".concat(N).concat(S).concat(T,">").concat(o,"</li>"),prefix:i,suffix:l}}},w=function(){function t(){this.type="list-item",this.tag="button"}return t.prototype.getListNode=function(r){var t=this.type;return e.DomEditor.getSelectedNodeByType(r,t)},t.prototype.getValue=function(e){return""},t.prototype.isActive=function(e){var r=this.getListNode(e);if(null==r)return!1;var t=r.ordered;return(void 0!==t&&t)===this.ordered},t.prototype.isDisabled=function(t){return null==t.selection||!!e.DomEditor.getSelectedElems(t).some(function(e){if(r.Editor.isVoid(t,e)&&r.Editor.isBlock(t,e))return!0;var o=e.type;return!!["pre","code","table"].includes(o)})},t.prototype.exec=function(e,t){this.isActive(e)?r.Transforms.setNodes(e,{type:"paragraph",ordered:void 0,level:void 0}):r.Transforms.setNodes(e,{type:"list-item",ordered:this.ordered,indent:void 0})},t}(),x=function(r){function t(){var t=r.apply(this,d([],a(arguments),!1))||this;return t.ordered=!1,t.title=e.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 i(t,r),t}(w),E=function(r){function t(){var t=r.apply(this,d([],a(arguments),!1))||this;return t.ordered=!0,t.title=e.t("listModule.orderedList"),t.iconSvg='<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>',t}return i(t,r),t}(w),T={key:"bulletedList",factory:function(){return new x}},N={key:"numberedList",factory:function(){return new E}};function S(e){return e.length?e[0].tagName.toLowerCase():""}function k(t){return r.Editor.nodes(t,{at:t.selection||void 0,match:function(r){return 1===e.DomEditor.findPath(t,r).length}})}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,n,i){s.set(t,i);var l=t,a=l.level,d=void 0===a?0:a,c=l.ordered,f=void 0!==c&&c,v={margin:"5px 0 5px ".concat(20*d,"px"),display:"flex",alignItems:"flex-start"},p="";if(f){var g=function(t,o){var n=o,i=n.type,l=n.level,a=void 0===l?0:l,d=n.ordered,s=void 0!==d&&d,u=1,c=o,f=e.DomEditor.findPath(t,c);if(0===f[0])return 1;for(;f[0]>0;){var v=r.Path.previous(f),p=r.Editor.node(t,v);if(null==p)break;var g=p[0],b=g.level,y=void 0===b?0:b,m=g.type,h=g.ordered;if(m!==i)break;if(y<a)break;if(y===a){if(h!==s)break;u+=1}c=g,f=v}return u}(i,t);p="".concat(g,".")}else p=function(e){void 0===e&&(e=0);var r="";switch(e){case 0:r="•";break;case 1:r="◦";break;default:r="▪"}return r}(d);var b=u(t);return o.jsx("div",{style:v},o.jsx("span",{contentEditable:!1,style:{marginRight:"0.5em",color:b},"data-w-e-reserve":!0},p),o.jsx("span",{style:{flex:"1",wordBreak:"break-word"}},n))}}],editorPlugin:function(t){var o=t.deleteBackward,n=t.handleTab,i=t.normalizeNode,d=t.insertBreak,s=t;return s.insertBreak=function(){var o=a(r.Editor.nodes(t,{match:function(r){return e.DomEditor.checkNodeType(r,"list-item")},universal:!0}),1)[0];return o?""!==o[0].children[0].text?d():void r.Transforms.setNodes(s,{type:"paragraph",ordered:void 0,level:void 0}):d()},s.deleteBackward=function(n){var i=s.selection;if(null!=i)if(r.Range.isExpanded(i))o(n);else{var l=e.DomEditor.getSelectedNodeByType(s,"list-item");if(null!=l)if(0!==i.focus.offset)o(n);else{var a=l,d=a.level,u=void 0===d?0:d,f=a.ordered,v=void 0!==f&&f;if(u>0){var p=c(t,l,u-1);p&&p.ordered!==v?r.Transforms.setNodes(s,{level:u-1,ordered:!v}):r.Transforms.setNodes(s,{level:u-1})}else r.Transforms.setNodes(s,{type:"paragraph",ordered:void 0,level:void 0})}else o(n)}else o(n)},s.handleTab=function(){var t,o,i,d,u=s.selection;if(null!=u){if(r.Range.isCollapsed(u)){var c=e.DomEditor.getSelectedNodeByType(s,"list-item");if(null==c)return void n();if(0===u.focus.offset){var f=c.level,v=void 0===f?0:f;return void r.Transforms.setNodes(s,{level:v+1})}}if(r.Range.isExpanded(u)){var p=0,g=!1;try{for(var b=l(k(s)),y=b.next();!y.done;y=b.next()){var m=a(y.value,1)[0];"list-item"===e.DomEditor.getNodeType(m)?p+=1:g=!0}}catch(e){t={error:e}}finally{try{y&&!y.done&&(o=b.return)&&o.call(b)}finally{if(t)throw t.error}}if(g||p<=1)return void n();try{for(var h=l(k(s)),w=h.next();!w.done;w=h.next()){var x=a(w.value,2),E=(m=x[0],x[1]),T=m.level;v=void 0===T?0:T;r.Transforms.setNodes(s,{level:v+1},{at:E})}}catch(e){i={error:e}}finally{try{w&&!w.done&&(d=h.return)&&d.call(h)}finally{if(i)throw i.error}}}else n()}else n()},s.normalizeNode=function(t){var o=a(t,2),n=o[0],l=o[1],d=e.DomEditor.getNodeType(n);return"bulleted-list"!==d&&"numbered-list"!==d||r.Transforms.unwrapNodes(s,{at:l}),i([n,l])},s},menus:[T,N],elemsToHtml:[h],parseElemsHtml:[{selector:"ul:not([data-w-e-type]),ol:not([data-w-e-type])",parseElemHtml:function(e,r,t){return r.flat(1/0)}},{selector:"li:not([data-w-e-type])",parseElemHtml:function(e,o,n){var i=t(e);0===(o=o.filter(function(e){return!!r.Text.isText(e)||!!n.isInline(e)})).length&&(o=[{text:i.text().replace(/\s+/gm," ")}]);var l=function(e){return"ol"===S(e.parent())}(i),a=function(e){for(var r=0,t=e.parent(),o=S(t);"ul"===o||"ol"===o;)o=S(t=t.parent()),r+=1;return r-1}(i);return{type:"list-item",ordered:l,level:a,children:o}}}]}});
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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/module/menu/BaseMenu.ts","../src/module/menu/BulletedListMenu.ts","../src/constants/svg.ts","../src/module/menu/NumberedListMenu.ts","../src/module/menu/index.ts","../src/utils/dom.ts","../src/module/plugin.ts","../src/module/index.ts","../src/module/render-elem.tsx","../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 },\n}\n","/**\n * @description i18n zh-CN\n * @author wangfupeng\n */\n\nexport default {\n listModule: {\n unOrderedList: '无序列表',\n orderedList: '有序列表',\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 } from './custom-types'\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 ? brotherElem.ordered === elem.ordered : 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 { Editor, Element, Path } from 'slate'\n\nimport { ELEM_TO_EDITOR } from '../utils/maps'\nimport { getListItemColor } from '../utils/util'\nimport { ListItemElement } from './custom-types'\nimport { hasSameOrderWithBrother } from './helpers'\nimport { genListColorClassName, resolveListColorAction } from './style-class'\n\n/**\n * 当前 list-item 前面需要拼接几个 <ol> 或 <ul>\n * @param elem elem\n */\nfunction getStartContainerTagNumber(elem: Element): number {\n const editor = ELEM_TO_EDITOR.get(elem)\n\n if (editor == null) { return 0 }\n\n const { type, ordered = false, level = 0 } = elem as ListItemElement\n\n const path = DomEditor.findPath(editor, elem)\n\n if (path[0] === 0) {\n // list-item 是第一个元素,再往前没有了。需要拼接 <ol> 或 <ul>\n return level + 1\n }\n\n // 获取上一个 elem\n const prevPath = Path.previous(path)\n const prevEntry = Editor.node(editor, prevPath)\n\n if (!prevEntry) { return 0 }\n const [prevElem] = prevEntry\n\n const prevType = DomEditor.getNodeType(prevElem)\n\n if (prevType !== type) {\n // 上一个 elem 不是 list-item ,需要拼接 <ol> 或 <ul>\n return level + 1\n }\n\n // 上一个 elem 是 list-item\n const { ordered: prevOrdered = false, level: prevLevel = 0 } = prevElem as ListItemElement\n\n if (prevLevel < level) {\n // 上一个 level 小于当前 level ,需要拼接 <ol> 或 <ul>\n return level - prevLevel\n }\n if (prevLevel > level) {\n // 此处需要看上一个同级兄弟节点 ordered 是否一致,如果一致则不需要拼接,否则需要拼接\n return hasSameOrderWithBrother(editor, elem as ListItemElement) ? 0 : 1\n }\n if (prevLevel === level) {\n // 上一个 level 等于当前 level\n if (prevOrdered === ordered) {\n // ordered 一致,则不需要拼接 <ol> 或 <ul>\n return 0\n }\n /// ordered 不一致,则需要拼接 <ol> 或 <ul>\n return 1\n\n }\n\n // 其他情况\n return 0\n}\n\n/**\n * 当前 list-item 后面面需要拼接几个 </ol> 或 </ul>\n * @param elem elem\n */\nfunction getEndContainerTagNumber(elem: Element): number {\n const editor = ELEM_TO_EDITOR.get(elem)\n\n if (editor == null) { return 0 }\n\n const { type, ordered = false, level = 0 } = elem as ListItemElement\n\n const path = DomEditor.findPath(editor, elem)\n\n if (path[0] === editor.children.length - 1) {\n // list-item 是最后一个元素,再往后没有了。需要拼接 </ol> 或 </ul>\n return level + 1\n }\n\n // 获取下一个 elem\n const nextPath = Path.next(path)\n const nextEntry = Editor.node(editor, nextPath)\n\n if (!nextEntry) { return 0 }\n const [nextElem] = nextEntry\n\n const nextType = DomEditor.getNodeType(nextElem)\n\n if (nextType !== type) {\n // 下一个 elem 不是 list-item ,需要拼接 <ol> 或 <ul>\n return level + 1\n }\n\n // 下一个 elem 是 list-item\n const { ordered: nextOrdered = false, level: nextLevel = 0 } = nextElem as ListItemElement\n\n if (nextLevel < level) {\n // 下一个 level 小于当前 level,此处需要看上一个同级兄弟节点 ordered 是否一致,如果一致则不需要拼接,否则需要拼接\n if (hasSameOrderWithBrother(editor, nextElem as ListItemElement)) {\n // ordered 一致,则不需要额外拼接 </ol> 或 </ul>\n return level - nextLevel\n }\n // ordered 不一致,则需要额外拼接 </ol> 或 </ul>\n return level - nextLevel + 1\n\n }\n if (nextLevel > level) {\n // 下一个 level 大于当前 level ,不需要拼接 </ol> 或 </ul>\n return 0\n }\n if (nextLevel === level) {\n // 下一个 level 等于当前 level\n if (nextOrdered === ordered) {\n // ordered 一致,则不需要拼接 </ol> 或 </ul>\n return 0\n }\n /// ordered 不一致,则需要拼接 </ol> 或 </ul>\n return 1\n\n }\n\n // 其他情况\n return 0\n}\n\n// ol ul 栈\nconst CONTAINER_TAG_STACK: Array<string> = []\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 { ordered = false } = elem as ListItemElement\n const containerTag = ordered ? 'ol' : 'ul'\n\n // 前面需要拼接几个 <ol> 或 <ul>\n const startContainerTagNumber = getStartContainerTagNumber(elem)\n\n if (startContainerTagNumber > 0) {\n for (let i = 0; i < startContainerTagNumber; i += 1) {\n startContainerStr += `<${containerTag}>` // 记录 start container tag ,如 `<ul>`\n CONTAINER_TAG_STACK.push(containerTag) // tag 压栈\n }\n }\n\n // 后面需要拼接几个 </ol> 或 </ul>\n const endContainerTagNumber = getEndContainerTagNumber(elem)\n\n if (endContainerTagNumber > 0) {\n for (let i = 0; i < endContainerTagNumber; i += 1) {\n const tag = CONTAINER_TAG_STACK.pop() // tag 从栈中获取\n\n endContainerStr += `</${tag}>` // 记录 end container tag ,如 `</ul>`\n }\n }\n\n // 获取前缀颜色\n const prefixColor = getListItemColor(elem)\n const textStyleMode = getTextStyleMode(editor)\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(editor, 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 return {\n html: `<li${colorClass}${colorData}${colorStyle}>${childrenHtml}</li>`,\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 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 } from '../custom-types'\n\nabstract class BaseMenu implements IButtonMenu {\n readonly type = 'list-item'\n\n abstract readonly ordered: boolean\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 { ordered = false } = node as ListItemElement\n\n return ordered === this.ordered\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 })\n } else {\n // 否则,转换为 list-item\n Transforms.setNodes(editor, {\n type: 'list-item',\n ordered: this.ordered, // 有序/无序\n indent: 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 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 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 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","/**\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 })\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, ordered = false } = listItemElem as ListItemElement\n\n if (level > 0) {\n // 如果有兄弟节点,则判断 ordered 是否一致,不一致需要切换 ordered\n const brotherElem = getBrotherListNodeByLevel(\n editor,\n listItemElem as ListItemElement,\n level - 1,\n )\n\n if (brotherElem && brotherElem.ordered !== ordered) {\n Transforms.setNodes(newEditor, { level: level - 1, ordered: !ordered })\n } else { Transforms.setNodes(newEditor, { level: level - 1 }) }\n } else {\n // 转换为 p 元素\n Transforms.setNodes(newEditor, {\n type: 'paragraph',\n // @ts-ignore\n ordered: undefined,\n level: 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 list module entry\n * @author wangfupeng\n */\n\nimport { IModuleConf } from '@wangeditor-next/core'\n\nimport listItemToHtmlConf from './elem-to-html'\nimport { bulletedListMenuConf, numberedListMenuConf } 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],\n elemsToHtml: [listItemToHtmlConf],\n parseElemsHtml: [parseListHtmlConf, parseItemHtmlConf],\n}\n\nexport default list\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'\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\n/**\n * 有序列表:获取前缀 number\n * @param editor editor\n * @param elem listItem elem\n */\nfunction getOrderedItemNumber(editor: IDomEditor, elem: SlateElement): number {\n const { type, level = 0, ordered = false } = elem as ListItemElement\n\n let num = 1 // 默认值 1\n let curElem = elem\n let curPath = DomEditor.findPath(editor, curElem)\n\n // 第一个元素,直接返回 1\n if (curPath[0] === 0) { return 1 }\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 一样,如果 ordered 不一样,则退出循环,不再累加 num\n if (prevOrdered !== ordered) { break } else {\n // level 一样,order 一样,则累加 num\n num += 1\n }\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\n prefix = `${orderedNumber}.`\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 parse elem html\n * @author wangfupeng\n */\n\nimport { IDomEditor } from '@wangeditor-next/core'\nimport { Dom7Array } from 'dom7'\nimport { Descendant, Text } from 'slate'\n\nimport $, { DOMElement, getTagName } from '../utils/dom'\nimport { ListItemElement } 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\n/**\n * 获取 level\n * @param $elem list $elem\n */\nfunction getLevel($elem: Dom7Array): number {\n let level = 0\n\n let $cur: Dom7Array = $elem.parent()\n let tagName: string = getTagName($cur)\n\n while (tagName === 'ul' || tagName === 'ol') {\n $cur = $cur.parent()\n tagName = getTagName($cur)\n level += 1\n }\n\n return level - 1\n}\n\nfunction parseItemHtml(\n elem: DOMElement,\n children: Descendant[],\n editor: IDomEditor,\n): ListItemElement {\n const $elem = $(elem)\n\n children = children.filter(child => {\n if (Text.isText(child)) { return true }\n if (editor.isInline(child)) { return true }\n return false\n })\n\n // 无 children ,则用纯文本\n if (children.length === 0) {\n children = [{ text: $elem.text().replace(/\\s+/gm, ' ') }]\n }\n\n const ordered = getOrdered($elem)\n const level = getLevel($elem)\n\n return {\n type: 'list-item',\n ordered,\n level,\n // @ts-ignore\n children,\n }\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","ELEM_TO_EDITOR","WeakMap","getListItemColor","elem","firstTextNode","children","length","i","child","Text","isText","color","getBrotherListNodeByLevel","editor","level","type","otherProps","elemLevel","undefined","brotherPath","DomEditor","findPath","Path","previous","brotherEntry","Editor","node","brotherElem","__read","_b","brotherLevel","getNodeType","hasSameOrderWithBrother","ordered","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","_a","getConfig","styleClassTokens","normalizedColor","hasExtraRegisteredColor","CONTAINER_TAG_STACK","listItemToHtmlConf","elemToHtml","childrenHtml","startContainerStr","endContainerStr","containerTag","startContainerTagNumber","get","_c","path","prevPath","prevEntry","prevElem","_e","_f","prevOrdered","_g","prevLevel","getStartContainerTagNumber","push","endContainerTagNumber","nextPath","nextEntry","nextElem","nextOrdered","nextLevel","getEndContainerTagNumber","tag","pop","prefixColor","textStyleMode","getTextStyleMode","colorStyle","colorClass","colorData","action","policy","getClassStylePolicy","fallback","message","reportKey","add","reportUnsupportedClassStyle","scene","Error","resolveListColorAction","html","prefix","suffix","BaseMenu","this","prototype","getListNode","getSelectedNodeByType","getValue","_editor","isActive","isDisabled","selection","getSelectedElems","some","isVoid","isBlock","includes","exec","_value","Transforms","setNodes","indent","BulletedListMenu","_super","_this","title","t","iconSvg","__extends","NumberedListMenu","bulletedListMenuConf","key","factory","numberedListMenuConf","getTagName","$elem","tagName","getTopSelectedElemsBySelection","nodes","at","match","n","append","$","fn","attr","parent","renderElems","renderElem","elemNode","set","listStyle","margin","display","alignItems","orderedNumber","num","curElem","curPath","_d","prevType","getOrderedItemNumber","s","genPreSymbol","jsx","style","contentEditable","marginRight","flex","wordBreak","editorPlugin","deleteBackward","handleTab","normalizeNode","insertBreak","newEditor","nodeEntry","checkNodeType","universal","text","unit","Range","isExpanded","listItemElem","focus","offset","isCollapsed","listItemNum","hasOtherElem","done","_h","_j","_k","unwrapNodes","menus","elemsToHtml","parseElemsHtml","selector","parseElemHtml","_elem","flat","Infinity","filter","isInline","getOrdered","$cur","getLevel"],"mappings":"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"}
|