Skip to content
This repository was archived by the owner on Aug 25, 2024. It is now read-only.

Commit 84287ed

Browse files
committed
docs: static: Add copybutton.js
Signed-off-by: John Andersen <[email protected]>
1 parent 2090ec4 commit 84287ed

File tree

1 file changed

+64
-0
lines changed

1 file changed

+64
-0
lines changed

docs/_static/copybutton.js

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
$(document).ready(function() {
2+
/* Add a [>>>] button on the top-right corner of code samples to hide
3+
* the >>> and ... prompts and the output and thus make the code
4+
* copyable. */
5+
var div = $('.highlight-python .highlight,' +
6+
'.highlight-python3 .highlight,' +
7+
'.highlight-pycon .highlight,' +
8+
'.highlight-pycon3 .highlight,' +
9+
'.highlight-default .highlight');
10+
var pre = div.find('pre');
11+
12+
// get the styles from the current theme
13+
pre.parent().parent().css('position', 'relative');
14+
var hide_text = 'Hide the prompts and output';
15+
var show_text = 'Show the prompts and output';
16+
var border_width = pre.css('border-top-width');
17+
var border_style = pre.css('border-top-style');
18+
var border_color = pre.css('border-top-color');
19+
var button_styles = {
20+
'cursor':'pointer', 'position': 'absolute', 'top': '0', 'right': '0',
21+
'border-color': border_color, 'border-style': border_style,
22+
'border-width': border_width, 'color': border_color, 'text-size': '75%',
23+
'font-family': 'monospace', 'padding-left': '0.2em', 'padding-right': '0.2em',
24+
'border-radius': '0 3px 0 0'
25+
}
26+
27+
// create and add the button to all the code blocks that contain >>>
28+
div.each(function(index) {
29+
var jthis = $(this);
30+
if (jthis.find('.gp').length > 0) {
31+
var button = $('<span class="copybutton">&gt;&gt;&gt;</span>');
32+
button.css(button_styles)
33+
button.attr('title', hide_text);
34+
button.data('hidden', 'false');
35+
jthis.prepend(button);
36+
}
37+
// tracebacks (.gt) contain bare text elements that need to be
38+
// wrapped in a span to work with .nextUntil() (see later)
39+
jthis.find('pre:has(.gt)').contents().filter(function() {
40+
return ((this.nodeType == 3) && (this.data.trim().length > 0));
41+
}).wrap('<span>');
42+
});
43+
44+
// define the behavior of the button when it's clicked
45+
$('.copybutton').click(function(e){
46+
e.preventDefault();
47+
var button = $(this);
48+
if (button.data('hidden') === 'false') {
49+
// hide the code output
50+
button.parent().find('.go, .gp, .gt').hide();
51+
button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'hidden');
52+
button.css('text-decoration', 'line-through');
53+
button.attr('title', show_text);
54+
button.data('hidden', 'true');
55+
} else {
56+
// show the code output
57+
button.parent().find('.go, .gp, .gt').show();
58+
button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'visible');
59+
button.css('text-decoration', 'none');
60+
button.attr('title', hide_text);
61+
button.data('hidden', 'false');
62+
}
63+
});
64+
});

0 commit comments

Comments
 (0)