From 044fbab85fd468817d01ffa63e96173509a66844 Mon Sep 17 00:00:00 2001 From: Maxime Pauvert Date: Tue, 29 Aug 2023 18:53:06 +0200 Subject: [PATCH 1/4] feat: add binding for external vars --- src/runtime/components/MDCRenderer.vue | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/runtime/components/MDCRenderer.vue b/src/runtime/components/MDCRenderer.vue index 408625e0..974e7123 100644 --- a/src/runtime/components/MDCRenderer.vue +++ b/src/runtime/components/MDCRenderer.vue @@ -63,7 +63,14 @@ export default defineComponent({ components: { type: Object as PropType>>, default: () => ({}) - } + }, + /** + * External vars binding to use for rendering. + */ + vars: { + type: Object, + default: () => ({}) + }, }, async setup (props) { const { mdc } = useRuntimeConfig().public @@ -107,7 +114,7 @@ export default defineComponent({ /** * Render a markdown node */ -function renderNode (node: MDCNode, h: CreateElement, documentMeta: MDCData, parentScope: any = {}): VNode { +function renderNode (node: MDCNode, h: CreateElement, documentMeta: MDCData, parentScope: any = {}, vars: any = {}): VNode { /** * Render Text node */ @@ -124,7 +131,7 @@ function renderNode (node: MDCNode, h: CreateElement, documentMeta: MDCData, par const renderTag: string = (typeof node.props?.__ignoreMap === 'undefined' && documentMeta.tags[originalTag]) || originalTag if (node.tag === 'binding') { - return renderBinding(node, h, documentMeta, parentScope) + return renderBinding(node, h, documentMeta, parentScope, vars) } const component = resolveVueComponent(renderTag) @@ -137,7 +144,7 @@ function renderNode (node: MDCNode, h: CreateElement, documentMeta: MDCData, par return h( component as any, props, - renderSlots(node, h, documentMeta, { ...parentScope, ...props }) + renderSlots(node, h, documentMeta, { ...parentScope, ...props }, vars) ) } @@ -153,12 +160,13 @@ function renderToText (node: MDCNode): string { return `<${node.tag}>${node.children?.map(renderToText).join('') || ''}` } -function renderBinding (node: MDCElement, h: CreateElement, documentMeta: MDCData, parentScope: any = {}): VNode { +function renderBinding (node: MDCElement, h: CreateElement, documentMeta: MDCData, parentScope: any = {}, vars: any = {}): VNode { const data = { ...parentScope, $route: () => useRoute(), $document: documentMeta, - $doc: documentMeta + $doc: documentMeta, + $vars: vars } const splitter = /\.|\[(\d+)\]/ const keys: string[] = node.props?.value.trim().split(splitter).filter(Boolean) @@ -179,7 +187,7 @@ function renderBinding (node: MDCElement, h: CreateElement, documentMeta: MDCDat /** * Create slots from `node` template children. */ -function renderSlots (node: MDCNode, h: CreateElement, documentMeta: MDCData, parentProps: any): Record VNode[]> { +function renderSlots (node: MDCNode, h: CreateElement, documentMeta: MDCData, parentProps: any, vars: any): Record VNode[]> { const children: MDCNode[] = (node as MDCElement).children || [] const slotNodes: Record = children.reduce((data, node) => { @@ -204,7 +212,7 @@ function renderSlots (node: MDCNode, h: CreateElement, documentMeta: MDCData, pa if (!children.length) { return slots } slots[name] = () => { - const vNodes = children.map(child => renderNode(child, h, documentMeta, parentProps)) + const vNodes = children.map(child => renderNode(child, h, documentMeta, parentProps, vars)) return mergeTextNodes(vNodes) } @@ -403,7 +411,7 @@ async function resolveContentComponents (body: MDCRoot, meta: Record Date: Tue, 29 Aug 2023 19:42:31 +0200 Subject: [PATCH 2/4] fix: add binding for external vars --- src/runtime/components/MDCRenderer.vue | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/runtime/components/MDCRenderer.vue b/src/runtime/components/MDCRenderer.vue index 974e7123..71cc5adf 100644 --- a/src/runtime/components/MDCRenderer.vue +++ b/src/runtime/components/MDCRenderer.vue @@ -87,7 +87,7 @@ export default defineComponent({ return { tags } }, render (ctx: any) { - const { tags, tag, body, data } = ctx + const { tags, tag, body, data, vars } = ctx if (!body) { return null @@ -106,7 +106,7 @@ export default defineComponent({ ...meta.component?.props, ...this.$attrs }, - renderSlots(body, h, meta, meta) + renderSlots(body, h, meta, meta, vars) ) } }) @@ -161,6 +161,7 @@ function renderToText (node: MDCNode): string { } function renderBinding (node: MDCElement, h: CreateElement, documentMeta: MDCData, parentScope: any = {}, vars: any = {}): VNode { + console.log(vars.value); const data = { ...parentScope, $route: () => useRoute(), From c5ad51425bf461397d0d51329b081ac005b0d978 Mon Sep 17 00:00:00 2001 From: Maxime Pauvert Date: Tue, 29 Aug 2023 19:44:11 +0200 Subject: [PATCH 3/4] fix: remove console.log() --- src/runtime/components/MDCRenderer.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/src/runtime/components/MDCRenderer.vue b/src/runtime/components/MDCRenderer.vue index 71cc5adf..05291a0a 100644 --- a/src/runtime/components/MDCRenderer.vue +++ b/src/runtime/components/MDCRenderer.vue @@ -161,7 +161,6 @@ function renderToText (node: MDCNode): string { } function renderBinding (node: MDCElement, h: CreateElement, documentMeta: MDCData, parentScope: any = {}, vars: any = {}): VNode { - console.log(vars.value); const data = { ...parentScope, $route: () => useRoute(), From d88b3a829b61fc938fd8ff2fa01a2c82cf2c1357 Mon Sep 17 00:00:00 2001 From: Maxime Pauvert Date: Sun, 1 Oct 2023 22:33:35 +0200 Subject: [PATCH 4/4] feat: add default value to variable binding --- src/runtime/components/MDCRenderer.vue | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/runtime/components/MDCRenderer.vue b/src/runtime/components/MDCRenderer.vue index 0aa82a3d..ab5b1812 100644 --- a/src/runtime/components/MDCRenderer.vue +++ b/src/runtime/components/MDCRenderer.vue @@ -176,8 +176,9 @@ function renderBinding (node: MDCElement, h: CreateElement, documentMeta: MDCDat } return {} }, data) + const defaultValue = node.props?.defaultValue - return h(Text, value) + return h(Text, value ?? defaultValue ?? '') } /**