@myissue/vue-website-page-builder
Version:
Vue 3 page builder component with drag & drop functionality.
60 lines (51 loc) • 1.71 kB
text/typescript
import type { PageBuilderConfig } from '../types'
export function extractCleanHTMLFromPageBuilder(
pagebuilder: HTMLElement | null,
config?: PageBuilderConfig,
): string {
if (!pagebuilder) {
console.warn('No valid pagebuilder element passed')
return ''
}
const clone = pagebuilder.cloneNode(true) as HTMLElement
clone.removeAttribute('id')
// Remove custom attributes
const elementsWithAttrs = clone.querySelectorAll<HTMLElement>(
'[data-componentid], [data-component-title], #page-builder-editor-editable-area',
)
elementsWithAttrs.forEach((el) => {
el.removeAttribute('data-componentid')
el.removeAttribute('data-component-title')
if (el.id === 'page-builder-editor-editable-area') {
el.removeAttribute('id')
}
})
if (config && config && typeof config.imageUrlPrefix === 'string') {
const imageUrlPrefix = config.imageUrlPrefix
const imgs = clone.querySelectorAll<HTMLImageElement>('img')
imgs.forEach((img) => {
const src = img.getAttribute('src') || ''
if (
!src.startsWith('http') &&
// extra safety
imageUrlPrefix &&
!src.startsWith(imageUrlPrefix)
) {
img.setAttribute('src', imageUrlPrefix + src.replace(/^\/+/, ''))
}
})
}
// Recursively remove all comment nodes
const removeComments = (node: Node): void => {
for (let i = node.childNodes.length - 1; i >= 0; i--) {
const child = node.childNodes[i]
if (child.nodeType === Node.COMMENT_NODE) {
node.removeChild(child)
} else if (child.nodeType === Node.ELEMENT_NODE) {
removeComments(child)
}
}
}
removeComments(clone)
return clone.outerHTML
}