[LyX/master] Extend 0768b232583

Juergen Spitzmueller spitz at lyx.org
Fri Aug 14 06:29:35 UTC 2026


commit 32c6040934bea712a342a1e3d629a2a02b27acc4
Author: Juergen Spitzmueller <spitz at lyx.org>
Date:   Fri Aug 14 08:28:31 2026 +0200

    Extend 0768b232583
    
    Also support copy html and copy docbook
---
 lib/RELEASE-NOTES           |  7 ++++---
 src/BufferView.cpp          | 18 +++++++++++++-----
 src/Cursor.cpp              |  8 ++++----
 src/Cursor.h                |  2 +-
 src/CutAndPaste.cpp         |  4 ++--
 src/CutAndPaste.h           |  2 +-
 src/LyXAction.cpp           |  3 ++-
 src/Paragraph.cpp           | 15 +++++++++++++++
 src/Paragraph.h             |  4 +++-
 src/insets/InsetTabular.cpp | 27 +++++++++++++++++++++++----
 src/insets/InsetTabular.h   |  2 +-
 11 files changed, 69 insertions(+), 23 deletions(-)

diff --git a/lib/RELEASE-NOTES b/lib/RELEASE-NOTES
index c5af4f3bb4..a8145e1c37 100644
--- a/lib/RELEASE-NOTES
+++ b/lib/RELEASE-NOTES
@@ -65,9 +65,10 @@
 - The function language now accepts an additional "local" argument
   which ensures the language switch is an inline one (e.g. \foreignlanguage).
 
-- The function copy now accepts an optional argument "latex" which will cause
-  LyX to copy the selection in its LaTeX representation to the external clipboard.
-  The argument "plain" is equal to the default (copy as plain text string).
+- The function copy now accepts an optional argument which will cause
+  LyX to copy the selection in a special representation to the external clipboard.
+  Supported values are "latex", "docbook", and "xhtml", as well as "plain" which
+  is equal to the default (copy as plain text string).
   
 - The function paste now has a second optional argument "force" that will enforce
   conversion with the first argument "latex" or "html" even if the pasted string
