@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,295 @@
1
+ import { KNode } from '@/model'
2
+ import { splitNodeToNodes } from '@/model/config/function'
3
+ import { Extension } from '../Extension'
4
+ import './style.less'
5
+
6
+ declare module '../../model' {
7
+ interface EditorCommandsType {
8
+ getCode?: () => KNode | null
9
+ hasCode?: () => boolean
10
+ allCode?: () => boolean
11
+ setCode?: () => Promise<void>
12
+ unsetCode?: () => Promise<void>
13
+ }
14
+ }
15
+
16
+ export const CodeExtension = () =>
17
+ Extension.create({
18
+ name: 'code',
19
+ extraKeepTags: ['code'],
20
+ domParseNodeCallback(node) {
21
+ if (node.isMatch({ tag: 'code' })) {
22
+ node.type = 'inline'
23
+ }
24
+ return node
25
+ },
26
+ formatRules: [
27
+ ({ editor, node }) => {
28
+ //行内代码只能是行内节点并且只能有文本节点和闭合节点
29
+ if (node.isMatch({ tag: 'code' }) && node.hasChildren()) {
30
+ node.type = 'inline'
31
+ node.children!.forEach(item => {
32
+ splitNodeToNodes.apply(editor, [item])
33
+ })
34
+ }
35
+ }
36
+ ],
37
+ addCommands() {
38
+ /**
39
+ * 获取光标所在的行内代码,如果光标不在一个行内代码内,返回null
40
+ */
41
+ const getCode = () => {
42
+ return this.getMatchNodeBySelection({
43
+ tag: 'code'
44
+ })
45
+ }
46
+
47
+ /**
48
+ * 判断光标范围内是否有行内代码
49
+ */
50
+ const hasCode = () => {
51
+ return this.isSelectionNodesSomeMatch({
52
+ tag: 'code'
53
+ })
54
+ }
55
+
56
+ /**
57
+ * 光标范围内是否都是行内代码
58
+ */
59
+ const allCode = () => {
60
+ return this.isSelectionNodesAllMatch({
61
+ tag: 'code'
62
+ })
63
+ }
64
+
65
+ /**
66
+ * 设置行内代码
67
+ */
68
+ const setCode = async () => {
69
+ if (allCode()) {
70
+ return
71
+ }
72
+ //起点和终点在一起
73
+ if (this.selection.collapsed()) {
74
+ const codeNode = KNode.create({
75
+ type: 'inline',
76
+ tag: 'code'
77
+ })
78
+ const zeroWidthText = KNode.createZeroWidthText()
79
+ this.addNode(zeroWidthText, codeNode)
80
+ this.insertNode(codeNode)
81
+ this.setSelectionAfter(zeroWidthText, 'all')
82
+ }
83
+ //起点和终点不在一起
84
+ else {
85
+ const focusNodes = this.getFocusSplitNodesBySelection('all')
86
+ const length = focusNodes.length
87
+ for (let i = 0; i < length; i++) {
88
+ const node = focusNodes[i]
89
+ const isExsitInCode = !!node.getMatchNode({
90
+ tag: 'code'
91
+ })
92
+ //该节点已经在行内代码内跳过本次循环
93
+ if (isExsitInCode) {
94
+ continue
95
+ }
96
+ //复制该节点
97
+ const newNode = node.clone(true)
98
+ //节点改为行内代码
99
+ node.type = 'inline'
100
+ node.tag = 'code'
101
+ node.marks = {}
102
+ node.styles = {}
103
+ node.textContent = undefined
104
+ node.children = [newNode]
105
+ newNode.parent = node
106
+ //重置光标位置
107
+ if (this.isSelectionInNode(node, 'start')) {
108
+ this.selection.start!.node = newNode
109
+ }
110
+ if (this.isSelectionInNode(node, 'end')) {
111
+ this.selection.end!.node = newNode
112
+ }
113
+ }
114
+ }
115
+ await this.updateView()
116
+ }
117
+
118
+ /**
119
+ * 取消行内代码
120
+ */
121
+ const unsetCode = async () => {
122
+ if (!allCode()) {
123
+ return
124
+ }
125
+ //起点和终点在一起
126
+ if (this.selection.collapsed()) {
127
+ //光标所在节点
128
+ const node = this.selection.start!.node
129
+ //光标偏移值
130
+ const offset = this.selection.start!.offset
131
+ //光标所在的行内代码节点
132
+ const codeNode = node.getMatchNode({
133
+ tag: 'code'
134
+ })!
135
+ //行内代码内第一个可设置光标的节点
136
+ const firstSelectionNode = this.getFirstSelectionNodeInChildren(codeNode)!
137
+ //行内代码内最后一个可设置光标的节点
138
+ const lastSelectionNode = this.getLastSelectionNodeInChildren(codeNode)!
139
+ //光标在行内代码起点处
140
+ if (firstSelectionNode.isEqual(node) && offset == 0) {
141
+ const zeroWidthText = KNode.createZeroWidthText()
142
+ this.addNodeBefore(zeroWidthText, codeNode)
143
+ this.setSelectionAfter(zeroWidthText)
144
+ }
145
+ //光标在行内代码的末尾处
146
+ else if (lastSelectionNode.isEqual(node) && offset == (node.isText() ? node.textContent!.length : 1)) {
147
+ const zeroWidthText = KNode.createZeroWidthText()
148
+ this.addNodeAfter(zeroWidthText, codeNode)
149
+ this.setSelectionAfter(zeroWidthText)
150
+ }
151
+ //光标在行内代码的中间
152
+ else {
153
+ //将光标的起点移动到行内代码的起始处
154
+ this.setSelectionBefore(firstSelectionNode, 'start')
155
+ //创建新的行内代码
156
+ const newCodeNode = KNode.create({
157
+ type: 'inline',
158
+ tag: 'code'
159
+ })
160
+ //获取选区内的可聚焦节点并遍历
161
+ this.getFocusSplitNodesBySelection('all').forEach((item, i) => {
162
+ //获取可聚焦节点在父节点中的位置
163
+ const index = codeNode.children!.findIndex(n => n.isEqual(item))
164
+ //从父节点中移除
165
+ codeNode.children!.splice(index, 1)
166
+ //加入到新的行内代码里
167
+ this.addNode(item, newCodeNode, i)
168
+ })
169
+ //新的行内代码插入到当前行内代码前面
170
+ this.addNodeBefore(newCodeNode, codeNode)
171
+ //创建一个空白文本节点
172
+ const zeroWidthText = KNode.createZeroWidthText()
173
+ //加入到当前行内代码前面
174
+ this.addNodeBefore(zeroWidthText, codeNode)
175
+ //重置光标位置
176
+ this.setSelectionAfter(zeroWidthText, 'all')
177
+ }
178
+ }
179
+ //起点和终点不在一起
180
+ else {
181
+ const startNode = this.selection.start!.node
182
+ const endNode = this.selection.end!.node
183
+ const startCodeNode = startNode.getMatchNode({ tag: 'code' })!
184
+ const endCodeNode = endNode.getMatchNode({ tag: 'code' })!
185
+ //起点和终点在一个行内代码内
186
+ if (startCodeNode.isEqual(endCodeNode)) {
187
+ //获取选区内的可聚焦节点
188
+ const focusNodes = this.getFocusSplitNodesBySelection('all')
189
+ //获取选区内第一个可聚焦节点在行内代码中的序列
190
+ const firstIndex = startCodeNode.children!.findIndex(item => item.isEqual(focusNodes[0]))
191
+ //获取选区内最后一个可聚焦节点在行内代码中的序列
192
+ const lastIndex = startCodeNode.children!.findIndex(item => item.isEqual(focusNodes[focusNodes.length - 1]))
193
+ //行内代码的子节点数量
194
+ const length = startCodeNode.children!.length
195
+ //是第一个可聚焦节点和最后一个可聚焦节点,说明选区是整个行内代码
196
+ if (firstIndex == 0 && lastIndex == length - 1) {
197
+ startCodeNode.children!.forEach(item => {
198
+ this.addNodeBefore(item, startCodeNode)
199
+ })
200
+ startCodeNode.children = []
201
+ }
202
+ //是第一个可聚焦节点
203
+ else if (firstIndex == 0 && lastIndex == 0) {
204
+ const node = startCodeNode.children![0]
205
+ startCodeNode.children!.splice(0, 1)
206
+ this.addNodeBefore(node, startCodeNode)
207
+ }
208
+ //是最后一个可聚焦节点
209
+ else if (firstIndex == length - 1 && lastIndex == length - 1) {
210
+ const node = startCodeNode.children![length - 1]
211
+ startCodeNode.children!.splice(length - 1, 1)
212
+ this.addNodeAfter(node, startCodeNode)
213
+ }
214
+ //是同一个可聚焦节点但是在中间位置
215
+ else if (firstIndex == lastIndex) {
216
+ //获取该可聚焦节点
217
+ const node = startCodeNode.children![firstIndex]
218
+ //创建新的行内节点
219
+ const newCodeNode = KNode.create({ type: 'inline', tag: 'code' })
220
+ //将选区前的行内节点部份给新的行内节点
221
+ startCodeNode.children!.splice(0, firstIndex).forEach((item, index) => {
222
+ this.addNode(item, newCodeNode, index)
223
+ })
224
+ //将新的行内代码节点插入到原行内代码节点前
225
+ this.addNodeBefore(newCodeNode, startCodeNode)
226
+ //将选区内的节点插入到原来的行内节点前面
227
+ this.addNodeBefore(node, startCodeNode)
228
+ //从原来的行内代码中移出该节点
229
+ startCodeNode.children!.splice(0, 1)
230
+ }
231
+ //不是同一个可聚焦节点
232
+ else {
233
+ //创建新的行内节点
234
+ const newCodeNode = KNode.create({ type: 'inline', tag: 'code' })
235
+ //将选区前的行内节点部份给新的行内节点
236
+ startCodeNode.children!.splice(0, firstIndex).forEach((item, index) => {
237
+ this.addNode(item, newCodeNode, index)
238
+ })
239
+ //将新的行内代码节点插入到原行内代码节点前
240
+ this.addNodeBefore(newCodeNode, startCodeNode)
241
+ //将选区内的节点插入到原行内节点的前面
242
+ focusNodes.forEach(item => {
243
+ this.addNodeBefore(item, startCodeNode)
244
+ })
245
+ startCodeNode.children!.splice(0, lastIndex - firstIndex + 1)
246
+ }
247
+ }
248
+ //起点和终点不在一个行内代码里
249
+ else {
250
+ const startOffset = this.selection.start!.offset
251
+ //起点所在的行内代码内第一个可设置光标的节点
252
+ const firstStartSelectionNode = this.getFirstSelectionNodeInChildren(startCodeNode)!
253
+ //获取选区内的可聚焦节点
254
+ const focusNodes = this.getFocusSplitNodesBySelection('all')
255
+ const length = focusNodes.length
256
+ const map: { [key: number]: { nodes: KNode[]; code: KNode } } = {}
257
+ for (let i = 0; i < length; i++) {
258
+ const codeNode = focusNodes[i].getMatchNode({ tag: 'code' })!
259
+ const index = codeNode.children!.findIndex(item => item.isEqual(focusNodes[i]))
260
+ codeNode.children!.splice(index, 1)
261
+ //是起点所在的行内代码并且起点不在行内代码的起始处
262
+ if (codeNode.isEqual(startCodeNode) && !(firstStartSelectionNode.isEqual(startNode) && startOffset == 0)) {
263
+ if (map[codeNode.key]) {
264
+ map[codeNode.key].nodes.push(focusNodes[i])
265
+ } else {
266
+ map[codeNode.key] = {
267
+ code: codeNode,
268
+ nodes: [focusNodes[i]]
269
+ }
270
+ }
271
+ }
272
+ //其他
273
+ else {
274
+ this.addNodeBefore(focusNodes[i], codeNode)
275
+ }
276
+ }
277
+ Object.values(map).forEach(item => {
278
+ item.nodes.reverse().forEach(node => {
279
+ this.addNodeAfter(node, item.code)
280
+ })
281
+ })
282
+ }
283
+ }
284
+ await this.updateView()
285
+ }
286
+
287
+ return {
288
+ getCode,
289
+ hasCode,
290
+ allCode,
291
+ setCode,
292
+ unsetCode
293
+ }
294
+ }
295
+ })
@@ -0,0 +1,14 @@
1
+ .Kaitify code {
2
+ display: inline-block;
3
+ padding: 2px 4px;
4
+ margin: 0 var(--kaitify-sides-between);
5
+ border-radius: var(--kaitify-border-radius);
6
+ font-family: Consolas, monospace, Monaco, Andale Mono, Ubuntu Mono;
7
+ background: #f6f9ff;
8
+ border: 1px solid var(--kaitify-border-color);
9
+ color: var(--kaitify-font-color);
10
+ }
11
+
12
+ :root[kaitify-dark] .Kaitify code {
13
+ background: #29292d;
14
+ }
@@ -0,0 +1,183 @@
1
+ /**
2
+ * 这里是对highlight的主题样式的自定义设置
3
+ */
4
+
5
+ .Kaitify pre {
6
+ .kaitify-hljs-doctag,
7
+ .kaitify-hljs-keyword,
8
+ .kaitify-hljs-meta .kaitify-hljs-keyword,
9
+ .kaitify-hljs-template-tag,
10
+ .kaitify-hljs-template-variable,
11
+ .kaitify-hljs-type,
12
+ .kaitify-hljs-variable.language_ {
13
+ /* prettylights-syntax-keyword */
14
+ color: #d73a49;
15
+ }
16
+ .kaitify-hljs-title,
17
+ .kaitify-hljs-title.class_,
18
+ .kaitify-hljs-title.class_.inherited__,
19
+ .kaitify-hljs-title.function_ {
20
+ /* prettylights-syntax-entity */
21
+ color: #6f42c1;
22
+ }
23
+ .kaitify-hljs-attr,
24
+ .kaitify-hljs-attribute,
25
+ .kaitify-hljs-literal,
26
+ .kaitify-hljs-meta,
27
+ .kaitify-hljs-number,
28
+ .kaitify-hljs-operator,
29
+ .kaitify-hljs-variable,
30
+ .kaitify-hljs-selector-attr,
31
+ .kaitify-hljs-selector-class,
32
+ .kaitify-hljs-selector-id {
33
+ /* prettylights-syntax-constant */
34
+ color: #005cc5;
35
+ }
36
+ .kaitify-hljs-regexp,
37
+ .kaitify-hljs-string,
38
+ .kaitify-hljs-meta .hljs-string {
39
+ /* prettylights-syntax-string */
40
+ color: #032f62;
41
+ }
42
+ .kaitify-hljs-built_in,
43
+ .kaitify-hljs-symbol {
44
+ /* prettylights-syntax-variable */
45
+ color: #e36209;
46
+ }
47
+ .kaitify-hljs-comment,
48
+ .kaitify-hljs-code,
49
+ .kaitify-hljs-formula {
50
+ /* prettylights-syntax-comment */
51
+ color: #6a737d;
52
+ }
53
+ .kaitify-hljs-name,
54
+ .kaitify-hljs-quote,
55
+ .kaitify-hljs-selector-tag,
56
+ .kaitify-hljs-selector-pseudo {
57
+ /* prettylights-syntax-entity-tag */
58
+ color: #22863a;
59
+ }
60
+ .kaitify-hljs-subst {
61
+ /* prettylights-syntax-storage-modifier-import */
62
+ color: #24292e;
63
+ }
64
+ .kaitify-hljs-section {
65
+ /* prettylights-syntax-markup-heading */
66
+ color: #005cc5;
67
+ font-weight: bold;
68
+ }
69
+ .kaitify-hljs-bullet {
70
+ /* prettylights-syntax-markup-list */
71
+ color: #735c0f;
72
+ }
73
+ .kaitify-hljs-emphasis {
74
+ /* prettylights-syntax-markup-italic */
75
+ color: #24292e;
76
+ font-style: italic;
77
+ }
78
+ .kaitify-hljs-strong {
79
+ /* prettylights-syntax-markup-bold */
80
+ color: #24292e;
81
+ font-weight: bold;
82
+ }
83
+ .kaitify-hljs-addition {
84
+ /* prettylights-syntax-markup-inserted */
85
+ color: #22863a;
86
+ background-color: #f0fff4;
87
+ }
88
+ .kaitify-hljs-deletion {
89
+ /* prettylights-syntax-markup-deleted */
90
+ color: #b31d28;
91
+ background-color: #ffeef0;
92
+ }
93
+ }
94
+
95
+ :root[kaitify-dark] .Kaitify pre {
96
+ .kaitify-hljs-doctag,
97
+ .kaitify-hljs-keyword,
98
+ .kaitify-hljs-meta .kaitify-hljs-keyword,
99
+ .kaitify-hljs-template-tag,
100
+ .kaitify-hljs-template-variable,
101
+ .kaitify-hljs-type,
102
+ .kaitify-hljs-variable.language_ {
103
+ /* prettylights-syntax-keyword */
104
+ color: #ff7b72;
105
+ }
106
+ .kaitify-hljs-title,
107
+ .kaitify-hljs-title.class_,
108
+ .kaitify-hljs-title.class_.inherited__,
109
+ .kaitify-hljs-title.function_ {
110
+ /* prettylights-syntax-entity */
111
+ color: #d2a8ff;
112
+ }
113
+ .kaitify-hljs-attr,
114
+ .kaitify-hljs-attribute,
115
+ .kaitify-hljs-literal,
116
+ .kaitify-hljs-meta,
117
+ .kaitify-hljs-number,
118
+ .kaitify-hljs-operator,
119
+ .kaitify-hljs-variable,
120
+ .kaitify-hljs-selector-attr,
121
+ .kaitify-hljs-selector-class,
122
+ .kaitify-hljs-selector-id {
123
+ /* prettylights-syntax-constant */
124
+ color: #79c0ff;
125
+ }
126
+ .kaitify-hljs-regexp,
127
+ .kaitify-hljs-string,
128
+ .kaitify-hljs-meta .kaitify-hljs-string {
129
+ /* prettylights-syntax-string */
130
+ color: #a5d6ff;
131
+ }
132
+ .kaitify-hljs-built_in,
133
+ .kaitify-hljs-symbol {
134
+ /* prettylights-syntax-variable */
135
+ color: #ffa657;
136
+ }
137
+ .kaitify-hljs-comment,
138
+ .kaitify-hljs-code,
139
+ .kaitify-hljs-formula {
140
+ /* prettylights-syntax-comment */
141
+ color: #8b949e;
142
+ }
143
+ .kaitify-hljs-name,
144
+ .kaitify-hljs-quote,
145
+ .kaitify-hljs-selector-tag,
146
+ .kaitify-hljs-selector-pseudo {
147
+ /* prettylights-syntax-entity-tag */
148
+ color: #7ee787;
149
+ }
150
+ .kaitify-hljs-subst {
151
+ /* prettylights-syntax-storage-modifier-import */
152
+ color: #c9d1d9;
153
+ }
154
+ .kaitify-hljs-section {
155
+ /* prettylights-syntax-markup-heading */
156
+ color: #1f6feb;
157
+ font-weight: bold;
158
+ }
159
+ .kaitify-hljs-bullet {
160
+ /* prettylights-syntax-markup-list */
161
+ color: #f2cc60;
162
+ }
163
+ .kaitify-hljs-emphasis {
164
+ /* prettylights-syntax-markup-italic */
165
+ color: #c9d1d9;
166
+ font-style: italic;
167
+ }
168
+ .kaitify-hljs-strong {
169
+ /* prettylights-syntax-markup-bold */
170
+ color: #c9d1d9;
171
+ font-weight: bold;
172
+ }
173
+ .kaitify-hljs-addition {
174
+ /* prettylights-syntax-markup-inserted */
175
+ color: #aff5b4;
176
+ background-color: #033a16;
177
+ }
178
+ .kaitify-hljs-deletion {
179
+ /* prettylights-syntax-markup-deleted */
180
+ color: #ffdcd7;
181
+ background-color: #67060c;
182
+ }
183
+ }
@@ -0,0 +1,95 @@
1
+ //引入核心库
2
+ import hljs from 'highlight.js/lib/core'
3
+ //引入语言支持
4
+ import plaintext from 'highlight.js/lib/languages/plaintext'
5
+ import json from 'highlight.js/lib/languages/json'
6
+ import javascript from 'highlight.js/lib/languages/javascript'
7
+ import java from 'highlight.js/lib/languages/java'
8
+ import typescript from 'highlight.js/lib/languages/typescript'
9
+ import python from 'highlight.js/lib/languages/python'
10
+ import php from 'highlight.js/lib/languages/php'
11
+ import css from 'highlight.js/lib/languages/css'
12
+ import less from 'highlight.js/lib/languages/less'
13
+ import scss from 'highlight.js/lib/languages/scss'
14
+ import html from 'highlight.js/lib/languages/xml'
15
+ import markdown from 'highlight.js/lib/languages/markdown'
16
+ import objectivec from 'highlight.js/lib/languages/objectivec'
17
+ import swift from 'highlight.js/lib/languages/swift'
18
+ import dart from 'highlight.js/lib/languages/dart'
19
+ import nginx from 'highlight.js/lib/languages/nginx'
20
+ import go from 'highlight.js/lib/languages/go'
21
+ import http from 'highlight.js/lib/languages/http'
22
+ import ruby from 'highlight.js/lib/languages/ruby'
23
+ import c from 'highlight.js/lib/languages/c'
24
+ import cpp from 'highlight.js/lib/languages/cpp'
25
+ import csharp from 'highlight.js/lib/languages/csharp'
26
+ import sql from 'highlight.js/lib/languages/sql'
27
+ import shell from 'highlight.js/lib/languages/shell'
28
+ import r from 'highlight.js/lib/languages/r'
29
+ import kotlin from 'highlight.js/lib/languages/kotlin'
30
+ import rust from 'highlight.js/lib/languages/rust'
31
+ //引入css样式主题
32
+ import './hljs.less'
33
+ //import 'highlight.js/styles/github.css'
34
+ //import 'highlight.js/styles/atom-one-light.css'
35
+ //import 'highlight.js/styles/lightfair.css'
36
+ //import 'highlight.js/styles/color-brewer.css'
37
+
38
+ //注册语言
39
+ hljs.registerLanguage('plaintext', plaintext)
40
+ hljs.registerLanguage('json', json)
41
+ hljs.registerLanguage('javascript', javascript)
42
+ hljs.registerLanguage('java', java)
43
+ hljs.registerLanguage('typescript', typescript)
44
+ hljs.registerLanguage('python', python)
45
+ hljs.registerLanguage('php', php)
46
+ hljs.registerLanguage('css', css)
47
+ hljs.registerLanguage('less', less)
48
+ hljs.registerLanguage('scss', scss)
49
+ hljs.registerLanguage('html', html)
50
+ hljs.registerLanguage('markdown', markdown)
51
+ hljs.registerLanguage('objectivec', objectivec)
52
+ hljs.registerLanguage('swift', swift)
53
+ hljs.registerLanguage('dart', dart)
54
+ hljs.registerLanguage('nginx', nginx)
55
+ hljs.registerLanguage('go', go)
56
+ hljs.registerLanguage('http', http)
57
+ hljs.registerLanguage('ruby', ruby)
58
+ hljs.registerLanguage('c', c)
59
+ hljs.registerLanguage('cpp', cpp)
60
+ hljs.registerLanguage('csharp', csharp)
61
+ hljs.registerLanguage('sql', sql)
62
+ hljs.registerLanguage('shell', shell)
63
+ hljs.registerLanguage('r', r)
64
+ hljs.registerLanguage('kotlin', kotlin)
65
+ hljs.registerLanguage('rust', rust)
66
+
67
+ /**
68
+ * 支持的语言列表
69
+ */
70
+ export const HljsLanguages = ['plaintext', 'json', 'javascript', 'java', 'typescript', 'python', 'php', 'css', 'less', 'scss', 'html', 'markdown', 'objectivec', 'swift', 'dart', 'nginx', 'http', 'go', 'ruby', 'c', 'cpp', 'csharp', 'sql', 'shell', 'r', 'kotlin', 'rust'] as const
71
+
72
+ //全局设置
73
+ hljs.configure({
74
+ cssSelector: 'pre',
75
+ classPrefix: 'kaitify-hljs-',
76
+ languages: [...HljsLanguages],
77
+ ignoreUnescapedHTML: true
78
+ })
79
+
80
+ /**
81
+ * 语言类型
82
+ */
83
+ export type HljsLanguageType = (typeof HljsLanguages)[number]
84
+ /**
85
+ * 获取经过hljs处理的html元素
86
+ */
87
+ export const getHljsHtml = function (code: string, language: string) {
88
+ if (language) {
89
+ return hljs.highlight(code, {
90
+ language: language,
91
+ ignoreIllegals: true
92
+ }).value
93
+ }
94
+ return hljs.highlightAuto(code).value
95
+ }