Skip to content

Commit cf1e37f

Browse files
committed
feat: swagger-toolkit: 快速复制 API path 🔗
1 parent 2ad0479 commit cf1e37f

File tree

1 file changed

+59
-4
lines changed

1 file changed

+59
-4
lines changed

swagger_toolkit.js

Lines changed: 59 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
// ==UserScript==
2-
// @name Swagger Toolkit
2+
// @name swagger-toolkit
33
// @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 🔗
66
// @note v1.0.1 增加当前页是不是 swagger 构建的文档判断; 自动展开所有 tag, 以定位到对应的 API;
7+
// @note v1.1.0 增加复制 API path 功能
8+
// @note v1.1.1 fix: 修复增加历史记录时将 toolkit-btn-group 内容一起加进去的问题
79
// @author Sven
810
// @icon https://static1.smartbear.co/swagger/media/assets/swagger_fav.png
911
// @match *://*/docs/index.html
@@ -82,6 +84,14 @@
8284
--body-btn-group-width: 20px;
8385
}
8486
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+
8595
/* 页面内容主体布局 */
8696
#swagger-ui div.topbar { display: flex; justify-content: flex-end; }
8797
#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,7 +159,7 @@
149159
store.id = row.id
150160
store.key = key
151161
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
153163
store.description = row.querySelector('.opblock-summary-description').innerText
154164
LinkStore.add(key, store)
155165
}
@@ -279,6 +289,13 @@
279289
class SideBar {
280290
static dom = null
281291
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+
}
282299
addListeners() {
283300
window.addEventListener('hashchange', () => {
284301
const _path = location.hash.length > 0 ? location.hash.substr(1) : ''
@@ -287,8 +304,45 @@
287304
if (row) LinkStore.save(row, 'swagger-toolkit-history')
288305
this._updatePane('swagger-toolkit-history')
289306
})
307+
document.querySelector('#swagger-ui').addEventListener('mouseover', evt => {
308+
this._showPathBtnGroup(evt) // 显示在 path 栏中的按钮组
309+
})
290310
return this
291311
}
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+
}
292346
generateDom() {
293347
const sidebar = document.createElement('sidebar')
294348
sidebar.id = 'swagger-toolkit-sidebar'
@@ -342,6 +396,7 @@
342396
SideBar.panes.push(new MarkPane())
343397
window.$$_SideBar = new SideBar()
344398
window.$$_SideBar
399+
.initCopyDOM()
345400
.addListeners()
346401
.generateDom()
347402
.appendPanes()

0 commit comments

Comments
 (0)