import { replaceMatch } from '../internal';
import { BlockMDParser, BlockMDRule } from './type';

/**
 * Parses block-level markdown text into HTML using defined block rules.
 *
 * @param text - The text to parse.
 * @param rule - The markdown rule to run.
 * @param parse - A function that run the parser on remaining parts..
 * @param parseInline - Optional function to parse inline elements.
 * @returns The text with the markdown rule applied or `undefined` if no match is found.
 */
export const runBlockRule = (
  text: string,
  rule: BlockMDRule,
  parse: BlockMDParser,
  parseInline?: (txt: string) => string
): string | undefined => {
  const matchResult = rule.match(text);
  if (matchResult) {
    const content = rule.html(matchResult, parseInline);
    return replaceMatch(text, matchResult, content, (txt) => [parse(txt, parseInline)]).join('');
  }
  return undefined;
};
