[LyX/master] Allow pasting references to mathed
Enrico Forestieri
forenr at lyx.org
Sat Jan 30 00:37:02 UTC 2021
commit 22ee249c3ea6426dbf24956ae36986e3ee6f81c0
Author: Enrico Forestieri <forenr at lyx.org>
Date: Sat Jan 30 01:32:40 2021 +0100
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 fc555c1..306be8b 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 13c19a2..6ed17dc 100644
--- a/src/CutAndPaste.h
+++ b/src/CutAndPaste.h
@@ -41,8 +41,11 @@ namespace cap {
std::vector<docstring> 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 b348ae4..77611c2 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 4812684..c67a507 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 4dbd8a1..3a8b376 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())
More information about the lyx-cvs
mailing list