您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
4/5/2025, 11:24:00 AM
- // ==UserScript==
- // @name Rewrite reddit links to use the Narwhal 2 URI scheme
- // @namespace codes.heals.violentmonkey.narwhal2-opener
- // @match https://*/*
- // @require https://update.greasyfork.org/scripts/446257/1059316/waitForKeyElements%20utility%20function.js
- // @grant GM_getValue
- // @grant GM_setValue
- // @grant GM_registerMenuCommand
- // @grant GM_unregisterMenuCommand
- // @grant GM_addValueChangeListener
- // @grant window.close
- // @run-at document-start
- // @version 1.3
- // @author HealsCodes
- // @description 4/5/2025, 11:24:00 AM
- // @license GPL3
- // ==/UserScript==
- const redditLinkDomains = ['https://reddit.com', 'https://m.reddit.com', 'https://www.reddit.com', 'https://reddit.app.link'];
- function redirectHrefAndCloseIfPossible() {
- // handle a new tab that is about to load a reddit-url (opened from another app for example)
- for(const prefix of redditLinkDomains) {
- if (window.location.href.startsWith(prefix)) {
- let encodedUrl = encodeURIComponent(window.location.href);
- window.location.href = 'narwhal://open-url/' + encodedUrl;
- setTimeout(() => window.close(), 500);
- return true;
- }
- }
- return false;
- }
- function updatePageLinks(element) {
- 'use strict';
- function updateTextContent(textContent) {
- if (GM_getValue('addWhaleMark', true)) {
- return textContent + ' ' + String.fromCodePoint(0x1f433);
- }
- return textContent;
- }
- // Function to extract the original URL and redirect to Narwhal
- function redirectToNarwhal(link) {
- var originalUrl = link.href;
- var originalTextContent = link.textContent;
- if (originalUrl.startsWith('narwhal://')) {
- // already processed
- return;
- }
- for(const prefix of redditLinkDomains) {
- if (originalUrl.startsWith(prefix)) {
- let encodedUrl = encodeURIComponent(originalUrl);
- let textContent = updateTextContent(originalTextContent);
- Object.assign(link, {
- textContent: textContent,
- href: 'narwhal://open-url/' + encodedUrl
- });
- return;
- }
- }
- }
- if (element !== undefined) {
- redirectToNarwhal(element);
- } else {
- document.querySelectorAll(`a[href*="reddit."]`).forEach(link => redirectToNarwhal(link));
- }
- }
- function menuCommandTitle(state) {
- let checked = (state != null) ? state : GM_getValue('addWhaleMark', true);
- return String.fromCodePoint(checked ? 0x2611 : 0x2610) + ' Add ' + String.fromCodePoint(0x1f433) + ' to Narwhal links';
- }
- let valueChangedListener = GM_addValueChangeListener('addWhaleMark', function(name, oldVal, newVal, remote) {
- GM_unregisterMenuCommand(menuCommandTitle(oldVal));
- GM_registerMenuCommand(menuCommandTitle(newVal), (_) => GM_setValue('addWhaleMark', !GM_getValue('addWhaleMark', true)));
- });
- (function () {
- // move straight to Narwhal is we're already on reddit
- if (redirectHrefAndCloseIfPossible()) {
- return;
- }
- // register the context menu handler
- GM_registerMenuCommand(menuCommandTitle(null), (_) => GM_setValue('addWhaleMark', !GM_getValue('addWhaleMark', true)));
- // run on ajax updates
- waitForKeyElements(`a[href*="reddit."]`, (element) => updatePageLinks(), false);
- // run on initial page load
- document.updatePageLinks(undefined);
- })();