mirror of
https://github.com/Sevichecc/Urara-Blog.git
synced 2025-05-02 07:19:30 +08:00
55 lines
1.3 KiB
Text
55 lines
1.3 KiB
Text
/**
|
||
* @typedef Options
|
||
* @property {boolean} [includeImageAlt=true]
|
||
*/
|
||
|
||
/**
|
||
* Get the text content of a node.
|
||
* Prefer the node’s plain-text fields, otherwise serialize its children,
|
||
* and if the given value is an array, serialize the nodes in it.
|
||
*
|
||
* @param {unknown} node
|
||
* @param {Options} [options]
|
||
* @returns {string}
|
||
*/
|
||
export function toString(node, options) {
|
||
var {includeImageAlt = true} = options || {}
|
||
return one(node, includeImageAlt)
|
||
}
|
||
|
||
/**
|
||
* @param {unknown} node
|
||
* @param {boolean} includeImageAlt
|
||
* @returns {string}
|
||
*/
|
||
function one(node, includeImageAlt) {
|
||
return (
|
||
(node &&
|
||
typeof node === 'object' &&
|
||
// @ts-ignore looks like a literal.
|
||
(node.value ||
|
||
// @ts-ignore looks like an image.
|
||
(includeImageAlt ? node.alt : '') ||
|
||
// @ts-ignore looks like a parent.
|
||
('children' in node && all(node.children, includeImageAlt)) ||
|
||
(Array.isArray(node) && all(node, includeImageAlt)))) ||
|
||
''
|
||
)
|
||
}
|
||
|
||
/**
|
||
* @param {Array.<unknown>} values
|
||
* @param {boolean} includeImageAlt
|
||
* @returns {string}
|
||
*/
|
||
function all(values, includeImageAlt) {
|
||
/** @type {Array.<string>} */
|
||
var result = []
|
||
var index = -1
|
||
|
||
while (++index < values.length) {
|
||
result[index] = one(values[index], includeImageAlt)
|
||
}
|
||
|
||
return result.join('')
|
||
}
|