Bitbucket code highlight

Add syntax highlight on bitbucket pull requests

  1. // ==UserScript==
  2. // @name Bitbucket code highlight
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.3
  5. // @description Add syntax highlight on bitbucket pull requests
  6. // @author Johnatan Dias
  7. // @match https://bitbucket.org/**/*
  8. // @grant none
  9. // ==/UserScript==
  10.  
  11. /*global hljs: true */
  12.  
  13. (function () {
  14. 'use strict';
  15.  
  16. const ENABLE_DEBUG = false;
  17.  
  18. const style = document.createElement('link');
  19. style.rel = 'stylesheet';
  20. style.href = 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/default.min.css';
  21. document.body.appendChild(style);
  22.  
  23. const script = document.createElement('script');
  24. script.src = 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js';
  25. document.body.appendChild(script);
  26.  
  27. const DEBUG = {
  28. LOG: message => ENABLE_DEBUG && console.log('=>', message),
  29. };
  30.  
  31. const highlightCode = () => {
  32. const notHighlightedCode = document.querySelectorAll(
  33. '.code-diff:not([data-highlighted="true"])'
  34. );
  35.  
  36. if (!notHighlightedCode.length) return;
  37. DEBUG.LOG({ notHighlightedCode });
  38.  
  39. const articleFilesElements = document.querySelectorAll(
  40. '[data-qa="pr-diff-file-styles"]'
  41. );
  42.  
  43. if (!articleFilesElements.length) return;
  44. DEBUG.LOG({ articleFilesElements });
  45.  
  46. addEventListenerOnShowMoreButton();
  47.  
  48. const handleExtensionName = extension => {
  49. const extensions = { json: 'js' };
  50. return extensions[extension] || extension;
  51. }
  52.  
  53. Array.from(articleFilesElements).forEach(file => {
  54. const fileTitle = file.querySelector('[data-qa="bk-filepath"]')
  55. .firstChild
  56. .lastElementChild
  57. .innerText;
  58.  
  59. const language = handleExtensionName(fileTitle.split('.').pop());
  60. DEBUG.LOG({ fileTitle, language });
  61.  
  62. const linesCode = file.querySelectorAll(
  63. '.code-diff:not([data-highlighted="true"])'
  64. );
  65.  
  66. DEBUG.LOG({ linesCode });
  67.  
  68. Array.from(linesCode).forEach(codeElement => {
  69. const parentElement = codeElement.parentElement;
  70. parentElement.classList.add(language);
  71. parentElement.style.display = 'flex';
  72. parentElement.style.alignItems = 'center';
  73.  
  74. hljs.highlightBlock(codeElement);
  75. codeElement.style.backgroundColor = 'transparent';
  76. codeElement.style.padding = '0';
  77. codeElement.dataset.highlighted = true;
  78. });
  79. });
  80. }
  81.  
  82. const addEventListenerOnShowMoreButton = () => {
  83. const buttons = document.querySelectorAll(
  84. '[data-qa="pr-diff-show-more-lines"]:not([data-event-added="true"])'
  85. );
  86.  
  87. DEBUG.LOG({ buttons });
  88.  
  89. for (let button of buttons) {
  90. button.addEventListener('click', highlightCode, false);
  91. button.dataset.eventAdded = true;
  92. }
  93. };
  94.  
  95. window.addEventListener('scroll', highlightCode, false);
  96. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址