Skip to content

Commit e9e9ce4

Browse files
committed
Add syntax highlighting to the curl section while preserving copying ability 💾
1 parent 66af113 commit e9e9ce4

File tree

2 files changed

+35
-10
lines changed

2 files changed

+35
-10
lines changed

src/core/components/curl.jsx

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
import React from "react"
22
import PropTypes from "prop-types"
33
import curlify from "core/curlify"
4+
import Lowlight from "../lowlight"
5+
import {copyToClipboard} from "../utils"
46

57
export default class Curl extends React.Component {
68
static propTypes = {
79
request: PropTypes.object.isRequired
810
}
911

10-
handleFocus(e) {
11-
e.target.select()
12-
document.execCommand("copy")
12+
copy(curlCommand) {
13+
return () => copyToClipboard(curlCommand)
1314
}
1415

1516
render() {
@@ -18,9 +19,10 @@ export default class Curl extends React.Component {
1819

1920
return (
2021
<div>
21-
<h4>Curl</h4>
22-
<div className="copy-paste">
23-
<textarea onFocus={this.handleFocus} readOnly={true} className="curl" value={curl}></textarea>
22+
<h4>Curl <i onClick={this.copy(curl)}>(copyCommand)</i></h4>
23+
24+
<div>
25+
<Lowlight language="bash" className="curl" value={curl}/>
2426
</div>
2527
</div>
2628
)

src/core/utils.js

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -256,20 +256,43 @@ export function mapToList(map, keyNames="key", collectedKeys=Im.Map()) {
256256
return list
257257
}
258258

259+
export const copyToClipboard = str => {
260+
// adapted from https://hackernoon.com/copying-text-to-clipboard-with-javascript-df4d4988697f
261+
const el = document.createElement("textarea")
262+
el.value = str
263+
el.setAttribute("readonly", "")
264+
el.style.position = "absolute"
265+
el.style.left = "-9999px"
266+
267+
document.body.appendChild(el)
268+
// preserve selection
269+
const selected =
270+
document.getSelection().rangeCount > 0
271+
? document.getSelection().getRangeAt(0)
272+
: false
273+
el.select()
274+
document.execCommand("copy")
275+
document.body.removeChild(el)
276+
if (selected) {
277+
document.getSelection().removeAllRanges()
278+
document.getSelection().addRange(selected)
279+
}
280+
}
281+
259282
export function extractFileNameFromContentDispositionHeader(value){
260283
let patterns = [
261284
/filename\*=[^']+'\w*'"([^"]+)";?/i,
262285
/filename\*=[^']+'\w*'([^;]+);?/i,
263286
/filename="([^;]*);?"/i,
264287
/filename=([^;]*);?/i
265288
]
266-
289+
267290
let responseFilename
268291
patterns.some(regex => {
269292
responseFilename = regex.exec(value)
270293
return responseFilename !== null
271294
})
272-
295+
273296
if (responseFilename !== null && responseFilename.length > 1) {
274297
try {
275298
return decodeURIComponent(responseFilename[1])
@@ -741,15 +764,15 @@ export function paramToIdentifier(param, { returnAll = false, allowHashes = true
741764
}
742765
const paramName = param.get("name")
743766
const paramIn = param.get("in")
744-
767+
745768
let generatedIdentifiers = []
746769

747770
// Generate identifiers in order of most to least specificity
748771

749772
if (param && param.hashCode && paramIn && paramName && allowHashes) {
750773
generatedIdentifiers.push(`${paramIn}.${paramName}.hash-${param.hashCode()}`)
751774
}
752-
775+
753776
if(paramIn && paramName) {
754777
generatedIdentifiers.push(`${paramIn}.${paramName}`)
755778
}

0 commit comments

Comments
 (0)