ChatGPT Code Export Button

Adds Export button to code blocks in ChatGPT responses, prompts user to save code as file with predefined filename based on coding language detected from the code block's class name.

目前為 2024-07-04 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name ChatGPT Code Export Button
  3. // @name:en ChatGPT Code Export Button
  4. // @name:zh-CN ChatGPT 代码导出按钮
  5. // @name:es Botón de Exportación de Código de ChatGPT
  6. // @name:hi चैटजीपीटी कोड निर्यात बटन
  7. // @name:fr Bouton d'Exportation de Code ChatGPT
  8. // @name:ar زر تصدير الكود في ChatGPT
  9. // @name:bn চ্যাটজিপিটি কোড রপ্তানি বাটন
  10. // @name:ru Кнопка экспорта кода ChatGPT
  11. // @name:pt Botão de Exportação de Código do ChatGPT
  12. // @name:ur چیٹ جی پی ٹی کوڈ برآمد بٹن
  13. // @namespace http://tampermonkey.net/
  14. // @version 2024/07/03.2
  15. // @license MIT
  16. // @description Adds Export button to code blocks in ChatGPT responses, prompts user to save code as file with predefined filename based on coding language detected from the code block's class name.
  17. // @description:en Adds Export button to code blocks in ChatGPT responses, prompts user to save code as file with predefined filename based on coding language detected from the code block's class name.
  18. // @description:zh-CN 为 ChatGPT 响应中的代码块添加导出按钮,提示用户根据代码块的类名检测到的编程语言将代码保存为文件。
  19. // @description:es Agrega un botón de exportación a los bloques de código en las respuestas de ChatGPT, solicitando al usuario que guarde el código como archivo con un nombre predefinido según el lenguaje de programación detectado del nombre de la clase del bloque de código.
  20. // @description:hi चैटजीपीटी प्रतिक्रियाओं में कोड ब्लॉक्स में निर्यात बटन जोड़ता है, उपयोगकर्ता को कोड को फ़ाइल के रूप में सहेजने के लिए प्रीडिफ़ाइन्ड फ़ाइलनाम पर प्रोम्प्ट करता है जोड़ता है। कोड ब्लॉक के क्लास नाम से डिटेक्ट किया गया।
  21. // @description:fr Ajoute un bouton d'exportation aux blocs de code dans les réponses de ChatGPT, invite l'utilisateur à enregistrer le code sous forme de fichier avec un nom prédéfini basé sur le langage de programmation détecté à partir du nom de classe du bloc de code.
  22. // @description:ar يضيف زر التصدير إلى كتل الكود في ردود ChatGPT ، ويطلب من المستخدم حفظ الكود كملف باسم محدد مسبقًا بناءً على لغة البرمجة المكتشفة من اسم الفئة لكتلة الكود.
  23. // @description:bn ChatGPT রেসপন্সে কোড ব্লকের জন্য রপ্তানি বাটন যোগ করে, ব্যবহারকারীকে কোডটি ক্লাস নাম থেকে ডিটেক্ট করে পূর্বনির্ধারিত ফাইলনেমের মধ্যে সংরক্ষণ করতে বলে।
  24. // @description:ru Добавляет кнопку экспорта в блоки кода в ответах ChatGPT, предлагает пользователю сохранить код в файл с предопределенным именем на основе обнаруженного языка программирования из имени класса блока кода.
  25. // @description:pt Adiciona um botão de exportação aos blocos de código nas respostas do ChatGPT, solicitando ao usuário que salve o código como arquivo com um nome predefinido com base na linguagem de programação detectada a partir do nome da classe do bloco de código.
  26. // @description:ur چیٹ جی پی ٹی ردعملات میں کوڈ بلاکس میں برآمد بٹن شامل کرتا ہے، صارف کو کوڈ کو فائل کے طور پر محفوظ کرنے کے لیے پہلے سے تعین شدہ فائل نام پر پرومپٹ کرتا ہے جو کوڈ بلاک کے کلاس کے نام سے دریافت کیا گیا ہے
  27. // @author Muffin & Arcadie
  28. // @match https://chatgpt.com/*
  29. // @grant none
  30. // ==/UserScript==
  31.  
  32. (function() {
  33. 'use strict';
  34.  
  35. // Function to add "Export" button to existing code headers
  36. function addExportButtonToHeaders() {
  37. const codeHeaders = document.querySelectorAll('.flex.items-center.relative.text-token-text-secondary.bg-token-main-surface-secondary.px-4.py-2.text-xs.font-sans.justify-between.rounded-t-md');
  38.  
  39. codeHeaders.forEach(header => {
  40. // Check if "Export" button is already added
  41. if (header.querySelector('.export-button')) {
  42. return; // Skip if already added
  43. }
  44.  
  45. // Find the language label
  46. const languageLabel = header.querySelector('span');
  47.  
  48. // Create the "Export" button
  49. const exportButton = document.createElement('button');
  50. exportButton.innerText = 'Export';
  51. exportButton.classList.add('export-button'); // Add a class for styling
  52. exportButton.style.padding = '8px 16px';
  53. exportButton.style.marginRight = '8px'; // Adjust spacing if necessary
  54. exportButton.style.border = 'none';
  55. exportButton.style.borderRadius = '4px';
  56. exportButton.style.backgroundColor = '#e3e3e3';
  57. exportButton.style.color = '#333';
  58. exportButton.style.cursor = 'pointer';
  59. exportButton.style.transition = 'background-color 0.3s';
  60.  
  61. // Insert "Export" button after the language label
  62. languageLabel.parentNode.insertBefore(exportButton, languageLabel.nextSibling);
  63.  
  64. // Add click event listener for the "Export" button
  65. exportButton.addEventListener('click', () => {
  66. const codeBlock = header.parentElement.querySelector('pre code'); // Assuming structure, adjust as needed
  67. const language = languageLabel.textContent.trim().toLowerCase(); // Extract language
  68. exportCode(codeBlock, language); // Call export function
  69. });
  70. });
  71. }
  72.  
  73. // Function to open File Explorer for saving the code as file
  74. async function exportCode(codeBlock, language) {
  75. let fileName;
  76. let fileExtension;
  77. let mimeType;
  78.  
  79. // Determine filename, extension, and MIME type based on language
  80. switch (language) {
  81. case 'javascript':
  82. case 'js':
  83. fileName = 'script';
  84. fileExtension = '.js';
  85. mimeType = 'application/javascript';
  86. break;
  87. case 'html':
  88. fileName = 'index';
  89. fileExtension = '.html';
  90. mimeType = 'text/html';
  91. break;
  92. case 'css':
  93. fileName = 'styles';
  94. fileExtension = '.css';
  95. mimeType = 'text/css';
  96. break;
  97. case 'python':
  98. case 'py':
  99. fileName = 'main';
  100. fileExtension = '.py';
  101. mimeType = 'text/x-python';
  102. break;
  103. default:
  104. // If language cannot be determined from <span>, fallback to provided language
  105. switch (language.toLowerCase()) {
  106. case 'javascript':
  107. case 'js':
  108. fileName = 'script';
  109. fileExtension = '.js';
  110. mimeType = 'application/javascript';
  111. break;
  112. case 'html':
  113. fileName = 'index';
  114. fileExtension = '.html';
  115. mimeType = 'text/html';
  116. break;
  117. case 'css':
  118. fileName = 'styles';
  119. fileExtension = '.css';
  120. mimeType = 'text/css';
  121. break;
  122. case 'python':
  123. case 'py':
  124. fileName = 'main';
  125. fileExtension = '.py';
  126. mimeType = 'text/x-python';
  127. break;
  128. case 'java':
  129. fileName = 'Main';
  130. fileExtension = '.java';
  131. mimeType = 'text/x-java-source';
  132. break;
  133. case 'kotlin':
  134. fileName = 'Main';
  135. fileExtension = '.kt';
  136. mimeType = 'text/x-kotlin';
  137. break;
  138. case 'c++':
  139. case 'cpp':
  140. fileName = 'main';
  141. fileExtension = '.cpp';
  142. mimeType = 'text/x-c++src';
  143. break;
  144. case 'c#':
  145. case 'csharp':
  146. fileName = 'Program';
  147. fileExtension = '.cs';
  148. mimeType = 'text/x-csharp';
  149. break;
  150. case 'c':
  151. fileName = 'main';
  152. fileExtension = '.c';
  153. mimeType = 'text/x-csrc';
  154. break;
  155. case 'ruby':
  156. fileName = 'script';
  157. fileExtension = '.rb';
  158. mimeType = 'text/x-ruby';
  159. break;
  160. case 'rust':
  161. fileName = 'main';
  162. fileExtension = '.rs';
  163. mimeType = 'text/x-rustsrc';
  164. break;
  165. case 'php':
  166. fileName = 'script';
  167. fileExtension = '.php';
  168. mimeType = 'text/x-php';
  169. break;
  170. case 'swift':
  171. fileName = 'main';
  172. fileExtension = '.swift';
  173. mimeType = 'text/x-swift';
  174. break;
  175. case 'typescript':
  176. case 'ts':
  177. fileName = 'script';
  178. fileExtension = '.ts';
  179. mimeType = 'application/typescript';
  180. break;
  181. case 'go':
  182. fileName = 'main';
  183. fileExtension = '.go';
  184. mimeType = 'text/x-go';
  185. break;
  186. case 'perl':
  187. fileName = 'script';
  188. fileExtension = '.pl';
  189. mimeType = 'text/x-perl';
  190. break;
  191. case 'lua':
  192. fileName = 'script';
  193. fileExtension = '.lua';
  194. mimeType = 'text/x-lua';
  195. break;
  196. default:
  197. fileName = 'code';
  198. fileExtension = '.txt';
  199. mimeType = 'text/plain';
  200. break;
  201. }
  202. break;
  203. }
  204.  
  205. // Create a Blob object with the code content
  206. const blob = new Blob([codeBlock.innerText], { type: mimeType });
  207.  
  208. try {
  209. if (window.showSaveFilePicker) {
  210. // Use File System Access API if available
  211. const fileHandle = await window.showSaveFilePicker({
  212. suggestedName: fileName + fileExtension,
  213. types: [
  214. {
  215. description: language,
  216. accept: {
  217. [mimeType]: [fileExtension],
  218. },
  219. },
  220. ],
  221. });
  222.  
  223. const writable = await fileHandle.createWritable();
  224. await writable.write(blob);
  225. await writable.close();
  226. } else {
  227. // Fallback for browsers that do not support showSaveFilePicker
  228. const downloadLink = document.createElement('a');
  229. downloadLink.href = URL.createObjectURL(blob);
  230. downloadLink.download = fileName + fileExtension;
  231. downloadLink.style.display = 'none';
  232. document.body.appendChild(downloadLink);
  233. downloadLink.click();
  234. URL.revokeObjectURL(downloadLink.href);
  235. document.body.removeChild(downloadLink);
  236. }
  237. } catch (error) {
  238. console.error('Save file dialog was canceled or failed', error);
  239. }
  240. }
  241.  
  242. // Observe the document for changes and add "Export" button to new code headers
  243. const observer = new MutationObserver(addExportButtonToHeaders);
  244. observer.observe(document.body, { childList: true, subtree: true });
  245.  
  246. // Initial processing of existing code headers
  247. addExportButtonToHeaders();
  248.  
  249. // Add custom CSS styles if needed
  250. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址