const INLINE_MARKDOWN_ELEMENTS_OBJECT = {

'strong': /\*\*([^\*]*)\*\*/g,
'em': /_([^_]*)_/g

}

function replaceRegex(string, regex, replacement) {

const newString = string.replace(regex, replacement);
return newString;

}

function escapeCharacters(string, escapeOption) {

const escapedCharactersObject = {
  '\\*': '__asterisk__',
  '\\_': '__underscore__',
  '\\[': '__openBracket__',
  '\\]': '__closeBracket__',
  '\\(': '__openParenthesis__',
  '\\)': '__closeParenthesis__'
}

for (let char in escapedCharactersObject) {
  if (escapedCharactersObject.hasOwnProperty(char)) {
    escapeOption === true ? string = replaceRegex(string, char, escapedCharactersObject[char])
    : escapeOption === false ? string = replaceRegex(string, escapedCharactersObject[char], char.replace(/^\\/g, ''))
    : null;
  }
}
return string;

}

function createAnchorElements(string) {

return string = string.replace(/\[(?<linkText>[^\]]*)\]\((?<linkHref>[^\)]*)\)/g, '<a href="$<linkHref>" target="_blank" rel="noopener noreferrer">$<linkText></a>');

}

function replacer(match, p1) {

if ( p1 === '' ) { // Filters out the '__' (double underscore) matches.
  return match;
} else {
  for (var el in INLINE_MARKDOWN_ELEMENTS_OBJECT) {
    if (INLINE_MARKDOWN_ELEMENTS_OBJECT.hasOwnProperty(el)) {
      match = match.replace(INLINE_MARKDOWN_ELEMENTS_OBJECT[el], '<' + el + '>$1</' + el + '>' );
    }
  }
  return match;
}

}

function createInlineElements(string) {

for (var el in INLINE_MARKDOWN_ELEMENTS_OBJECT) {
  if (INLINE_MARKDOWN_ELEMENTS_OBJECT.hasOwnProperty(el)) {
    string = string.replace(INLINE_MARKDOWN_ELEMENTS_OBJECT[el], replacer);
  }
}
return string;

}

function paragraphReplacer(match, p1) {

if ( p1 === '' ) { // Filters out blank lines
  return match;
} else {
  return match.replace(/^(.*)$/gm, '<p class="typography__alert">$1</p>');
}

}

function createParagraphElements(string) {

return string = string.replace(/^(.*)$/gm, paragraphReplacer);

}

function parseMarkdownToHTML(string) {

const escapedString = escapeCharacters(string, true);
const stringWithInlineElements = createInlineElements(escapedString);
const stringWithAnchorElements = createAnchorElements(stringWithInlineElements);
const stringWithParagraphElements = createParagraphElements(stringWithAnchorElements);
const unescapedString = escapeCharacters(stringWithParagraphElements, false);
//console.log(unescapedString);
return unescapedString;

}

// // USAGE: // import parseMarkdownToHTML from './parseMarkdownToHTML.js'; // // parseMarkdownToHTML(stringContainingSimplifiedMarkdown);

export default parseMarkdownToHTML;