21 subscriber

D. Путаница. Чемпионат по программированию Яндекса: Фронтенд, Квалификация

На планете Альфа-Центавра, населённой высокоразвитыми хищными гуманоидами, находится Университет умных наук и нежданного кусь.

Там на последнем курсе учатся два студента — Пупус и Лупус. Они весь семестр разрабатывали новую платформу документации для родного университета в качестве курсовой работы.

В ночь перед сдачей стало понятно, что Пупус и Лупус что-то напутали и перенесли из старой системы списки в формате 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 включительно.