Advertisement
Kalashnikov

LOR backwash

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