@@ -1769,9 +1769,37 @@ href="https://doc.rust-lang.org/${channel}/rustdoc/read-documentation/search.htm
1769
1769
} ( ) ) ;
1770
1770
1771
1771
// This section handles the copy button that appears next to the path breadcrumbs
1772
+ // and the copy buttons on the code examples.
1772
1773
( function ( ) {
1773
- let reset_button_timeout = null ;
1774
+ // Common functions to copy buttons.
1775
+ function copyContentToClipboard ( content ) {
1776
+ const el = document . createElement ( "textarea" ) ;
1777
+ el . value = content ;
1778
+ el . setAttribute ( "readonly" , "" ) ;
1779
+ // To not make it appear on the screen.
1780
+ el . style . position = "absolute" ;
1781
+ el . style . left = "-9999px" ;
1774
1782
1783
+ document . body . appendChild ( el ) ;
1784
+ el . select ( ) ;
1785
+ document . execCommand ( "copy" ) ;
1786
+ document . body . removeChild ( el ) ;
1787
+ }
1788
+
1789
+ function copyButtonAnimation ( button ) {
1790
+ button . classList . add ( "clicked" ) ;
1791
+
1792
+ if ( button . reset_button_timeout !== undefined ) {
1793
+ window . clearTimeout ( button . reset_button_timeout ) ;
1794
+ }
1795
+
1796
+ button . reset_button_timeout = window . setTimeout ( ( ) => {
1797
+ button . reset_button_timeout = undefined ;
1798
+ button . classList . remove ( "clicked" ) ;
1799
+ } , 1000 ) ;
1800
+ }
1801
+
1802
+ // Copy button that appears next to the path breadcrumbs.
1775
1803
const but = document . getElementById ( "copy-path" ) ;
1776
1804
if ( ! but ) {
1777
1805
return ;
@@ -1786,29 +1814,49 @@ href="https://doc.rust-lang.org/${channel}/rustdoc/read-documentation/search.htm
1786
1814
}
1787
1815
} ) ;
1788
1816
1789
- const el = document . createElement ( "textarea" ) ;
1790
- el . value = path . join ( "::" ) ;
1791
- el . setAttribute ( "readonly" , "" ) ;
1792
- // To not make it appear on the screen.
1793
- el . style . position = "absolute" ;
1794
- el . style . left = "-9999px" ;
1795
-
1796
- document . body . appendChild ( el ) ;
1797
- el . select ( ) ;
1798
- document . execCommand ( "copy" ) ;
1799
- document . body . removeChild ( el ) ;
1800
-
1801
- but . classList . add ( "clicked" ) ;
1817
+ copyContentToClipboard ( path . join ( "::" ) ) ;
1818
+ copyButtonAnimation ( but ) ;
1819
+ } ;
1802
1820
1803
- if ( reset_button_timeout !== null ) {
1804
- window . clearTimeout ( reset_button_timeout ) ;
1821
+ // Copy buttons on code examples.
1822
+ function copyCode ( codeElem ) {
1823
+ if ( ! codeElem ) {
1824
+ // Should never happen, but the world is a dark and dangerous place.
1825
+ return ;
1805
1826
}
1827
+ copyContentToClipboard ( codeElem . textContent ) ;
1828
+ }
1806
1829
1807
- function reset_button ( ) {
1808
- reset_button_timeout = null ;
1809
- but . classList . remove ( "clicked" ) ;
1830
+ function addCopyButton ( event ) {
1831
+ let elem = event . target ;
1832
+ while ( ! hasClass ( elem , "example-wrap" ) ) {
1833
+ elem = elem . parentElement ;
1834
+ if ( elem . tagName === "body" || hasClass ( elem , "docblock" ) ) {
1835
+ return ;
1836
+ }
1837
+ }
1838
+ // Since the button will be added, no need to keep this listener around.
1839
+ elem . removeEventListener ( "mouseover" , addCopyButton ) ;
1840
+
1841
+ const parent = document . createElement ( "div" ) ;
1842
+ parent . className = "button-holder" ;
1843
+ const runButton = elem . querySelector ( ".test-arrow" ) ;
1844
+ if ( runButton !== null ) {
1845
+ // If there is a run button, we move it into the same div.
1846
+ parent . appendChild ( runButton ) ;
1810
1847
}
1848
+ elem . appendChild ( parent ) ;
1849
+ const copyButton = document . createElement ( "button" ) ;
1850
+ copyButton . className = "copy-button" ;
1851
+ copyButton . title = "Copy code to clipboard" ;
1852
+ copyButton . addEventListener ( "click" , ( ) => {
1853
+ copyCode ( elem . querySelector ( "pre > code" ) ) ;
1854
+ copyButtonAnimation ( copyButton ) ;
1855
+ } ) ;
1856
+ parent . appendChild ( copyButton ) ;
1857
+ }
1811
1858
1812
- reset_button_timeout = window . setTimeout ( reset_button , 1000 ) ;
1813
- } ;
1859
+ onEachLazy ( document . querySelectorAll ( ".docblock .example-wrap" ) , elem => {
1860
+ elem . addEventListener ( "mouseover" , addCopyButton ) ;
1861
+ } ) ;
1814
1862
} ( ) ) ;
0 commit comments