Guest User

Untitled

a guest
Sep 14th, 2012
85
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. })()
RAW Paste Data