/** * @fileoverview * Collapse whitespace. * * Normally, collapses to a single space. * If `newlines: true`, collapses whitespace containing newlines to `'\n'` * instead of `' '`. * @example *
This and that
*/ 'use strict' var is = require('hast-util-is-element') var embedded = require('hast-util-embedded') var convert = require('unist-util-is/convert') var whitespace = require('hast-util-whitespace') var blocks = require('./block') var contents = require('./content') var skippables = require('./skippable') module.exports = minifyWhitespace var ignorableNode = convert(['doctype', 'comment']) var parent = convert(['element', 'root']) var root = convert(['root']) var element = convert(['element']) var text = convert(['text']) function minifyWhitespace(options) { var collapse = collapseFactory( (options || {}).newlines ? replaceNewlines : replaceWhitespace ) return transform function transform(tree) { minify(tree, {collapse: collapse, whitespace: 'normal'}) } } function minify(node, options) { var settings if (parent(node)) { settings = Object.assign({}, options) if (root(node) || blocklike(node)) { settings.before = true settings.after = true } settings.whitespace = inferWhiteSpace(node, options) return all(node, settings) } if (text(node)) { if (options.whitespace === 'normal') { return minifyText(node, options) } // Naïve collapse, but no trimming: if (options.whitespace === 'nowrap') { node.value = options.collapse(node.value) } // The `pre-wrap` or `pre` whitespace settings are neither collapsed nor // trimmed. } return { remove: false, ignore: ignorableNode(node), stripAtStart: false } } function minifyText(node, options) { var value = options.collapse(node.value) var start = 0 var end = value.length var result = {remove: false, ignore: false, stripAtStart: false} if (options.before && removable(value.charAt(0))) { start++ } if (start !== end && removable(value.charAt(end - 1))) { if (options.after) { end-- } else { result.stripAtStart = true } } if (start === end) { result.remove = true } else { node.value = value.slice(start, end) } return result } function all(parent, options) { var before = options.before var after = options.after var children = parent.children var length = children.length var index = -1 var result while (++index < length) { result = minify( children[index], Object.assign({}, options, { before: before, after: collapsableAfter(children, index, after) }) ) if (result.remove) { children.splice(index, 1) index-- length-- } else if (!result.ignore) { before = result.stripAtStart } // If this element, such as a `