diff --git a/src/BufferView.cpp b/src/BufferView.cpp
index 8a57cf0e49..ed1ace664d 100644
--- a/src/BufferView.cpp
+++ b/src/BufferView.cpp
@@ -1422,7 +1422,8 @@ bool BufferView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
 
 	case LFUN_COPY: {
 		string const arg = cmd.getArg(0);
-		if (!arg.empty() && arg != "latex" && arg != "plain") {
+		if (!arg.empty() && arg != "latex" && arg != "plain"
+		     && arg != "html" && arg != "docbook") {
 			flag.setEnabled(false);
 			break;
 		}
@@ -2677,7 +2678,6 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
 	}
 
 	case LFUN_COPY: {
-		bool const latex = cmd.getArg(0) == "latex";
 		// With multi-cell table content, we pass down to the inset
 		if (cur.inTexted() && cur.selection()
 		    && cur.selectionBegin().idx() != cur.selectionEnd().idx()) {
@@ -2685,9 +2685,17 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
 			dispatched = dr.dispatched();
 			break;
 		}
-		cap::copySelection(cur, latex);
-		if (latex)
-			cur.message(_("Copy as LaTeX"));
+		string const type = cmd.getArg(0);
+		int option = AS_STR_NONE;
+		if (type == "latex")
+			option = AS_STR_LATEX;
+		else if (type == "html")
+			option = AS_STR_XHTML;
+		else if (type == "docbook")
+			option = AS_STR_DOCBOOK;
+		cap::copySelection(cur, option);
+		if (!type.empty())
+			cur.message(bformat(_("Copy to Format: %1$s"), from_ascii(type)));
 		else
 			cur.message(_("Copy"));
 		break;
diff --git a/src/Cursor.cpp b/src/Cursor.cpp
index 09bd78c7ca..7c7f0d9cbf 100644
--- a/src/Cursor.cpp
+++ b/src/Cursor.cpp
@@ -341,7 +341,7 @@ docstring parbreak(CursorData const * cur)
 
 
 docstring CursorData::selectionAsString(bool const with_label, bool const skipdelete,
-					bool const latex) const
+					int const option) const
 {
 	if (!selection())
 		return docstring();
@@ -361,9 +361,9 @@ docstring CursorData::selectionAsString(bool const with_label, bool const skipde
 		seq_label = AS_STR_INSETS | AS_STR_SKIPDELETE;
 	}
 
-	if (latex) {
-		label |= AS_STR_LATEX;
-		seq_label |= AS_STR_LATEX;
+	if (option != AS_STR_NONE) {
+		label |= option;
+		seq_label |= option;
 	}
 
 	idx_type const startidx = selBegin().idx();
diff --git a/src/Cursor.h b/src/Cursor.h
index 1307217338..e886843ff5 100644
--- a/src/Cursor.h
+++ b/src/Cursor.h
@@ -161,7 +161,7 @@ public:
 	///
 	docstring selectionAsString(bool const with_label,
 				    bool const skipdelete = false,
-				    bool const latex = false) const;
+				    int const option = 0) const;
 	/// get some interesting description of top position
 	void info(odocstream & os, bool devel_mode) const;
 	///
diff --git a/src/CutAndPaste.cpp b/src/CutAndPaste.cpp
index e3b197d47a..8f6d9d7555 100644
--- a/src/CutAndPaste.cpp
+++ b/src/CutAndPaste.cpp
@@ -1045,9 +1045,9 @@ void cutSelectionToTemp(Cursor & cur, bool realcut)
 }
 
 
-void copySelection(Cursor const & cur, bool const latex)
+void copySelection(Cursor const & cur, int const option)
 {
-	copySelection(cur, cur.selectionAsString(true, true, latex));
+	copySelection(cur, cur.selectionAsString(true, true, option));
 }
 
 
diff --git a/src/CutAndPaste.h b/src/CutAndPaste.h
index ba308b8927..db4edc08f6 100644
--- a/src/CutAndPaste.h
+++ b/src/CutAndPaste.h
@@ -71,7 +71,7 @@ void cutSelection(Cursor & cur, bool realcut = true);
 void cutSelectionToTemp(Cursor & cur, bool realcut = true);
 
 /// Push the current selection to the cut buffer and the system clipboard.
-void copySelection(Cursor const & cur, bool const latex = false);
+void copySelection(Cursor const & cur, int const option = 0);
 /// Like copySelection, but only put to temporary cut buffer
 void copySelectionToTemp(Cursor const & cur);
 ///
diff --git a/src/LyXAction.cpp b/src/LyXAction.cpp
index 24a5f2b78d..5cd182d627 100644
--- a/src/LyXAction.cpp
+++ b/src/LyXAction.cpp
@@ -1436,7 +1436,8 @@ void LyXAction::init()
  * \var lyx::FuncCode lyx::LFUN_COPY
  * \li Action: Copies the current selection to the clipboard.
  * \li Syntax: copy [<type>]
- * \li Params: <type>: type of copy, possible values: plain (= default), latex
+ * \li Params: <type>: type of copy, possible values: plain (= default), latex,
+ *             html, docbook
  * \endvar
  */
 		{ LFUN_COPY, "copy", ReadOnly, Edit },
diff --git a/src/Paragraph.cpp b/src/Paragraph.cpp
index b73074bb27..8f616a5008 100644
--- a/src/Paragraph.cpp
+++ b/src/Paragraph.cpp
@@ -4600,6 +4600,7 @@ docstring Paragraph::asString(pos_type beg, pos_type end, int options, const Out
 {
 	odocstringstream os;
 	otexstream ots(os);
+	XMLStream xs(os);
 
 	if (beg == 0
 	    && options & AS_STR_LABEL
@@ -4621,6 +4622,8 @@ docstring Paragraph::asString(pos_type beg, pos_type end, int options, const Out
 		    || (c == '\n' && (options & AS_STR_NEWLINES))) {
 			if (options & AS_STR_LATEX)
 				ots.put(c);
+			else if (options & AS_STR_XHTML || options & AS_STR_DOCBOOK)
+				xs << c;
 			else
 				os.put(c);
 		} else if (c == META_INSET && (options & AS_STR_INSETS)) {
@@ -4643,6 +4646,18 @@ docstring Paragraph::asString(pos_type beg, pos_type end, int options, const Out
 				Font const font(inherit_font, buf.params().language);
 				rp.local_font = &font;
 				getInset(i)->latex(ots, rp);
+			} else if (c == META_INSET && (options & AS_STR_XHTML)) {
+				Buffer const & buf = getInset(i)->buffer();
+				OutputParams rp(&buf.params().encoding());
+				Font const font(inherit_font, buf.params().language);
+				rp.local_font = &font;
+				getInset(i)->xhtml(xs, rp);
+			} else if (c == META_INSET && (options & AS_STR_DOCBOOK)) {
+				Buffer const & buf = getInset(i)->buffer();
+				OutputParams rp(&buf.params().encoding());
+				Font const font(inherit_font, buf.params().language);
+				rp.local_font = &font;
+				getInset(i)->docbook(xs, rp);
 			} else {
 				getInset(i)->toString(os);
 			}
diff --git a/src/Paragraph.h b/src/Paragraph.h
index a77b50bcee..83cb848243 100644
--- a/src/Paragraph.h
+++ b/src/Paragraph.h
@@ -130,7 +130,9 @@ enum AsStringParameter
 	AS_STR_SKIPDELETE = 8, ///< Skip deleted text in change tracking.
 	AS_STR_PLAINTEXT = 16, ///< Don't export formatting when descending into insets.
 	AS_STR_MATHED = 32, ///< Use a format suitable for mathed (eg. for InsetRef).
-	AS_STR_LATEX = 64 ///< LaTeX output.
+	AS_STR_LATEX = 64, ///< LaTeX output.
+	AS_STR_XHTML = 128, ///< XHTML output.
+	AS_STR_DOCBOOK = 256 ///< DocBook output.
 };
 
 
diff --git a/src/insets/InsetTabular.cpp b/src/insets/InsetTabular.cpp
index 65b333e06a..0ba8550502 100644
--- a/src/insets/InsetTabular.cpp
+++ b/src/insets/InsetTabular.cpp
@@ -5969,9 +5969,16 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd)
 		break;
 
 	case LFUN_COPY: {
-		bool const latex = cmd.getArg(0) == "latex";
+		string const type = cmd.getArg(0);
+		int option = AS_STR_NONE;
+		if (type == "latex")
+			option = AS_STR_LATEX;
+		else if (type == "html")
+			option = AS_STR_XHTML;
+		else if (type == "docbook")
+			option = AS_STR_DOCBOOK;
 		if (cur.selIsMultiCell())
-			copySelection(cur, latex);
+			copySelection(cur, option);
 		else
 			cell(cur.idx())->dispatch(cur, cmd);
 		break;
@@ -8129,7 +8136,7 @@ void InsetTabular::tabularFeatures(Cursor & cur,
 }
 
 
-bool InsetTabular::copySelection(Cursor & cur, bool const latex)
+bool InsetTabular::copySelection(Cursor & cur, int const type)
 {
 	if (!cur.selection())
 		return false;
@@ -8156,7 +8163,7 @@ bool InsetTabular::copySelection(Cursor & cur, bool const latex)
 
 	paste_tabular->setBuffer(tabular.buffer());
 
-	if (latex) {
+	if (type == AS_STR_LATEX) {
 		otexstringstream ots;
 		Buffer const & buf = paste_tabular->buffer();
 		OutputParams runparams(&buf.params().encoding());
@@ -8164,6 +8171,18 @@ bool InsetTabular::copySelection(Cursor & cur, bool const latex)
 		runparams.local_font = &font;
 		paste_tabular->latex(ots, runparams);
 		cap::copySelection(cur, ots.str());
+	} else if (type == AS_STR_XHTML || type == AS_STR_DOCBOOK) {
+		odocstringstream os;
+		XMLStream xs(os);
+		Buffer const & buf = paste_tabular->buffer();
+		OutputParams runparams(&buf.params().encoding());
+		Font const font(inherit_font, buf.params().language);
+		runparams.local_font = &font;
+		if (type == AS_STR_XHTML)
+			paste_tabular->xhtml(xs, runparams);
+		else
+			paste_tabular->docbook(xs, runparams);
+		cap::copySelection(cur, os.str());
 	} else {
 		OutputParams const runparams(nullptr);
 		odocstringstream os;
diff --git a/src/insets/InsetTabular.h b/src/insets/InsetTabular.h
index 556ae2d250..6f4370a72d 100644
--- a/src/insets/InsetTabular.h
+++ b/src/insets/InsetTabular.h
@@ -1311,7 +1311,7 @@ private:
 	///
 	int cellYPos(idx_type cell) const;
 	///
-	bool copySelection(Cursor & cur, bool const latex = false);
+	bool copySelection(Cursor & cur, int const type = AS_STR_NONE);
 	///
 	bool pasteClipboard(Cursor & cur);
 	///


More information about the lyx-cvs mailing list