/*
 * SPDX-FileCopyrightText: 2020 The HedgeDoc developers (see AUTHORS file)
 *
 * SPDX-License-Identifier: AGPL-3.0-only
 */

import { parseDocument } from 'htmlparser2'
import { processNodes } from './processNodes.js'
import { ReactElement } from 'react'
import { Document } from 'domhandler'
import { NodeToReactElementTransformer } from './NodeToReactElementTransformer.js'

export interface ParserOptions {
  decodeEntities?: boolean
  transform?: NodeToReactElementTransformer
  preprocessNodes?: (nodes: Document) => Document
}

/**
 * Parses an HTML string and returns a list of React components generated from it
 *
 * @param {String} html The HTML to convert into React component
 * @param {Object} options Options to pass
 * @returns {Array} List of top level React elements
 */
export function convertHtmlToReact(
  html: string,
  options?: ParserOptions,
): (ReactElement | string | null)[] {
  const parsedDocument = parseDocument(html, {
    decodeEntities: options?.decodeEntities ?? true,
  })

  const processedDocument = options?.preprocessNodes?.(parsedDocument) ?? parsedDocument

  return processNodes(processedDocument.childNodes, options?.transform)
}
