@kaitify/core 0.0.1-beta.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.
Files changed (119) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +3 -0
  3. package/examples/App.vue +342 -0
  4. package/examples/content.js +1 -0
  5. package/examples/main.ts +4 -0
  6. package/examples/test.html +23 -0
  7. package/lib/extensions/Extension.d.ts +172 -0
  8. package/lib/extensions/align/index.d.ts +10 -0
  9. package/lib/extensions/attachment/index.d.ts +29 -0
  10. package/lib/extensions/back-color/index.d.ts +9 -0
  11. package/lib/extensions/blockquote/index.d.ts +12 -0
  12. package/lib/extensions/bold/index.d.ts +9 -0
  13. package/lib/extensions/code/index.d.ts +12 -0
  14. package/lib/extensions/code-block/hljs.d.ts +12 -0
  15. package/lib/extensions/code-block/index.d.ts +15 -0
  16. package/lib/extensions/color/index.d.ts +9 -0
  17. package/lib/extensions/font-family/index.d.ts +9 -0
  18. package/lib/extensions/font-size/index.d.ts +9 -0
  19. package/lib/extensions/heading/index.d.ts +13 -0
  20. package/lib/extensions/history/index.d.ts +10 -0
  21. package/lib/extensions/horizontal/index.d.ts +7 -0
  22. package/lib/extensions/image/index.d.ts +26 -0
  23. package/lib/extensions/indent/index.d.ts +8 -0
  24. package/lib/extensions/index.d.ts +29 -0
  25. package/lib/extensions/italic/index.d.ts +9 -0
  26. package/lib/extensions/line-height/index.d.ts +9 -0
  27. package/lib/extensions/link/index.d.ts +27 -0
  28. package/lib/extensions/list/index.d.ts +18 -0
  29. package/lib/extensions/math/index.d.ts +11 -0
  30. package/lib/extensions/strikethrough/index.d.ts +9 -0
  31. package/lib/extensions/subscript/index.d.ts +9 -0
  32. package/lib/extensions/superscript/index.d.ts +9 -0
  33. package/lib/extensions/table/index.d.ts +21 -0
  34. package/lib/extensions/task/index.d.ts +12 -0
  35. package/lib/extensions/text/index.d.ts +14 -0
  36. package/lib/extensions/underline/index.d.ts +9 -0
  37. package/lib/extensions/video/index.d.ts +27 -0
  38. package/lib/index.d.ts +3 -0
  39. package/lib/kaitify-core.es.js +38337 -0
  40. package/lib/kaitify-core.umd.js +2 -0
  41. package/lib/model/Editor.d.ts +504 -0
  42. package/lib/model/History.d.ts +42 -0
  43. package/lib/model/KNode.d.ts +258 -0
  44. package/lib/model/Selection.d.ts +29 -0
  45. package/lib/model/config/dom-observe.d.ts +10 -0
  46. package/lib/model/config/event-handler.d.ts +33 -0
  47. package/lib/model/config/format-patch.d.ts +25 -0
  48. package/lib/model/config/format-rules.d.ts +37 -0
  49. package/lib/model/config/function.d.ts +84 -0
  50. package/lib/model/index.d.ts +6 -0
  51. package/lib/tools/index.d.ts +49 -0
  52. package/lib/view/index.d.ts +21 -0
  53. package/lib/view/js-render/dom-patch.d.ts +65 -0
  54. package/lib/view/js-render/index.d.ts +5 -0
  55. package/package.json +52 -0
  56. package/src/css/style.less +56 -0
  57. package/src/css/var.less +45 -0
  58. package/src/extensions/Extension.ts +200 -0
  59. package/src/extensions/align/index.ts +115 -0
  60. package/src/extensions/attachment/icon.svg +1 -0
  61. package/src/extensions/attachment/index.ts +293 -0
  62. package/src/extensions/attachment/style.less +25 -0
  63. package/src/extensions/back-color/index.ts +56 -0
  64. package/src/extensions/blockquote/index.ts +144 -0
  65. package/src/extensions/blockquote/style.less +16 -0
  66. package/src/extensions/bold/index.ts +77 -0
  67. package/src/extensions/code/index.ts +295 -0
  68. package/src/extensions/code/style.less +14 -0
  69. package/src/extensions/code-block/hljs.less +183 -0
  70. package/src/extensions/code-block/hljs.ts +95 -0
  71. package/src/extensions/code-block/index.ts +308 -0
  72. package/src/extensions/code-block/style.less +20 -0
  73. package/src/extensions/color/index.ts +56 -0
  74. package/src/extensions/font-family/index.ts +80 -0
  75. package/src/extensions/font-size/index.ts +56 -0
  76. package/src/extensions/heading/index.ts +164 -0
  77. package/src/extensions/heading/style.less +42 -0
  78. package/src/extensions/history/index.ts +96 -0
  79. package/src/extensions/horizontal/index.ts +45 -0
  80. package/src/extensions/horizontal/style.less +13 -0
  81. package/src/extensions/image/index.ts +242 -0
  82. package/src/extensions/image/style.less +8 -0
  83. package/src/extensions/indent/index.ts +98 -0
  84. package/src/extensions/index.ts +29 -0
  85. package/src/extensions/italic/index.ts +77 -0
  86. package/src/extensions/line-height/index.ts +113 -0
  87. package/src/extensions/link/index.ts +184 -0
  88. package/src/extensions/link/style.less +19 -0
  89. package/src/extensions/list/index.ts +410 -0
  90. package/src/extensions/list/style.less +19 -0
  91. package/src/extensions/math/index.ts +233 -0
  92. package/src/extensions/math/style.less +21 -0
  93. package/src/extensions/strikethrough/index.ts +78 -0
  94. package/src/extensions/subscript/index.ts +77 -0
  95. package/src/extensions/superscript/index.ts +77 -0
  96. package/src/extensions/table/index.ts +1148 -0
  97. package/src/extensions/table/style.less +71 -0
  98. package/src/extensions/task/index.ts +243 -0
  99. package/src/extensions/task/style.less +59 -0
  100. package/src/extensions/text/index.ts +359 -0
  101. package/src/extensions/underline/index.ts +78 -0
  102. package/src/extensions/video/index.ts +273 -0
  103. package/src/extensions/video/style.less +8 -0
  104. package/src/index.ts +9 -0
  105. package/src/model/Editor.ts +1963 -0
  106. package/src/model/History.ts +115 -0
  107. package/src/model/KNode.ts +677 -0
  108. package/src/model/Selection.ts +39 -0
  109. package/src/model/config/dom-observe.ts +184 -0
  110. package/src/model/config/event-handler.ts +237 -0
  111. package/src/model/config/format-patch.ts +215 -0
  112. package/src/model/config/format-rules.ts +218 -0
  113. package/src/model/config/function.ts +1018 -0
  114. package/src/model/index.ts +6 -0
  115. package/src/tools/index.ts +156 -0
  116. package/src/view/index.ts +46 -0
  117. package/src/view/js-render/dom-patch.ts +324 -0
  118. package/src/view/js-render/index.ts +210 -0
  119. package/vite-env.d.ts +2 -0
