Advertisement
Kalashnikov

Untitled

Mar 31st, 2012
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name LOR Backwash
  3. // @description Превью и список ответов для комментариев.
  4. // @author Kalashnikov Ilya
  5. // @license CC NC SA
  6. // @version 0.1.2
  7. // @namespace http://www.linux.org.ru/*
  8. // @namespace https://www.linux.org.ru/*
  9. // @include http://www.linux.org.ru/*
  10. // @include https://www.linux.org.ru/*
  11. // ==/UserScript==
  12.  
  13. (function() {
  14.     if (!document.getElementsByClassName('comment')[0] /*|| window.top != window.self*/)
  15.         return;
  16.  
  17.     /*var loadedPages = []; // сюда будут складывться линки на темы которые будут подгружены
  18.  
  19.     function pageNumber(url) { // вытягивает номер страницы из урла
  20.         return parseInt(url.match(/\d+(?:\/page(\d))?/)[1] || 0);
  21.     }
  22.  
  23.     loadedPages[ pageNumber(location.href) ] = true;
  24.     */
  25.  
  26.     // CSS
  27.     var style = document.createElement('style');
  28.     style.innerHTML = 'div#commentPreview {\
  29.         display:none;\
  30.         position:fixed;\
  31.         /*min-width: 500px;*/\
  32.     }\
  33.     div#commentPreview article {\
  34.         border:red 1px solid;\
  35.         box-shadow: 0 0 10px black;\
  36.         margin:5px;\
  37.     }\
  38.     iframe#pageLoader{\
  39.         display:none;\
  40.     }';
  41.     document.getElementsByTagName('head')[0].appendChild(style);
  42.  
  43.     var preview = document.createElement('div');
  44.     preview.id = 'commentPreview';
  45.     document.getElementsByClassName('comment')[0].appendChild(preview); // Втыкаем сюда чтоб применялись все стили для комментов
  46.  
  47.     /*
  48.     var iframe = document.createElement('iframe'); // потому что responseXML XHR не парсится :(
  49.     iframe.id = 'pageLoader';
  50.     document.body.appendChild(iframe);*/
  51.  
  52.     function commentPreview(id) {   // Генерирует попап
  53.         var comment = document.getElementById('comment-' + id);
  54.         if (!comment)
  55.             return;
  56.         comment = comment.cloneNode(true);
  57.         comment.removeChild( comment.children[0] ); // Удаляем заголовок
  58.         var msg = comment.getElementsByClassName('msg_body')[0];
  59.         msg.removeChild( msg.getElementsByClassName('reply')[0] ); // и [Ответить на Это сообщение]
  60.         preview.innerHTML = '';
  61.         preview.appendChild(comment);
  62.     };
  63.  
  64.     function showPreview(id) {  // Создает обработчик для конкрентного ид // Вообще, если покопаться в event.target, ид можно и оттуда выцепить
  65.         return function(event) {
  66.             commentPreview(id);
  67.             preview.style.display = 'block';    // приходится делать первым ибо иначе ширина/высота 0
  68.             preview.style.left = event.x + 20 + 'px';
  69.             preview.style.top = Math.max(0, event.y - preview.scrollHeight - 10) + 'px';
  70.         }
  71.     };
  72.  
  73.     function hidePreview() {
  74.         preview.style.display = 'none';
  75.     };
  76.  
  77.     var links = document.querySelectorAll('.comment .msg .title a[onclick]');   // Костыльно, но хз как лучше
  78.     for (var i =0; i<links.length; i++) {
  79.         var container = links[i].parentNode.parentNode;
  80.  
  81.         var originalId = links[i].href.match(/.*-(\d+)/)[1];    // Комментарий на который мы нашли ответ
  82.         var original = document.getElementById('comment-'+originalId)
  83.  
  84.         if (original) { //  Если он на текущей странице
  85.             var repliesList = original.getElementsByClassName('title')[0].getElementsByClassName('repliesList')[0];
  86.             if (!repliesList) {
  87.                 repliesList = document.createElement('span');
  88.                 repliesList.className = 'repliesList';
  89.                 repliesList.innerText = 'Ответы: ';
  90.                 original.getElementsByClassName('title')[0].appendChild(repliesList);
  91.             }
  92.  
  93.             var a = document.createElement('a');
  94.             a.href = links[i].href.replace(/#comment-\d+$/, '#'+container.id);  // линк на текущий комментарий
  95.  
  96.             var h2 = container.getElementsByClassName('msg_body')[0].getElementsByTagName('h2')[0];
  97.            
  98.             repliesList.appendChild(document.createTextNode(" ["));
  99.             if (h2)
  100.                 a.innerText = h2.innerText;
  101.             else {
  102.                 var username = container.getElementsByClassName('msg_body')[0].getElementsByClassName('sign')[0].getElementsByTagName('a')[0];
  103.                 a.innerText = 'от ' + (username? username.innerText: 'anonymous');
  104.             }
  105.  
  106.             repliesList.appendChild(a);
  107.             repliesList.appendChild(document.createTextNode("]"));
  108.  
  109.             a.addEventListener('mouseover', showPreview( container.id.match(/comment-(\d+)/)[1] ));
  110.             a.addEventListener('mouseout',  hidePreview);
  111.         }
  112.         /*else {
  113.             var url = links[i].href;
  114.             if(!loadedPages[ pageNumber(url) ]) {   // если ту страницу мы ещё не грузили
  115.                 loadedPages[ pageNumber(url) ] = true;  // правильней это сделать в обработчике ответа, но он вызывается асинхронно :(
  116.                 /*var req = new XMLHttpRequest( url );
  117.                 console.log(url)
  118.                 req.open('GET', url, true);     // может тут рсс можно грузить?
  119.                 req.overrideMimeType('text/html');
  120.                 req.onreadystatechange = function() {
  121.                     if (req.readyState == 4) {
  122.                         if (req.status == 200) {
  123.                             //var dom = (new DOMParser()).parseFromString(req.responseText, "application/xml"); // responseXML пустой :(
  124.                             console.log(req);
  125.                             //console.log(req.getAllResponseHeaders());
  126.                             console.log(req.responseXML);
  127.                         }
  128.                         else
  129.                             console.log('Не удалось загрузить предыдущюю страницу: ' + req.statusText);
  130.                     }
  131.                 }
  132.                 req.send(null);     * /
  133.                 /*iframe.src = url;
  134.                 iframe.contentDocument.onload = function() {
  135.                     var oldComments = iframe.contentDocument.getElementsByClassName('comment')[0].cloneNode(true);
  136.                     oldComments.className = 'oldComment';
  137.                     oldComments.style.display = 'none';
  138.                     document.getElementsByClassName('comment')[0].appendChild(oldComments);
  139.                     console.log(oldComments)
  140.                 }
  141.                 iframe.src = url;   * /
  142.             }
  143.         }*/
  144.         links[i].addEventListener('mouseover', showPreview(originalId));
  145.         links[i].addEventListener('mouseout',  hidePreview)
  146.     }
  147. })()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement