@kaitify/core 0.0.1-beta.1 → 0.0.1-beta.2
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/package.json +1 -1
- package/examples/App.vue +0 -342
- package/examples/content.js +0 -1
- package/examples/main.ts +0 -4
- package/examples/test.html +0 -23
- package/src/css/style.less +0 -56
- package/src/css/var.less +0 -45
- package/src/extensions/Extension.ts +0 -200
- package/src/extensions/align/index.ts +0 -115
- package/src/extensions/attachment/icon.svg +0 -1
- package/src/extensions/attachment/index.ts +0 -293
- package/src/extensions/attachment/style.less +0 -25
- package/src/extensions/back-color/index.ts +0 -56
- package/src/extensions/blockquote/index.ts +0 -144
- package/src/extensions/blockquote/style.less +0 -16
- package/src/extensions/bold/index.ts +0 -77
- package/src/extensions/code/index.ts +0 -295
- package/src/extensions/code/style.less +0 -14
- package/src/extensions/code-block/hljs.less +0 -183
- package/src/extensions/code-block/hljs.ts +0 -95
- package/src/extensions/code-block/index.ts +0 -308
- package/src/extensions/code-block/style.less +0 -20
- package/src/extensions/color/index.ts +0 -56
- package/src/extensions/font-family/index.ts +0 -80
- package/src/extensions/font-size/index.ts +0 -56
- package/src/extensions/heading/index.ts +0 -164
- package/src/extensions/heading/style.less +0 -42
- package/src/extensions/history/index.ts +0 -96
- package/src/extensions/horizontal/index.ts +0 -45
- package/src/extensions/horizontal/style.less +0 -13
- package/src/extensions/image/index.ts +0 -242
- package/src/extensions/image/style.less +0 -8
- package/src/extensions/indent/index.ts +0 -98
- package/src/extensions/index.ts +0 -29
- package/src/extensions/italic/index.ts +0 -77
- package/src/extensions/line-height/index.ts +0 -113
- package/src/extensions/link/index.ts +0 -184
- package/src/extensions/link/style.less +0 -19
- package/src/extensions/list/index.ts +0 -410
- package/src/extensions/list/style.less +0 -19
- package/src/extensions/math/index.ts +0 -233
- package/src/extensions/math/style.less +0 -21
- package/src/extensions/strikethrough/index.ts +0 -78
- package/src/extensions/subscript/index.ts +0 -77
- package/src/extensions/superscript/index.ts +0 -77
- package/src/extensions/table/index.ts +0 -1148
- package/src/extensions/table/style.less +0 -71
- package/src/extensions/task/index.ts +0 -243
- package/src/extensions/task/style.less +0 -59
- package/src/extensions/text/index.ts +0 -359
- package/src/extensions/underline/index.ts +0 -78
- package/src/extensions/video/index.ts +0 -273
- package/src/extensions/video/style.less +0 -8
- package/src/index.ts +0 -9
- package/src/model/Editor.ts +0 -1963
- package/src/model/History.ts +0 -115
- package/src/model/KNode.ts +0 -677
- package/src/model/Selection.ts +0 -39
- package/src/model/config/dom-observe.ts +0 -184
- package/src/model/config/event-handler.ts +0 -237
- package/src/model/config/format-patch.ts +0 -215
- package/src/model/config/format-rules.ts +0 -218
- package/src/model/config/function.ts +0 -1018
- package/src/model/index.ts +0 -6
- package/src/tools/index.ts +0 -156
- package/src/view/index.ts +0 -46
- package/src/view/js-render/dom-patch.ts +0 -324
- package/src/view/js-render/index.ts +0 -210
- package/vite-env.d.ts +0 -2
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
import { KNode, KNodeStylesType } from '@/model'
|
|
2
|
-
import { getSelectionBlockNodes } from '@/model/config/function'
|
|
3
|
-
import { deleteProperty } from '@/tools'
|
|
4
|
-
import { Extension } from '../Extension'
|
|
5
|
-
|
|
6
|
-
declare module '../../model' {
|
|
7
|
-
interface EditorCommandsType {
|
|
8
|
-
isLineHeight?: (value: string | number) => boolean
|
|
9
|
-
setLineHeight?: (value: string | number) => Promise<void>
|
|
10
|
-
unsetLineHeight?: (value: string | number) => Promise<void>
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* 删除指定块节点及以上块节点的行高样式
|
|
16
|
-
*/
|
|
17
|
-
const clearLineHeight = (blockNode: KNode, value: string | number) => {
|
|
18
|
-
const matchNode = blockNode.getMatchNode({ styles: { lineHeight: value } })
|
|
19
|
-
if (matchNode) {
|
|
20
|
-
matchNode.styles = deleteProperty(matchNode.styles!, 'lineHeight')
|
|
21
|
-
clearLineHeight(matchNode, value)
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export const LineHeightExtension = () =>
|
|
26
|
-
Extension.create({
|
|
27
|
-
name: 'lineHeight',
|
|
28
|
-
pasteKeepStyles(node) {
|
|
29
|
-
const styles: KNodeStylesType = {}
|
|
30
|
-
if (node.isBlock() && node.hasStyles()) {
|
|
31
|
-
if (node.styles!.hasOwnProperty('lineHeight')) styles.lineHeight = node.styles!.lineHeight
|
|
32
|
-
}
|
|
33
|
-
return styles
|
|
34
|
-
},
|
|
35
|
-
addCommands() {
|
|
36
|
-
/**
|
|
37
|
-
* 光标所在的块节点是否都是符合的行高
|
|
38
|
-
*/
|
|
39
|
-
const isLineHeight = (value: string | number) => {
|
|
40
|
-
if (!this.selection.focused()) {
|
|
41
|
-
return false
|
|
42
|
-
}
|
|
43
|
-
//起点和终点在一起
|
|
44
|
-
if (this.selection.collapsed()) {
|
|
45
|
-
const block = this.selection.start!.node.getBlock()
|
|
46
|
-
return !!block.getMatchNode({ styles: { lineHeight: value } })
|
|
47
|
-
}
|
|
48
|
-
//起点和终点不在一起
|
|
49
|
-
const blockNodes = getSelectionBlockNodes.apply(this)
|
|
50
|
-
return blockNodes.every(item => {
|
|
51
|
-
return !!item.getMatchNode({ styles: { lineHeight: value } })
|
|
52
|
-
})
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* 设置行高
|
|
57
|
-
*/
|
|
58
|
-
const setLineHeight = async (value: string | number) => {
|
|
59
|
-
if (isLineHeight(value)) {
|
|
60
|
-
return
|
|
61
|
-
}
|
|
62
|
-
//起点和终点在一起
|
|
63
|
-
if (this.selection.collapsed()) {
|
|
64
|
-
const blockNode = this.selection.start!.node.getBlock()
|
|
65
|
-
const styles: KNodeStylesType = blockNode.hasStyles() ? blockNode.styles! : {}
|
|
66
|
-
blockNode.styles = {
|
|
67
|
-
...styles,
|
|
68
|
-
lineHeight: value
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
//起点和终点不在一起
|
|
72
|
-
else {
|
|
73
|
-
const blockNodes = getSelectionBlockNodes.apply(this)
|
|
74
|
-
blockNodes.forEach(item => {
|
|
75
|
-
const styles: KNodeStylesType = item.hasStyles() ? item.styles! : {}
|
|
76
|
-
item.styles = {
|
|
77
|
-
...styles,
|
|
78
|
-
lineHeight: value
|
|
79
|
-
}
|
|
80
|
-
})
|
|
81
|
-
}
|
|
82
|
-
await this.updateView()
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* 取消行高
|
|
87
|
-
*/
|
|
88
|
-
const unsetLineHeight = async (value: string | number) => {
|
|
89
|
-
if (!isLineHeight(value)) {
|
|
90
|
-
return
|
|
91
|
-
}
|
|
92
|
-
//起点和终点在一起
|
|
93
|
-
if (this.selection.collapsed()) {
|
|
94
|
-
const blockNode = this.selection.start!.node.getBlock()
|
|
95
|
-
clearLineHeight(blockNode, value)
|
|
96
|
-
}
|
|
97
|
-
//起点和终点不在一起
|
|
98
|
-
else {
|
|
99
|
-
const blockNodes = getSelectionBlockNodes.apply(this)
|
|
100
|
-
blockNodes.forEach(item => {
|
|
101
|
-
clearLineHeight(item, value)
|
|
102
|
-
})
|
|
103
|
-
}
|
|
104
|
-
await this.updateView()
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
return {
|
|
108
|
-
isLineHeight,
|
|
109
|
-
setLineHeight,
|
|
110
|
-
unsetLineHeight
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
})
|
|
@@ -1,184 +0,0 @@
|
|
|
1
|
-
import { KNode, KNodeMarksType } from '@/model'
|
|
2
|
-
import { splitNodeToNodes } from '@/model/config/function'
|
|
3
|
-
import { Extension } from '../Extension'
|
|
4
|
-
import './style.less'
|
|
5
|
-
import { deleteProperty } from '@/tools'
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* 插入链接方法入参类型
|
|
9
|
-
*/
|
|
10
|
-
export type SetLinkOptionType = {
|
|
11
|
-
href: string
|
|
12
|
-
text?: string
|
|
13
|
-
newOpen?: boolean
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* 更新链接方法入参类型
|
|
18
|
-
*/
|
|
19
|
-
export type UpdateLinkOptionType = {
|
|
20
|
-
href?: string
|
|
21
|
-
newOpen?: boolean
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
declare module '../../model' {
|
|
25
|
-
interface EditorCommandsType {
|
|
26
|
-
getLink?: () => KNode | null
|
|
27
|
-
hasLink?: () => boolean
|
|
28
|
-
setLink?: (options: SetLinkOptionType) => Promise<void>
|
|
29
|
-
updateLink?: (options: UpdateLinkOptionType) => Promise<void>
|
|
30
|
-
unsetLink?: () => Promise<void>
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export const LinkExtension = () =>
|
|
35
|
-
Extension.create({
|
|
36
|
-
name: 'link',
|
|
37
|
-
extraKeepTags: ['a'],
|
|
38
|
-
domParseNodeCallback(node) {
|
|
39
|
-
if (node.isMatch({ tag: 'a' })) {
|
|
40
|
-
node.type = 'inline'
|
|
41
|
-
}
|
|
42
|
-
return node
|
|
43
|
-
},
|
|
44
|
-
pasteKeepMarks(node) {
|
|
45
|
-
const marks: KNodeMarksType = {}
|
|
46
|
-
if (node.isMatch({ tag: 'a' }) && node.hasMarks()) {
|
|
47
|
-
if (node.marks!.hasOwnProperty('href')) marks['href'] = node.marks!['href']
|
|
48
|
-
if (node.marks!.hasOwnProperty('target')) marks['target'] = node.marks!['target']
|
|
49
|
-
}
|
|
50
|
-
return marks
|
|
51
|
-
},
|
|
52
|
-
formatRules: [
|
|
53
|
-
({ editor, node }) => {
|
|
54
|
-
//链接只能是行内节点且只能有文本节点和闭合节点
|
|
55
|
-
if (node.isMatch({ tag: 'a' }) && node.hasChildren()) {
|
|
56
|
-
node.type = 'inline'
|
|
57
|
-
node.children!.forEach(item => {
|
|
58
|
-
splitNodeToNodes.apply(editor, [item])
|
|
59
|
-
})
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
],
|
|
63
|
-
addCommands() {
|
|
64
|
-
/**
|
|
65
|
-
* 获取光标所在的链接,如果光标不在一个链接内,返回null
|
|
66
|
-
*/
|
|
67
|
-
const getLink = () => {
|
|
68
|
-
return this.getMatchNodeBySelection({ tag: 'a' })
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* 判断光标范围内是否有链接
|
|
73
|
-
*/
|
|
74
|
-
const hasLink = () => {
|
|
75
|
-
return this.isSelectionNodesSomeMatch({
|
|
76
|
-
tag: 'a'
|
|
77
|
-
})
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* 设置连接
|
|
82
|
-
*/
|
|
83
|
-
const setLink = async (options: SetLinkOptionType) => {
|
|
84
|
-
if (!this.selection.focused() || hasLink()) {
|
|
85
|
-
return
|
|
86
|
-
}
|
|
87
|
-
if (!options.href) {
|
|
88
|
-
return
|
|
89
|
-
}
|
|
90
|
-
//起点和终点在一起
|
|
91
|
-
if (this.selection.collapsed()) {
|
|
92
|
-
if (!options.text) {
|
|
93
|
-
return
|
|
94
|
-
}
|
|
95
|
-
const marks: KNodeMarksType = {
|
|
96
|
-
href: options.href
|
|
97
|
-
}
|
|
98
|
-
if (options.newOpen) {
|
|
99
|
-
marks.target = '_blank'
|
|
100
|
-
}
|
|
101
|
-
const linkNode = KNode.create({
|
|
102
|
-
type: 'inline',
|
|
103
|
-
tag: 'a',
|
|
104
|
-
marks,
|
|
105
|
-
children: [
|
|
106
|
-
{
|
|
107
|
-
type: 'text',
|
|
108
|
-
textContent: options.text
|
|
109
|
-
}
|
|
110
|
-
]
|
|
111
|
-
})
|
|
112
|
-
this.insertNode(linkNode)
|
|
113
|
-
}
|
|
114
|
-
//起点和终点不在一起
|
|
115
|
-
else {
|
|
116
|
-
const marks: KNodeMarksType = {
|
|
117
|
-
href: options.href
|
|
118
|
-
}
|
|
119
|
-
if (options.newOpen) {
|
|
120
|
-
marks.target = '_blank'
|
|
121
|
-
}
|
|
122
|
-
const linkNode = KNode.create({
|
|
123
|
-
type: 'inline',
|
|
124
|
-
tag: 'a',
|
|
125
|
-
marks,
|
|
126
|
-
children: []
|
|
127
|
-
})
|
|
128
|
-
this.getFocusSplitNodesBySelection('all').forEach((item, index) => {
|
|
129
|
-
const newNode = item.clone(true)
|
|
130
|
-
this.addNode(newNode, linkNode, index)
|
|
131
|
-
})
|
|
132
|
-
this.insertNode(linkNode)
|
|
133
|
-
}
|
|
134
|
-
await this.updateView()
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
/**
|
|
138
|
-
* 更新链接
|
|
139
|
-
*/
|
|
140
|
-
const updateLink = async (options: UpdateLinkOptionType) => {
|
|
141
|
-
if (!this.selection.focused()) {
|
|
142
|
-
return
|
|
143
|
-
}
|
|
144
|
-
if (!options.href && typeof options.newOpen != 'boolean') {
|
|
145
|
-
return
|
|
146
|
-
}
|
|
147
|
-
const linkNode = getLink()
|
|
148
|
-
if (!linkNode) {
|
|
149
|
-
return
|
|
150
|
-
}
|
|
151
|
-
if (options.href) {
|
|
152
|
-
linkNode.marks!.href = options.href
|
|
153
|
-
}
|
|
154
|
-
if (typeof options.newOpen == 'boolean') {
|
|
155
|
-
if (options.newOpen) {
|
|
156
|
-
linkNode.marks!.target = '_blank'
|
|
157
|
-
} else {
|
|
158
|
-
linkNode.marks = deleteProperty(linkNode.marks!, 'target')
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
await this.updateView()
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* 取消链接
|
|
166
|
-
*/
|
|
167
|
-
const unsetLink = async () => {
|
|
168
|
-
if (!this.selection.focused()) {
|
|
169
|
-
return
|
|
170
|
-
}
|
|
171
|
-
const linkNode = getLink()
|
|
172
|
-
if (!linkNode) {
|
|
173
|
-
return
|
|
174
|
-
}
|
|
175
|
-
linkNode.children!.forEach(item => {
|
|
176
|
-
this.addNodeBefore(item, linkNode)
|
|
177
|
-
})
|
|
178
|
-
linkNode.children = []
|
|
179
|
-
await this.updateView()
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
return { getLink, hasLink, setLink, updateLink, unsetLink }
|
|
183
|
-
}
|
|
184
|
-
})
|