Помогите Пожалуйста c js

введите сюда описание изображения

введите сюда описание изображения

Редактор разметки текстов

Чтобы упростить жизнь контент-менеджеру сайта, сделали простую CMS, в которой тексты статей набираются в кастомной разметке.

Набор операторов ограничен:

  • Заголовки
  • Неупорядоченные списки одного уровня вложенности
  • Абзацы — Ссылки

Необходимо написать тело преобразующей функции

module.exports = (str) => {
    //  Ваш код здесь
};

Формат ввода

= head

text ((https://ya.ru link)) text.

* item
* item

Формат вывода

<h1>head</h1><p>text <a href="https://ya.ru">link</a> text.</p><ul><li>item</li><li>item</li></ul>

Примечания

Незначимые пробелы и переносы строк на выходе не имеют значения, т.к. в тестах html приводится к одной строке, а лишние пробелы удаляются;

Одинарные кавычки в тесте приводятся к двойным;

Формат заголовка (Начало строки, знак равно, пробел, текст заголовка, конец строки);

Формат абзаца (Начало строки, текст абзаца, конец строки);

Формат списка (Пункт списка, повторенный один и более раз: Начало строки, звёздочка, пробел, текст, конец строки. До и после списка пустые строки);

Формат ссылки (Две открывающие скобки, адрес ссылки, первый пробел, текст ссылки с любым кол-вом пробелов, две закрывающие скобки)

введите сюда описание изображения


Ответы (1 шт):

Автор решения: vsemozhebuty

Один из вариантов:

module.exports = (str) => {
  let html = '';

  let context = null;

  const linkRegExp = /\(\((?<href>.+?) (?<text>.+?)\)\)/igu;
  const linkReplacement = '<a href="$<href>">$<text></a>'

  for (const line of str.split(/\r?\n/)) {
    if (line.startsWith('* ')) {
      if (context !== 'ul') {
        html += '<ul>';
        context = 'ul';
      }

      html += `<li>${line.slice(2)}</li>`;
    } else {
      if (context === 'ul') {
        html += '</ul>';
        context = null;
      }

      if (line.startsWith('= ')) {
        html += `<h1>${line.slice(2)}</h1>`;
      } else if (line.trim().length !== 0) {
        html += `<p>${line.replace(linkRegExp, linkReplacement)}</p>`;
      }
    }
  }

  if (context === 'ul') {
    html += '</ul>';
    context = null;
  }

  return html;
};
→ Ссылка