diff mbox series

[02/10] docs: copy only the command from a console block

Message ID 20260922020339.481929-3-twoerner@gmail.com
State Under Review
Headers show
Series docs: editorial repairs to the examples | expand

Commit Message

Trevor Woerner Sept. 22, 2026, 2:03 a.m. UTC
The copy button matches the literal "$ " prompt, so on a block prompted
any other way it matches nothing and falls back to copying every line,
output included. Match a pattern covering each prompt shape the manuals
use instead, and stop the mouse selecting the output, so both ways of
copying give the commands alone.

AI-Generated: codex/claude-opus 5 (xhigh)
Signed-off-by: Trevor Woerner <twoerner@gmail.com>
---
 documentation/conf.py                         | 21 ++++++++++++++++++-
 .../sphinx-static/theme_overrides.css         |  9 ++++++++
 2 files changed, 29 insertions(+), 1 deletion(-)
diff mbox series

Patch

diff --git a/documentation/conf.py b/documentation/conf.py
index 48d28a686807..ccec27e60165 100644
--- a/documentation/conf.py
+++ b/documentation/conf.py
@@ -242,4 +242,23 @@  intersphinx_mapping = {
 # -- sphinx_copybutton configuration -----------------------------------------
 
 # sphinx-copybutton configuration
-copybutton_prompt_text = "$ "
+# Strip the prompt from a copied line wherever the prompt cannot be
+# confused with content. The pattern is not scoped to console blocks, so
+# every alternative has to stay safe inside a BitBake or configuration
+# example as well; measured over the built manuals, each one matches only
+# lines the lexer itself marks as a prompt.
+#
+# A bare "#" is deliberately absent. It opens a root prompt, a comment and
+# a line of program output alike, and nothing distinguishes them - which is
+# why the root prompts are given a preamble before this is switched on.
+copybutton_prompt_text = "|".join((
+    r"^(?:\S+[@:]\S*)?\$\s+",   # "$ ", and "user@host:~$ "
+    r"^\S+[@:]\S*#\s+",         # "root@qemux86-64:~# ", a root prompt
+    r"^[A-Za-z]:\\[^>]*>\s*",   # "C:\WINDOWS\system32>", cmd.exe
+    r"^DISKPART>\s*",           # diskpart prints a prompt of its own
+    r"^pydevshell>\s+",         # bitbake -c pydevshell
+))
+copybutton_prompt_is_regexp = True
+copybutton_only_copy_prompt_lines = True
+copybutton_remove_prompts = True
+copybutton_line_continuation_character = "\\"
diff --git a/documentation/sphinx-static/theme_overrides.css b/documentation/sphinx-static/theme_overrides.css
index f9e067239b8e..1a439e9faf69 100644
--- a/documentation/sphinx-static/theme_overrides.css
+++ b/documentation/sphinx-static/theme_overrides.css
@@ -107,6 +107,15 @@  section#welcome-to-the-yocto-project-documentation p.caption {
    display: none;
 }
 
+/* Sphinx already excludes the prompt from a selection; do the same for the
+   output, so selecting a session block gives what the copy button gives */
+.highlight span.go {
+    user-select: none;
+    -webkit-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+}
+
 @media screen {
     .wy-nav-content {
        max-width: 1000px;