KhodeN
6/21/2018 - 10:29 AM

Converter markdown multilevel list to jasmine/mocha tests structure http://jsbin.com/qahurad

Converter markdown multilevel list to jasmine/mocha tests structure http://jsbin.com/qahurad

'use strict';

var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();

function parseTree(list) {
    var root = {
        title: 'Корень',
        parent: null,
        children: [],
        level: -1
    };

    list.split('\n').map(function (r) {
        return r.match(/^(\s*)- (.+?)$/);
    }).filter(function (r) {
        return r;
    }).reduce(function (acc, row) {
        var _row = _slicedToArray(row, 3);

        var _ = _row[0];
        var indent = _row[1];
        var title = _row[2];

        var level = indent.length / 2;
        var item = { title: title, level: level, children: [] };

        // Next is child
        if (item.level > acc.level) {
            item.parent = acc;
        }

        // Next is uncle
        if (item.level < acc.level) {
            var diff = acc.level - level;
            switch (diff) {
                case 1:
                    item.parent = acc.parent.parent;
                    break;
                case 2:
                    item.parent = acc.parent.parent.parent;
                    break;
                case 3:
                    item.parent = acc.parent.parent.parent.parent;
                    break;
            }
        }

        // Next is sibling
        if (level === acc.level) {
            item.parent = acc.parent;
        }

        item.parent.children.push(item);
        return item;
    }, root);

    return root;
}

function toCode(branch) {
    var result = '';
    var indent = '';
    for (var i = -1; i < branch.level; i += 1) {
        indent += '  ';
    }
    if (branch.children.length > 0) {
        var content = branch.children.map(function (c) {
            return toCode(c);
        });
        result += indent + 'xdescribe(\'' + branch.title + '\', () => {\n' + content.join('\n') + '\n' + indent + '});\n';
    } else {
        result += indent + 'xit(\'' + branch.title + '\', () => {\n' + indent + '  // TODO\n' + indent + '});\n';
    }

    return result;
};

function convert(list) {
    var tree = parseTree(list);
    return toCode(tree);
}

console.clear();

var gbi = function gbi(id) {
    return document.querySelector('#' + id);
};

gbi('convert').addEventListener('click', function () {
    var list = gbi('in').value;
    gbi('out').value = convert(list);
});
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
    <table>
        <tr>
            <td>
                <textarea id="in" cols=50 rows=30>- Вход/регистрация
  - [COMPLETE] Авторизация
  - Регистрация
  - Восстановление пароля #отложено 
  - Подтверждение email #отложено 
  - Выход
- Общие действия
  - Выбор элементов списков
    - Прогрузка элементов при выборе всех
  - Работа фильтров (в т.ч. поиска) и сортировки
  - Работа с тулбаром
  - На каждой странице проверять
    - Заголовок окна
    - Хлебную крошку
    - Тип компонента-страницы (тег)
    - URL
  - Раздел групп
    - Переключение режима видимости
    - Создание групп
    - Удаление групп
    - Переименование групп
    - Проверка на страницах проксей, аккаунтов, задач
    - Удаление элемента из группы
- Дашборд
  - Вызов помощи (индексной страницы)
  - Меню скачивания агента
  - Переключение режима бокового меню
  - Версия и чейнжлог
  - Покупка лицензии
- Настройки
  - Вызов помощи по настройкам
  - Установка часового пояса
  - Установка режима антибана
  - Настройки антикапчи (в т.ч. проверка баланса)
  - Редактирование списка UA
  - Просмотр списка лицензий
  - Привязывание Dropbox #отложено 
- Прокси
  - Вызов помощи по прокси (список/добавление)
  - Добавление прокси вручную
  - Импорт проксей
    - В том числе с ошибками
  - Список проксей  (группы, фильтры, сортировки)
  - Действия
    - Запуск проверки
    - Остановка/возобновление активности
    - Удаление прокси
    - Экспорт в CSV
  - Страница прокси
    - Редактирование
    - Дополнительная информация
    - Список аккаунтов
    - Журнал
- Аккаунты
  - Вызов помощи по аккаунтам (список/добавление)
  - Добавление аккаунтов вручную
  - Импорт аккаунтов
    - В том числе в формате spotlight
    - В том числе с ошибками
  - Список аккаунтов (группы, фильтры, сортировки)
  - Действия
    - Авторизация
    - Статистика
    - Удаление
    - Открытие стены ВК
    - Остановка/возобновление активности
    - Распределение UA
    - Распределение прокси автоматически
    - Распределение прокси вручную
    - Экспорт в CSV
  - Редактирование
    - Открытие стены
    - Открытие статистики
    - Смена пароля аккаунта
    - Смена UA
    - Смена прокси
    - Просмотр журнала событий
- Списки
  - Вызов справки по работе со списками
  - Список списков
  - Импорт списка
  - Импорт списков из Spotlight
