diff --git a/resources/js/components/TemplateRenderer.vue b/resources/js/components/TemplateRenderer.vue index 20a5dcbf6..b920a2185 100644 --- a/resources/js/components/TemplateRenderer.vue +++ b/resources/js/components/TemplateRenderer.vue @@ -10,25 +10,28 @@ diff --git a/resources/js/show/components/fields/text/TextRenderer.vue b/resources/js/show/components/fields/text/TextRenderer.vue index 796222c68..ffaa34434 100644 --- a/resources/js/show/components/fields/text/TextRenderer.vue +++ b/resources/js/show/components/fields/text/TextRenderer.vue @@ -4,7 +4,7 @@ import Html from "@/show/components/fields/text/nodes/Html.vue"; import { ShowTextFieldData } from "@/types"; import Embed from "@/show/components/fields/text/nodes/Embed.vue"; - import { components } from '@/components/TemplateRenderer.vue'; + import TemplateRenderer from '@/components/TemplateRenderer.vue'; const props = defineProps<{ field: ShowTextFieldData, @@ -21,31 +21,26 @@ dom.content.removeChild(htmlNode); }); return dom.innerHTML; - }) + }); - const component = computed(() => ({ - template: `
${formattedContent.value}
`, - components: { - ...components, - 'x-sharp-file': File, - 'x-sharp-image': File, - 'html-content': Html, - ...Object.fromEntries( - Object.entries(props.field.embeds ?? {}) - .map(([embedKey, embed]) => [ - embed.tag, - { - template: '', - components: { Embed }, - data: () => ({ embed }), - } - ]) - ), - }, + const components = computed(() => ({ + 'x-sharp-file': File, + 'x-sharp-image': File, + 'html-content': Html, + ...Object.fromEntries( + Object.entries(props.field.embeds ?? {}) + .map(([embedKey, embed]) => [ + embed.tag, + { + template: '', + components: { Embed }, + data: () => ({ embed }), + } + ]) + ), })); - diff --git a/resources/js/utils/sanitize.ts b/resources/js/utils/sanitize.ts index 8d21f66bf..f4d0d97bc 100644 --- a/resources/js/utils/sanitize.ts +++ b/resources/js/utils/sanitize.ts @@ -6,7 +6,9 @@ export function sanitize(html: string | null) { ADD_TAGS: ['iframe'], CUSTOM_ELEMENT_HANDLING: { tagNameCheck: () => true, - attributeNameCheck: () => true, + attributeNameCheck: (name) => { + return !name.match(/^(v-)|:|@|#/); // remove vue related attributes + }, }, }) : html;