Add spoiler tag for PSE

Add the "add spoiler" button in the right click menu

  1. // ==UserScript==
  2. // @name Add spoiler tag for PSE
  3. // @description Add the "add spoiler" button in the right click menu
  4. // @version 1
  5. // @author Lord of dark
  6. // @require http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
  7. // @include http://puzzling.stackexchange.com/*
  8. // @namespace https://greasyfork.org/users/49190
  9. // ==/UserScript==
  10.  
  11. this.$ = this.jQuery = jQuery.noConflict(true); // use jquery has no conflict
  12.  
  13. if (!("contextMenu" in document.documentElement &&
  14. "HTMLMenuItemElement" in window)) return;
  15.  
  16. var body = document.body;
  17. body.addEventListener("contextmenu", initMenu, false);
  18.  
  19. var menu = body.appendChild(document.createElement("menu"));
  20. menu.outerHTML = '<menu id="userscript-spoiler" type="context">\
  21. <menuitem label="add spoiler"></menuitem>\
  22. </menu>';
  23.  
  24. document.querySelector("#userscript-spoiler menuitem")
  25. .addEventListener("click", addspoiler, false);
  26.  
  27. function initMenu(aEvent) {
  28. // Executed when user right click on web page body
  29. // aEvent.target is the element you right click on
  30. var node = aEvent.target;
  31. var item = document.querySelector("#userscript-spoiler menuitem");
  32. if (node.localName == "textarea") {
  33. body.setAttribute("contextmenu", "userscript-spoiler");
  34. } else {
  35. body.removeAttribute("contextmenu");
  36. }
  37. }
  38.  
  39. function addspoiler(aEvent) {
  40. var textareas = document.getElementsByTagName("textarea");
  41. var nb = textareas.length;
  42. for (var i=0;i<nb;i++){
  43. var textarea=textareas[i];
  44. var len = textarea.value.length;
  45. var start = textarea.selectionStart;
  46. var end = textarea.selectionEnd;
  47. var sel = textarea.value.substring(start, end);
  48. if (sel.length>0){
  49. // Select text and edit it
  50. var spoilered = sel.replace(/^[>! ]*/,">! ");
  51. spoilered=spoilered.replace(/ *\n[>! ]*/g, " \n>! ");
  52.  
  53. // Replace the selected text with this one
  54. textarea.value = textarea.value.substring(0,start) + spoilered + textarea.value.substring(end,len);
  55. // trigger event to update the "preview"
  56. var ev = document.createEvent("KeyboardEvent");
  57. ev.initKeyEvent("keypress", true, false, window, 0, 0, 0, 0, 13, 13);
  58. textarea.dispatchEvent(ev);
  59. break;
  60. }
  61. }
  62. }