vBulletin - Show Postnumber

Shows [post=n]title[/post] near # postnumber, so internal links to single posts in vBulletin-forums could be done easy. Works in linear and hybrid mode only!

  1. // ==UserScript==
  2. // @name vBulletin - Show Postnumber
  3. // @namespace http://openuserjs.org/users/ardiman
  4. // @description Shows [post=n]title[/post] near # postnumber, so internal links to single posts in vBulletin-forums could be done easy. Works in linear and hybrid mode only!
  5. // @description:de-DE Zeigt [post=n]Titel[/post] neben # Beitragnummer - erleichtert somit das Verlinken auf einzelne Beiträge in vBulletin-Foren. Funktioniert nur in Linear- und Hybriddarstellung!
  6. // @grant none
  7. // @homepage https://github.com/ardiman/userscripts/tree/master/vbulletinshowpostnumber
  8. // @icon https://raw.githubusercontent.com/ardiman/userscripts/master/scriptlogo.gif
  9. // @include */showthread.php*
  10. // @include http://www.vbseo.com/f*
  11. // @include http://www.apfeltalk.de/forum/*
  12. // @license CC-BY-NC-SA-3.0; https://creativecommons.org/licenses/by-nc-sa/3.0/legalcode
  13. // @license MIT; https://opensource.org/licenses/MIT
  14. // @supportURL https://github.com/ardiman/userscripts/issues
  15. // @version 1.0.5
  16. // @date 2017-11-19
  17. // ==/UserScript==
  18.  
  19. (function () {
  20. // Anfang der moeglichen Anpassungen - Stil der anzuzeigenden Strings:
  21. // Fuer Postlinks:
  22. var p_postcolor = '#f9f9f9'; // moeglich waere auch 'inherit' - dann wird die Standardfarbe eingesetzt
  23. var p_postbackground = 'transparent'; // Hintergrundfarbe/art - fuer rot: '#f00'
  24. var p_postfontsize = '0.8em'; // Schriftgroesse (mit 0.8em wird sie kleiner)
  25. // Hover-Text des anzuzeigenden Strings (title-Attribut):
  26. var p_posthover = 'Kopieren Sie die Zeichenfolge, um auf diesen Beitrag zu verweisen';
  27. // Fuer Threadlink:
  28. var p_threadlink = 1; // 1= auch [thread=n]Titel[/thread] in Navbar anzeigen
  29. var p_threadfontsize = '0.7em'; // Schriftgroesse
  30. var p_threadhover = 'Kopieren Sie die Zeichenfolge, um auf dieses Thema zu verweisen';
  31. // Maximale Laenge fuer Titel (0 fuer keine Aenderung):
  32. var p_titlelen = 55;
  33. // Ende der moeglichen Anpassungen
  34.  
  35.  
  36. // Ab hier nichts mehr aendern!
  37.  
  38. var v_title=''; // Fuer Titel
  39.  
  40. // Titelnode ermitteln (vBulletin 4 und vBulletin 3.6x)
  41. var titlenode = document.evaluate(
  42. "//div[@id='pagetitle']/h1/span|//td[@class='navbar']",
  43. document,
  44. null,
  45. XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
  46. null);
  47.  
  48. // Titelstring ermitteln
  49. if (titlenode.snapshotItem(0) !== null) {
  50. v_title= fcttitle(titlenode.snapshotItem(0).textContent);
  51. // Threadlink setzen, falls gewuenscht
  52. if (p_threadlink == 1){
  53. var link_node = document.evaluate(
  54. "//a[contains(@href,'sendmessage.php?do=sendtofriend')]",
  55. document,
  56. null,
  57. XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
  58. null);
  59. var tnr=fctgivenumber(link_node.snapshotItem(0).href,'t');
  60. titlenode.snapshotItem(0).innerHTML = "<span style='cursor:help' id=gmvbspn_t" + tnr + " title='"+p_threadhover+"'><span style='font-size:"+p_threadfontsize +"'>[thread=" + tnr +"]</span>"+v_title+"<span style='font-size:"+p_threadfontsize +"'>[/thread]</span></span>";
  61. var tlink=document.getElementById("gmvbspn_t"+tnr);
  62. tlink.addEventListener('click', selectID("gmvbspn_t"+tnr), false);
  63. }
  64. // Ende Threadlink setzen, falls gewuenscht
  65. } else {
  66. // falls kein Titelnode gefunden, auf document.title ausweichen
  67. v_title=fcttitle(document.title);
  68. }
  69. // Ende Titelstring ermitteln
  70.  
  71. //Postnodes ermitteln
  72. var postnodes = document.evaluate(
  73. "//a[starts-with(@id,'postcount')]",
  74. document,
  75. null,
  76. XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
  77. null);
  78.  
  79.  
  80. //Postlinks in vorher ermittelten Postnodes setzen
  81. for(var i=0; i<postnodes.snapshotLength; i++) {
  82. thisnode = postnodes.snapshotItem(i);
  83. var postspan = document.createElement("span");
  84. var postid= fctgivenumber(thisnode.id,"p");
  85. postspan.id = "gmvbspn_p"+postid;
  86. postspan.innerHTML="[post="+postid+"]"+v_title+"[/post] ";
  87. postspan.style.backgroundColor = p_postbackground;
  88. postspan.style.color = p_postcolor;
  89. postspan.style.cursor = 'help';
  90. postspan.style.fontSize= p_postfontsize;
  91. postspan.title = p_posthover;
  92. postspan.addEventListener('click', selectID(postspan.id), false);
  93. thisnode.parentNode.insertBefore(postspan, thisnode.previousSibling);
  94. }
  95. // Ende Postlinks setzen
  96.  
  97.  
  98. // Hilfsfunktionen
  99.  
  100. // Markierung per Klick auf Element mit ID:
  101. function selectID(sId){
  102. return (function(event) {
  103. var myElement = document.getElementById(sId);
  104. var selection = window.getSelection();
  105. var range = document.createRange();
  106. range.selectNodeContents(myElement);
  107. selection.removeAllRanges();
  108. selection.addRange(range);
  109. });
  110. }
  111.  
  112.  
  113. // kuerzt den Titel auf x Zeichen - s. p_titlelen (es wird nicht im Wort gekuerzt):
  114. function fcttitle(a_str){
  115. a_str = a_str.replace(/ +/g, ' ').replace(/^\s+/g, '').replace(/\s+$/g, '');
  116. if(a_str.length > p_titlelen && p_titlelen > 0) {
  117. wordWrap = a_str.slice(0,a_str.lastIndexOf(' ',p_titlelen));
  118. if (wordWrap.length<a_str.length){wordWrap += '&nbsp;&#133';}
  119. }
  120. else {
  121. wordWrap = a_str;
  122. }
  123. return wordWrap.replace(/</g,'&lt;').replace(/'/g,'&apos;').replace(/"/g,'&quot;');
  124. }
  125.  
  126.  
  127. // extrahiert die Post- bzw. Threadnummer:
  128. function fctgivenumber(a_str,a_type) {
  129. var b_return='';
  130. if (a_type == 'p') {
  131. // alle Zahlen ab '...postcount':
  132. b_return=a_str.match(/postcount\d+/)[0].match(/\d+/);
  133. }
  134. else {
  135. // einige Browser veraendern leider innerHTML, deshalb innerHTML sicherheitshalber auf einen Stand bringen:
  136. var c_tlinkextr = 'sendmessage.php?do=sendtofriend&amp;t=';
  137. var c_tlinkrepl = 'sendmessage.php?do=sendtofriend&t=';
  138. a_str=a_str.replace(c_tlinkrepl,c_tlinkextr);
  139. // alle Zahlen ab '...sendmessage.php?do=sendtofriend&amp;t=' (? maskiert!):
  140. b_return=a_str.match(/sendmessage.php\?do=sendtofriend&amp;t=\d+/)[0].match(/\d+/);
  141. }
  142. return b_return;
  143. }
  144. // Ende Hilfsfunktionen
  145.  
  146. })();