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.
128 lines
3.0 KiB
128 lines
3.0 KiB
'use strict'; |
|
|
|
Object.defineProperty(exports, '__esModule', { |
|
value: true |
|
}); |
|
exports.test = exports.serialize = exports.default = void 0; |
|
|
|
var _markup = require('./lib/markup'); |
|
|
|
/** |
|
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. |
|
* |
|
* This source code is licensed under the MIT license found in the |
|
* LICENSE file in the root directory of this source tree. |
|
*/ |
|
const ELEMENT_NODE = 1; |
|
const TEXT_NODE = 3; |
|
const COMMENT_NODE = 8; |
|
const FRAGMENT_NODE = 11; |
|
const ELEMENT_REGEXP = /^((HTML|SVG)\w*)?Element$/; |
|
|
|
const testHasAttribute = val => { |
|
try { |
|
return typeof val.hasAttribute === 'function' && val.hasAttribute('is'); |
|
} catch { |
|
return false; |
|
} |
|
}; |
|
|
|
const testNode = val => { |
|
const constructorName = val.constructor.name; |
|
const {nodeType, tagName} = val; |
|
const isCustomElement = |
|
(typeof tagName === 'string' && tagName.includes('-')) || |
|
testHasAttribute(val); |
|
return ( |
|
(nodeType === ELEMENT_NODE && |
|
(ELEMENT_REGEXP.test(constructorName) || isCustomElement)) || |
|
(nodeType === TEXT_NODE && constructorName === 'Text') || |
|
(nodeType === COMMENT_NODE && constructorName === 'Comment') || |
|
(nodeType === FRAGMENT_NODE && constructorName === 'DocumentFragment') |
|
); |
|
}; |
|
|
|
const test = val => { |
|
var _val$constructor; |
|
|
|
return ( |
|
(val === null || val === void 0 |
|
? void 0 |
|
: (_val$constructor = val.constructor) === null || |
|
_val$constructor === void 0 |
|
? void 0 |
|
: _val$constructor.name) && testNode(val) |
|
); |
|
}; |
|
|
|
exports.test = test; |
|
|
|
function nodeIsText(node) { |
|
return node.nodeType === TEXT_NODE; |
|
} |
|
|
|
function nodeIsComment(node) { |
|
return node.nodeType === COMMENT_NODE; |
|
} |
|
|
|
function nodeIsFragment(node) { |
|
return node.nodeType === FRAGMENT_NODE; |
|
} |
|
|
|
const serialize = (node, config, indentation, depth, refs, printer) => { |
|
if (nodeIsText(node)) { |
|
return (0, _markup.printText)(node.data, config); |
|
} |
|
|
|
if (nodeIsComment(node)) { |
|
return (0, _markup.printComment)(node.data, config); |
|
} |
|
|
|
const type = nodeIsFragment(node) |
|
? 'DocumentFragment' |
|
: node.tagName.toLowerCase(); |
|
|
|
if (++depth > config.maxDepth) { |
|
return (0, _markup.printElementAsLeaf)(type, config); |
|
} |
|
|
|
return (0, _markup.printElement)( |
|
type, |
|
(0, _markup.printProps)( |
|
nodeIsFragment(node) |
|
? [] |
|
: Array.from(node.attributes) |
|
.map(attr => attr.name) |
|
.sort(), |
|
nodeIsFragment(node) |
|
? {} |
|
: Array.from(node.attributes).reduce((props, attribute) => { |
|
props[attribute.name] = attribute.value; |
|
return props; |
|
}, {}), |
|
config, |
|
indentation + config.indent, |
|
depth, |
|
refs, |
|
printer |
|
), |
|
(0, _markup.printChildren)( |
|
Array.prototype.slice.call(node.childNodes || node.children), |
|
config, |
|
indentation + config.indent, |
|
depth, |
|
refs, |
|
printer |
|
), |
|
config, |
|
indentation |
|
); |
|
}; |
|
|
|
exports.serialize = serialize; |
|
const plugin = { |
|
serialize, |
|
test |
|
}; |
|
var _default = plugin; |
|
exports.default = _default;
|
|
|