From ac2181895dbc0b344bf52bb8082685d692d44915 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?ma=E1=B4=9Ako?= <66082492+grey4owl@users.noreply.github.com> Date: Sat, 13 Jan 2024 16:36:13 +0100 Subject: [PATCH 1/8] Add copy code to clipboard button - markdown.rs --- src/librustdoc/html/markdown.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/librustdoc/html/markdown.rs b/src/librustdoc/html/markdown.rs index 642265f5f6bef..181d626254609 100644 --- a/src/librustdoc/html/markdown.rs +++ b/src/librustdoc/html/markdown.rs @@ -51,6 +51,8 @@ use crate::html::highlight; use crate::html::length_limit::HtmlWithLimit; use crate::html::render::small_url_encode; use crate::html::toc::TocBuilder; +use crate::html::static_files; +use crate::html::layout::Page; use pulldown_cmark::{ html, BrokenLink, CodeBlockKind, CowStr, Event, LinkType, OffsetIter, Options, Parser, Tag, @@ -270,9 +272,15 @@ impl<'a, I: Iterator>> Iterator for CodeBlocks<'_, 'a, I> { format!( "
\
\
+                                     \
                                      {text}\
                                  
\
", + static_root_path = &page.get_static_root_path(), + clipboard_svg = &static_files::STATIC_FILES.clipboard_svg, added_classes = added_classes.join(" "), text = Escape(&original_text), ) From 324c04110cff2490f38ea667a03814e4c7b89bc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?ma=E1=B4=9Ako?= <66082492+grey4owl@users.noreply.github.com> Date: Sat, 13 Jan 2024 16:37:16 +0100 Subject: [PATCH 2/8] Add copy code to clipboard button - source.html --- src/librustdoc/html/templates/source.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/librustdoc/html/templates/source.html b/src/librustdoc/html/templates/source.html index 42d01277db2c2..08a425e235cd1 100644 --- a/src/librustdoc/html/templates/source.html +++ b/src/librustdoc/html/templates/source.html @@ -11,6 +11,11 @@ {% endfor %} {# #}
 {# #}
+         {# #}
         
             {% if needs_expansion %}
                 

From da9546f8add802f795031e540a4783d4972349e1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?ma=E1=B4=9Ako?= <66082492+grey4owl@users.noreply.github.com>
Date: Sat, 13 Jan 2024 16:40:26 +0100
Subject: [PATCH 3/8] Add copy code to clipboard button - main.js

---
 src/librustdoc/html/static/js/main.js | 33 +++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git a/src/librustdoc/html/static/js/main.js b/src/librustdoc/html/static/js/main.js
index 88901191cda25..36f6bcafb99fa 100644
--- a/src/librustdoc/html/static/js/main.js
+++ b/src/librustdoc/html/static/js/main.js
@@ -1734,6 +1734,39 @@ href="https://doc.rust-lang.org/${channel}/rustdoc/read-documentation/search.htm
     resizer.addEventListener("pointerdown", initResize, false);
 }());
 
+// This section handles the copy buttons that appears in top right corner of the code blocks
+(function() {
+    let preElements = document.querySelectorAll("pre:has(code)");
+    preElements.forEach(function(pre, index) {
+        let resetTimeout = null;
+        let copyBtn = pre.querySelector("button[class='copy-code']");
+        let icon = copyBtn.innerHTML;
+        console.log(copyBtn);
+        pre.style.background = "red"; 
+        pre.addEventListener("mouseenter", function() {
+            copyBtn.style.opacity = "1";
+            copyBtn.addEventListener("click", function() {
+                let code = pre.querySelector("code");
+                let summary = code.querySelector("summary");
+                let content = code.textContent;
+                content = content.replace(summary.textContent, "");
+                navigator.clipboard.writeText(content).then(function() {
+                    copyBtn.textContent = "✓";
+                    if (resetTimeout !== null) {
+                        clearTimeout(resetTimeout);
+                    }
+                    resetTimeout = setTimeout(function() {
+                        copyBtn.innerHTML = icon;
+                    }, 1000);
+                });
+            });
+        });
+        pre.addEventListener("mouseleave", function() {
+            copyBtn.style.opacity = "0";
+        });
+    });
+}());
+
 // This section handles the copy button that appears next to the path breadcrumbs
 (function() {
     let reset_button_timeout = null;

From e3d800da1a6bf84e0a62d51641ef129a2d9766b7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?ma=E1=B4=9Ako?= <66082492+grey4owl@users.noreply.github.com>
Date: Sat, 13 Jan 2024 16:41:27 +0100
Subject: [PATCH 4/8] Disable copy code to clipboard button - noscript.css

---
 src/librustdoc/html/static/css/noscript.css | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/librustdoc/html/static/css/noscript.css b/src/librustdoc/html/static/css/noscript.css
index f425f3ec95c31..da752c981d270 100644
--- a/src/librustdoc/html/static/css/noscript.css
+++ b/src/librustdoc/html/static/css/noscript.css
@@ -9,7 +9,7 @@ rules.
 	margin-left: 0 !important;
 }
 
-#copy-path, #sidebar-button, .sidebar-resizer {
+#copy-path, #sidebar-button, .sidebar-resizer, .copy-code {
 	/* It requires JS to work so no need to display it in this case. */
 	display: none !important;
 }

From f614f5d7940921a1dfae272ae6a39944317a309c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?ma=E1=B4=9Ako?= <66082492+grey4owl@users.noreply.github.com>
Date: Sat, 13 Jan 2024 16:43:27 +0100
Subject: [PATCH 5/8] Add copy code to clipboard button - rustdoc.css

---
 src/librustdoc/html/static/css/rustdoc.css | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/src/librustdoc/html/static/css/rustdoc.css b/src/librustdoc/html/static/css/rustdoc.css
index cd53fcb8b7c16..954e032784b95 100644
--- a/src/librustdoc/html/static/css/rustdoc.css
+++ b/src/librustdoc/html/static/css/rustdoc.css
@@ -1596,6 +1596,24 @@ a.tooltip:hover::after {
 	height: 22px;
 }
 
+.copy-code {
+	width: 32px;
+	height: 30px;
+	float: right;
+	opacity: 0;
+	transition: opacity ease 0.3s;
+	background: var(--code-block-background-color);
+	outline: 1px solid var(--main-color);
+	border-radius: 5px;
+	padding: 5px 7px 4px 8px;
+	z-index: 1;
+	position: sticky;
+}
+
+.copy-code > img {
+	filter: var(--copy-code-img-filter);
+}
+
 #copy-path {
 	color: var(--copy-path-button-color);
 	background: var(--main-background-color);
@@ -2329,6 +2347,7 @@ in src-script.js and main.js
 	--copy-path-button-color: #999;
 	--copy-path-img-filter: invert(50%);
 	--copy-path-img-hover-filter: invert(35%);
+	--copy-code-img-filter: invert(20%);
 	--codeblock-error-hover-color: rgb(255, 0, 0);
 	--codeblock-error-color: rgba(255, 0, 0, .5);
 	--codeblock-ignore-hover-color: rgb(255, 142, 0);
@@ -2434,6 +2453,7 @@ in src-script.js and main.js
 	--copy-path-button-color: #999;
 	--copy-path-img-filter: invert(50%);
 	--copy-path-img-hover-filter: invert(65%);
+	--copy-code-img-filter: invert(50%);
 	--codeblock-error-hover-color: rgb(255, 0, 0);
 	--codeblock-error-color: rgba(255, 0, 0, .5);
 	--codeblock-ignore-hover-color: rgb(255, 142, 0);
@@ -2546,6 +2566,7 @@ Original by Dempfi (https://github.com/dempfi/ayu)
 	--copy-path-button-color: #fff;
 	--copy-path-img-filter: invert(70%);
 	--copy-path-img-hover-filter: invert(100%);
+	--copy-code-img-filter: invert(50%);
 	--codeblock-error-hover-color: rgb(255, 0, 0);
 	--codeblock-error-color: rgba(255, 0, 0, .5);
 	--codeblock-ignore-hover-color: rgb(255, 142, 0);

From 65c591b430bfb7579d2f57841912f5e2b3c2737f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?ma=E1=B4=9Ako?= <66082492+grey4owl@users.noreply.github.com>
Date: Sat, 13 Jan 2024 17:04:19 +0100
Subject: [PATCH 6/8] Add copy code to clipboard button - main.js

---
 src/librustdoc/html/static/js/main.js | 2 --
 1 file changed, 2 deletions(-)

diff --git a/src/librustdoc/html/static/js/main.js b/src/librustdoc/html/static/js/main.js
index 36f6bcafb99fa..49bfd41f9660a 100644
--- a/src/librustdoc/html/static/js/main.js
+++ b/src/librustdoc/html/static/js/main.js
@@ -1741,8 +1741,6 @@ href="https://doc.rust-lang.org/${channel}/rustdoc/read-documentation/search.htm
         let resetTimeout = null;
         let copyBtn = pre.querySelector("button[class='copy-code']");
         let icon = copyBtn.innerHTML;
-        console.log(copyBtn);
-        pre.style.background = "red"; 
         pre.addEventListener("mouseenter", function() {
             copyBtn.style.opacity = "1";
             copyBtn.addEventListener("click", function() {

From 8aebe6e1aefd564bbaabd169922c1b4ba7157a50 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?ma=E1=B4=9Ako?= <66082492+grey4owl@users.noreply.github.com>
Date: Sat, 13 Jan 2024 19:37:05 +0100
Subject: [PATCH 7/8] Changes in response to PR
 https://github.com/rust-lang/rust/pull/119929#issue-2080372438

---
 src/librustdoc/html/sources.rs | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/librustdoc/html/sources.rs b/src/librustdoc/html/sources.rs
index d4b1da71b40a0..b79f94514c8e2 100644
--- a/src/librustdoc/html/sources.rs
+++ b/src/librustdoc/html/sources.rs
@@ -5,6 +5,7 @@ use crate::error::Error;
 use crate::html::format;
 use crate::html::highlight;
 use crate::html::layout;
+use crate::html::Page;
 use crate::html::render::Context;
 use crate::visit::DocVisitor;
 
@@ -315,6 +316,7 @@ pub(crate) fn print_src(
         needs_expansion: bool,
         lines: RangeInclusive,
         code_html: Code,
+        static_root_path: &'a str,
     }
     let lines = s.lines().count();
     let (embedded, needs_expansion, lines) = match source_context {
@@ -335,5 +337,6 @@ pub(crate) fn print_src(
         );
         Ok(())
     });
-    Source { embedded, needs_expansion, lines, code_html: code }.render_into(&mut writer).unwrap();
+    let static_root_path = get_static_root_path();
+    Source { embedded, needs_expansion, lines, code_html: code, static_root_path }.render_into(&mut writer).unwrap();
 }

From c92dcd98799de4e2c0836bf79ec43ff42d7eed25 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?ma=E1=B4=9Ako?= <66082492+grey4owl@users.noreply.github.com>
Date: Sat, 13 Jan 2024 19:39:26 +0100
Subject: [PATCH 8/8] Update markdown.rs

---
 src/librustdoc/html/markdown.rs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/librustdoc/html/markdown.rs b/src/librustdoc/html/markdown.rs
index 181d626254609..d0e3dd339855e 100644
--- a/src/librustdoc/html/markdown.rs
+++ b/src/librustdoc/html/markdown.rs
@@ -279,7 +279,7 @@ impl<'a, I: Iterator>> Iterator for CodeBlocks<'_, 'a, I> {
                                      {text}\
                                  
\ ", - static_root_path = &page.get_static_root_path(), + static_root_path = &get_static_root_path(), clipboard_svg = &static_files::STATIC_FILES.clipboard_svg, added_classes = added_classes.join(" "), text = Escape(&original_text),