На планете Альфа-Центавра, населённой высокоразвитыми хищными гуманоидами, находится Университет умных наук и нежданного кусь.
Там на последнем курсе учатся два студента — Пупус и Лупус. Они весь семестр разрабатывали новую платформу документации для родного университета в качестве курсовой работы.
В ночь перед сдачей стало понятно, что Пупус и Лупус что-то напутали и перенесли из старой системы списки в формате html вместо markdown.
Было решено написать скрипт, который исправит ошибку автоматически. Помогите студентам сделать это, иначе преподаватель откусит им руки по самые коленки (это аналог оценки 2 на Земле).
Вам нужно написать функцию, которая на вход принимает HTML, содержащий один или больше списков, и преобразует его в markdown-подобную разметку.
В качестве решения этого задания отправьте файл .js, в котором объявлена функция solution:
function solution(input) {
// ...
}
Формат ввода
HTML приходит в виде строки:
<ul>
<li>content</li>
<li>more content</li>
<ol>
<li> numbered item</li>
<li>second numbered
item</li>
</ol>
<li> even more content</li>
</ul>
<ol>
<li>numbered item</li>
<li>second numbered item</li>
<ol>
<li>numbered sublist item</li>
<li>another one</li>
<ol>
<li>third numbered level</li>
</ol>
</ol>
</ol>
- Списки могут быть ненумерованные ul и нумерованные ol.
- Каждый список содержит хотя бы один элемент li, всегда в качестве первого потомка.
- li может содержать только текст и не может быть пустым.
- Нумерованный список ol может содержать в себе, помимо li, другие нумерованные списки.
- Ненумерованный список ul, помимо li, может содержать оба типа списков.
- Два нумерованных списка ol подряд никогда не идут.
Пробелы и переносы строк в исходном HTML могут встречаться в любом месте, не нарушающем валидность HTML.
Формат вывода
На выходе должна получиться строка с markdown-разметкой:
- content
- more content
1. numbered item
2. second numbered item
- even more content
1. numbered item
2. second numbered item
2.1. numbered sublist item
2.2. another one
2.2.1. third numbered level
- Пробелы по краям содержимого тегов li должны быть удалены.
- Более одного пробела подряд в содержимом тегов li должны быть заменены одним пробелом.
- Переносы строк в содержимом тегов li должны быть удалены.
- Вложенные списки имеют дополнительный отступ, равный количеству символов до содержимого от начала строки у предыдущего элемента.
- Нумерация в каждом нумерованном списке начинается с единицы (1.).
- Если нумерованный список вложен в другой нумерованный список, то каждому его элементу добавляется номер предыдущего элемента в родительском списке.
Примечания
- Для перевода строки нужно использовать символ \n.
- Решение будет проверяться в браузерном окружении (Chrome 78) с доступом к объектам document и window.
- Можно использовать синтаксис до es2018 включительно.