commit bed546d6f6aab7c32ef51d61edd120e18089da53
Author: Isaac <[email protected]>
Date: Tue Apr 9 13:48:46 2019 +1200
Make math autocorrrect work with more than 2 chars
Currently, math autocorrect allows to transform a couple of characters
to a new one. This patch allows to transform a couple (sequence,
character) to a new character.
No example are implemented right now. One possible idea would be
"--" + ">" => \longrightarrow
---
src/mathed/InsetMathNest.cpp | 2 +-
src/mathed/MathAutoCorrect.cpp | 44 +++++++++++++++++++++++----------------
src/mathed/MathAutoCorrect.h | 4 +-
3 files changed, 29 insertions(+), 21 deletions(-)
diff --git a/src/mathed/InsetMathNest.cpp b/src/mathed/InsetMathNest.cpp
index 798ca89..85e4dd7 100644
--- a/src/mathed/InsetMathNest.cpp
+++ b/src/mathed/InsetMathNest.cpp
@@ -1868,7 +1868,7 @@ bool InsetMathNest::interpretChar(Cursor & cur, char_type
const c)
// try auto-correction
if (lyxrc.autocorrection_math && cur.autocorrect() && cur.pos() != 0
- && math_autocorrect(cur.prevAtom(), c))
+ && math_autocorrect(cur, c))
return true;
// no special circumstances, so insert the character without any fuss
diff --git a/src/mathed/MathAutoCorrect.cpp b/src/mathed/MathAutoCorrect.cpp
index fc4ad44..be5aeb4 100644
--- a/src/mathed/MathAutoCorrect.cpp
+++ b/src/mathed/MathAutoCorrect.cpp
@@ -10,6 +10,7 @@
#include <config.h>
+#include "Cursor.h"
#include "MathAutoCorrect.h"
#include "MathData.h"
#include "InsetMath.h"
@@ -38,18 +39,18 @@ public:
/// \brief Correction
Correction() : from2_(0) {}
///
- bool correct(MathAtom & at, char_type c) const;
+ bool correct(Cursor & cur, char_type c) const;
///
bool read(idocstream & is);
///
void write(odocstream & os) const;
private:
///
- MathAtom from1_;
+ MathData from1_;
///
char_type from2_;
///
- MathAtom to_;
+ MathData to_;
};
@@ -64,26 +65,35 @@ bool Correction::read(idocstream & is)
MathData ar1, ar3;
mathed_parse_cell(ar1, s1);
mathed_parse_cell(ar3, s3);
- if (ar1.size() != 1 || ar3.size() != 1)
- return false;
- from1_ = ar1.front();
+ from1_ = ar1;
from2_ = s2[0];
- to_ = ar3.front();
+ to_ = ar3;
return true;
}
-bool Correction::correct(MathAtom & at, char_type c) const
+bool Correction::correct(Cursor & cur, char_type c) const
{
//LYXERR(Debug::MATHED,
// "trying to correct ar: " << at << " from: '" << from1_ << '\'');
if (from2_ != c)
return false;
- if (asString(at) != asString(from1_))
+ pos_type n = from1_.size();
+ if (cur.pos() < pos_type(from1_.size())) // not enough to match
return false;
- LYXERR(Debug::MATHED, "match found! subst in " << at
+ pos_type start = cur.pos() - from1_.size();
+
+ for (pos_type i = 0; i < n; i++)
+ if (asString(cur.cell()[start + i]) != asString(from1_[i]))
+ return false;
+
+ LYXERR(Debug::MATHED, "match found! subst in " << cur.cell()
<< " from: '" << from1_ << "' to '" << to_ << '\'');
- at = to_;
+
+ cur.cell().erase(cur.pos() - n, cur.pos());
+ cur.pos() -= n;
+
+ cur.insert(to_);
return true;
}
@@ -121,17 +131,17 @@ public:
///
void insert(const Correction & corr) { data_.push_back(corr); }
///
- bool correct(MathAtom & at, char_type c) const;
+ bool correct(Cursor & cur, char_type c) const;
private:
///
vector<Correction> data_;
};
-bool Corrections::correct(MathAtom & at, char_type c) const
+bool Corrections::correct(Cursor & cur, char_type c) const
{
for (const_iterator it = data_.begin(); it != data_.end(); ++it)
- if (it->correct(at, c))
+ if (it->correct(cur, c))
return true;
return false;
}
@@ -172,7 +182,7 @@ void initAutoCorrect()
} // namespace
-bool math_autocorrect(MathAtom & at, char_type c)
+bool math_autocorrect(Cursor & cur, char_type c)
{
static bool initialized = false;
@@ -181,8 +191,6 @@ bool math_autocorrect(MathAtom & at, char_type c)
initialized = true;
}
- return theCorrections.correct(at, c);
+ return theCorrections.correct(cur, c);
}
-
-
} // namespace lyx
diff --git a/src/mathed/MathAutoCorrect.h b/src/mathed/MathAutoCorrect.h
index 679e837..a782d67 100644
--- a/src/mathed/MathAutoCorrect.h
+++ b/src/mathed/MathAutoCorrect.h
@@ -16,10 +16,10 @@
namespace lyx {
-class MathAtom;
+class Cursor;
// make "corrections" according to file lib/autocorrect
-bool math_autocorrect(MathAtom & at, char_type c);
+bool math_autocorrect(Cursor & cur, char_type c);
} // namespace lyx