From 22ee249c3ea6426dbf24956ae36986e3ee6f81c0 Mon Sep 17 00:00:00 2001 From: Enrico Forestieri Date: Sat, 30 Jan 2021 01:32:40 +0100 Subject: [PATCH] Allow pasting references to mathed A reference can be directly inserted into mathed but cannot be pasted because the pasted material is returned in plain text format. This patch allows getting a string from the cut stack in a suitable format allowing the math parser to actually create an InsetRef. Fixes #11539 --- src/CutAndPaste.cpp | 8 ++++++-- src/CutAndPaste.h | 7 +++++-- src/Paragraph.cpp | 8 ++++++++ src/Paragraph.h | 3 ++- src/mathed/InsetMathGrid.cpp | 2 +- 5 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/CutAndPaste.cpp b/src/CutAndPaste.cpp index fc555c1375..306be8bac4 100644 --- a/src/CutAndPaste.cpp +++ b/src/CutAndPaste.cpp @@ -1167,7 +1167,7 @@ void clearCutStack() } -docstring selection(size_t sel_index, DocumentClassConstPtr docclass) +docstring selection(size_t sel_index, DocumentClassConstPtr docclass, bool for_math) { if (sel_index >= theCuts.size()) return docstring(); @@ -1177,7 +1177,11 @@ docstring selection(size_t sel_index, DocumentClassConstPtr docclass) if (!buffer) return docstring(); - return buffer->paragraphs().back().asString(AS_STR_INSETS | AS_STR_NEWLINES); + int options = AS_STR_INSETS | AS_STR_NEWLINES; + if (for_math) + options |= AS_STR_MATHED; + + return buffer->paragraphs().back().asString(options); } diff --git a/src/CutAndPaste.h b/src/CutAndPaste.h index 13c19a2276..6ed17dc585 100644 --- a/src/CutAndPaste.h +++ b/src/CutAndPaste.h @@ -41,8 +41,11 @@ namespace cap { std::vector availableSelections(Buffer const *); /// Get the number of available elements in the cut buffer. size_type numberOfSelections(); -/// Get the sel_index-th element of the cut buffer in plain text format. -docstring selection(size_t sel_index, DocumentClassConstPtr docclass); +/** + * Get the sel_index-th element of the cut buffer in plain text format + * or, if \param for_math is true, in a format suitable for mathed. + */ +docstring selection(size_t sel_index, DocumentClassConstPtr docclass, bool for_math = false); /** * Replace using the font of the first selected character and select diff --git a/src/Paragraph.cpp b/src/Paragraph.cpp index b348ae4c39..77611c2e26 100644 --- a/src/Paragraph.cpp +++ b/src/Paragraph.cpp @@ -4144,6 +4144,14 @@ docstring Paragraph::asString(pos_type beg, pos_type end, int options, const Out if (c == META_INSET && (options & AS_STR_PLAINTEXT)) { LASSERT(runparams != nullptr, return docstring()); getInset(i)->plaintext(os, *runparams); + } else if (c == META_INSET && (options & AS_STR_MATHED) + && getInset(i)->lyxCode() == REF_CODE) { + Buffer const & buf = getInset(i)->buffer(); + OutputParams rp(&buf.params().encoding()); + Font const font(inherit_font, buf.params().language); + rp.local_font = &font; + otexstream ots(os); + getInset(i)->latex(ots, rp); } else { getInset(i)->toString(os); } diff --git a/src/Paragraph.h b/src/Paragraph.h index 4812684c3d..c67a507397 100644 --- a/src/Paragraph.h +++ b/src/Paragraph.h @@ -123,7 +123,8 @@ enum AsStringParameter AS_STR_INSETS = 2, ///< Go into insets. AS_STR_NEWLINES = 4, ///< Get also newline characters. AS_STR_SKIPDELETE = 8, ///< Skip deleted text in change tracking. - AS_STR_PLAINTEXT = 16 ///< Don't export formatting when descending into insets. + 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). }; diff --git a/src/mathed/InsetMathGrid.cpp b/src/mathed/InsetMathGrid.cpp index 4dbd8a1bdc..3a8b37609c 100644 --- a/src/mathed/InsetMathGrid.cpp +++ b/src/mathed/InsetMathGrid.cpp @@ -1566,7 +1566,7 @@ void InsetMathGrid::doDispatch(Cursor & cur, FuncRequest & cmd) idocstringstream is(cmd.argument()); int n = 0; is >> n; - topaste = cap::selection(n, buffer().params().documentClassPtr()); + topaste = cap::selection(n, buffer().params().documentClassPtr(), true); } InsetMathGrid grid(buffer_, 1, 1); if (!topaste.empty()) -- 2.39.5