您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Enhanced script to change text colors, fonts, and sizes with a modern UI using Tailwind CSS
当前为
- // ==UserScript==
- // @name Enhanced Character.AI Font and Colors
- // @namespace EnhancedCharacterAITextColor
- // @match https://old.character.ai/*
- // @grant none
- // @license MIT
- // @version 1.1
- // @description Enhanced script to change text colors, fonts, and sizes with a modern UI using Tailwind CSS
- // @icon https://i.imgur.com/ynjBqKW.png
- // @author Karan via ChatGPT
- // ==/UserScript==
- (function () {
- // Add Tailwind CSS to the document
- const tailwindCSS = document.createElement('link');
- tailwindCSS.href = 'https://cdnjs.cloudflare.com/ajax/libs/tailwindcss/2.2.19/tailwind.min.css';
- tailwindCSS.rel = 'stylesheet';
- document.head.appendChild(tailwindCSS);
- var plaintextColor = localStorage.getItem('plaintext_color') || '#958C7F';
- var fontFamily = localStorage.getItem('font_family') || 'Noto Sans, sans-serif';
- var fontSize = localStorage.getItem('font_size') || '16px';
- var css = `
- p, .swiper-no-swiping div {
- color: ${plaintextColor} !important;
- font-family: ${fontFamily} !important;
- font-size: ${fontSize} !important;
- }
- `;
- var head = document.getElementsByTagName("head")[0];
- var style = document.createElement("style");
- style.setAttribute("type", "text/css");
- style.innerHTML = css;
- head.appendChild(style);
- })();
- function changeColors() {
- const pTags = document.getElementsByTagName("p");
- for (let i = 0; i < pTags.length; i++) {
- const pTag = pTags[i];
- if (
- pTag.dataset.colorChanged === "true" ||
- pTag.querySelector("code") ||
- pTag.querySelector("img")
- ) {
- continue;
- }
- let text = pTag.innerHTML;
- const aTags = pTag.getElementsByTagName("a");
- for (let j = 0; j < aTags.length; j++) {
- const aTag = aTags[j];
- text = text.replace(aTag.outerHTML, "REPLACE_ME_" + j);
- }
- text = text.replace(/(["“”«»].*?["“”«»])/g, `<span style="color: ${localStorage.getItem('quotationmarks_color') || '#FFFFFF'}">$1</span>`);
- text = text.replace(/<em>(.*?)<\/em>/g,`<span style="color: ${localStorage.getItem('italic_color') || '#E0DF7F'}; font-style: italic;">$1</span>`);
- var wordlist_cc = JSON.parse(localStorage.getItem('wordlist_cc')) || [];
- if (wordlist_cc.length > 0) {
- var wordRegex = new RegExp('\\b(' + wordlist_cc.map(word => word.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('|') + ')\\b', 'gi');
- text = text.replace(wordRegex, `<span style="color: ${localStorage.getItem('custom_color') || '#FFFFFF'}">$1</span>`);
- }
- for (let j = 0; j < aTags.length; j++) {
- const aTag = aTags[j];
- text = text.replace("REPLACE_ME_" + j, aTag.outerHTML);
- }
- pTag.innerHTML = text;
- pTag.dataset.colorChanged = "true";
- }
- console.log("Changed colors");
- }
- const observer = new MutationObserver(changeColors);
- observer.observe(document, { subtree: true, childList: true });
- changeColors();
- function createButton(symbol, onClick, extraClasses = '') {
- const button = document.createElement('button');
- button.innerHTML = symbol;
- button.className = `relative bg-none border-none text-lg cursor-pointer ${extraClasses}`;
- button.addEventListener('click', onClick);
- return button;
- }
- function createColorPanel() {
- const panel = document.createElement('div');
- panel.id = 'colorPanel';
- panel.className = 'fixed top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 bg-gray-800 rounded-lg p-6 shadow-lg text-white z-50';
- const categories = ['italic', 'quotationmarks', 'plaintext', 'custom'];
- const colorPickers = {};
- categories.forEach(category => {
- const colorPicker = document.createElement('input');
- colorPicker.type = 'color';
- const storedColor = localStorage.getItem(`${category}_color`);
- if (storedColor) {
- colorPicker.value = storedColor;
- }
- colorPickers[category] = colorPicker;
- const colorDiv = document.createElement('div');
- colorDiv.className = 'relative w-5 h-5 ml-2 mt-1 bg-current inline-block mr-2 cursor-pointer border border-black';
- colorDiv.style.backgroundColor = colorPicker.value;
- colorDiv.addEventListener('click', function () {
- colorPicker.click();
- });
- colorPicker.addEventListener('input', function () {
- colorDiv.style.backgroundColor = colorPicker.value;
- });
- const label = document.createElement('label');
- label.className = 'inline-block w-32';
- label.appendChild(document.createTextNode(`${category}: `));
- const resetButton = createButton('↺', function () {
- colorPicker.value = getDefaultColor(category);
- colorDiv.style.backgroundColor = colorPicker.value;
- }, 'relative top-1');
- const containerDiv = document.createElement('div');
- containerDiv.appendChild(label);
- containerDiv.appendChild(colorDiv);
- containerDiv.appendChild(resetButton);
- panel.appendChild(containerDiv);
- panel.appendChild(document.createElement('br'));
- });
- // Font selector
- const fontSelector = document.createElement('select');
- fontSelector.className = 'mt-4 bg-gray-700 border-none text-white rounded p-2';
- const fonts = ['Noto Sans', 'Arial', 'Times New Roman', 'Courier New', 'Verdana'];
- fonts.forEach(font => {
- const option = document.createElement('option');
- option.value = font;
- option.textContent = font;
- fontSelector.appendChild(option);
- });
- fontSelector.value = localStorage.getItem('font_family') || 'Noto Sans';
- const fontSizeInput = document.createElement('input');
- fontSizeInput.type = 'number';
- fontSizeInput.className = 'mt-4 bg-gray-700 border-none text-white rounded p-2 w-20';
- fontSizeInput.value = localStorage.getItem('font_size') ? parseInt(localStorage.getItem('font_size')) : 16;
- panel.appendChild(document.createTextNode('Font: '));
- panel.appendChild(fontSelector);
- panel.appendChild(document.createElement('br'));
- panel.appendChild(document.createTextNode('Font Size: '));
- panel.appendChild(fontSizeInput);
- panel.appendChild(document.createElement('br'));
- const buttonContainer = document.createElement('div');
- buttonContainer.className = 'mt-6 flex justify-between';
- const okButton = document.createElement('button');
- okButton.textContent = 'Confirm';
- okButton.className = 'w-24 h-10 rounded bg-green-500 hover:bg-green-600 text-white';
- okButton.addEventListener('click', function () {
- categories.forEach(category => {
- const oldValue = localStorage.getItem(`${category}_color`);
- const newValue = colorPickers[category].value;
- if (oldValue !== newValue) {
- localStorage.setItem(`${category}_color`, newValue);
- if (category === 'plaintext') {
- window.location.reload();
- }
- }
- });
- localStorage.setItem('font_family', fontSelector.value);
- localStorage.setItem('font_size', fontSizeInput.value + 'px');
- window.location.reload();
- });
- const cancelButton = document.createElement('button');
- cancelButton.textContent = 'Cancel';
- cancelButton.className = 'w-24 h-10 rounded bg-red-500 hover:bg-red-600 text-white';
- cancelButton.addEventListener('click', function () {
- panel.remove();
- });
- buttonContainer.appendChild(okButton);
- buttonContainer.appendChild(cancelButton);
- panel.appendChild(buttonContainer);
- document.body.appendChild(panel);
- }
- function getDefaultColor(category) {
- const defaultColors = {
- 'italic': '#E0DF7F',
- 'quotationmarks': '#FFFFFF',
- 'plaintext': '#958C7F',
- 'custom': '#E0DF7F'
- };
- return defaultColors[category];
- }
- const mainButton = createButton('', function () {
- const colorPanelExists = document.getElementById('colorPanel');
- if (!colorPanelExists) {
- createColorPanel();
- }
- });
- mainButton.style.backgroundImage = "url('https://i.imgur.com/yBgJ3za.png')";
- mainButton.style.backgroundSize = "cover";
- mainButton.style.top = "0px";
- mainButton.style.width = "22px";
- mainButton.style.height = "22px";
- function insertMainButton() {
- const targetSelector = '.chat2 > div:nth-child(1) > div:nth-child(1) > div:nth-child(3) > div:nth-child(1)';
- const targetPanel1 = document.querySelector(targetSelector);
- if (targetPanel1) {
- if (!document.querySelector('.color-palette-button')) {
- mainButton.classList.add('color-palette-button');
- targetPanel1.insertBefore(mainButton, targetPanel1.firstChild);
- }
- } else {
- const observer = new MutationObserver(() => {
- const updatedTargetPanel = document.querySelector(targetSelector);
- if (updatedTargetPanel) {
- mainButton.classList.add('color-palette-button');
- updatedTargetPanel.insertBefore(mainButton, updatedTargetPanel.firstChild);
- observer.disconnect();
- }
- });
- observer.observe(document.body, { subtree: true, childList: true });
- console.error('Target panel not found. Waiting for changes...');
- }
- }
- setInterval(insertMainButton, 1000);
- insertMainButton();