mirror of
				https://github.com/mealie-recipes/mealie.git
				synced 2025-10-31 10:13:32 -04:00 
			
		
		
		
	
		
			
	
	
		
			43 lines
		
	
	
		
			976 B
		
	
	
	
		
			Vue
		
	
	
	
	
	
		
		
			
		
	
	
			43 lines
		
	
	
		
			976 B
		
	
	
	
		
			Vue
		
	
	
	
	
	
|  | <template> | ||
|  |   <VueMarkdown :source="sanitizeMarkdown(source)"></VueMarkdown> | ||
|  | </template> | ||
|  | 
 | ||
|  | <script lang="ts"> | ||
|  | // @ts-ignore vue-markdown has no types
 | ||
|  | import VueMarkdown from "@adapttive/vue-markdown"; | ||
|  | import { defineComponent } from "@nuxtjs/composition-api"; | ||
|  | import DOMPurify from "isomorphic-dompurify"; | ||
|  | 
 | ||
|  | export default defineComponent({ | ||
|  |   components: { | ||
|  |     VueMarkdown, | ||
|  |   }, | ||
|  |   props: { | ||
|  |     source: { | ||
|  |       type: String, | ||
|  |       default: "", | ||
|  |     }, | ||
|  |   }, | ||
|  |   setup() { | ||
|  |     function sanitizeMarkdown(rawHtml: string | null | undefined): string { | ||
|  |       if (!rawHtml) { | ||
|  |         return ""; | ||
|  |       } | ||
|  | 
 | ||
|  |       const sanitized = DOMPurify.sanitize(rawHtml, { | ||
|  |         USE_PROFILES: { html: true }, | ||
|  |         // TODO: some more thought could be put into what is allowed and what isn't
 | ||
|  |         ALLOWED_TAGS: ["img", "div", "p"], | ||
|  |         ADD_ATTR: ["src", "alt", "height", "width", "class"], | ||
|  |       }); | ||
|  | 
 | ||
|  |       return sanitized; | ||
|  |     } | ||
|  | 
 | ||
|  |     return { | ||
|  |       sanitizeMarkdown, | ||
|  |     }; | ||
|  |   }, | ||
|  | }); | ||
|  | </script> |