fix filtering
This commit is contained in:
parent
e788ad1333
commit
99f92cb9a0
@ -1,6 +1,7 @@
|
|||||||
|
|
||||||
import { YXmlText, YXmlElement, YXmlHook } from '../../Types/YXml/YXml.js'
|
import { YXmlText, YXmlElement, YXmlHook } from '../../Types/YXml/YXml.js'
|
||||||
import { createAssociation } from './util.js'
|
import { createAssociation } from './util.js'
|
||||||
|
import { filterDomAttributes } from './filter.js'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a Yjs type (YXml) based on the contents of a DOM Element.
|
* Creates a Yjs type (YXml) based on the contents of a DOM Element.
|
||||||
@ -17,6 +18,7 @@ export default function domToType (element, _document = document, binding) {
|
|||||||
case _document.ELEMENT_NODE:
|
case _document.ELEMENT_NODE:
|
||||||
let hookName = element.dataset.yjsHook
|
let hookName = element.dataset.yjsHook
|
||||||
let hook
|
let hook
|
||||||
|
// configure `hookName !== undefined` if element is a hook.
|
||||||
if (hookName !== undefined) {
|
if (hookName !== undefined) {
|
||||||
hook = binding.opts.hooks[hookName]
|
hook = binding.opts.hooks[hookName]
|
||||||
if (hook === undefined) {
|
if (hook === undefined) {
|
||||||
@ -26,15 +28,26 @@ export default function domToType (element, _document = document, binding) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (hookName === undefined) {
|
if (hookName === undefined) {
|
||||||
type = new YXmlElement(element.nodeName)
|
// Not a hook
|
||||||
const attrs = element.attributes
|
const attrs = filterDomAttributes(element, binding.filter)
|
||||||
for (let i = attrs.length - 1; i >= 0; i--) {
|
if (attrs === null) {
|
||||||
const attr = attrs[i]
|
type = false
|
||||||
type.setAttribute(attr.name, attr.value)
|
} else {
|
||||||
|
type = new YXmlElement(element.nodeName)
|
||||||
|
attrs.forEach((val, key) => {
|
||||||
|
type.setAttribute(key, val)
|
||||||
|
})
|
||||||
|
const children = []
|
||||||
|
for (let elem of element.childNodes) {
|
||||||
|
const type = domToType(elem, _document, binding)
|
||||||
|
if (type !== false) {
|
||||||
|
children.push(type)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
type.insert(0, children)
|
||||||
}
|
}
|
||||||
const children = Array.from(element.childNodes).map(e => domToType(e, _document, binding))
|
|
||||||
type.insert(0, children)
|
|
||||||
} else {
|
} else {
|
||||||
|
// Is a hook
|
||||||
type = new YXmlHook(hookName)
|
type = new YXmlHook(hookName)
|
||||||
hook.fillType(element, type)
|
hook.fillType(element, type)
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,18 @@ export function defaultFilter (nodeName, attrs) {
|
|||||||
return attrs
|
return attrs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
export function filterDomAttributes (dom, filter) {
|
||||||
|
const attrs = new Map()
|
||||||
|
for (let i = dom.attributes.length - 1; i >= 0; i--) {
|
||||||
|
const attr = dom.attributes[i]
|
||||||
|
attrs.set(attr.name, attr.value)
|
||||||
|
}
|
||||||
|
return filter(dom.nodeName, attrs)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Applies a filter on a type.
|
* Applies a filter on a type.
|
||||||
*
|
*
|
||||||
|
@ -54,7 +54,14 @@ export function createAssociation (domBinding, dom, type) {
|
|||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
export function insertDomElementsAfter (type, prev, doms, _document, binding) {
|
export function insertDomElementsAfter (type, prev, doms, _document, binding) {
|
||||||
return type.insertAfter(prev, doms.map(dom => domToType(dom, _document, binding)))
|
const types = []
|
||||||
|
for (let dom of doms) {
|
||||||
|
const t = domToType(dom, _document, binding)
|
||||||
|
if (t !== false) {
|
||||||
|
types.push(t)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return type.insertAfter(prev, types)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user