Furaffinity-Custom-Pages

Library to create Custom pages on Furaffinitiy

目前为 2025-03-07 提交的版本。查看 最新版本

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.cn-greasyfork.org/scripts/476762/1549463/Furaffinity-Custom-Pages.js

  1. // ==UserScript==
  2. // @name Furaffinity-Custom-Pages
  3. // @namespace Violentmonkey Scripts
  4. // @grant none
  5. // @version 1.2.2
  6. // @author Midori Dragon
  7. // @description Library to create Custom pages on Furaffinitiy
  8. // @icon https://www.furaffinity.net/themes/beta/img/banners/fa_logo.png
  9. // @license MIT
  10. // @homepageURL https://greasyfork.org/scripts/476762-furaffinity-custom-settings
  11. // @supportURL https://greasyfork.org/scripts/476762-furaffinity-custom-settings/feedback
  12. // ==/UserScript==
  13. // jshint esversion: 8
  14. (() => {
  15. "use strict";
  16. var LogLevel;
  17. !function(LogLevel) {
  18. LogLevel[LogLevel.Error = 1] = "Error";
  19. LogLevel[LogLevel.Warning = 2] = "Warning";
  20. LogLevel[LogLevel.Info = 3] = "Info";
  21. }(LogLevel || (LogLevel = {}));
  22. class Logger {
  23. static log(logLevel = LogLevel.Warning, ...args) {
  24. if (null == window.__FF_GLOBAL_LOG_LEVEL__) window.__FF_GLOBAL_LOG_LEVEL__ = LogLevel.Error;
  25. if (!(logLevel > window.__FF_GLOBAL_LOG_LEVEL__)) switch (logLevel) {
  26. case LogLevel.Error:
  27. console.error(...args);
  28. break;
  29.  
  30. case LogLevel.Warning:
  31. console.warn(...args);
  32. break;
  33.  
  34. case LogLevel.Info:
  35. console.log(...args);
  36. }
  37. }
  38. static setLogLevel(logLevel) {
  39. window.__FF_GLOBAL_LOG_LEVEL__ = logLevel;
  40. }
  41. static logError(...args) {
  42. Logger.log(LogLevel.Error, ...args);
  43. }
  44. static logWarning(...args) {
  45. Logger.log(LogLevel.Warning, ...args);
  46. }
  47. static logInfo(...args) {
  48. Logger.log(LogLevel.Info, ...args);
  49. }
  50. }
  51. function extractParameter(url, parameterName) {
  52. const parts = url.split("?");
  53. if (parts.length > 1) {
  54. const params = parts[parts.length - 1].split("&");
  55. for (const param of params) {
  56. const [key, value] = param.split("=");
  57. if (key === parameterName) return {
  58. key,
  59. value: decodeURIComponent(value)
  60. };
  61. }
  62. }
  63. }
  64. class CustomData {
  65. constructor(document) {
  66. this.document = document;
  67. }
  68. removeDocumentSiteContent() {
  69. const siteContent = this.document.getElementById("site-content");
  70. if (null != siteContent) siteContent.remove();
  71. return siteContent;
  72. }
  73. }
  74. class CustomPage extends EventTarget {
  75. constructor(pageUrl, parameterName = "") {
  76. super();
  77. Object.setPrototypeOf(this, CustomPage.prototype);
  78. this.pageUrl = pageUrl;
  79. this.parameterName = parameterName;
  80. CustomPage.customPages.push(this);
  81. if ("" !== parameterName) Logger.logInfo(`New CustomPage at '${pageUrl}'='${parameterName}'`); else Logger.logInfo(`New CustomPage at '${pageUrl}'`);
  82. }
  83. get isOpen() {
  84. const url = window.location.toString();
  85. if (!url.includes(this.pageUrl)) return false; else if ("" === this.parameterName) return true;
  86. const parameter = extractParameter(url, this.parameterName), isOpen = (null == parameter ? void 0 : parameter.key) === this.parameterName;
  87. if (isOpen) Logger.logInfo(`CustomPage '${this.pageUrl}'='${this.parameterName}' is open`);
  88. return isOpen;
  89. }
  90. get parameterValue() {
  91. const parameter = extractParameter(window.location.toString(), this.parameterName);
  92. return null == parameter ? void 0 : parameter.value;
  93. }
  94. get onOpen() {
  95. return this._onOpen;
  96. }
  97. set onOpen(handler) {
  98. this._onOpen = handler;
  99. }
  100. static checkAllPages() {
  101. CustomPage.customPages.forEach((page => page.checkPageOpened()));
  102. }
  103. checkPageOpened() {
  104. if (this.isOpen) this.pageOpened(this.parameterValue, document);
  105. }
  106. pageOpened(parameterValue, openedPage) {
  107. const customData = new CustomData(openedPage);
  108. customData.parameterValue = parameterValue;
  109. const event = new CustomEvent("onOpen", {
  110. detail: customData
  111. });
  112. this.dispatchEvent(event);
  113. }
  114. invokeOpen(doc, parameterValue) {
  115. var _a;
  116. const customData = new CustomData(doc);
  117. customData.parameterValue = parameterValue;
  118. null === (_a = this._onOpen) || void 0 === _a || _a.call(this, customData);
  119. this.dispatchEvent(new CustomEvent("open", {
  120. detail: customData
  121. }));
  122. }
  123. }
  124. CustomPage.customPages = [];
  125. Object.defineProperties(window, {
  126. FACustomPage: {
  127. get: () => CustomPage
  128. }
  129. });
  130. })();