@@ -0,0 +1,258 @@
1
+ import * as CSS from 'csstype';
2
+ /**
3
+ * 节点类型
4
+ */
5
+ export type KNodeType = 'text' | 'closed' | 'inline' | 'block';
6
+ /**
7
+ * 标记集合类型
8
+ */
9
+ export type KNodeMarksType = {
10
+ [mark: string]: string | number;
11
+ };
12
+ /**
13
+ * 样式集合类型
14
+ */
15
+ export type KNodeStylesType = CSS.Properties<string | number> & {
16
+ [style: string]: string | number;
17
+ };
18
+ /**
19
+ * 节点匹配入参类型
20
+ */
21
+ export type KNodeMatchOptionType = {
22
+ tag?: string;
23
+ marks?: KNodeMarksType | {
24
+ [mark: string]: boolean;
25
+ };
26
+ styles?: KNodeStylesType | {
27
+ [style: string]: boolean;
28
+ };
29
+ };
30
+ /**
31
+ * 创建节点的入参类型
32
+ */
33
+ export type KNodeCreateOptionType = {
34
+ type: KNodeType;
35
+ tag?: string;
36
+ marks?: KNodeMarksType;
37
+ styles?: KNodeStylesType;
38
+ namespace?: string;
39
+ textContent?: string;
40
+ locked?: boolean;
41
+ fixed?: boolean;
42
+ nested?: boolean;
43
+ void?: boolean;
44
+ children?: KNodeCreateOptionType[];
45
+ };
46
+ /**
47
+ * 创建零宽度无断空白文本节点的入参类型
48
+ */
49
+ export type ZeroWidthTextKNodeCreateOptionType = {
50
+ marks?: KNodeMarksType;
51
+ styles?: KNodeStylesType;
52
+ namespace?: string;
53
+ locked?: boolean;
54
+ };
55
+ /**
56
+ * 基本节点
57
+ */
58
+ export declare class KNode {
59
+ /**
60
+ * 唯一key【不可修改】
61
+ */
62
+ key: number;
63
+ /**
64
+ * 类型【可以修改】
65
+ */
66
+ type?: KNodeType;
67
+ /**
68
+ * 渲染标签【可以修改】
69
+ */
70
+ tag?: string;
71
+ /**
72
+ * 文本值【可以修改】
73
+ */
74
+ textContent?: string;
75
+ /**
76
+ * 标记集合【可以修改】
77
+ */
78
+ marks?: KNodeMarksType;
79
+ /**
80
+ * 样式集合,样式名称请使用驼峰写法,虽然在渲染时兼容处理了中划线格式的样式名称,但是在其他地方可能会出现问题并且编辑器内部在样式相关的判断都是以驼峰写法为主【可以修改】
81
+ */
82
+ styles?: KNodeStylesType;
83
+ /**
84
+ * 是否锁定节点【可以修改】:
85
+ * 针对块节点,在符合合并条件的情况下是否允许编辑器将其与父节点或者子节点进行合并;
86
+ * 针对行内节点,在符合合并条件的情况下是否允许编辑器将其与相邻节点或者父节点或者子节点进行合并;
87
+ * 针对文本节点,在符合合并的条件下是否允许编辑器将其与相邻节点或者父节点进行合并。
88
+ */
89
+ locked: boolean;
90
+ /**
91
+ * 是否为固定块节点,值为true时:当光标在节点起始处或者光标在节点内只有占位符时,执行删除操作不会删除此节点,会再次创建一个占位符进行处理;当光标在节点内且节点不是代码块样式,不会进行换行【可以修改】
92
+ */
93
+ fixed: boolean;
94
+ /**
95
+ * 是否为固定格式的内嵌块节点,如li、tr、td等【可以修改】
96
+ */
97
+ nested: boolean;
98
+ /**
99
+ * 是否为不可见节点,意味着此类节点在编辑器内视图内无法看到
100
+ */
101
+ void?: boolean;
102
+ /**
103
+ * 命名空间【可以修改】
104
+ */
105
+ namespace?: string;
106
+ /**
107
+ * 子节点数组【可以修改】
108
+ */
109
+ children?: KNode[];
110
+ /**
111
+ * 父节点【可以修改】
112
+ */
113
+ parent?: KNode;
114
+ /**
115
+ * 【API】是否块节点
116
+ */
117
+ isBlock(): boolean;
118
+ /**
119
+ * 【API】是否行内节点
120
+ */
121
+ isInline(): boolean;
122
+ /**
123
+ * 【API】是否闭合节点
124
+ */
125
+ isClosed(): boolean;
126
+ /**
127
+ * 【API】是否文本节点
128
+ */
129
+ isText(): boolean;
130
+ /**
131
+ * 【API】获取所在的根级块节点
132
+ */
133
+ getRootBlock(): KNode;
134
+ /**
135
+ * 【API】获取所在块级节点
136
+ */
137
+ getBlock(): KNode;
138
+ /**
139
+ * 【API】获取所在行内节点
140
+ */
141
+ getInline(): KNode | null;
142
+ /**
143
+ * 【API】是否有子节点
144
+ */
145
+ hasChildren(): boolean;
146
+ /**
147
+ * 【API】是否空节点
148
+ */
149
+ isEmpty(): boolean;
150
+ /**
151
+ * 【API】是否零宽度无断空白文本节点
152
+ */
153
+ isZeroWidthText(): boolean;
154
+ /**
155
+ * 【API】是否占位符
156
+ */
157
+ isPlaceholder(): boolean;
158
+ /**
159
+ * 【API】是否含有标记
160
+ */
161
+ hasMarks(): boolean;
162
+ /**
163
+ * 【API】是否含有样式
164
+ */
165
+ hasStyles(): boolean;
166
+ /**
167
+ * 【API】判断节点是否不可编辑的,如果是返回设置不可编辑的那个节点,否则返回null
168
+ */
169
+ getUneditable(): KNode | null;
170
+ /**
171
+ * 【API】当前节点是否只包含占位符
172
+ */
173
+ allIsPlaceholder(): boolean;
174
+ /**
175
+ * 【API】设置为空节点
176
+ */
177
+ toEmpty(): void;
178
+ /**
179
+ * 【API】比较当前节点和另一个节点的styles是否一致
180
+ */
181
+ isEqualStyles(node: KNode): boolean;
182
+ /**
183
+ * 【API】比较当前节点和另一个节点的marks是否一致
184
+ */
185
+ isEqualMarks(node: KNode): boolean;
186
+ /**
187
+ * 【API】判断当前节点是否在拥有代码块样式的块级节点内(包括自身)
188
+ */
189
+ isInCodeBlockStyle(): KNode | null;
190
+ /**
191
+ * 【API】判断当前节点是否与另一个节点相同
192
+ */
193
+ isEqual(node: KNode): boolean;
194
+ /**
195
+ * 【API】判断当前节点是否包含指定节点
196
+ */
197
+ isContains(node: KNode): boolean;
198
+ /**
199
+ * 【API】复制节点,deep 为true表示深度复制,即复制子节点,否则只会复制自身
200
+ */
201
+ clone: (deep?: boolean | undefined) => KNode;
202
+ /**
203
+ * 完全复制节点,涵盖每个属性
204
+ */
205
+ fullClone(): KNode;
206
+ /**
207
+ * 【API】如果当前节点是文本节点或者闭合节点,则判断是不是指定节点后代中所有文本节点和闭合节点中的第一个
208
+ */
209
+ firstTextClosedInNode: (node: KNode) => boolean;
210
+ /**
211
+ * 【API】如果当前节点是文本节点或者闭合节点,则判断是不是指定节点后代中所有文本节点和闭合节点中的最后一个
212
+ */
213
+ lastTextClosedInNode(node: KNode): boolean;
214
+ /**
215
+ * 【API】获取当前节点在某个节点数组中的前一个非空节点
216
+ */
217
+ getPrevious(nodes: KNode[]): KNode | null;
218
+ /**
219
+ * 【API】获取当前节点在某个节点数组中的后一个非空节点
220
+ */
221
+ getNext(nodes: KNode[]): KNode | null;
222
+ /**
223
+ * 【API】判断当前节点是否符合指定的条件,marks和styles参数中的属性值可以是true表示只判断是否拥有该标记或者样式,而不关心是什么值
224
+ */
225
+ isMatch(options: KNodeMatchOptionType): boolean;
226
+ /**
227
+ * 【API】判断当前节点是否存在于符合条件的节点内,包含自身,如果是返回符合条件的节点,否则返回null
228
+ */
229
+ getMatchNode(options: KNodeMatchOptionType): KNode | null;
230
+ /**
231
+ * 【API】获取当前节点下的所有可聚焦的节点,如果自身符合也会包括在内,type是all获取闭合节点和文本节点,type是closed获取闭合节点,type是text获取文本节点
232
+ */
233
+ getFocusNodes: (type?: "all" | "closed" | "text" | undefined) => KNode[];
234
+ /**
235
+ * 【API】创建节点
236
+ */
237
+ static create(options: KNodeCreateOptionType): KNode;
238
+ /**
239
+ * 【API】创建零宽度无断空白文本节点
240
+ */
241
+ static createZeroWidthText(options?: ZeroWidthTextKNodeCreateOptionType): KNode;
242
+ /**
243
+ * 【API】创建占位符
244
+ */
245
+ static createPlaceholder(): KNode;
246
+ /**
247
+ * 【API】判断参数是否节点
248
+ */
249
+ static isKNode(val: any): boolean;
250
+ /**
251
+ * 【API】将某个节点数组扁平化处理后返回
252
+ */
253
+ static flat(nodes: KNode[]): KNode[];
254
+ /**
255
+ * 【API】在指定的节点数组中根据key查找节点
256
+ */
257
+ static searchByKey(key: string | number, nodes: KNode[]): KNode | null;
258
+ }
@@ -0,0 +1,29 @@
1
+ import { KNode } from './KNode';
2
+ /**
3
+ * 光标点位类型,node仅支持文本节点和闭合节点
4
+ */
5
+ export type SelectionPointType = {
6
+ node: KNode;
7
+ offset: number;
8
+ };
9
+ /**
10
+ * 光标选区
11
+ */
12
+ export declare class Selection {
13
+ /**
14
+ * 起点
15
+ */
16
+ start?: SelectionPointType;
17
+ /**
18
+ * 终点
19
+ */
20
+ end?: SelectionPointType;
21
+ /**
22
+ * 是否已经初始化设置光标位置
23
+ */
24
+ focused(): boolean;
25
+ /**
26
+ * 光标是否折叠
27
+ */
28
+ collapsed(): boolean;
29
+ }
@@ -0,0 +1,10 @@
1
+ import { Editor } from '../Editor';
2
+ /**
3
+ * 移除对编辑器的dom监听
4
+ */
5
+ export declare const removeDomObserve: (editor: Editor) => void;
6
+ /**
7
+ * 设置对编辑器的dom监听,主要解决非法dom插入问题
8
+ * 中文输入和updateView时不会启用dom监听
9
+ */
10
+ export declare const setDomObserve: (editor: Editor) => void;
@@ -0,0 +1,33 @@
1
+ import { Editor } from '../Editor';
2
+ /**
3
+ * 监听外部改变selection
4
+ */
5
+ export declare const onSelectionChange: (this: Editor) => Promise<void>;
6
+ /**
7
+ * 监听beforeinput
8
+ */
9
+ export declare const onBeforeInput: (this: Editor, e: Event) => Promise<void>;
10
+ /**
11
+ * 监听中文输入
12
+ */
13
+ export declare const onComposition: (this: Editor, e: Event) => Promise<void>;
14
+ /**
15
+ * 监听键盘事件
16
+ */
17
+ export declare const onKeyboard: (this: Editor, e: Event) => void;
18
+ /**
19
+ * 监听编辑器获取焦点
20
+ */
21
+ export declare const onFocus: (this: Editor, e: Event) => void;
22
+ /**
23
+ * 监听编辑器失去焦点
24
+ */
25
+ export declare const onBlur: (this: Editor, e: Event) => void;
26
+ /**
27
+ * 监听编辑器复制
28
+ */
29
+ export declare const onCopy: (this: Editor, e: Event) => void;
30
+ /**
31
+ * 监听编辑器剪切
32
+ */
33
+ export declare const onCut: (this: Editor, e: Event) => void;
@@ -0,0 +1,25 @@
1
+ import { KNode } from '../KNode';
2
+ /**
3
+ * 这里的比对结果仅进行格式化处理,只需要判断节点是否变化
4
+ */
5
+ /**
6
+ * 节点数组比对结果类型
7
+ */
8
+ export type NodePatchResultType = {
9
+ /**
10
+ * 新节点
11
+ */
12
+ newNode: KNode | null;
13
+ /**
14
+ * 旧节点
15
+ */
16
+ oldNode: KNode | null;
17
+ };
18
+ /**
19
+ * 对新旧两个节点数组进行比对
20
+ */
21
+ export declare const patchNodes: (newNodes: KNode[], oldNodes: (KNode | null)[]) => NodePatchResultType[];
22
+ /**
23
+ * 对新旧两个节点进行比对
24
+ */
25
+ export declare const patchNode: (newNode: KNode, oldNode: KNode) => NodePatchResultType[];
@@ -0,0 +1,37 @@
1
+ import { Editor } from '../Editor';
2
+ import { KNode } from '../KNode';
3
+ /**
4
+ * 格式化函数类型
5
+ */
6
+ export type RuleFunctionType = (state: {
7
+ editor: Editor;
8
+ node: KNode;
9
+ }) => void;
10
+ /**
11
+ * 针对节点自身:处理块节点的标签,部分块节点需要转为默认块节点标签
12
+ */
13
+ export declare const fomratBlockTagParse: RuleFunctionType;
14
+ /**
15
+ * 针对子节点中的块节点:行内节点的子节点中含有块节点则该节点转为块节点;子节点中的其他节点也转为块节点
16
+ */
17
+ export declare const formatBlockInChildren: RuleFunctionType;
18
+ /**
19
+ * 针对节点自身:处理不可编辑的非块级节点:在两侧添加零宽度无断空白字符 & 重置不可编辑节点内的光标位置
20
+ */
21
+ export declare const formatUneditableNoodes: RuleFunctionType;
22
+ /**
23
+ * 针对节点的子节点数组:处理子节点中的占位符,如果占位符和其他节点共存则删除占位符,如果只存在占位符则将多个占位符合并为一个(光标可能会更新)
24
+ */
25
+ export declare const formatPlaceholderMerge: RuleFunctionType;
26
+ /**
27
+ * 针对节点自身:将文本节点内连续的零宽度无断空白字符合并(光标可能会更新)
28
+ */
29
+ export declare const formatZeroWidthTextMerge: RuleFunctionType;
30
+ /**
31
+ * 针对节点的子节点数组:兄弟节点合并策略(光标可能会更新)
32
+ */
33
+ export declare const formatSiblingNodesMerge: RuleFunctionType;
34
+ /**
35
+ * 针对节点的子节点数组:父子节点合并策略(光标可能会更新)
36
+ */
37
+ export declare const formatParentNodeMerge: RuleFunctionType;
@@ -0,0 +1,84 @@
1
+ import { Extension } from '../../extensions';
2
+ import { Editor } from '../Editor';
3
+ import { KNode } from '../KNode';
4
+ import { RuleFunctionType } from './format-rules';
5
+ /**
6
+ * 获取选区内的可聚焦节点所在的块节点数组
7
+ */
8
+ export declare const getSelectionBlockNodes: (this: Editor) => KNode[];
9
+ /**
10
+ * 打散指定的节点,将其分裂成多个节点,如果子孙节点还有子节点则继续打散
11
+ */
12
+ export declare const splitNodeToNodes: (this: Editor, node: KNode) => void;
13
+ /**
14
+ * 清空固定块节点的内容
15
+ */
16
+ export declare const emptyFixedBlock: (this: Editor, node: KNode) => void;
17
+ /**
18
+ * 该方法目前只为delete方法内部使用:将后一个块节点与前一个块节点合并
19
+ */
20
+ export declare const mergeBlock: (this: Editor, node: KNode, target: KNode) => void;
21
+ /**
22
+ * 判断编辑器内的指定节点是否可以进行合并操作,parent表示和父节点进行合并,prevSibling表示和前一个兄弟节点进行合并,nextSibling表示和下一个兄弟节点合并,如果可以返回合并的对象节点
23
+ */
24
+ export declare const getAllowMergeNode: (this: Editor, node: KNode, type: "parent" | "prevSibling" | "nextSibling") => KNode | null;
25
+ /**
26
+ * 对编辑器内的某个节点执行合并操作,parent表示和父节点进行合并,prevSibling表示和前一个兄弟节点进行合并,nextSibling表示和下一个兄弟节点合并(可能会更新光标)
27
+ */
28
+ export declare const applyMergeNode: (this: Editor, node: KNode, type: "parent" | "prevSibling" | "nextSibling") => void;
29
+ /**
30
+ * 将编辑器内的某个非块级节点转为默认块级节点
31
+ */
32
+ export declare const convertToBlock: (this: Editor, node: KNode) => void;
33
+ /**
34
+ * 对节点数组使用指定规则进行格式化,nodes是需要格式化的节点数组,sourceNodes是格式化的节点所在的源数组
35
+ */
36
+ export declare const formatNodes: (this: Editor, rule: RuleFunctionType, nodes: KNode[], sourceNodes: KNode[]) => void;
37
+ /**
38
+ * 注册扩展
39
+ */
40
+ export declare const registerExtension: (this: Editor, extension: Extension) => void;
41
+ /**
42
+ * 根据真实光标更新selection,返回布尔值表示是否更新成功
43
+ */
44
+ export declare const updateSelection: (this: Editor) => boolean;
45
+ /**
46
+ * 纠正光标位置,返回布尔值表示是否存在纠正行为
47
+ */
48
+ export declare const redressSelection: (this: Editor) => boolean;
49
+ /**
50
+ * 初始化校验编辑器的节点数组,如果编辑器的节点数组为空或者都是空节点,则初始化创建一个只有占位符的段落
51
+ */
52
+ export declare const checkNodes: (this: Editor) => void;
53
+ /**
54
+ * 粘贴时对节点的标记和样式的保留处理
55
+ */
56
+ export declare const handlerForPasteKeepMarksAndStyles: (this: Editor, nodes: KNode[]) => void;
57
+ /**
58
+ * 粘贴时对文件的处理
59
+ */
60
+ export declare const handlerForPasteFiles: (this: Editor, files: FileList) => Promise<void>;
61
+ /**
62
+ * 处理某个节点数组,针对为空的块级节点补充占位符
63
+ */
64
+ export declare const fillPlaceholderToEmptyBlock: (this: Editor, nodes: KNode[]) => void;
65
+ /**
66
+ * 粘贴处理
67
+ */
68
+ export declare const handlerForPasteDrop: (this: Editor, dataTransfer: DataTransfer) => Promise<void>;
69
+ /**
70
+ * 将指定的非固定块节点从父节点(非固定块节点)中抽离,插入到和父节点同级的位置
71
+ */
72
+ export declare const removeBlockFromParentToSameLevel: (this: Editor, node: KNode) => void;
73
+ /**
74
+ * 光标所在的块节点不是只有占位,且非固定块节点,非代码块样式的块节点,在该块节点内正常换行方法
75
+ */
76
+ export declare const handlerForNormalInsertParagraph: (this: Editor) => void;
77
+ /**
78
+ * 设置placeholder,在每次视图更新时调用此方法
79
+ */
80
+ export declare const setPlaceholder: (this: Editor) => void;
81
+ /**
82
+ * 合并扩展数组(只能用在扩展注册之前)
83
+ */
84
+ export declare const mergeExtensions: (this: Editor, from: Extension[]) => Extension[];
@@ -0,0 +1,6 @@
1
+ export type * from './config/format-patch';
2
+ export type * from './config/format-rules';
3
+ export * from './Editor';
4
+ export * from './History';
5
+ export * from './KNode';
6
+ export * from './Selection';
@@ -0,0 +1,49 @@
1
+ import { KNodeMarksType, KNodeStylesType } from '../model';
2
+ /**
3
+ * 用于KNode生成唯一的key
4
+ */
5
+ export declare const createUniqueKey: () => number;
6
+ /**
7
+ * 用于编辑器生成唯一的guid
8
+ */
9
+ export declare const createGuid: () => number;
10
+ /**
11
+ * 判断字符串是否零宽度无断空白字符
12
+ */
13
+ export declare const isZeroWidthText: (val: string) => boolean;
14
+ /**
15
+ * 获取一个零宽度无断空白字符
16
+ */
17
+ export declare const getZeroWidthText: () => string;
18
+ /**
19
+ * 驼峰转中划线
20
+ */
21
+ export declare const camelToKebab: (val: string) => string;
22
+ /**
23
+ * 中划线转驼峰
24
+ */
25
+ export declare const kebabToCamel: (val: string) => string;
26
+ /**
27
+ * 获取dom元素的属性集合
28
+ */
29
+ export declare const getDomAttributes: (dom: HTMLElement) => KNodeMarksType;
30
+ /**
31
+ * 获取dom元素的样式集合
32
+ */
33
+ export declare const getDomStyles: (dom: HTMLElement) => KNodeStylesType;
34
+ /**
35
+ * 初始化编辑器dom
36
+ */
37
+ export declare const initEditorDom: (dom: HTMLElement | string) => HTMLElement;
38
+ /**
39
+ * 判断某个dom是否包含另一个dom
40
+ */
41
+ export declare const isContains: (parent: Node, child: Node) => boolean;
42
+ /**
43
+ * 延迟指定时间
44
+ */
45
+ export declare const delay: (num?: number | undefined) => Promise<void>;
46
+ /**
47
+ * 删除对象的某个属性
48
+ */
49
+ export declare const deleteProperty: <T>(val: any, propertyName: string) => T;
@@ -0,0 +1,21 @@
1
+ import { Editor, KNode, KNodeMarksType, KNodeStylesType } from '../model';
2
+ /**
3
+ * 渲染参数类型
4
+ */
5
+ export type KNodeRenderOptionType = {
6
+ key: number;
7
+ tag: string;
8
+ attrs: KNodeMarksType;
9
+ styles: KNodeStylesType;
10
+ namespace?: string;
11
+ textContent?: string;
12
+ children?: KNodeRenderOptionType[];
13
+ };
14
+ /**
15
+ * 节点渲染成dom后在dom上生成的一个特殊标记名称,它的值是节点的key值
16
+ */
17
+ export declare const NODE_MARK = "kaitify-node";
18
+ /**
19
+ * 获取节点的渲染参数
20
+ */
21
+ export declare const getNodeRenderOptions: (editor: Editor, node: KNode) => KNodeRenderOptionType;
@@ -0,0 +1,65 @@
1
+ import { KNode, KNodeMarksType, KNodeStylesType } from '../../model';
2
+ /**
3
+ * 节点数组比对结果类型
4
+ */
5
+ type NodePatchResultType = {
6
+ /**
7
+ * 差异类型:insert:插入节点;remove:移除节点;update:节点更新;replace:节点被替换;move:节点同级位置移动
8
+ */
9
+ type: 'insert' | 'remove' | 'update' | 'replace' | 'move';
10
+ /**
11
+ * 新节点
12
+ */
13
+ newNode: KNode | null;
14
+ /**
15
+ * 旧节点
16
+ */
17
+ oldNode: KNode | null;
18
+ /**
19
+ * 更新的字段
20
+ */
21
+ update?: 'textContent' | 'styles' | 'marks';
22
+ };
23
+ /**
24
+ * mark比对结果类型
25
+ */
26
+ export type MarkPatchResultType = {
27
+ /**
28
+ * 新增和更新的标记
29
+ */
30
+ addMarks: KNodeMarksType;
31
+ /**
32
+ * 移除的标记
33
+ */
34
+ removeMarks: KNodeMarksType;
35
+ };
36
+ /**
37
+ * style比对结果类型
38
+ */
39
+ export type StylePatchResultType = {
40
+ /**
41
+ * 新增和更新的样式
42
+ */
43
+ addStyles: KNodeStylesType;
44
+ /**
45
+ * 移除的样式
46
+ */
47
+ removeStyles: KNodeStylesType;
48
+ };
49
+ /**
50
+ * 获取两个节点上不相同的marks
51
+ */
52
+ export declare const getDifferentMarks: (newNode: KNode, oldNode: KNode) => MarkPatchResultType;
53
+ /**
54
+ * 获取两个节点上不相同的styles
55
+ */
56
+ export declare const getDifferentStyles: (newNode: KNode, oldNode: KNode) => StylePatchResultType;
57
+ /**
58
+ * 对新旧两个节点数组进行比对
59
+ */
60
+ export declare const patchNodes: (newNodes: KNode[], oldNodes: (KNode | null)[]) => NodePatchResultType[];
61
+ /**
62
+ * 对新旧两个节点进行比对
63
+ */
64
+ export declare const patchNode: (newNode: KNode, oldNode: KNode) => NodePatchResultType[];
65
+ export {};
@@ -0,0 +1,5 @@
1
+ import { Editor } from '../../model';
2
+ /**
3
+ * 默认的原生js渲染编辑器视图层
4
+ */
5
+ export declare const defaultUpdateView: (this: Editor, init: boolean) => void;
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "@kaitify/core",
3
+ "version": "0.0.1-beta.1",
4
+ "private": false,
5
+ "type": "module",
6
+ "author": "so-better",
7
+ "main": "lib/kaitify-core.umd.js",
8
+ "module": "lib/kaitify-core.es.js",
9
+ "types": "lib/index.d.ts",
10
+ "license": "MIT",
11
+ "description": "基于原生JS的富文本编辑器核心库",
12
+ "scripts": {
13
+ "dev": "vite",
14
+ "lib": "tsc && vite build",
15
+ "docs:dev": "vitepress dev docs",
16
+ "docs:build": "vitepress build docs"
17
+ },
18
+ "dependencies": {
19
+ "csstype": "^3.1.3",
20
+ "dap-util": "^1.5.8",
21
+ "highlight.js": "^11.10.0",
22
+ "interactjs": "^1.10.27",
23
+ "katex": "^0.16.11",
24
+ "vue": "^3.5.12"
25
+ },
26
+ "devDependencies": {
27
+ "@types/katex": "^0.16.7",
28
+ "@types/node": "^20.11.24",
29
+ "@vitejs/plugin-vue": "^5.0.4",
30
+ "less": "^3.0.4",
31
+ "less-loader": "^5.0.0",
32
+ "terser": "^5.16.9",
33
+ "typescript": "^5.6.3",
34
+ "vite": "^5.4.10",
35
+ "vite-plugin-css-injected-by-js": "^3.5.1",
36
+ "vite-plugin-dts": "^4.3.0",
37
+ "vitepress": "^1.5.0"
38
+ },
39
+ "browserslist": [
40
+ "> 1%",
41
+ "last 2 versions",
42
+ "not dead"
43
+ ],
44
+ "repository": {
45
+ "type": "git",
46
+ "url": "https://github.com/so-better/kaitify-core"
47
+ },
48
+ "publishConfig": {
49
+ "access": "public",
50
+ "registry": "https://registry.npmjs.org"
51
+ }
52
+ }