Percentage to Fraction Converter

Convert all percentages on nwdb.info to fractions with special rules for under 40%.

  1. // ==UserScript==
  2. // @name Percentage to Fraction Converter
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.1
  5. // @description Convert all percentages on nwdb.info to fractions with special rules for under 40%.
  6. // @author Fortunate
  7. // @match http://nwdb.info/*
  8. // @match https://nwdb.info/*
  9. // @grant none
  10. // @license MIT
  11. // ==/UserScript==
  12.  
  13. (function() {
  14. 'use strict';
  15.  
  16. // Function for new conversion rule (under 40%)
  17. function newConversion(numberStr) {
  18. var number = parseFloat(numberStr);
  19. if (number === 0) return "0"; // Handle division by zero
  20. var reciprocal = 100 / number;
  21. var rounded = parseFloat(reciprocal.toPrecision(3)); // Round to 3 significant digits for two decimal places
  22. var formatted = rounded % 1 === 0 ? rounded.toString() : rounded.toLocaleString('en', {maximumFractionDigits: 2});
  23. return "1/" + formatted;
  24. }
  25.  
  26. // Function to convert percentage string to fraction string
  27. function getFractionString(numberStr) {
  28. var number = parseFloat(numberStr);
  29. if (Math.abs(number) < 40) {
  30. return newConversion(numberStr);
  31. } else {
  32. return numberStr + "/100";
  33. }
  34. }
  35.  
  36. // Regular expression to match percentage patterns
  37. var regex = /(-?\d+(\.\d+)?)\s*%(?!\d)/g;
  38.  
  39. // Function to process percentage badges in a given node
  40. function processPercentageBadges(node) {
  41. if (!node) return;
  42. var badges = node.querySelectorAll('span.badge.item-badge');
  43. badges.forEach(function(badge) {
  44. var originalText = badge.textContent;
  45. var newText = originalText.replace(regex, function(match, p1) {
  46. return getFractionString(p1);
  47. });
  48. if (newText !== originalText) {
  49. badge.textContent = newText;
  50. }
  51. });
  52. }
  53.  
  54. // Initial processing of all percentage badges on the page
  55. function initialProcess() {
  56. var badges = document.querySelectorAll('span.badge.item-badge');
  57. badges.forEach(function(badge) {
  58. var originalText = badge.textContent;
  59. var newText = originalText.replace(regex, function(match, p1) {
  60. return getFractionString(p1);
  61. });
  62. if (newText !== originalText) {
  63. badge.textContent = newText;
  64. }
  65. });
  66. }
  67.  
  68. initialProcess();
  69.  
  70. // Function to find and handle the "Perk Buckets" tab
  71. function setupPerkBucketsHandler() {
  72. var perkBucketsTabButton = null;
  73. var buttons = document.querySelectorAll('button');
  74. for (var button of buttons) {
  75. var span = button.querySelector('span:first-child');
  76. if (span && span.textContent.trim() === "Perk Buckets") {
  77. perkBucketsTabButton = button;
  78. break;
  79. }
  80. }
  81.  
  82. if (perkBucketsTabButton) {
  83. var tabPanelId = perkBucketsTabButton.getAttribute("aria-controls");
  84. var perkBucketsTabPanel = document.getElementById(tabPanelId);
  85.  
  86. if (perkBucketsTabPanel) {
  87. // Process initially
  88. processPercentageBadges(perkBucketsTabPanel);
  89.  
  90. // Add click event listener with delay to reprocess on click
  91. perkBucketsTabButton.addEventListener("click", function() {
  92. setTimeout(function() {
  93. processPercentageBadges(perkBucketsTabPanel);
  94. }, 300); // Increased delay to 300ms to ensure content is rendered
  95. });
  96.  
  97. // Periodic check for tab content visibility and conversion
  98. setInterval(function() {
  99. if (perkBucketsTabPanel && window.getComputedStyle(perkBucketsTabPanel).display !== "none") {
  100. processPercentageBadges(perkBucketsTabPanel);
  101. }
  102. }, 500); // Check every 500ms
  103. }
  104. }
  105. }
  106.  
  107. // Run setup after a delay to ensure DOM is fully loaded
  108. setTimeout(setupPerkBucketsHandler, 1000);
  109.  
  110. // General MutationObserver for dynamic content on the whole page
  111. var observer = new MutationObserver(function(mutations) {
  112. mutations.forEach(function(mutation) {
  113. if (mutation.type === "childList") {
  114. mutation.addedNodes.forEach(function(node) {
  115. if (node.nodeType === Node.ELEMENT_NODE) {
  116. processPercentageBadges(node);
  117. }
  118. });
  119. }
  120. });
  121. });
  122.  
  123. observer.observe(document.body, {
  124. subtree: true,
  125. childList: true
  126. });
  127. })();

QingJ © 2025

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