(fileElement)
| 136 | } |
| 137 | |
| 138 | function createCopyButton(fileElement) { |
| 139 | const fileActionElement = fileElement.querySelector('.file-actions') |
| 140 | if (!fileActionElement) { |
| 141 | return noop |
| 142 | } |
| 143 | |
| 144 | const rawButton = fileActionElement.querySelector('a[href*="/raw/"]') |
| 145 | if (!rawButton) { |
| 146 | return noop |
| 147 | } |
| 148 | |
| 149 | const buttonToDown = document.createElement('button') |
| 150 | buttonToDown.className = 'btn-octicon gist-down-button' |
| 151 | buttonToDown.style.marginRight = '5px' |
| 152 | const button = document.createElement('button') |
| 153 | button.className = 'btn-octicon gist-copy-button' |
| 154 | button.style.marginRight = '5px' |
| 155 | buttonToDown.innerHTML = ` |
| 156 | <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-down"> |
| 157 | <path d="M2.75 14A1.75 1.75 0 0 1 1 12.25v-2.5a.75.75 0 0 1 1.5 0v2.5c0 .138.112.25.25.25h10.5a.25.25 0 0 0 .25-.25v-2.5a.75.75 0 0 1 1.5 0v2.5A1.75 1.75 0 0 1 13.25 14Z"></path> |
| 158 | <path d="M7.25 7.689V2a.75.75 0 0 1 1.5 0v5.689l1.97-1.969a.749.749 0 1 1 1.06 1.06l-3.25 3.25a.749.749 0 0 1-1.06 0L4.22 6.78a.749.749 0 1 1 1.06-1.06l1.97 1.969Z"></path> |
| 159 | </svg> |
| 160 | |
| 161 | <svg style="display: none;" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check color-fg-success"> |
| 162 | <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path> |
| 163 | </svg> |
| 164 | ` |
| 165 | |
| 166 | button.innerHTML = ` |
| 167 | <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy"> |
| 168 | <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path> |
| 169 | </svg> |
| 170 | |
| 171 | <svg style="display: none;" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check color-fg-success"> |
| 172 | <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path> |
| 173 | </svg> |
| 174 | ` |
| 175 | |
| 176 | const copyIcon = button.querySelector('.octicon-copy') |
| 177 | const checkIcon = button.querySelector('.octicon-check') |
| 178 | const downIcon = buttonToDown.querySelector('.octicon-down') |
| 179 | const downcheckIcon = buttonToDown.querySelector('.octicon-check') |
| 180 | let timeoutId = null |
| 181 | const copyHandler = (e) => { |
| 182 | if (timeoutId) { |
| 183 | return |
| 184 | } |
| 185 | e.preventDefault() |
| 186 | const rawUrl = rawButton.href |
| 187 | GM_xmlhttpRequest({ |
| 188 | method: 'GET', |
| 189 | url: rawUrl, |
| 190 | onload: function (response) { |
| 191 | if (response.status === 200) { |
| 192 | navigator.clipboard.writeText(response.responseText).then(() => { |
| 193 | copyIcon.style.display = 'none' |
| 194 | checkIcon.style.display = 'inline-block' |
| 195 | timeoutId = setTimeout(() => { |
nothing calls this directly
no test coverage detected