|
1 | 1 | // ==UserScript== |
2 | | -// @name Swagger Toolkit |
| 2 | +// @name swagger-toolkit |
3 | 3 | // @namespace https://github.com/SublimeCT/greasy_monkey_scripts |
4 | | -// @version 1.0.0 |
5 | | -// @description Swagger 站点工具脚本 💪 | 保存浏览历史 🕘 | 显示收藏夹 ⭐️ | 点击 path 快速定位 🎯 |
| 4 | +// @version 1.1.1 |
| 5 | +// @description Swagger 站点工具脚本 💪 | 保存浏览历史 🕘 | 显示收藏夹 ⭐️ | 点击 path 快速定位 🎯 | 快速复制 API path 🔗 |
6 | 6 | // @note v1.0.1 增加当前页是不是 swagger 构建的文档判断; 自动展开所有 tag, 以定位到对应的 API; |
| 7 | +// @note v1.1.0 增加复制 API path 功能 |
| 8 | +// @note v1.1.1 fix: 修复增加历史记录时将 toolkit-btn-group 内容一起加进去的问题 |
7 | 9 | // @author Sven |
8 | 10 | // @icon https://static1.smartbear.co/swagger/media/assets/swagger_fav.png |
9 | 11 | // @match *://*/docs/index.html |
|
82 | 84 | --body-btn-group-width: 20px; |
83 | 85 | } |
84 | 86 |
|
| 87 | + /* 应用于 Copy input */ |
| 88 | + .toolkit-hidden { width: 1; height: 1; } |
| 89 | +
|
| 90 | + /* 接口信息部分样式 */ |
| 91 | + #swagger-ui .opblock .toolkit-path-btn-group { margin-left: 10px; display: none; } |
| 92 | + #swagger-ui .opblock:hover .toolkit-path-btn-group { display: block; } |
| 93 | + #swagger-ui .opblock .toolkit-path-btn-group a { text-decoration: none; } |
| 94 | +
|
85 | 95 | /* 页面内容主体布局 */ |
86 | 96 | #swagger-ui div.topbar { display: flex; justify-content: flex-end; } |
87 | 97 | #swagger-ui div.topbar .wrapper { margin: 0; width: var(--body-wrapper-width); min-width: var(--body-wrapper-min-width); margin-right: var(--body-wrapper-margin-right) } |
|
149 | 159 | store.id = row.id |
150 | 160 | store.key = key |
151 | 161 | store.method = row.querySelector('.opblock-summary-method').innerText |
152 | | - store.path = row.querySelector('.opblock-summary-path').innerText |
| 162 | + store.path = row.querySelector('.opblock-summary-path > a').innerText |
153 | 163 | store.description = row.querySelector('.opblock-summary-description').innerText |
154 | 164 | LinkStore.add(key, store) |
155 | 165 | } |
|
279 | 289 | class SideBar { |
280 | 290 | static dom = null |
281 | 291 | static panes = [] |
| 292 | + static pathBtnGroupClassName = 'toolkit-path-btn-group' |
| 293 | + static copyInput = document.createElement('input') |
| 294 | + initCopyDOM() { |
| 295 | + SideBar.copyInput.classList.add('toolkit-hidden') |
| 296 | + document.body.appendChild(SideBar.copyInput) |
| 297 | + return this |
| 298 | + } |
282 | 299 | addListeners() { |
283 | 300 | window.addEventListener('hashchange', () => { |
284 | 301 | const _path = location.hash.length > 0 ? location.hash.substr(1) : '' |
|
287 | 304 | if (row) LinkStore.save(row, 'swagger-toolkit-history') |
288 | 305 | this._updatePane('swagger-toolkit-history') |
289 | 306 | }) |
| 307 | + document.querySelector('#swagger-ui').addEventListener('mouseover', evt => { |
| 308 | + this._showPathBtnGroup(evt) // 显示在 path 栏中的按钮组 |
| 309 | + }) |
290 | 310 | return this |
291 | 311 | } |
| 312 | + _showPathBtnGroup(evt) { |
| 313 | + const opblock = evt.target.closest('.opblock') |
| 314 | + if (!opblock) return |
| 315 | + this._appendPathBtnGroupDOM(opblock) |
| 316 | + } |
| 317 | + _appendPathBtnGroupDOM(opblock) { |
| 318 | + if (opblock.querySelector('.' + SideBar.pathBtnGroupClassName)) return |
| 319 | + const group = document.createElement('div') |
| 320 | + const copyBtn = document.createElement('a') |
| 321 | + group.classList.add(SideBar.pathBtnGroupClassName) |
| 322 | + copyBtn.setAttribute('href', 'javascript:;') |
| 323 | + copyBtn.classList.add('btn-copy') |
| 324 | + copyBtn.innerText = '🔗' |
| 325 | + copyBtn.setAttribute('title', 'copy') |
| 326 | + group.appendChild(copyBtn) |
| 327 | + copyBtn.addEventListener('click', evt => { |
| 328 | + this._copyPath(evt) |
| 329 | + }) |
| 330 | + |
| 331 | + const pathDOM = opblock.querySelector('.opblock-summary-path') |
| 332 | + if (pathDOM) pathDOM.appendChild(group) |
| 333 | + } |
| 334 | + _copyPath(evt) { |
| 335 | + evt.stopPropagation() |
| 336 | + const pathDOM = evt.target.closest('.opblock-summary-path') |
| 337 | + if (!pathDOM) return |
| 338 | + const pathLink = pathDOM.querySelector('a') |
| 339 | + if (!pathLink) return |
| 340 | + const path = pathLink.innerText |
| 341 | + SideBar.copyInput.value = path |
| 342 | + SideBar.copyInput.select() |
| 343 | + document.execCommand('Copy') |
| 344 | + console.log('copy successfuly') |
| 345 | + } |
292 | 346 | generateDom() { |
293 | 347 | const sidebar = document.createElement('sidebar') |
294 | 348 | sidebar.id = 'swagger-toolkit-sidebar' |
|
342 | 396 | SideBar.panes.push(new MarkPane()) |
343 | 397 | window.$$_SideBar = new SideBar() |
344 | 398 | window.$$_SideBar |
| 399 | + .initCopyDOM() |
345 | 400 | .addListeners() |
346 | 401 | .generateDom() |
347 | 402 | .appendPanes() |
|
0 commit comments