- // ==UserScript==
- // @name ChatGPT Text Splitter
- // @namespace http://tampermonkey.net/
- // @version 0.1
- // @description Automatically split long messages into parts for ChatGPT, inspired by jjdiaz.dev, created with ❤️.
- // @author JOHNNYDAN
- // @match https://chatgpt.com/*
- // @icon https://chatgpt-prompt-splitter.jjdiaz.dev/favicon.ico
- // @grant none
- // @license GNU GENERAL PUBLIC LICENSE
- // ==/UserScript==
-
- (function() {
- 'use strict';
-
- // Constants
- const MAX_CHUNK_SIZE = 15000;
- const SCISSOR_EMOJI = '✂️';
- const PAPER_EMOJI = '📄';
- let longContent = '';
- let splitParts = [];
- let currentPartIndex = 0;
-
- // Function to create styled buttons
- function createButton(text, left, top, bgColor) {
- const button = document.createElement('button');
- button.innerHTML = text;
- Object.assign(button.style, {
- position: 'fixed',
- left: `${left}px`,
- top: `${top}px`,
- padding: '8px 12px',
- fontSize: '14px',
- fontWeight: 'bold',
- backgroundColor: bgColor,
- color: 'white',
- border: 'none',
- borderRadius: '8px',
- cursor: 'pointer',
- zIndex: '1000',
- transition: '0.2s ease-in-out',
- boxShadow: '0px 2px 5px rgba(0,0,0,0.2)'
- });
-
- button.addEventListener('mouseenter', () => button.style.opacity = '0.8');
- button.addEventListener('mouseleave', () => button.style.opacity = '1');
-
- document.body.appendChild(button);
- return button;
- }
-
- // Create UI Buttons
- const scissorButton = createButton(SCISSOR_EMOJI + " Split", 1600, 10, '#f39c12'); // Orange
- const paperButton = createButton(PAPER_EMOJI + " Paste", 1600, 50, '#3498db'); // Blue
-
- // Function to show notifications (extended to 5s)
- function showNotification(message) {
- const notification = document.createElement('div');
- notification.textContent = message;
- Object.assign(notification.style, {
- position: 'fixed',
- top: '50px',
- left: '50%',
- transform: 'translateX(-50%)',
- backgroundColor: '#2f2f2f',
- color: 'white',
- padding: '10px 15px',
- borderRadius: '6px',
- fontSize: '14px',
- fontWeight: 'bold',
- zIndex: '999',
- boxShadow: '0px 2px 5px rgba(0,0,0,0.2)'
- });
- document.body.appendChild(notification);
- setTimeout(() => notification.remove(), 5000); // Extended to 5 seconds
- }
-
- // Function to split text into chunks
- function splitText(content) {
- let parts = [];
- let numParts = Math.ceil(content.length / MAX_CHUNK_SIZE);
- for (let i = 0; i < numParts; i++) {
- let start = i * MAX_CHUNK_SIZE;
- let end = start + MAX_CHUNK_SIZE;
- parts.push(content.slice(start, end));
- }
- return parts;
- }
-
- // Event listener for the scissors button (Step 1)
- scissorButton.addEventListener('click', () => {
- const editableDiv = document.querySelector('#prompt-textarea');
- if (!editableDiv) {
- alert('Unable to find the input field!');
- return;
- }
-
- longContent = editableDiv.innerText.trim();
- splitParts = splitText(longContent);
- currentPartIndex = 0;
-
- const instructionText = `
- The total length of the content I want to send you is too large to send in one piece.
-
- For sending this content, I will follow this rule:
-
- [START PART 1/${splitParts.length}]
- I will divide the text into parts, each with a strict format.
- Do not process the content yet. Simply acknowledge each part as "Part X/Y received" and wait for the next.
- [END PART 1/${splitParts.length}]
-
- Once all parts are sent, I will write "ALL PARTS SENT" to signal you to process them.
- `.trim();
-
- editableDiv.innerText = instructionText;
- editableDiv.focus();
- showNotification("Press Enter to send instructions. Then use the Paste button for parts.");
- });
-
- // Event listener for the paper button (Step 2)
- paperButton.addEventListener('click', () => {
- if (splitParts.length === 0) {
- showNotification("Click the Split button first to prepare the content.");
- return;
- }
-
- const editableDiv = document.querySelector('#prompt-textarea');
- if (!editableDiv) return;
-
- // If all parts are sent, send "ALL PARTS SENT" and reset
- if (currentPartIndex >= splitParts.length) {
- editableDiv.innerText = "ALL PARTS SENT";
- showNotification("All parts sent! ChatGPT can now process the data.");
- currentPartIndex = 0;
- return;
- }
-
- let partText = splitParts[currentPartIndex];
- let totalParts = splitParts.length;
- let partNumber = currentPartIndex + 1;
-
- let message = `
- Do not answer yet. This is just another part of the text I want to send you.
- Just receive and acknowledge as "Part ${partNumber}/${totalParts} received" and wait for the next part.
-
- [START PART ${partNumber}/${totalParts}]
- ${partText}
- [END PART ${partNumber}/${totalParts}]
- `.trim();
-
- if (partNumber < totalParts) {
- message += `\nRemember not answering yet. Just acknowledge you received this part with the message "Part ${partNumber}/${totalParts} received" and wait for the next part."`;
- }
-
- editableDiv.innerText = message;
- editableDiv.focus();
-
- showNotification(`Sent Part ${partNumber}/${totalParts}. Press Enter.`);
-
- currentPartIndex++;
- });
- })();