Помогите Пожалуйста 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 шт):
Один из вариантов:
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;
};