- Задачи
  - Вызов помощи по задачам (проверить также разную помощь в разных типах задач)
  - Создание и редактирование
    - Параметры задачи
      - Масслайк
      - Пригласить в друзья
      - Пригласить в сообщество
      - Пригласить из группы на мероприятие
      - Заполнение аккаунта
      - Очистка аккаунта
      - Поставить лайк
      - Рассылка сообщений
      - Обслуживание аккаунта
    - Список аккаунтов на задаче
    - Расписание
    - Журнал
  - Список задач (группы, фильтры, сортировки)
  - Действия
    - Запуск
    - Остановка
    - Статистика
    - Удаление
    - Дублирование
- Журнал
  - Вызов помощи по журналу
- Статистика команд
  - Вызов помощи по статистике команд
- Статистика по капчам
  - Вызов помощи по статистики капчей
- Мультичат #отложено 
  - Вызов помощи
  - Аккаунты
    - Добавление аккаунта в чат
    - Удаление аккаунта в чат
    - Поиск аккаунтов в чате
  - Диалоги
    - Фильтрация диалогов
    - Начать новый диалог
    - Открыть диалог
  - Написать сообщение
  - Получить сообщение
    - В том числе на другой странице (уведомление)
</textarea>
            </td>
            <td>
                <button id="convert">></button>
            </td>
            <td>
                <textarea id="out" cols=50 rows=30></textarea>
            </td>
        </tr>
    </table>
    
<script id="jsbin-javascript">
'use strict';

var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();

function parseTree(list) {
    var root = {
        title: 'Корень',
        parent: null,
        children: [],
        level: -1
    };

    list.split('\n').map(function (r) {
        return r.match(/^(\s*)- (.+?)$/);
    }).filter(function (r) {
        return r;
    }).reduce(function (acc, row) {
        var _row = _slicedToArray(row, 3);

        var _ = _row[0];
        var indent = _row[1];
        var title = _row[2];

        var level = indent.length / 2;
        var item = { title: title, level: level, children: [] };

        // Next is child
        if (item.level > acc.level) {
            item.parent = acc;
        }

        // Next is uncle
        if (item.level < acc.level) {
            var diff = acc.level - level;
            switch (diff) {
                case 1:
                    item.parent = acc.parent.parent;
                    break;
                case 2:
                    item.parent = acc.parent.parent.parent;
                    break;
                case 3:
                    item.parent = acc.parent.parent.parent.parent;
                    break;
            }
        }

        // Next is sibling
        if (level === acc.level) {
            item.parent = acc.parent;
        }

        item.parent.children.push(item);
        return item;
    }, root);

    return root;
}

function toCode(branch) {
    var result = '';
    var indent = '';
    for (var i = -1; i < branch.level; i += 1) {
        indent += '  ';
    }
    if (branch.children.length > 0) {
        var content = branch.children.map(function (c) {
            return toCode(c);
        });
        result += indent + 'xdescribe(\'' + branch.title + '\', () => {\n' + content.join('\n') + '\n' + indent + '});\n';
    } else {
        result += indent + 'xit(\'' + branch.title + '\', () => {\n' + indent + '  // TODO\n' + indent + '});\n';
    }

    return result;
};

function convert(list) {
    var tree = parseTree(list);
    return toCode(tree);
}

console.clear();

var gbi = function gbi(id) {
    return document.querySelector('#' + id);
};

gbi('convert').addEventListener('click', function () {
    var list = gbi('in').value;
    gbi('out').value = convert(list);
});
</script>



<script id="jsbin-source-javascript" type="text/javascript">function parseTree(list) {
    const root = {
        title: 'Корень', 
        parent: null,
        children: [],
        level: -1
    };
    
    list.split('\n')
        .map(r => r.match(/^(\s*)- (.+?)$/))
        .filter(r => r)
        .reduce((acc, row) => {
            const [_, indent, title] = row;
            const level = indent.length/2;
            const item = {title,level,children:[]};

            // Next is child
            if (item.level > acc.level) {
                item.parent = acc;
            }

            // Next is uncle
            if (item.level < acc.level) {
                const diff = acc.level - level;
                switch(diff){
                    case 1:
                        item.parent = acc.parent.parent;
                        break;
                    case 2:
                        item.parent = acc.parent.parent.parent;
                        break;
                    case 3:
                        item.parent = acc.parent.parent.parent.parent;
                        break;
                }
            }

            // Next is sibling
            if (level === acc.level){
                item.parent = acc.parent;
            }

            item.parent.children.push(item);
            return item;
        }, root);
    
    return root;
}

function toCode(branch) {
    let result = '';
    let indent = '';
    for (let i = -1; i < branch.level; i+=1){
        indent+='  ';
    }
    if (branch.children.length > 0) {
        const content = branch.children.map(c => toCode(c))
        result += `${indent}xdescribe('${branch.title}', () => {
${content.join('\n')}
${indent}});\n`;
    } else {
        result += `${indent}xit('${branch.title}', () => {
${indent}  // TODO
${indent}});\n`;
    }
    
    return result;
};

function convert(list) {
    const tree = parseTree(list);
    return toCode(tree);
}

console.clear();

const gbi = id => document.querySelector(`#${id}`);

gbi('convert').addEventListener('click', () =>{
    const list = gbi('in').value;
    gbi('out').value = convert(list);
});



</script></body>
</html>