Guest User

Untitled

a guest
Jun 22nd, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.87 KB | None | 0 0
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width">
  6. <title>JS Bin</title>
  7. </head>
  8. <body>
  9. <table>
  10. <tr>
  11. <td>
  12. <textarea id="in" cols=50 rows=30>- Вход/регистрация
  13. - [COMPLETE] Авторизация
  14. - Регистрация
  15. - Восстановление пароля #отложено
  16. - Подтверждение email #отложено
  17. - Выход
  18. - Общие действия
  19. - Выбор элементов списков
  20. - Прогрузка элементов при выборе всех
  21. - Работа фильтров (в т.ч. поиска) и сортировки
  22. - Работа с тулбаром
  23. - На каждой странице проверять
  24. - Заголовок окна
  25. - Хлебную крошку
  26. - Тип компонента-страницы (тег)
  27. - URL
  28. - Раздел групп
  29. - Переключение режима видимости
  30. - Создание групп
  31. - Удаление групп
  32. - Переименование групп
  33. - Проверка на страницах проксей, аккаунтов, задач
  34. - Удаление элемента из группы
  35. - Дашборд
  36. - Вызов помощи (индексной страницы)
  37. - Меню скачивания агента
  38. - Переключение режима бокового меню
  39. - Версия и чейнжлог
  40. - Покупка лицензии
  41. - Настройки
  42. - Вызов помощи по настройкам
  43. - Установка часового пояса
  44. - Установка режима антибана
  45. - Настройки антикапчи (в т.ч. проверка баланса)
  46. - Редактирование списка UA
  47. - Просмотр списка лицензий
  48. - Привязывание Dropbox #отложено
  49. - Прокси
  50. - Вызов помощи по прокси (список/добавление)
  51. - Добавление прокси вручную
  52. - Импорт проксей
  53. - В том числе с ошибками
  54. - Список проксей (группы, фильтры, сортировки)
  55. - Действия
  56. - Запуск проверки
  57. - Остановка/возобновление активности
  58. - Удаление прокси
  59. - Экспорт в CSV
  60. - Страница прокси
  61. - Редактирование
  62. - Дополнительная информация
  63. - Список аккаунтов
  64. - Журнал
  65. - Аккаунты
  66. - Вызов помощи по аккаунтам (список/добавление)
  67. - Добавление аккаунтов вручную
  68. - Импорт аккаунтов
  69. - В том числе в формате spotlight
  70. - В том числе с ошибками
  71. - Список аккаунтов (группы, фильтры, сортировки)
  72. - Действия
  73. - Авторизация
  74. - Статистика
  75. - Удаление
  76. - Открытие стены ВК
  77. - Остановка/возобновление активности
  78. - Распределение UA
  79. - Распределение прокси автоматически
  80. - Распределение прокси вручную
  81. - Экспорт в CSV
  82. - Редактирование
  83. - Открытие стены
  84. - Открытие статистики
  85. - Смена пароля аккаунта
  86. - Смена UA
  87. - Смена прокси
  88. - Просмотр журнала событий
  89. - Списки
  90. - Вызов справки по работе со списками
  91. - Список списков
  92. - Импорт списка
  93. - Импорт списков из Spotlight
  94. - Задачи
  95. - Вызов помощи по задачам (проверить также разную помощь в разных типах задач)
  96. - Создание и редактирование
  97. - Параметры задачи
  98. - Масслайк
  99. - Пригласить в друзья
  100. - Пригласить в сообщество
  101. - Пригласить из группы на мероприятие
  102. - Заполнение аккаунта
  103. - Очистка аккаунта
  104. - Поставить лайк
  105. - Рассылка сообщений
  106. - Обслуживание аккаунта
  107. - Список аккаунтов на задаче
  108. - Расписание
  109. - Журнал
  110. - Список задач (группы, фильтры, сортировки)
  111. - Действия
  112. - Запуск
  113. - Остановка
  114. - Статистика
  115. - Удаление
  116. - Дублирование
  117. - Журнал
  118. - Вызов помощи по журналу
  119. - Статистика команд
  120. - Вызов помощи по статистике команд
  121. - Статистика по капчам
  122. - Вызов помощи по статистики капчей
  123. - Мультичат #отложено
  124. - Вызов помощи
  125. - Аккаунты
  126. - Добавление аккаунта в чат
  127. - Удаление аккаунта в чат
  128. - Поиск аккаунтов в чате
  129. - Диалоги
  130. - Фильтрация диалогов
  131. - Начать новый диалог
  132. - Открыть диалог
  133. - Написать сообщение
  134. - Получить сообщение
  135. - В том числе на другой странице (уведомление)
  136. </textarea>
  137. </td>
  138. <td>
  139. <button id="convert">></button>
  140. </td>
  141. <td>
  142. <textarea id="out" cols=50 rows=30></textarea>
  143. </td>
  144. </tr>
  145. </table>
  146.  
  147. <script id="jsbin-javascript">
  148. 'use strict';
  149.  
  150. 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'); } }; })();
  151.  
  152. function parseTree(list) {
  153. var root = {
  154. title: 'Корень',
  155. parent: null,
  156. children: [],
  157. level: -1
  158. };
  159.  
  160. list.split('\n').map(function (r) {
  161. return r.match(/^(\s*)- (.+?)$/);
  162. }).filter(function (r) {
  163. return r;
  164. }).reduce(function (acc, row) {
  165. var _row = _slicedToArray(row, 3);
  166.  
  167. var _ = _row[0];
  168. var indent = _row[1];
  169. var title = _row[2];
  170.  
  171. var level = indent.length / 2;
  172. var item = { title: title, level: level, children: [] };
  173.  
  174. // Next is child
  175. if (item.level > acc.level) {
  176. item.parent = acc;
  177. }
  178.  
  179. // Next is uncle
  180. if (item.level < acc.level) {
  181. var diff = acc.level - level;
  182. switch (diff) {
  183. case 1:
  184. item.parent = acc.parent.parent;
  185. break;
  186. case 2:
  187. item.parent = acc.parent.parent.parent;
  188. break;
  189. case 3:
  190. item.parent = acc.parent.parent.parent.parent;
  191. break;
  192. }
  193. }
  194.  
  195. // Next is sibling
  196. if (level === acc.level) {
  197. item.parent = acc.parent;
  198. }
  199.  
  200. item.parent.children.push(item);
  201. return item;
  202. }, root);
  203.  
  204. return root;
  205. }
  206.  
  207. function toCode(branch) {
  208. var result = '';
  209. var indent = '';
  210. for (var i = -1; i < branch.level; i += 1) {
  211. indent += ' ';
  212. }
  213. if (branch.children.length > 0) {
  214. var content = branch.children.map(function (c) {
  215. return toCode(c);
  216. });
  217. result += indent + 'xdescribe(\'' + branch.title + '\', () => {\n' + content.join('\n') + '\n' + indent + '});\n';
  218. } else {
  219. result += indent + 'xit(\'' + branch.title + '\', () => {\n' + indent + ' // TODO\n' + indent + '});\n';
  220. }
  221.  
  222. return result;
  223. };
  224.  
  225. function convert(list) {
  226. var tree = parseTree(list);
  227. return toCode(tree);
  228. }
  229.  
  230. console.clear();
  231.  
  232. var gbi = function gbi(id) {
  233. return document.querySelector('#' + id);
  234. };
  235.  
  236. gbi('convert').addEventListener('click', function () {
  237. var list = gbi('in').value;
  238. gbi('out').value = convert(list);
  239. });
  240. </script>
  241.  
  242.  
  243.  
  244. <script id="jsbin-source-javascript" type="text/javascript">function parseTree(list) {
  245. const root = {
  246. title: 'Корень',
  247. parent: null,
  248. children: [],
  249. level: -1
  250. };
  251.  
  252. list.split('\n')
  253. .map(r => r.match(/^(\s*)- (.+?)$/))
  254. .filter(r => r)
  255. .reduce((acc, row) => {
  256. const [_, indent, title] = row;
  257. const level = indent.length/2;
  258. const item = {title,level,children:[]};
  259.  
  260. // Next is child
  261. if (item.level > acc.level) {
  262. item.parent = acc;
  263. }
  264.  
  265. // Next is uncle
  266. if (item.level < acc.level) {
  267. const diff = acc.level - level;
  268. switch(diff){
  269. case 1:
  270. item.parent = acc.parent.parent;
  271. break;
  272. case 2:
  273. item.parent = acc.parent.parent.parent;
  274. break;
  275. case 3:
  276. item.parent = acc.parent.parent.parent.parent;
  277. break;
  278. }
  279. }
  280.  
  281. // Next is sibling
  282. if (level === acc.level){
  283. item.parent = acc.parent;
  284. }
  285.  
  286. item.parent.children.push(item);
  287. return item;
  288. }, root);
  289.  
  290. return root;
  291. }
  292.  
  293. function toCode(branch) {
  294. let result = '';
  295. let indent = '';
  296. for (let i = -1; i < branch.level; i+=1){
  297. indent+=' ';
  298. }
  299. if (branch.children.length > 0) {
  300. const content = branch.children.map(c => toCode(c))
  301. result += `${indent}xdescribe('${branch.title}', () => {
  302. ${content.join('\n')}
  303. ${indent}});\n`;
  304. } else {
  305. result += `${indent}xit('${branch.title}', () => {
  306. ${indent} // TODO
  307. ${indent}});\n`;
  308. }
  309.  
  310. return result;
  311. };
  312.  
  313. function convert(list) {
  314. const tree = parseTree(list);
  315. return toCode(tree);
  316. }
  317.  
  318. console.clear();
  319.  
  320. const gbi = id => document.querySelector(`#${id}`);
  321.  
  322. gbi('convert').addEventListener('click', () =>{
  323. const list = gbi('in').value;
  324. gbi('out').value = convert(list);
  325. });
  326.  
  327.  
  328.  
  329. </script></body>
  330. </html>
Add Comment
Please, Sign In to add comment