mirror of
https://github.com/Sevichecc/Urara-Blog.git
synced 2025-05-02 19:59:31 +08:00
73 lines
1.4 KiB
Text
73 lines
1.4 KiB
Text
/**
|
||
* @fileoverview
|
||
* Get the plain-text value of a hast node.
|
||
* @longdescription
|
||
* ## Use
|
||
*
|
||
* ```js
|
||
* import {h} from 'hastscript'
|
||
* import {toString} from 'hast-util-to-string'
|
||
*
|
||
* toString(h('p', 'Alpha'))
|
||
* //=> 'Alpha'
|
||
* toString(h('div', [h('b', 'Bold'), ' and ', h('i', 'italic'), '.']))
|
||
* //=> 'Bold and italic.'
|
||
* ```
|
||
*
|
||
* ## API
|
||
*
|
||
* ### `toString(node)`
|
||
*
|
||
* Transform a node to a string.
|
||
*/
|
||
|
||
/**
|
||
* @typedef {import('hast').Root} Root
|
||
* @typedef {import('hast').Element} Element
|
||
* @typedef {Root|Root['children'][number]} Node
|
||
*/
|
||
|
||
/**
|
||
* Get the plain-text value of a hast node.
|
||
*
|
||
* @param {Node} node
|
||
* @returns {string}
|
||
*/
|
||
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 {Node} node
|
||
* @returns {string}
|
||
*/
|
||
function one(node) {
|
||
if (node.type === 'text') {
|
||
return node.value
|
||
}
|
||
|
||
return 'children' in node ? all(node) : ''
|
||
}
|
||
|
||
/**
|
||
* @param {Root|Element} node
|
||
* @returns {string}
|
||
*/
|
||
function all(node) {
|
||
let index = -1
|
||
/** @type {string[]} */
|
||
const result = []
|
||
|
||
while (++index < node.children.length) {
|
||
result[index] = one(node.children[index])
|
||
}
|
||
|
||
return result.join('')
|
||
}
|