您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
10/12/2024, 14:57:32
- // ==UserScript==
- // @name 4chan thread sorter
- // @namespace Violentmonkey Scripts
- // @match https://boards.4chan.org/*
- // @grant none
- // @version 1.0
- // @author Anon
- // @description 10/12/2024, 14:57:32
- // ==/UserScript==
- let currentOption = 'default';
- const thread = document.querySelector('.thread');
- if (!thread) return;
- // Post sorter
- const postOrderReplies = (post) => {
- const replyCount = post.querySelectorAll('.postInfo .backlink').length;
- post.style.order = 100 - replyCount;
- }
- const postOrderCatbox = (post) => {
- const postContent = post.querySelector('.postMessage').textContent;
- const matches = postContent.match(/catbox\.moe/g);
- const catboxCount = matches ? matches.length : 0;
- post.style.order = 100 - catboxCount;
- }
- const assignPostOrder = () => {
- if (currentOption === 'default') {
- thread.style.display = 'block';
- return;
- }
- thread.style.display = 'flex';
- const posts = thread.querySelectorAll('.replyContainer');
- if (currentOption === 'replies') {
- posts.forEach(post => postOrderReplies(post));
- } else if (currentOption === 'catbox') {
- posts.forEach(post => postOrderCatbox(post));
- }
- }
- // Create option select
- const selectOptions = ['Default', 'Replies', 'Catbox'];
- const selectElement = document.createElement('select');
- selectOptions.forEach(option => {
- const optionElement = document.createElement('option');
- optionElement.value = option.toLowerCase();
- optionElement.textContent = option;
- selectElement.appendChild(optionElement);
- });
- selectElement.id = 'thread-sort';
- document.body.appendChild(selectElement);
- selectElement.addEventListener('change', (event) => {
- currentOption = event.target.value;
- assignPostOrder();
- });
- // Select observer
- const observerCallback = (mutationsList, observer) => {
- for (const mutation of mutationsList) {
- if (mutation.type === 'childList') {
- assignPostOrder();
- }
- }
- };
- const threadObserver = new MutationObserver(observerCallback);
- threadObserver.observe(thread, { childList: true, subtree: false });
- // Styles
- const style = document.createElement('style');
- style.innerHTML = `
- .thread {
- flex-direction: column;
- }
- .thread .opContainer {
- order: 1;
- }
- #thread-sort {
- position: fixed;
- top: 2.5rem;
- right: 2rem;
- opacity: 0.5;
- padding: 0.4rem 0.6rem;
- background: white !important;
- border: none !important;
- border-radius: 0.2rem;
- transition: all ease 150ms;
- cursor: pointer;
- }
- #thread-sort:hover {
- opacity: 1;
- }
- `;
- document.head.appendChild(style);