1+ ; ( function ( ) {
2+ 'use strict'
3+
4+ var CMD_RX = / ^ \$ ( \S [ ^ \\ \n ] * ( \\ \n (? ! \$ ) [ ^ \\ \n ] * ) * ) (? = \n | $ ) / gm
5+ var LINE_CONTINUATION_RX = / ( ) * \\ \n * | \\ \n ( ? ) * / g
6+ var TRAILING_SPACE_RX = / + $ / gm
7+
8+ var config = ( document . getElementById ( 'site-script' ) || { dataset : { } } ) . dataset
9+ var uiRootPath = config . uiRootPath == null ? '.' : config . uiRootPath
10+ var svgAs = config . svgAs
11+ var supportsCopy = window . navigator . clipboard
12+
13+ ; [ ] . slice . call ( document . querySelectorAll ( '.doc pre.highlight, .doc .literalblock pre' ) ) . forEach ( function ( pre ) {
14+ var code , language , lang , copy , toast , toolbox
15+ if ( pre . classList . contains ( 'highlight' ) ) {
16+ code = pre . querySelector ( 'code' )
17+ if ( ( language = code . dataset . lang ) && language !== 'console' ) {
18+ ; ( lang = document . createElement ( 'span' ) ) . className = 'source-lang'
19+ lang . appendChild ( document . createTextNode ( language ) )
20+ }
21+ } else if ( pre . innerText . startsWith ( '$ ' ) ) {
22+ var block = pre . parentNode . parentNode
23+ block . classList . remove ( 'literalblock' )
24+ block . classList . add ( 'listingblock' )
25+ pre . classList . add ( 'highlightjs' , 'highlight' )
26+ ; ( code = document . createElement ( 'code' ) ) . className = 'language-console hljs'
27+ code . dataset . lang = 'console'
28+ code . appendChild ( pre . firstChild )
29+ pre . appendChild ( code )
30+ } else {
31+ return
32+ }
33+ ; ( toolbox = document . createElement ( 'div' ) ) . className = 'source-toolbox'
34+ if ( lang ) toolbox . appendChild ( lang )
35+ if ( supportsCopy ) {
36+ ; ( copy = document . createElement ( 'button' ) ) . className = 'copy-button'
37+ copy . setAttribute ( 'title' , 'Copy to clipboard' )
38+ if ( svgAs === 'svg' ) {
39+ var svg = document . createElementNS ( 'http://www.w3.org/2000/svg' , 'svg' )
40+ svg . setAttribute ( 'class' , 'copy-icon' )
41+ var use = document . createElementNS ( 'http://www.w3.org/2000/svg' , 'use' )
42+ use . setAttribute ( 'href' , uiRootPath + '/../images/octicons-16.svg#icon-clippy' )
43+ svg . appendChild ( use )
44+ copy . appendChild ( svg )
45+ } else {
46+ var img = document . createElement ( 'img' )
47+ img . src = uiRootPath + '/../images/octicons-16.svg#view-clippy'
48+ img . alt = 'copy icon'
49+ img . className = 'copy-icon'
50+ copy . appendChild ( img )
51+ }
52+ ; ( toast = document . createElement ( 'span' ) ) . className = 'copy-toast'
53+ toast . appendChild ( document . createTextNode ( 'Copied!' ) )
54+ copy . appendChild ( toast )
55+ toolbox . appendChild ( copy )
56+ }
57+ pre . parentNode . appendChild ( toolbox )
58+ if ( copy ) copy . addEventListener ( 'click' , writeToClipboard . bind ( copy , code ) )
59+ } )
60+
61+ function extractCommands ( text ) {
62+ var cmds = [ ]
63+ var m
64+ while ( ( m = CMD_RX . exec ( text ) ) ) cmds . push ( m [ 1 ] . replace ( LINE_CONTINUATION_RX , '$1$2' ) )
65+ return cmds . join ( ' && ' )
66+ }
67+
68+ function writeToClipboard ( code ) {
69+ var text = code . innerText . replace ( TRAILING_SPACE_RX , '' )
70+ if ( code . dataset . lang === 'console' && text . startsWith ( '$ ' ) ) text = extractCommands ( text )
71+ window . navigator . clipboard . writeText ( text ) . then (
72+ function ( ) {
73+ this . classList . add ( 'clicked' )
74+ this . offsetHeight // eslint-disable-line no-unused-expressions
75+ this . classList . remove ( 'clicked' )
76+ } . bind ( this ) ,
77+ function ( ) { }
78+ )
79+ }
80+ } ) ( )
81+
0 commit comments