mirror of https://github.com/docusealco/docuseal
				
				
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							76 lines
						
					
					
						
							1.6 KiB
						
					
					
				
			
		
		
	
	
							76 lines
						
					
					
						
							1.6 KiB
						
					
					
				<template>
 | 
						|
  <span>
 | 
						|
    <template
 | 
						|
      v-for="(item, index) in items"
 | 
						|
      :key="index"
 | 
						|
    >
 | 
						|
      <a
 | 
						|
        v-if="item.startsWith('<a') && item.endsWith('</a>')"
 | 
						|
        :href="sanitizeHref(extractAttr(item, 'href'))"
 | 
						|
        rel="noopener noreferrer nofollow"
 | 
						|
        :class="extractAttr(item, 'class') || 'link'"
 | 
						|
        target="_blank"
 | 
						|
      >
 | 
						|
        {{ extractText(item) }}
 | 
						|
      </a>
 | 
						|
      <b
 | 
						|
        v-else-if="item.startsWith('<b>') || item.startsWith('<strong>')"
 | 
						|
      >
 | 
						|
        {{ extractText(item) }}
 | 
						|
      </b>
 | 
						|
      <i
 | 
						|
        v-else-if="item.startsWith('<i>') || item.startsWith('<em>')"
 | 
						|
      >
 | 
						|
        {{ extractText(item) }}
 | 
						|
      </i>
 | 
						|
      <br
 | 
						|
        v-else-if="item === '<br>' || item === '\n'"
 | 
						|
      >
 | 
						|
      <template
 | 
						|
        v-else
 | 
						|
      >
 | 
						|
        {{ item }}
 | 
						|
      </template>
 | 
						|
    </template>
 | 
						|
  </span>
 | 
						|
</template>
 | 
						|
 | 
						|
<script>
 | 
						|
import snarkdown from 'snarkdown'
 | 
						|
 | 
						|
const htmlSplitRegexp = /(<a.+?<\/a>|<i>.+?<\/i>|<b>.+?<\/b>|<em>.+?<\/em>|<strong>.+?<\/strong>|<br>)/
 | 
						|
 | 
						|
export default {
 | 
						|
  name: 'MarkdownContent',
 | 
						|
  props: {
 | 
						|
    string: {
 | 
						|
      type: String,
 | 
						|
      required: false,
 | 
						|
      default: ''
 | 
						|
    }
 | 
						|
  },
 | 
						|
  computed: {
 | 
						|
    items () {
 | 
						|
      return snarkdown(this.string.replace(/\n/g, '<br>')).split(htmlSplitRegexp)
 | 
						|
    }
 | 
						|
  },
 | 
						|
  methods: {
 | 
						|
    sanitizeHref (href) {
 | 
						|
      if (href && href.trim().match(/^((?:https?:\/\/)|\/)/)) {
 | 
						|
        return href.replace(/javascript:/g, '')
 | 
						|
      }
 | 
						|
    },
 | 
						|
    extractAttr (text, attr) {
 | 
						|
      if (text.includes(attr)) {
 | 
						|
        return text.split(attr).pop().split('"')[1]
 | 
						|
      }
 | 
						|
    },
 | 
						|
    extractText (text) {
 | 
						|
      if (text) {
 | 
						|
        return text.match(/>(.+?)</)?.[1]
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
</script>
 |