Skip to content

Commit 51a5017

Browse files
committed
refactor(app): use renderer in Heading node
1 parent 86c5144 commit 51a5017

File tree

4 files changed

+32
-47
lines changed

4 files changed

+32
-47
lines changed

packages/app/modules/editor/components/NodeEditorBlock.vue

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,15 @@ onKeyStroke('ArrowUp', (e) => {
5151
focusBlock(-1)
5252
})
5353
54+
onKeyStroke(
55+
'Enter',
56+
(e) => {
57+
e.preventDefault()
58+
// focusBlock(-1)
59+
},
60+
{ target: content }
61+
)
62+
5463
onMounted(() => {
5564
window.addEventListener('focus', setIsFocused, true)
5665
})

packages/app/modules/editor/components/NodeEditorBlockHeading.vue

Lines changed: 16 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<script setup lang="ts">
22
import MBlock from './NodeEditorBlock.vue'
33
import { Node as MarkdownNode, MarkdownToken, NodeType, Parser } from '@language-kit/markdown'
4+
import NodeEditorRenderer from './NodeEditorRenderer.vue'
45
56
import debounce from 'lodash/debounce'
67
import { NodeWithId } from '../types/node'
@@ -10,14 +11,11 @@ const model = defineModel({
1011
required: true,
1112
})
1213
13-
const el = ref<HTMLElement>()
14-
const text = ref('')
14+
const html = ref('')
1515
const level = ref(1)
1616
const parser = new Parser()
1717
1818
function setText() {
19-
if (!el.value) return
20-
2119
const tokens = model.value.tokens.filter((t) => t.value !== '#')
2220
2321
const value = tokens
@@ -26,12 +24,7 @@ function setText() {
2624
.join('')
2725
.trim()
2826
29-
const isEqual = value === el.value.innerHTML || value === text.value
30-
31-
if (isEqual) return
32-
33-
text.value = value
34-
el.value.innerHTML = value
27+
html.value = value
3528
}
3629
3730
function setLevel() {
@@ -40,8 +33,8 @@ function setLevel() {
4033
level.value = tokens
4134
}
4235
43-
function updateNode(markdown: string) {
44-
const tokens = parser.toTokens(markdown)
36+
function updateNode(text: string) {
37+
const tokens = parser.toTokens(text)
4538
4639
const lastIndex = tokens.length - 1
4740
const breakLine = MarkdownToken.breakLine()
@@ -56,42 +49,32 @@ function updateNode(markdown: string) {
5649
model.value = node
5750
}
5851
59-
const onInput = debounce((event: InputEvent) => {
60-
const html = (event.target as HTMLElement).innerHTML
52+
function update(newHtml: string) {
53+
html.value = newHtml
6154
62-
const markdown = '#'.repeat(level.value) + ' ' + html
63-
64-
updateNode(markdown)
65-
}, 100)
55+
updateNode('#'.repeat(level.value) + ' ' + newHtml)
56+
}
6657
6758
function updateLevel(value: number) {
6859
level.value = value
6960
70-
const markdown = '#'.repeat(value) + ' ' + text.value
61+
const markdown = '#'.repeat(value) + ' ' + html.value
7162
7263
updateNode(markdown)
7364
}
7465
75-
watch(model, setText)
66+
watch(model, setText, {
67+
immediate: true,
68+
})
7669
7770
watch(model, setLevel)
78-
79-
onMounted(setText)
80-
81-
onMounted(setLevel)
8271
</script>
8372

8473
<template>
8574
<m-block :node="model" class="md-heading">
86-
<component
87-
:is="'h' + level"
88-
ref="el"
89-
contenteditable
90-
class="outline-none"
91-
@input="onInput"
92-
@keydown.enter.prevent
93-
v-html="text"
94-
/>
75+
<component :is="'h' + level">
76+
<NodeEditorRenderer :model-value="html" @update:model-value="update" />
77+
</component>
9578

9679
<template #menu>
9780
<v-list-item v-for="n in 6" :key="n" @click="updateLevel(n)">

packages/app/modules/editor/components/NodeEditorBlockParagraph.vue

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<script setup lang="ts">
22
import MBlock from './NodeEditorBlock.vue'
3-
import MHtml from './NodeEditorRenderer.vue'
3+
import NodeEditorRenderer from './NodeEditorRenderer.vue'
44
import { MarkdownToken, NodeType, Parser } from '@language-kit/markdown'
55
import { NodeWithId } from '../types/node'
66
@@ -18,10 +18,6 @@ function load() {
1818
.join('')
1919
.trim()
2020
21-
const isEqual = value === html.value
22-
23-
if (isEqual) return
24-
2521
html.value = value
2622
}
2723
@@ -47,12 +43,7 @@ onMounted(load)
4743
</script>
4844

4945
<template>
50-
<m-block :node="model">
51-
<m-html
52-
ref="content"
53-
:model-value="html"
54-
data-block-focusable
55-
@update:model-value="update"
56-
/>
57-
</m-block>
46+
<MBlock :node="model">
47+
<NodeEditorRenderer :model-value="html" @update:model-value="update" />
48+
</MBlock>
5849
</template>

packages/app/modules/editor/components/NodeEditorRenderer.vue

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,11 @@ const textHaveVariable = computed(() => props.modelValue.includes('{{'))
2525
function setInnerModel() {
2626
let text = props.modelValue
2727
28+
const innerHTML = (el.value?.innerHTML ?? '').replace('&nbsp;', ' ')
29+
2830
if (text === innerModel.value) return
2931
30-
if (text === el.value?.innerHTML) return
32+
if (el.value && text === innerHTML) return
3133
3234
innerModel.value = text
3335
}

0 commit comments

Comments
 (0)