1+ function * getHideableCopyButtonElements ( rootElement ) {
2+ // yield all elements with the "go" (Generic.Output),
3+ // "gp" (Generic.Prompt), or "gt" (Generic.Traceback) CSS class
4+ for ( const el of rootElement . querySelectorAll ( '.go, .gp, .gt' ) ) {
5+ yield el
6+ }
7+ // tracebacks (.gt) contain bare text elements that need to be
8+ // wrapped in a span to hide or show the element
9+ for ( let el of rootElement . querySelectorAll ( '.gt' ) ) {
10+ while ( ( el = el . nextSibling ) && el . nodeType !== Node . DOCUMENT_NODE ) {
11+ // stop wrapping text nodes when we hit the next output or
12+ // prompt element
13+ if ( el . nodeType === Node . ELEMENT_NODE && el . matches ( ".gp, .go" ) ) {
14+ break
15+ }
16+ // if the node is a text node with content, wrap it in a
17+ // span element so that we can control visibility
18+ if ( el . nodeType === Node . TEXT_NODE && el . textContent . trim ( ) ) {
19+ const wrapper = document . createElement ( 'span' )
20+ el . after ( wrapper )
21+ wrapper . appendChild ( el )
22+ el = wrapper
23+ }
24+ yield el
25+ }
26+ }
27+ }
28+
129
230const loadCopyButton = ( ) => {
331 /* Add a [>>>] button in the top-right corner of code samples to hide
@@ -18,28 +46,16 @@ const loadCopyButton = () => {
1846 const codeEl = buttonEl . nextElementSibling
1947 if ( buttonEl . dataset . hidden === 'false' ) {
2048 // hide the code output
21- codeEl . querySelectorAll ( '.go, .gp, .gt' ) . forEach ( el => el . hidden = true )
22- // tracebacks (.gt) contain bare text elements that need to be
23- // wrapped in a span to hide or show the element
24- codeEl . querySelectorAll ( '.gt' ) . forEach ( el => {
25- while ( ( el = el . nextSibling ) && el . nodeType !== Node . DOCUMENT_NODE ) {
26- if ( el . nodeType === Node . ELEMENT_NODE && el . matches ( ".gp, .go" ) ) {
27- break
28- }
29- if ( el . nodeType === Node . TEXT_NODE && el . textContent . trim ( ) ) {
30- const wrapper = document . createElement ( 'span' )
31- el . after ( wrapper )
32- wrapper . appendChild ( el )
33- el = wrapper
34- }
35- el . hidden = true
36- }
37- } )
49+ for ( const el of getHideableCopyButtonElements ( codeEl ) ) {
50+ el . hidden = true
51+ }
3852 buttonEl . title = show_text
3953 buttonEl . dataset . hidden = "true"
4054 } else {
4155 // show the code output
42- codeEl . childNodes . forEach ( el => el . hidden = false )
56+ for ( const el of getHideableCopyButtonElements ( codeEl ) ) {
57+ el . hidden = false
58+ }
4359 buttonEl . title = hide_text
4460 buttonEl . dataset . hidden = "false"
4561 }
0 commit comments