Advertisement
Guest User

SVALKO++

a guest
Sep 13th, 2022
389
0
162 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
JavaScript 37.53 KB | Source Code | 0 0
  1. // ==UserScript==
  2. // @name               SVALKO++
  3. // @namespace          https://svalko.org
  4. // @version            0.31a
  5. // @description        Добавление различных улучшений для свалки
  6. // @author             погромист
  7. // @license            CC-BY-NC-SA-4.0
  8. // @icon               https://www.google.com/s2/favicons?domain=svalko.org
  9. // @match              https://svalko.org/*
  10. // @connect            *
  11. // @grant              GM_getValue
  12. // @grant              GM_setValue
  13. // @grant              GM.xmlHttpRequest
  14. // @run-at             document-start
  15. // ==/UserScript==
  16.  
  17. // Настройки по умолчанию. GUI пока нету, так что настраивать здесь
  18. var check_links = true; // Проверка ссылок, нужно разрешение на кроссдоменные запросы ДЛЯ ВСЕХ ДОМЕНОВ
  19. var patterns = []; // шаблоны для комментариев
  20. var maxCommentVideos = 1; // максимум видео в комменте
  21. var maxCommentImages = 5; // максимум картинок в комменте
  22. var maxCommentLines = 200; // максимум строк текста в комменте
  23. var russianDate = false; // изменение формата времени поста
  24. var showSeconds = true; // отображение секунд во времени поста
  25. var use_darkstyle = false; // использовать стиль темной свалки
  26. var dateButtons = [ 'btnan', 'btnci', 'btnso', 'btnst', 'btnba' ]; // список активных кнопок комментария
  27. // Настройки
  28.  
  29. var scriptStyle =
  30.     '.text.ban, .hidden { display: none; }' +
  31.     '.block_date { margin: 4px 0 -10px; }' +
  32.     '.active { color: red; }' +
  33.     '.line { margin: auto 5px; }' +
  34.     '.banned { background-color: #FBB2B2 !important; } ' +
  35.     '.btn { position: relative; padding: 0 2px; border: 1px solid blue; background-color: #FFFFFF; } .btn.add { left: 8px; height: 22px; }' +
  36.     '.btn.flat { margin: 2px; background-color: #F2F2F2; } .btn.flat:active { border: 1px solid red; } .btn.flat:hover { background-color: #CCCCCC !important; }' +
  37.     '.btn.flat.right { float: right; right: 48px; }' +
  38.     '.link.archive { display: inline-block; margin: 0 4px; }' +
  39.     '#add_bold { font-weight: bold; } #add_italic { font-style: italic; } #add_underline { text-decoration: underline; } #add_strikethrough { text-decoration: line-through; }';
  40.  
  41. var darkstyle =
  42.     'body,b,td,p { background-color:black !important; color:#999 !important; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif !important; font-size:11px !important;} ' +
  43.     'a { color:#0084FF !important; font-size:11px !important; }' +
  44.     'a:hover { color:#0084FF !important; font-size:11px !important; }' +
  45.     'a:visited { color:#005EB4 !important; font-size:11px !important; }' +
  46.     'div.text, div.posting, div.manage, span.author, div.single, div.info, div.comment, div.leave_comment, form { background-color:black !important; color:#005EB4 !important; font-size:11px !important; }' +
  47.     '.single .info, .info .author a, .info .datetime { color: #999999 !important; }' +
  48.     '.title { color:#0084FF !important; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif !important; font-size:13px; font-weight:bold !important; }';
  49.  
  50. var kums_array = [ 'сыктывкар', 'нет и нет', 'не существует', 'где опрувы?' ];
  51.  
  52. function loadSettings() {
  53.     patterns = GM_getValue('patterns');
  54.     russianDate = GM_getValue('russianDate');
  55.     showSeconds = GM_getValue('showSeconds');
  56.     dateButtons = GM_getValue('dateButtons');
  57.     maxCommentLines = GM_getValue('maxCommentLines');
  58.     maxCommentImages = GM_getValue('maxCommentImages');
  59.     maxCommentVideos = GM_getValue('maxCommentVideos');
  60. }
  61.  
  62. function saveSettings() {
  63.     GM_setValue('patterns', patterns);
  64.     GM_setValue('russianDate', russianDate);
  65.     GM_setValue('showSeconds', showSeconds);
  66.     GM_setValue('dateButtons', dateButtons);
  67.     GM_setValue('maxCommentLines', maxCommentLines);
  68.     GM_setValue('maxCommentImages', maxCommentImages);
  69.     GM_setValue('maxCommentVideos', maxCommentVideos);
  70. }
  71.  
  72. function isExist(object) {
  73.     return typeof(object) !== 'undefined' && object !== 'undefined' && object !== 'null';
  74. }
  75.  
  76. function numWorld(value, words) {
  77.     let num = Math.abs(value) % 100;
  78.     if (num > 10 && num < 20) {
  79.         return value + ' ' + words[2];
  80.     } else if (num % 10 > 1 && num % 10 < 5) {
  81.         return value + ' ' + words[1];
  82.     } else if(num % 10 == 1) {
  83.         return value + ' ' + words[0];
  84.     }
  85.  
  86.     return value + ' ' + words[2];
  87. }
  88.  
  89. function addToText(value) {
  90.     let textarea = document.getElementById('update_form').article;
  91.     if (textarea.createTextRange && textarea.caretPos) {
  92.         textarea.caretPos.text = value;
  93.     } else {
  94.         textarea.value += value;
  95.     }
  96.  
  97.     textarea.focus();
  98. }
  99.  
  100. function updateRight(page) {
  101.     switch (page) {
  102.         case 'upload':
  103.             document.getElementById('upload_area').style.display = 'block';
  104.             document.getElementById('pastes_area').style.display = 'none';
  105.             document.getElementById('pattern_area').style.display = 'none';
  106.             break;
  107.  
  108.         case 'pastes':
  109.             document.getElementById('upload_area').style.display = 'none';
  110.             document.getElementById('pastes_area').style.display = 'block';
  111.             document.getElementById('pattern_area').style.display = 'none';
  112.             break;
  113.  
  114.         case 'pattern':
  115.             document.getElementById('upload_area').style.display = 'none';
  116.             document.getElementById('pastes_area').style.display = 'none';
  117.             document.getElementById('pattern_area').style.display = 'block';
  118.             break;
  119.     }
  120. }
  121.  
  122. function formatDate(value) {
  123.     let date = value.split(' ')[0].split('-');
  124.     let time = value.split(' ')[1].split(':');
  125.  
  126.     if (russianDate) {
  127.         return '<span class="datetime">' + date[2] + '.' + date[1] + '.' + date[0].trim() + ' ' + time[0] + ':' + time[1] + (showSeconds ? (':' + time[2]) : ' ') + '</span>';
  128.     } else return '<span class="datetime">' + date[0] + '-' + date[1] + '-' + date[2].trim() + ' ' + time[0] + ':' + time[1] + (showSeconds ? (':' + time[2]) : ' ') + '</span>';
  129. }
  130.  
  131. function formatPost(post, num) {
  132.     let info = post.getElementsByClassName('info')[0];
  133.     let text = post.getElementsByClassName('text')[0];
  134.  
  135.     info.innerHTML +=
  136.         '<div class="block_date">' +
  137.         '<input type="button" class="btn flat stop" value="Ø" title="Остановить" id="anim_off" name="post_' + num + '" />' +
  138.         '</div>';
  139. }
  140.  
  141. function formatPager(comment, top) {
  142.     let info = comment.getElementsByClassName('info')[0];
  143.     let text = comment.getElementsByClassName('text')[0];
  144.  
  145.     if (top == false) {
  146.         info.innerHTML +=
  147.             '<div class="block_date">' +
  148.             '<input type="button" class="btn flat stop" value="Ø" title="Остановить всё" id="anim_off" name="all" />' +
  149.             '<input type="button" class="btn flat start" value="ᴥ" title="КУМОВСТВО!!!" id="anim_on" name="all" />' +
  150.             '</div>';
  151.     }
  152. }
  153.  
  154. function formatComment(comment, num) {
  155.     let info = comment.getElementsByClassName('info')[0];
  156.     let text = comment.getElementsByClassName('text')[0];
  157.  
  158.     let link = info.getElementsByTagName('a')[1];
  159.     let author = info.getElementsByClassName('author')[0];
  160.  
  161.     info.getElementsByTagName('a')[1].outerHTML = '';
  162.     info.getElementsByTagName('br')[0].outerHTML = '';
  163.     info.getElementsByClassName('author')[0].outerHTML = '';
  164.  
  165.     let date = formatDate(info.innerHTML);
  166.  
  167.     info.innerHTML = author.outerHTML + date +
  168.         '<a href="' + link.href + '" title="Ссылка">#</a>' +
  169.         '<div class="block_date">' +
  170.         (dateButtons.includes('btnan') ? '<input type="button" class="btn flat" value="@" title="Ответить" id="answer" name="' + link.href.split('#')[1].slice(1) + '" />' : '') +
  171.         (dateButtons.includes('btnci') ? '<input type="button" class="btn flat" value=">" title="Цитировать" id="citate" name="' + link.href.split('#')[1].slice(1) + '" />' : '') +
  172.         (dateButtons.includes('btnso') ? '<input type="button" class="btn flat source" value="&" title="Исходник" id="source" name="' + num + '" />' : '') +
  173.         (dateButtons.includes('btnst') ? '<input type="button" class="btn flat stop" value="Ø" title="Остановить" id="anim_off" name="' + num + '" />' : '') +
  174.         (dateButtons.includes('btnba') ? '<input type="button" class="btn flat right ban" value="✖" title="Игнор" id="ban" name="' + num + '" />' : '') +
  175.         (dateButtons.includes('btnku') ? '<input type="button" class="btn flat start" value="ᴥ" title="КУМОВСТВО!!!" id="anim_on" name="' + num + '" />' : '') +
  176.         '</div>';
  177.  
  178.     // Проверка ссылок, нужно разрешение на кроссдоменные запросы
  179.     if (check_links === true) {
  180.         let links = text.getElementsByTagName('a');
  181.         if (links.length > 0) {
  182.             for (let i = 0; i < links.length; ++i) {
  183.                 GM.xmlHttpRequest({
  184.                     method: 'GET',
  185.                     url: links[i].href,
  186.                     onload: function(response) {
  187.                         if (response.status != 200 && response.status != 301 && response.status != 302) {
  188.                             if (links[i].hasAttribute('href') && (!links[i].hasChildNodes() || !isExist(links[i].getElementsByTagName('img')[0]))) {
  189.                                 links[i].outerHTML += '<div class="link archive">(<a target="_blank" href="https://web.archive.org/web/*/' + links[i].href + '">archive</a>)</div>';
  190.                             }
  191.                         }
  192.                     },
  193.                     onerror: function() {
  194.                         if (links[i].hasAttribute('href') && (!links[i].hasChildNodes() || !isExist(links[i].getElementsByTagName('img')[0]))) {
  195.                             links[i].outerHTML += '<div class="link archive">(<a target="_blank" href="https://web.archive.org/web/*/' + links[i].href + '">archive</a>)</div>';
  196.                         }
  197.                     }
  198.                 });
  199.             }
  200.         }
  201.     }
  202.  
  203.     // Спойлеры
  204.     if (text.innerHTML.indexOf('#spoil#') !== -1) {
  205.         let start = text.innerHTML.indexOf('#spoil#');
  206.         let end = text.innerHTML.indexOf('#spe#');
  207.  
  208.         if (start !== -1 && end !== -1) {
  209.             let old_spoiler = text.innerHTML.substring(start, end);
  210.             let new_spoiler = '<div class="spoiled" style="display: none;">' + old_spoiler.replaceAll('<sub>', '').replaceAll('</sub>', '') + '</div>';
  211.  
  212.             let data = '<input type="button" class="btn flat btn_spoil" value="Спойлер" title="Скрытый текст" id="spoil" style="padding: 0 2px;" name="' + num + '" />' + new_spoiler;
  213.             text.innerHTML = text.innerHTML.replace(old_spoiler, data).replace('#spoil#', '').replace('#spe#', '');
  214.         }
  215.     }
  216.  
  217.     // Ответы-ссылки
  218.     if (text.innerHTML.indexOf('</strong> #') !== -1) {
  219.         let start = text.innerHTML.indexOf('</strong> #') + 11;
  220.         let end = text.innerHTML.indexOf('#, ');
  221.  
  222.         if (start !== -1 && end !== -1) {
  223.             let number = text.innerHTML.slice(start, end);
  224.             let answer = text.innerHTML.substring(0, end + 1);
  225.             let author = answer.substring(0, answer.indexOf('#') - 1);
  226.  
  227.             text.innerHTML = text.innerHTML.replace(answer, '<a class="answer" href="' + link.href.split('?')[0] + '?high=' + number + '#c' + number + '" >@' + author + '</a>');
  228.         }
  229.     }
  230.  
  231.     // Скрытие видео
  232.     let videos = text.getElementsByClassName('video');
  233.     if (videos.length > maxCommentVideos) {
  234.         let vspoiler = '';
  235.         let button = '<input type="button" class="btn flat" style="padding: 0 4px;" value="Видео: ' + (videos.length - maxCommentVideos) + '" id="video_spoiler" name="' + num + '" />';
  236.  
  237.         for (let i = 0; i < videos.length - maxCommentVideos; i++) {
  238.             vspoiler += (videos[i].outerHTML + (i < videos.length - maxCommentVideos ? '<br />' : ''));
  239.         }
  240.  
  241.         while (text.getElementsByClassName('video').length > maxCommentVideos) {
  242.             text.getElementsByClassName('video')[videos.length - maxCommentVideos - 1].outerHTML = '';
  243.         }
  244.  
  245.         text.innerHTML = (button + '<div class="vspoiler" name="' + num + '" style="display:none;">' + vspoiler + '</div><br />' + text.innerHTML);
  246.     }
  247.  
  248.     // Скрытие картинок
  249.     let images = text.getElementsByTagName('img');
  250.     if (images.length > maxCommentImages) {
  251.         let spoiler = '';
  252.         let button = '<input type="button" class="btn flat" style="padding: 0 4px;" value="Картинок: ' + (images.length - maxCommentImages) + '" id="image_spoiler" name="' + num + '" />';
  253.  
  254.         for (let i = 0; i < images.length - maxCommentImages; i++) {
  255.             spoiler += (images[i].outerHTML + (i < images.length - maxCommentImages ? '<br />' : ''));
  256.         }
  257.  
  258.         while (text.getElementsByTagName('img').length > maxCommentImages) {
  259.             text.getElementsByTagName('img')[images.length - maxCommentImages - 1].outerHTML = '';
  260.         }
  261.  
  262.         text.innerHTML = (button + '<div class="ispoiler" name="' + num + '" style="display:none;">' + spoiler + '</div>' + text.innerHTML);
  263.     }
  264.  
  265.     // Сокращение длинных текстов, немножечко кривое
  266.     let data = text.innerHTML;
  267.     let size = text.clientHeight / 10;
  268.  
  269.     if (size > maxCommentLines) {
  270.         text.outerHTML = '<div class="text" style="height:' + (maxCommentLines * 10) + 'px; overflow:auto;">' + data + '</div>';
  271.     }
  272.  
  273.     let link_parts = link.href.split('#');
  274.     let answer_path = './update.html?comment=' + (document.location.pathname == '/help.html' ? '11200' : (document.location.pathname.replace('/', '').replace('.html', '')));
  275.  
  276.     if (isExist(comment.getElementsByClassName('text')[1])) {
  277.         let share = comment.getElementsByClassName('text')[1].outerHTML = '';
  278.     }
  279. }
  280.  
  281. function formatHeader(header) {
  282.     let info = header.getElementsByClassName('info')[0];
  283.     let text = header.getElementsByClassName('text')[0];
  284.  
  285.     info.innerHTML +=
  286.         '<div class="block_date">' +
  287.         '<input type="button" class="btn flat source" value="&" title="Исходник" id="source" name="0" />' +
  288.         '<input type="button" class="btn flat stop" value="Ø" title="Остановить всё" id="anim_off" name="all" />' +
  289.         '<input type="button" class="btn flat start" value="ᴥ" title="КУМОВСТВО!!!" id="anim_on" name="all" />' +
  290.         '</div>';
  291.  
  292.     // Проверка ссылок, нужно разрешение на кроссдоменные запросы
  293.     if (check_links === true) {
  294.         let links = text.getElementsByTagName('a');
  295.         if (links.length > 0) {
  296.             for (let i = 0; i < links.length; ++i) {
  297.                 if (links[i].parentElement.className.toString() != 'rt-post') {
  298.                     GM.xmlHttpRequest({
  299.                         method: 'GET',
  300.                         url: links[i].href,
  301.                         onload: function(response) {
  302.                             if (response.status != 200 && response.status != 301 && response.status != 302) {
  303.                                 if (links[i].hasAttribute('href') && (!links[i].hasChildNodes() || !isExist(links[i].getElementsByTagName('img')[0]))) {
  304.                                     links[i].outerHTML += '<div class="link archive">(<a target="_blank" href="https://web.archive.org/web/*/' + links[i].href + '">archive</a>)</div>';
  305.                                 }
  306.                             }
  307.                         },
  308.                         onerror: function() {
  309.                             if (links[i].hasAttribute('href') && (!links[i].hasChildNodes() || !isExist(links[i].getElementsByTagName('img')[0]))) {
  310.                                 links[i].outerHTML += '<div class="link archive">(<a target="_blank" href="https://web.archive.org/web/*/' + links[i].href + '">archive</a>)</div>';
  311.                             }
  312.                         }
  313.                     });
  314.                 }
  315.             }
  316.         }
  317.     }
  318. }
  319.  
  320. function addCitate() {
  321.     let post = document.location.search.split('=')[1];
  322.     let comment = document.location.hash.split('_')[1].slice(1);
  323.     let link = 'https://svalko.org/' + post + '.html?high=' + comment + '#c' + comment;
  324.  
  325.     let xhr = new XMLHttpRequest();
  326.     xhr.open('GET', link, false);
  327.     xhr.send();
  328.     let result = xhr.responseText;
  329.  
  330.     var temp = document.createElement('div');
  331.     temp.innerHTML = result;
  332.  
  333.     let high = temp.getElementsByClassName('high')[0].getElementsByClassName('text')[0];
  334.  
  335.     if (isExist(high.innerText) && high.innerText !== '') {
  336.         addToText('>[i]' + high.innerText + '[/i]');
  337.     }
  338. }
  339.  
  340. function addAnswer() {
  341.     let post = document.location.search.split('=')[1];
  342.     let comment = document.location.hash.split('_')[1].slice(1);
  343.     let link = 'https://svalko.org/' + post + '.html?high=' + comment + '#c' + comment;
  344.  
  345.     let xhr = new XMLHttpRequest();
  346.     xhr.open('GET', link, false);
  347.     xhr.send();
  348.     let result = xhr.responseText;
  349.  
  350.     var temp = document.createElement('div');
  351.     temp.innerHTML = result;
  352.  
  353.     let high = temp.getElementsByClassName('high')[0];
  354.     if (isExist(high) && high.innerText !== '') {
  355.         let author = high.getElementsByClassName('author')[0].innerText;
  356.         addToText('[b]' + author + '[/b] #' + comment + '#, ');
  357.     }
  358. }
  359.  
  360. function showSource(comm_num) {
  361.     let comment = comm_num > 0 ? document.getElementsByClassName('comment')[parseInt(comm_num) - 1] : document.getElementsByClassName('single')[0];
  362.     let comm_text = comment.getElementsByClassName('text')[0];
  363.  
  364.     let source = comm_text.innerHTML
  365.     .replaceAll(/(<img src="[a-z0-9._:\/\/]+" alt="\[:\]\|\|\|\|\|\|\|\|\|\|\|\|\[:\]") (title="\[:\]\|\|\|\|\|\|\|\|\|\|\|\|\[:\]">)(<!--xaxaxa-->)/g, '[:]||||||||||||[:]')
  366.     .replaceAll('<i>', '[i]').replaceAll('</i>', '[/i]')
  367.     .replaceAll('<b>', '[b]').replaceAll('</b>', '[/b]')
  368.     .replaceAll('<s>', '[s]').replaceAll('</s>', '[/s]')
  369.     .replaceAll('<del>', '[s]').replaceAll('</del>', '[/s]')
  370.     .replaceAll('<!--', '&lt;!--').replaceAll('!-->', '!--&gt;')
  371.     .replaceAll('<sub>', '[sub]').replaceAll('</sub>', '[/sub]')
  372.     .replaceAll('<sup>', '[sup]').replaceAll('</sup>', '[/sup]')
  373.     .replaceAll('<strong>', '[b]').replaceAll('</strong>', '[/b]')
  374.     .replaceAll('<button>', '&lt;button&gt;').replaceAll('</button>', '&lt/button&gt;')
  375.     .replaceAll('<marquee>', '&lt;marquee&gt;').replaceAll('</marquee>', '&lt;/marquee&gt;');
  376.  
  377.     if (comm_text.classList.contains('hidden')) {
  378.         comm_text.classList.remove('hidden');
  379.         comment.getElementsByClassName('text source')[0].remove();
  380.     } else {
  381.         comm_text.classList.add('hidden');
  382.         comm_text.outerHTML += '<div class="text source">' + source + '</div>';
  383.     }
  384.  
  385.     let btn_source = comment.getElementsByClassName('btn flat source')[0];
  386.     if (isExist(btn_source)) {
  387.         btn_source.classList.contains('active') ? btn_source.classList.remove('active') : btn_source.classList.add('active');
  388.     }
  389. }
  390.  
  391. function loadBans() {
  392.     let comments = document.getElementsByClassName('comment');
  393.     if (!isExist(comments)) return;
  394.  
  395.     let bans = [];
  396.     if (isExist(GM_getValue('bans'))) {
  397.         bans = GM_getValue('bans');
  398.     }
  399.  
  400.     for (let i = 0; i < comments.length; i++) {
  401.         let comment_author = comments[i].getElementsByClassName('author')[0];
  402.         if (!isExist(comment_author)) continue;
  403.  
  404.         let ban_index = bans.indexOf(comment_author.innerText);
  405.         if (ban_index !== -1) {
  406.             comments[i].getElementsByClassName('text')[0].classList.add('ban');
  407.             comments[i].getElementsByClassName('right ban')[0].classList.add('banned');
  408.         }
  409.     }
  410. }
  411.  
  412. function handleBans(num) {
  413.     let comment = document.getElementsByClassName('comment')[parseInt(num) - 1];
  414.     let comment_author = comment.getElementsByClassName('author')[0].innerText;
  415.  
  416.     let bans = [];
  417.     if (isExist(GM_getValue('bans'))) {
  418.         bans = GM_getValue('bans');
  419.     }
  420.  
  421.     let ban_index = bans.indexOf(comment_author);
  422.     if (ban_index !== -1) {
  423.         bans.splice(ban_index, 1);
  424.         comment.getElementsByClassName('text')[0].classList.remove('ban');
  425.         comment.getElementsByClassName('right ban')[0].classList.remove('banned');
  426.     } else {
  427.         bans.push(comment_author);
  428.         comment.getElementsByClassName('text')[0].classList.add('ban');
  429.         comment.getElementsByClassName('right ban')[0].classList.add('banned');
  430.      }
  431.  
  432.     GM_setValue('bans', bans);
  433. }
  434.  
  435. function addPager(page, comments) {
  436.     if (comments >= 50 || document.getElementsByClassName('comment')[comments - 1].getElementsByClassName('author')[0].innerText == 'Свинодемон') return;
  437.  
  438.     let pager =
  439.         '<div class="pager comment"><a name="c"></a><div class="info"><span class="author"><a href="/?author=">Свинодемон</a></span><a href="' + page + '">#</a></div>' +
  440.         '<div class="text">насрано ' + numWorld(comments, ['раз', 'раза', 'раза']) + '.<br></div></div>';
  441.  
  442.     document.getElementsByClassName('leave_comment')[0].outerHTML = pager + document.getElementsByClassName('leave_comment')[0].outerHTML;
  443. }
  444.  
  445. function startAnimation(target) {
  446.     if (target === 'all') {
  447.         let mainBlock = document.getElementById('main-block');
  448.  
  449.         let topic = mainBlock.getElementsByClassName('single')[0];
  450.         if (isExist(topic)) {
  451.             topic.getElementsByClassName('start')[0].classList.add('active');
  452.             topic.getElementsByClassName('stop')[0].classList.remove('active');
  453.             topic.classList.add('kum');
  454.             kumovstvo();
  455.         }
  456.  
  457.         let comments = mainBlock.getElementsByClassName('comment');
  458.         for (let i = 0; i < comments.length; i++) {
  459.             if (isExist(comments[i].getElementsByClassName('block_date')[0])) {
  460.                 comments[i].getElementsByClassName('start')[0].classList.add('active');
  461.                 comments[i].getElementsByClassName('stop')[0].classList.remove('active');
  462.             }
  463.  
  464.             comments[i].classList.add('kum');
  465.             kumovstvo();
  466.         }
  467.     } else {
  468.         let comment = document.getElementsByClassName('comment')[parseInt(target) - 1];
  469.         comment.classList.add('kum');
  470.         comment.getElementsByClassName('start')[0].classList.add('active');
  471.         comment.getElementsByClassName('stop')[0].classList.remove('active');
  472.         kumovstvo();
  473.     }
  474. }
  475.  
  476. function stopAnimation(target) {
  477.      if (target.includes('post')) {
  478.          let num = target.slice(5);
  479.          let post = document.getElementsByClassName('posting')[num];
  480.  
  481.          if (post.classList.contains('kum')) {
  482.              post.getElementsByClassName('stop')[0].classList.add('active');
  483.              post.style.top = '0';
  484.              post.style.left = '0';
  485.              post.classList.remove('kum');
  486.              let clear_post = post.outerHTML;
  487.              post.outerHTML = clear_post;
  488.          }
  489.     } else if (target === 'all') {
  490.         let mainBlock = document.getElementById('main-block');
  491.  
  492.         let topic = mainBlock.getElementsByClassName('single')[0];
  493.         if (isExist(topic.getElementsByClassName('block_date')[0])) {
  494.             topic.getElementsByClassName('stop')[0].classList.add('active');
  495.             topic.getElementsByClassName('start')[0].classList.remove('active');
  496.         }
  497.  
  498.         topic.style.top = '0';
  499.         topic.style.left = '0';
  500.         topic.classList.remove('kum');
  501.         let clear_topic = topic.outerHTML;
  502.         topic.outerHTML = clear_topic;
  503.  
  504.         let comments = mainBlock.getElementsByClassName('comment');
  505.         for (let i = 0; i < comments.length; i++) {
  506.             if (isExist(comments[i].getElementsByClassName('block_date')[0])) {
  507.                 comments[i].getElementsByClassName('stop')[0].classList.add('active');
  508.                 comments[i].getElementsByClassName('start')[0].classList.remove('active');
  509.             }
  510.  
  511.             if (comments[i].classList.contains('kum')) {
  512.                 comments[i].style.top = '0';
  513.                 comments[i].style.left = '0';
  514.                 comments[i].classList.remove('kum');
  515.                 let clear_comment = comments[i].outerHTML;
  516.                 comments[i].outerHTML = clear_comment;
  517.             }
  518.         }
  519.     } else {
  520.         let comment = document.getElementsByClassName('comment')[parseInt(target) - 1];
  521.         let comment_text = comment.getElementsByClassName('text')[0];
  522.  
  523.         comment.getElementsByClassName('stop')[0].classList.add('active');
  524.         comment.getElementsByClassName('start')[0].classList.remove('active');
  525.  
  526.         if (comment.classList.contains('kum')) {
  527.             comment.classList.remove('kum');
  528.             comment.style.top = '0'; comment.style.left = '0';
  529.             let clear_comment = comment.outerHTML;
  530.             comment.innerHTML = '';
  531.             comment.outerHTML = clear_comment;
  532.         }
  533.     }
  534. }
  535.  
  536. function DOMLoaded() {
  537.     //loadSettings(); // Пока не храним настройки
  538.  
  539.     document.getElementsByTagName('head')[0].innerHTML += '<style type="text/css">' + scriptStyle + '</style>';
  540.     if (use_darkstyle) {
  541.         document.getElementsByTagName('head')[0].innerHTML += '<style type="text/css" id="darkstyle">' + darkstyle + '</style>';
  542.     }
  543.  
  544.     let new_post = document.location.search == '';
  545.     let path = document.location.pathname.replace('/', '');
  546.  
  547.     if (path === 'status.html') {
  548.         //
  549.     } else if (path.startsWith('update.html')) {
  550.         let form = document.getElementById('update_form');
  551.         form.outerHTML = '<div id="upload_area"></div>' + form.outerHTML;
  552.  
  553.         document.getElementById('upload_area').removeAttribute('style');
  554.         document.getElementById('upload_area').outerHTML =
  555.             '<div id="right_panel" style="float: right; position: relative; margin-right: -370px; top: 33px; width: 360px;">' +
  556.             '<div id="pastes_area" class="box"' + (new_post ? '' : 'style="display:none;') + '"></div>' +
  557.             '<div id="pattern_area" class="box" style="display:none;"></div>' +
  558.             document.getElementById('upload_area').outerHTML + '</div>';
  559.  
  560.         let pattern_area = document.getElementById('pattern_area');
  561.  
  562.         for (let i = 0; i < patterns.length; ++i) {
  563.             let id = patterns[i].id;
  564.             let key = patterns[i].key;
  565.             let value = patterns[i].value;
  566.  
  567.             pattern_area.innerHTML += '<button id="' + id + '" class="btn flat pattern">' + key + '</button>';
  568.             document.getElementById(id).addEventListener('click', addToText, value);
  569.         }
  570.  
  571.         if (isExist(document.getElementById('upload_area').getElementsByTagName('h2')[0])) {
  572.             document.getElementById('upload_area').getElementsByTagName('h2')[0].outerHTML = '';
  573.         }
  574.  
  575.         document.getElementById('right_panel').innerHTML =
  576.             (!new_post ? '<button type="button" class="btn flat right_page" id="upload" style="margin:2px 2px 7px; padding:3px;"> Заливалка </button>' : '') +
  577.             '<button type="button" class="btn flat right_page" id="pastes" style="margin:2px 2px 7px; padding:3px;"> Вставка </button>' +
  578.             '<button type="button" class="btn flat right_page" id="pattern" style="margin:2px 2px 7px; padding:3px;">Шаблоны</button>' +
  579.             document.getElementById('right_panel').innerHTML;
  580.  
  581.         if (!new_post) {
  582.             document.getElementById('upload_area_link').style.display = 'none';
  583.         }
  584.  
  585.         document.getElementById('pastes_area').innerHTML +=
  586.             '<div class="line">' +
  587.             '<button type="button" class="btn flat add" id="add_bold" onclick="addBBcode(\'b\');" style="width:12%">B</button>' +
  588.             '<button type="button" class="btn flat add" id="add_italic" onclick="addBBcode(\'i\');" style="width:12%;">I</button>' +
  589.             '<button type="button" class="btn flat add" id="add_underline" onclick="addBBcode(\'u\');" style="width:12%;">U</button>' +
  590.             '<button type="button" class="btn flat add" id="add_strikethrough" onclick="addBBcode(\'s\');" style="width:12%;">S</button>' +
  591.             '<button type="button" class="btn flat add" id="add_sup" onclick="addBBcode(\'sup\');" style="width:20%; top: 1px;">Инд <sup>верх</sup></button>' +
  592.             '<button type="button" class="btn flat add" id="add_sub" onclick="addBBcode(\'sub\');" style="width:20%; top: -1px;">Инд <sub>низ</sub></button>' +
  593.             '</div><div class="line">' +
  594.             '<button type="button" class="btn flat add" id="add_btn" onclick="addBBcode(\'button\');" style="width:60px;">Кнопка</button>' +
  595.             '<button type="button" class="btn flat add" id="add_marquee" onclick="addBBcode(\'marquee\');" style="width:90px;">Бег. строка</button>' +
  596.             '<button type="button" class="btn flat add" id="add_rand_img" style="width:120px;">Случ. картинка</button>' +
  597.             '</div><div class="line">' +
  598.             '<button type="button" class="btn flat add" id="add_user" style="width:60px;">USER</button>' +
  599.             '<button type="button" class="btn flat add" id="add_spam" style="width:60px;">SPAM</button>' +
  600.             '</div><div class="line" style="height: 5px;"></div>' +
  601.             '<div class="line">' +
  602.             '<button type="button" class="btn flat add" id="add_spoiler" style="width:60px;">Спойлер</button>' +
  603.             '<button type="button" class="btn flat add" id="add_hidden_kum" style="width:60px;">Трясучка</button>' +
  604.             '<button type="button" class="btn flat add" id="add_hidden_text" style="width:120px;">Скрытый текст</button>' +
  605.             '</div>';
  606.  
  607.         let old_buttons = document.getElementById('update_form').getElementsByTagName('div')[0].getElementsByTagName('button');
  608.         for (let i = 0; i < old_buttons.length; i++) {
  609.             old_buttons[0].outerHTML = ''; old_buttons[0].outerHTML = '';
  610.         }
  611.  
  612.         document.getElementById('update_form').getElementsByTagName('div')[0].innerHTML +=
  613.             '<select style="float: right;"><option selected disabled>Кумовство</option>' +
  614.             '<option id="где опрувы?" class="kum">где опрувы?</option>' +
  615.             '<option id="сыктывкар" class="kum">сыктывкар</option>' +
  616.             '<option id="нет и нет" class="kum">нет и нет</option><option id="не существует" class="kum">не существует</option></select>';
  617.  
  618.         if (document.location.hash.includes('citate_')) {
  619.             addCitate();
  620.         } else if (document.location.hash.includes('answer_')) {
  621.             addAnswer();
  622.         }
  623.     } else if (path === '' || path === 'index.html' || (path.indexOf('page') !== -1 && Number.isFinite(Number(path.split('/')[1])))) {
  624.         let posts = document.getElementsByClassName('posting');
  625.         for (let i = 0; i < posts.length; i++) {
  626.             formatPost(posts[i], i);
  627.         }
  628.     } else if (path !== 'index.html' && path !== '' && path.indexOf('page') === -1 && path.indexOf('tag') === -1) {
  629.         let updateLink = '<a href="/update.html?comment=' + document.location.pathname.replace('.html', '').replace('/', '') + '" class="write">Отметиться</a>';
  630.         if (document.location.pathname == '/help.html') {
  631.             updateLink = '<a href="/update.html?comment=11200" class="write">Отметиться</a>';
  632.         }
  633.  
  634.         if (isExist(document.getElementsByClassName('manage')[0])) {
  635.             document.getElementsByClassName('manage')[0].innerHTML = updateLink + document.getElementsByClassName('manage')[0].innerHTML;
  636.         }
  637.  
  638.         if (isExist(document.getElementsByClassName('single')[0])) {
  639.             formatHeader(document.getElementsByClassName('single')[0]);
  640.         }
  641.  
  642.         let comments = document.getElementsByClassName('comment');
  643.  
  644.         if (isExist(comments) && comments.length > 0) {
  645.             addPager(document.location.href, comments.length);
  646.         }
  647.  
  648.         for (let i = 0; i < comments.length; i++) {
  649.             let comment_text = comments[i].getElementsByClassName('text')[0];
  650.             let comment_author = comments[i].getElementsByClassName('info')[0].getElementsByClassName('author')[0].innerText;
  651.  
  652.             if ((i === 0 || i === comments.length - 1) && comment_author === 'Свинодемон' && comment_text.innerText.indexOf('насрано') !== -1) {
  653.                 formatPager(comments[i], i === 0);
  654.                 continue;
  655.             }
  656.  
  657.               formatComment(comments[i], i + 1);
  658.         }
  659.  
  660.         loadBans();
  661.  
  662.         for (let i = 0; i < document.getElementsByTagName('marquee').length; i++) {
  663.             document.getElementsByTagName('marquee')[i].name = i;
  664.         }
  665.     }
  666. }
  667.  
  668. function DOMClicked(event) {
  669.     let target = event.target || event.srcElement;
  670.     switch (target.className) {
  671.         case 'kum': addToText(target.id); break;
  672.     }
  673.  
  674.     for (let i = 0; i < patterns.length; ++i) {
  675.         let id = patterns[i].id;
  676.         let value = patterns[i].value;
  677.         if (target.id == id) {
  678.             addToText(value);
  679.         }
  680.     }
  681.  
  682.     switch (target.id) {
  683.         case 'upload': updateRight('upload'); break;
  684.         case 'pastes': updateRight('pastes'); break;
  685.         case 'pattern': updateRight('pattern'); break;
  686.  
  687.         case 'ban': handleBans(target.name); break;
  688.  
  689.         case 'answer': {
  690.             let addr = 'https://svalko.org/update.html?comment=' + document.location.pathname.replace('/', '').replace('.html', '') + '#answer_c' + target.name;
  691.             document.location = addr;
  692.         } break;
  693.  
  694.         case 'citate': {
  695.             let addr = 'https://svalko.org/update.html?comment=' + document.location.pathname.replace('/', '').replace('.html', '') + '#citate_c' + target.name;
  696.             document.location = addr;
  697.         } break;
  698.  
  699.         case 'spoil': {
  700.             let spoiler = document.getElementsByClassName('spoiled')[0];
  701.             if (spoiler.style.display === 'none') {
  702.                 spoiler.style.display = 'block';
  703.             } else {
  704.                 spoiler.style.display = 'none';
  705.             }
  706.         } break;
  707.  
  708.         case 'image_spoiler': {
  709.             let comment = document.getElementsByClassName('comment')[parseInt(target.name) - 1];
  710.  
  711.             let comment_text = comment.getElementsByClassName('text')[0];
  712.             if (comment_text.querySelector('div') && comment_text.getElementsByTagName('div')[0].classList.contains('ispoiler')) {
  713.                 let spoiler = comment_text.getElementsByTagName('div')[0];
  714.                 let spoiler_button = comment_text.getElementsByTagName('input')[0];
  715.                 if (spoiler.style.display === 'none') {
  716.                     spoiler_button.value = 'Картинки -';
  717.                     spoiler.style.display = 'block';
  718.                 } else {
  719.                     spoiler_button.value = 'Картинки +';
  720.                     spoiler.style.display = 'none';
  721.                 }
  722.             }
  723.         } break;
  724.  
  725.         case 'video_spoiler': {
  726.             let comment = document.getElementsByClassName('comment')[parseInt(target.name) - 1];
  727.             let comment_text = comment.getElementsByClassName('text')[0];
  728.  
  729.             if (comment_text.querySelector('div') && comment_text.getElementsByTagName('div')[0].classList.contains('vspoiler')) {
  730.                 let spoiler = comment_text.getElementsByTagName('div')[0];
  731.                 let spoiler_button = comment_text.getElementsByTagName('input')[0];
  732.                 if (spoiler.style.display === 'none') {
  733.                     spoiler_button.value = 'Видео -';
  734.                     spoiler.style.display = 'block';
  735.                 } else {
  736.                     spoiler_button.value = 'Видео +';
  737.                     spoiler.style.display = 'none';
  738.                 }
  739.             }
  740.         } break;
  741.  
  742.         case 'source': showSource(target.name); break;
  743.  
  744.         case 'anim_on': startAnimation(target.name); break;
  745.         case 'anim_off': stopAnimation(target.name); break;
  746.  
  747.         case 'add_spam': addToText('***SPAM***'); break;
  748.         case 'add_user': addToText('%username%'); break;
  749.         case 'add_rand_img': addToText('[:]||||||||||||[:]'); break;
  750.  
  751.         case 'add_spoiler': {
  752.             let spoil =
  753.                 '#spoil#[sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub]' +
  754.                 'скрытый текст' +
  755.                 '[/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub]#spe#';
  756.             addToText(spoil);
  757.         } break;
  758.  
  759.         case 'add_hidden_text': {
  760.             let hidden =
  761.                 '[sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub]' +
  762.                 'скрытый текст' +
  763.                 '[/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub]';
  764.             addToText(hidden);
  765.         } break;
  766.  
  767.         case 'add_hidden_kum': {
  768.             let hidden =
  769.                 '[sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub][sub]' +
  770.                 'нет и нет' +
  771.                 '[/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub][/sub]';
  772.             addToText(hidden);
  773.         } break;
  774.     }
  775. }
  776.  
  777.  
  778. document.addEventListener('click', function onClick(event) { DOMClicked(event); });
  779. document.addEventListener('DOMContentLoaded', function onDOMLoaded() { DOMLoaded(); });
  780.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement