"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = remarkStripTrailingBreaks;
var _mdastUtilToString = _interopRequireDefault(require("mdast-util-to-string"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
 * Removes break nodes that are at the end of a block.
 *
 * When a trailing double space or backslash is encountered at the end of a
 * markdown block, Remark will interpret the character(s) literally, as only
 * break entities followed by text qualify as breaks. A manually created MDAST,
 * however, may have such entities, and users of visual editors shouldn't see
 * these artifacts in resulting markdown.
 */
function remarkStripTrailingBreaks() {
  function transform(node) {
    if (node.children) {
      node.children = node.children.map((child, idx, children) => {
        /**
         * Only touch break nodes. Convert all subsequent nodes to their text
         * value and exclude the break node if no non-whitespace characters
         * are found.
         */
        if (child.type === 'break') {
          const subsequentNodes = children.slice(idx + 1);

          /**
           * Create a small MDAST so that mdastToString can process all
           * siblings as children of one node rather than making multiple
           * calls.
           */
          const fragment = {
            type: 'root',
            children: subsequentNodes
          };
          const subsequentText = (0, _mdastUtilToString.default)(fragment);
          return subsequentText.trim() ? child : null;
        }

        /**
         * Always return the child if not a break.
         */
        return child;
      })

      /**
       * Because some break nodes may be excluded, we filter out the resulting
       * null values.
       */.filter(child => child)

      /**
       * Recurse through the MDAST by transforming each individual child node.
       */.map(transform);
    }
    return node;
  }
  return transform;
}