56 lines
1 KiB
JavaScript
56 lines
1 KiB
JavaScript
/**
|
||
* @typedef {import('hast').Nodes} Nodes
|
||
* @typedef {import('hast').Parents} Parents
|
||
*/
|
||
|
||
/**
|
||
* Get the plain-text value of a hast node.
|
||
*
|
||
* @param {Nodes} node
|
||
* Node to serialize.
|
||
* @returns {string}
|
||
* Serialized node.
|
||
*/
|
||
export function toString(node) {
|
||
// “The concatenation of data of all the Text node descendants of the context
|
||
// object, in tree order.”
|
||
if ('children' in node) {
|
||
return all(node)
|
||
}
|
||
|
||
// “Context object’s data.”
|
||
return 'value' in node ? node.value : ''
|
||
}
|
||
|
||
/**
|
||
* @param {Nodes} node
|
||
* Node.
|
||
* @returns {string}
|
||
* Serialized node.
|
||
*/
|
||
function one(node) {
|
||
if (node.type === 'text') {
|
||
return node.value
|
||
}
|
||
|
||
return 'children' in node ? all(node) : ''
|
||
}
|
||
|
||
/**
|
||
* @param {Parents} node
|
||
* Node.
|
||
* @returns {string}
|
||
* Serialized node.
|
||
*/
|
||
function all(node) {
|
||
let index = -1
|
||
/** @type {Array<string>} */
|
||
const result = []
|
||
|
||
while (++index < node.children.length) {
|
||
result[index] = one(node.children[index])
|
||
}
|
||
|
||
return result.join('')
|
||
}
|