@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,210 @@
1
+ import { Editor, KNode } from '@/model'
2
+ import { camelToKebab, isContains } from '@/tools'
3
+ import { getNodeRenderOptions, KNodeRenderOptionType } from '../index'
4
+ import { getDifferentMarks, getDifferentStyles, patchNodes } from './dom-patch'
5
+
6
+ /**
7
+ * 封装findDom
8
+ */
9
+ const findDom = (editor: Editor, node: KNode) => {
10
+ let dom: HTMLElement | null = null
11
+ try {
12
+ dom = editor.findDom(node)
13
+ } catch (error) {
14
+ console.warn(`error: ${(error as Error).message}`)
15
+ }
16
+ return dom
17
+ }
18
+
19
+ /**
20
+ * 渲染单个节点
21
+ */
22
+ const renderNode = (editor: Editor, opts: KNodeRenderOptionType) => {
23
+ const element = opts.namespace ? (document.createElementNS(opts.namespace, opts.tag) as HTMLElement) : document.createElement(opts.tag)
24
+ //渲染文本
25
+ if (opts.textContent) {
26
+ element.textContent = opts.textContent
27
+ }
28
+ //渲染子元素
29
+ if (opts.children && opts.children.length) {
30
+ element.append(...opts.children.map(item => renderNode(editor, item)))
31
+ }
32
+ //设置属性
33
+ Object.keys(opts.attrs).forEach(attr => {
34
+ if (!/(^on)|(^style$)/g.test(attr)) {
35
+ element.setAttribute(attr, `${opts.attrs[attr]}`)
36
+ }
37
+ })
38
+ //设置样式
39
+ Object.keys(opts.styles).forEach(style => {
40
+ element.style.setProperty(camelToKebab(style), `${opts.styles[style]}`)
41
+ })
42
+ return element
43
+ }
44
+
45
+ /**
46
+ * 插入新dom
47
+ */
48
+ const insertDom = (editor: Editor, newNode: KNode) => {
49
+ //生成dom
50
+ const options = getNodeRenderOptions(editor, newNode)
51
+ const newDom = renderNode(editor, options)
52
+ //获取父节点
53
+ const parentNode = newNode.parent
54
+ //获取新dom的父元素
55
+ const parentDom = parentNode ? findDom(editor, parentNode)! : editor.$el!
56
+ //获取前一个兄弟节点
57
+ const previousNode = newNode.getPrevious(parentNode ? parentNode.children! : editor.stackNodes)
58
+ //获取前一个dom
59
+ const previousDom = previousNode ? findDom(editor, previousNode) : null
60
+ //获取后一个兄弟节点
61
+ const nextNode = newNode.getNext(parentNode ? parentNode.children! : editor.stackNodes)
62
+ //获取后一个dom
63
+ const nextDom = nextNode ? findDom(editor, nextNode) : null
64
+ //前一个dom存在则插入到前一个dom之后
65
+ if (previousDom && Array.from(parentDom.childNodes).some(item => item === previousDom)) {
66
+ previousDom.nextElementSibling ? parentDom.insertBefore(newDom, previousDom.nextElementSibling) : parentDom.appendChild(newDom)
67
+ }
68
+ //后一个dom存在则插入到后一个dom之前
69
+ else if (nextDom && Array.from(parentDom.childNodes).some(item => item === nextDom)) {
70
+ parentDom.insertBefore(newDom, nextDom)
71
+ }
72
+ //其他情况
73
+ else {
74
+ //获取节点在父节点内的位置
75
+ const idx = (parentNode ? parentNode.children! : editor.stackNodes).findIndex(item => item.isEqual(newNode))
76
+ const currentDom = parentDom.childNodes[idx]
77
+ currentDom ? parentDom.insertBefore(newDom, currentDom) : parentDom.appendChild(newDom)
78
+ }
79
+ }
80
+
81
+ /**
82
+ * 移除旧dom
83
+ */
84
+ const removeDom = (editor: Editor, oldNode: KNode) => {
85
+ const oldDom = findDom(editor, oldNode)
86
+ oldDom && oldDom.remove()
87
+ }
88
+
89
+ /**
90
+ * 移动dom
91
+ */
92
+ const moveDom = (editor: Editor, node: KNode) => {
93
+ //需要移动的dom
94
+ const dom = findDom(editor, node)!
95
+ //获取父节点
96
+ const parentNode = node.parent
97
+ //获取新dom的父元素
98
+ const parentDom = parentNode ? findDom(editor, parentNode)! : editor.$el!
99
+ //获取前一个兄弟节点
100
+ const previousNode = node.getPrevious(parentNode ? parentNode.children! : editor.stackNodes)
101
+ //获取前一个dom
102
+ const previousDom = previousNode ? findDom(editor, previousNode) : null
103
+ //获取后一个兄弟节点
104
+ const nextNode = node.getNext(parentNode ? parentNode.children! : editor.stackNodes)
105
+ //获取后一个dom
106
+ const nextDom = nextNode ? findDom(editor, nextNode) : null
107
+ //前一个dom存在则插入到前一个dom之后
108
+ if (previousDom && isContains(parentDom, previousDom)) {
109
+ previousDom.nextElementSibling ? parentDom.insertBefore(dom, previousDom.nextElementSibling) : parentDom.appendChild(dom)
110
+ }
111
+ //后一个dom存在则插入到后一个dom之前
112
+ else if (nextDom && isContains(parentDom, nextDom)) {
113
+ parentDom.insertBefore(dom, nextDom)
114
+ }
115
+ //其他情况
116
+ else {
117
+ //获取节点在父节点内的位置
118
+ const idx = (parentNode ? parentNode.children! : editor.stackNodes).findIndex(item => item.isEqual(node))
119
+ const currentDom = parentDom.childNodes[idx]
120
+ currentDom ? parentDom.insertBefore(dom, currentDom) : parentDom.appendChild(dom)
121
+ }
122
+ }
123
+
124
+ /**
125
+ * 替换dom
126
+ */
127
+ const replaceDom = (editor: Editor, newNode: KNode, oldNode: KNode) => {
128
+ //旧节点对应的dom
129
+ const oldDom = findDom(editor, oldNode)!
130
+ //插入新节点
131
+ insertDom(editor, newNode)
132
+ //移除旧dom
133
+ oldDom && oldDom.remove()
134
+ }
135
+
136
+ /**
137
+ * 默认的原生js渲染编辑器视图层
138
+ */
139
+ export const defaultUpdateView = function (this: Editor, init: boolean) {
140
+ if (!this.$el) {
141
+ return
142
+ }
143
+ //第一次视图渲染
144
+ if (init) {
145
+ //创建fragment
146
+ const fragment = document.createDocumentFragment()
147
+ //生成新的dom
148
+ this.stackNodes.forEach(node => {
149
+ const options = getNodeRenderOptions(this, node)
150
+ const element = renderNode(this, options)
151
+ fragment.appendChild(element)
152
+ })
153
+ //清空内容
154
+ this.$el.innerHTML = ''
155
+ //渲染内容
156
+ this.$el.appendChild(fragment)
157
+ }
158
+ //动态视图更新
159
+ else {
160
+ //进行比对
161
+ patchNodes(this.stackNodes, this.oldStackNodes).forEach(item => {
162
+ //插入dom
163
+ if (item.type == 'insert') {
164
+ insertDom(this, item.newNode!)
165
+ }
166
+ //移除dom
167
+ else if (item.type == 'remove') {
168
+ removeDom(this, item.oldNode!)
169
+ }
170
+ //替换dom
171
+ else if (item.type == 'replace') {
172
+ replaceDom(this, item.newNode!, item.oldNode!)
173
+ }
174
+ //移动dom
175
+ else if (item.type == 'move') {
176
+ moveDom(this, item.newNode!)
177
+ }
178
+ //更新dom
179
+ else if (item.type == 'update') {
180
+ const dom = findDom(this, item.newNode!)!
181
+ //更新文本
182
+ if (item.update == 'textContent') {
183
+ dom.textContent = item.newNode!.textContent || ''
184
+ }
185
+ //更新样式
186
+ else if (item.update == 'styles') {
187
+ const { addStyles, removeStyles } = getDifferentStyles(item.newNode!, item.oldNode!)
188
+ for (let key in removeStyles) {
189
+ dom.style.removeProperty(camelToKebab(key))
190
+ }
191
+ for (let key in addStyles) {
192
+ dom.style.setProperty(camelToKebab(key), `${addStyles[key]}`)
193
+ }
194
+ }
195
+ //更新属性
196
+ else if (item.update == 'marks') {
197
+ const { addMarks, removeMarks } = getDifferentMarks(item.newNode!, item.oldNode!)
198
+ for (let key in removeMarks) {
199
+ dom.removeAttribute(key)
200
+ }
201
+ for (let key in addMarks) {
202
+ if (!/(^on)|(^style$)/g.test(key)) {
203
+ dom.setAttribute(key, `${addMarks[key]}`)
204
+ }
205
+ }
206
+ }
207
+ }
208
+ })
209
+ }
210
+ }
package/vite-env.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ /// <reference types="vite/client" />
2
+ declare module '*.svg'