ChatGPT 聊天复制代码按钮

在 chatgpt.com 上代码块的右下角添加一个带有动画的“复制代码”按钮

当前为 2024-09-21 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name ChatGPT Chat Copy Code Button
  3. // @description Add a 'Copy Code' button to the bottom right hand of code blocks on chatgpt.com with animation
  4. // @name:zh-CN ChatGPT 聊天复制代码按钮
  5. // @description:zh-CN 在 chatgpt.com 上代码块的右下角添加一个带有动画的“复制代码”按钮
  6. // @name:ar ChatGPT زر نسخ رمز الدردشة
  7. // @description:ar يخرج chatgpt.com أضف رسمًا متحركًا في الركن الأيمن السفلي من كتلة التعليمات البرمجية العلوية“نسخ الرمز”زر
  8. // @name:bg ChatGPT Бутон за копиране на код за чат
  9. // @description:bg съществуват chatgpt.com Добавете анимация в долния десен ъгъл на горния кодов блок“Копирайте кода”бутон
  10. // @name:cs ChatGPT Tlačítko pro kopírování kódu chatu
  11. // @description:cs existovat chatgpt.com Přidejte animaci do pravého dolního rohu horního bloku kódu“Kopírovat kód”tlačítko
  12. // @name:da ChatGPT Chat kopi kode knap
  13. // @description:da eksistere chatgpt.com Tilføj en animation i nederste højre hjørne af den øverste kodeblok“Kopiér kode”knap
  14. // @name:de ChatGPT Schaltfläche zum Kopieren des Chat-Codes
  15. // @description:de existieren chatgpt.com Fügen Sie in der unteren rechten Ecke des oberen Codeblocks eine Animation hinzu“Code kopieren”Taste
  16. // @name:el ChatGPT Κουμπί αντιγραφής κωδικού συνομιλίας
  17. // @description:el υπάρχω chatgpt.com Προσθέστε μια κινούμενη εικόνα στην κάτω δεξιά γωνία του επάνω μπλοκ κώδικα“Αντιγραφή κωδικού”κουμπί
  18. // @name:en ChatGPT Chat copy code button
  19. // @description:en exist chatgpt.com Add an animation in the lower right corner of the upper code block“Copy code”button
  20. // @name:eo ChatGPT Babilejo kopia kodo butono
  21. // @description:eo ekzisti chatgpt.com Aldonu animacion en la malsupra dekstra angulo de la supra kodbloko“Kopiu kodon”butonon
  22. // @name:es ChatGPT Botón de copiar código de chat
  23. // @description:es existir chatgpt.com Agregue una animación en la esquina inferior derecha del bloque de código superior“Copiar código”botón
  24. // @name:fi ChatGPT Chat-koodin kopiointipainike
  25. // @description:fi olemassa chatgpt.com Lisää animaatio ylemmän koodilohkon oikeaan alakulmaan“Kopioi koodi”-painiketta
  26. // @name:fr ChatGPT Bouton de copie du code de chat
  27. // @description:fr exister chatgpt.com Ajoutez une animation dans le coin inférieur droit du bloc de code supérieur“Copier le code”bouton
  28. // @name:he ChatGPT לחצן העתקת קוד צ’אט
  29. // @description:he לְהִתְקַיֵם chatgpt.com הוסף אנימציה בפינה הימנית התחתונה של גוש הקוד העליון“העתק קוד”לַחְצָן
  30. // @name:hr ChatGPT Gumb za kopiranje koda za chat
  31. // @description:hr postojati chatgpt.com Dodajte animaciju u donji desni kut gornjeg bloka koda“Kopiraj kod”dugme
  32. // @name:hu ChatGPT Csevegési kódmásolás gomb
  33. // @description:hu létezik chatgpt.com Adjon hozzá animációt a felső kódblokk jobb alsó sarkába“Kód másolása”gomb
  34. // @name:id ChatGPT Tombol salin kode obrolan
  35. // @description:id ada chatgpt.com Tambahkan animasi di sudut kanan bawah blok kode atas“Salin kode”tombol
  36. // @name:it ChatGPT Pulsante copia codice chat
  37. // @description:it esistere chatgpt.com Aggiungi un’animazione nell’angolo in basso a destra del blocco di codice superiore“Copia il codice”pulsante
  38. // @name:ja ChatGPT チャットコードコピーボタン
  39. // @description:ja 存在する chatgpt.com 上部のコード ブロックの右下隅にアニメーションを追加します。“コードをコピーする”ボタン
  40. // @name:ka ChatGPT ჩეთის კოპირების კოდის ღილაკი
  41. // @description:ka არსებობს chatgpt.com დაამატეთ ანიმაცია ზედა კოდის ბლოკის ქვედა მარჯვენა კუთხეში“დააკოპირეთ კოდი”ღილაკი
  42. // @name:ko ChatGPT 채팅 코드 복사 버튼
  43. // @description:ko 존재하다 chatgpt.com 상단 코드 블록의 오른쪽 하단에 애니메이션을 추가합니다.“코드 복사”단추
  44. // @name:nl ChatGPT Knop voor chatkopieercode
  45. // @description:nl bestaan chatgpt.com Voeg een animatie toe in de rechter benedenhoek van het bovenste codeblok“Kopieer code”knop
  46. // @name:nb ChatGPT Chat kopi kode knapp
  47. // @description:nb eksistere chatgpt.com Legg til en animasjon i nedre høyre hjørne av den øvre kodeblokken“Kopier koden”knapp
  48. // @name:pl ChatGPT Przycisk kopiowania kodu czatu
  49. // @description:pl istnieć chatgpt.com Dodaj animację w prawym dolnym rogu górnego bloku kodu“Skopiuj kod”przycisk
  50. // @name:pt-BR ChatGPT Botão copiar código do bate-papo
  51. // @description:pt-BR existir chatgpt.com Adicione uma animação no canto inferior direito do bloco de código superior“Copiar código”botão
  52. // @name:ro ChatGPT Butonul de copiere a codului de chat
  53. // @description:ro exista chatgpt.com Adăugați o animație în colțul din dreapta jos al blocului de cod de sus“Copiați codul”buton
  54. // @name:ru ChatGPT Кнопка копирования кода в чате
  55. // @description:ru существовать chatgpt.com Добавьте анимацию в правом нижнем углу верхнего блока кода.“Скопировать код”кнопка
  56. // @name:sk ChatGPT Tlačidlo na kopírovanie kódu chatu
  57. // @description:sk existujú chatgpt.com Pridajte animáciu do pravého dolného rohu horného bloku kódu“Kopírovať kód”tlačidlo
  58. // @name:sr ChatGPT Дугме за копирање кода за ћаскање
  59. // @description:sr постоје chatgpt.com Додајте анимацију у доњи десни угао горњег кодног блока“Копирај код”дугме
  60. // @name:sv ChatGPT Knapp för chattkopiering
  61. // @description:sv existera chatgpt.com Lägg till en animation i det nedre högra hörnet av det övre kodblocket“Kopiera kod”knapp
  62. // @name:th ChatGPT ปุ่มคัดลอกรหัสแชท
  63. // @description:th มีอยู่ chatgpt.com เพิ่มภาพเคลื่อนไหวที่มุมขวาล่างของบล็อกโค้ดด้านบน“คัดลอกรหัส”ปุ่ม
  64. // @name:tr ChatGPT Sohbet kodunu kopyala düğmesi
  65. // @description:tr var olmak chatgpt.com Üst kod bloğunun sağ alt köşesine bir animasyon ekleyin“Kodu kopyala”düğme
  66. // @name:ug ChatGPT پاراڭلىشىش كودى كۇنۇپكىسى
  67. // @description:ug مەۋجۇت chatgpt.com ئۈستۈنكى كود توپىنىڭ ئوڭ ئوڭ بۇلۇڭىغا كارتون قوشۇڭ“كودنى كۆچۈرۈڭ”كۇنۇپكا
  68. // @name:uk ChatGPT Кнопка копіювання коду чату
  69. // @description:uk існують chatgpt.com Додайте анімацію в нижній правий кут верхнього блоку коду“Скопіюйте код”кнопку
  70. // @name:vi ChatGPT Nút sao chép mã trò chuyện
  71. // @description:vi hiện hữu chatgpt.com Thêm hình động ở góc dưới bên phải của khối mã phía trên“Sao chép mã”cái nút
  72. // @name:zh-TW ChatGPT 聊天複製代碼按鈕
  73. // @description:zh-TW 在 chatgpt.com 上代碼區塊的右下角添加一個帶有動畫的“複製程式碼”按鈕
  74. // @name:zh-HK ChatGPT 聊天複製代碼按鈕
  75. // @description:zh-HK 在 chatgpt.com 上代碼區塊的右下角添加一個帶有動畫的“複製程式碼”按鈕
  76. // @name:fr-CA ChatGPT Bouton de copie du code de chat
  77. // @description:fr-CA exister chatgpt.com Ajoutez une animation dans le coin inférieur droit du bloc de code supérieur“Copier le code”bouton
  78. // @match https://chatgpt.com/*
  79. // @match https://share.nezhagpt.cloud/*
  80. // @author YodaBets,人民的勤务员 <toniaiwanowskiskr47@gmail.com>
  81. // @namespace https://github.com/ChinaGodMan/UserScripts
  82. // @supportURL https://github.com/ChinaGodMan/UserScripts/issues
  83. // @homepageURL https://github.com/ChinaGodMan/UserScripts
  84. // @license MIT
  85. // @icon data:image/png;base64,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
  86. // @compatible chrome
  87. // @compatible firefox
  88. // @compatible edge
  89. // @compatible opera
  90. // @compatible safari
  91. // @version 1.0.0.0
  92. // @Created 2024-09-22 07:06:07
  93. // @modified 2024-09-22 07:06:07
  94. // ==/UserScript==
  95. (function () {
  96. 'use strict'
  97.  
  98. const copyToClipboard = (text, button) => {
  99. navigator.clipboard.writeText(text).then(() => {
  100. console.log('Copied code to clipboard')
  101. button.innerHTML = 'Copied!'
  102. setTimeout(() => {
  103. button.innerHTML = '' // Clear the text
  104. const svgIcon = getSVGIcon() // Re-add the SVG icon
  105. button.appendChild(svgIcon)
  106. }, 2000)
  107. }, (err) => {
  108. console.error('Failed to copy code: ', err)
  109. })
  110. }
  111.  
  112. const getSVGIcon = () => {
  113. const svgIcon = document.createElementNS('http://www.w3.org/2000/svg', 'svg')
  114. svgIcon.setAttribute('width', '24')
  115. svgIcon.setAttribute('height', '24')
  116. svgIcon.setAttribute('fill', 'none')
  117. svgIcon.setAttribute('viewBox', '0 0 24 24')
  118. svgIcon.classList.add('icon-sm')
  119.  
  120. const path = document.createElementNS('http://www.w3.org/2000/svg', 'path')
  121. path.setAttribute('fill', 'currentColor')
  122. path.setAttribute('fill-rule', 'evenodd')
  123. path.setAttribute('d', 'M7 5a3 3 0 0 1 3-3h9a3 3 0 0 1 3 3v9a3 3 0 0 1-3 3h-2v2a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3v-9a3 3 0 0 1 3-3h2zm2 2h5a3 3 0 0 1 3 3v5h2a1 1 0 0 0 1-1V5a1 1 0 0 0-1-1h-9a1 1 0 0 0-1 1zM5 9a1 1 0 0 0-1 1v9a1 1 0 0 0 1 1h9a1 1 0 0 0 1-1v-9a1 1 0 0 0-1-1z')
  124. path.setAttribute('clip-rule', 'evenodd')
  125.  
  126. svgIcon.appendChild(path)
  127. return svgIcon
  128. }
  129.  
  130. const addButton = (elem) => {
  131. const button = document.createElement('button')
  132. const svgIcon = getSVGIcon()
  133. button.appendChild(svgIcon)
  134. button.style.position = 'absolute'
  135. button.style.bottom = '8px'
  136. button.style.right = '8px'
  137. button.style.fontSize = '12px'
  138. button.style.padding = '4px 8px'
  139. button.style.border = '1px solid #ccc'
  140. button.style.borderRadius = '3px'
  141. button.style.background = 'rgba(0,0,0,0.1)'
  142. button.style.color = 'white'
  143. button.style.cursor = 'pointer'
  144. button.style.zIndex = '10'
  145. button.style.transition = 'background-color 0.3s ease'
  146.  
  147. button.addEventListener('click', (e) => {
  148. e.stopPropagation()
  149. copyToClipboard(elem.querySelector('code').textContent, button)
  150. })
  151.  
  152. button.addEventListener('mouseover', () => {
  153. button.style.backgroundColor = 'rgba(0,0,0,0.2)'
  154. })
  155.  
  156. button.addEventListener('mouseout', () => {
  157. button.style.backgroundColor = 'rgba(0,0,0,0.1)'
  158. })
  159.  
  160. elem.style.position = 'relative'
  161. elem.appendChild(button)
  162. }
  163.  
  164. const observeCodeBlocks = () => {
  165. const codeBlocks = document.querySelectorAll('pre:not(.copy-code-processed)')
  166. if (codeBlocks.length) {
  167. codeBlocks.forEach(block => {
  168.  
  169. addButton(block)
  170. block.classList.add('copy-code-processed')
  171. })
  172. }
  173. }
  174.  
  175. setTimeout(() => {
  176. const observer = new MutationObserver(observeCodeBlocks)
  177. observer.observe(document.body, { childList: true, subtree: true })
  178. observeCodeBlocks()
  179. }, 5000)
  180.  
  181. })()