Skip to content

Commit

Permalink
Merge pull request #1145 from PrefectHQ/nicholas/enhancement-markdown…
Browse files Browse the repository at this point in the history
…-renderer-memory-2024-03-12

Enhancement: `PMarkdownRenderer` memory update
  • Loading branch information
znicholasbrown authored Mar 13, 2024
2 parents 6771e44 + 2823069 commit 8f7b563
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 21 deletions.
22 changes: 3 additions & 19 deletions src/components/MarkdownRenderer/PMarkdownRenderer.vue
Original file line number Diff line number Diff line change
Expand Up @@ -3,36 +3,20 @@
</template>

<script lang="ts" setup>
import { marked } from 'marked'
import { computed, ref, watch } from 'vue'
import { computed } from 'vue'
import { getRootVNode } from '@/components/MarkdownRenderer/parser'
import MarkdownTokenWorker from '@/components/MarkdownRenderer/worker?worker&inline'
import type { ParseMessagePayload } from '@/types/markdownRenderer'
import { useMarkdownRenderer } from '@/compositions/useMarkdownRenderer'
const props = defineProps<{
text: string,
linkBaseUrl?: string,
}>()
const tokens = ref<marked.TokensList | []>([])
const { tokens } = useMarkdownRenderer(() => props.text)
const renderRoot = computed(() => {
return getRootVNode(tokens.value, { baseLinkUrl: props.linkBaseUrl })
})
const handleWorkerMessage = (message: ParseMessagePayload): void => {
tokens.value = message.tokens
}
const worker = new MarkdownTokenWorker()
worker.onmessage = (event: MessageEvent<ParseMessagePayload>) => handleWorkerMessage(event.data)
watch(() => props.text, (text) => {
if (text) {
worker.postMessage({ text })
}
}, { immediate: true })
</script>

<style>
Expand Down
4 changes: 2 additions & 2 deletions src/components/MarkdownRenderer/worker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ const parse = (text: string): marked.TokensList => {
}

const handleMessage = (message: MessageEvent<MarkdownMessagePayload>): void => {
const { text } = message.data
const { id, text } = message.data
const tokens = parse(text)
const response: ParseMessagePayload = { tokens }
const response: ParseMessagePayload = { id, tokens }
self.postMessage(response)
}

Expand Down
1 change: 1 addition & 0 deletions src/compositions/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ export * from './position'
export * from './useColorTheme'
export * from './useDrawer'
export * from './useGlobalEventListener'
export * from './useMarkdownRenderer'
export * from './useModal'
export * from './useOffsetStickyRootMargin'
export * from './usePopOverGroup'
Expand Down
38 changes: 38 additions & 0 deletions src/compositions/useMarkdownRenderer.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import { marked } from 'marked'
import { computed, getCurrentScope, MaybeRefOrGetter, onScopeDispose, onUnmounted, Ref, ref, toRef, toValue, watch, watchEffect } from 'vue'
import MarkdownTokenWorker from '@/components/MarkdownRenderer/worker?worker&inline'
import { ParseMessagePayload } from '@/types/markdownRenderer'
import { randomId } from '@/utilities'

export type Tokens = marked.TokensList | []
export type MarkdownRendererCallback = (tokens: Tokens) => void
export type UseMarkdownRenderer = {
tokens: Ref<Tokens>,
}

const callbacks = new Map<string, MarkdownRendererCallback>()
const worker = new MarkdownTokenWorker()

worker.onmessage = (message: MessageEvent<ParseMessagePayload>) => {
const { id, tokens } = message.data
const callback = callbacks.get(id)

if (callback) {
callback(tokens)
}
}

export function useMarkdownRenderer(text: MaybeRefOrGetter): UseMarkdownRenderer {
const id = randomId()
const tokensRef = ref<Tokens>([])

const rendererCallback = (tokens: Tokens): void => {
tokensRef.value = tokens
}

callbacks.set(id, rendererCallback)
watchEffect(() => worker.postMessage({ id, text: toValue(text) }))
onScopeDispose(() => callbacks.delete(id))

return { tokens: tokensRef }
}
2 changes: 2 additions & 0 deletions src/types/markdownRenderer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,12 @@ export type Token = ReturnType<typeof marked.lexer>[number]
export type VNodeChildren = VNode<RendererNode, RendererElement, Record<string, unknown>>[]

export type MarkdownMessagePayload = {
id: string,
text: string,
}

export type ParseMessagePayload = {
id: string,
tokens: marked.TokensList,
}

Expand Down

0 comments on commit 8f7b563

Please sign in to comment.