Make math autocorrrect work with more than 2 chars

This commit is contained in:
Isaac 2019-04-09 13:48:46 +12:00 committed by Jean-Marc Lasgouttes
parent 506324ef9d
commit 144e7d7159
3 changed files with 29 additions and 21 deletions

View File

@ -1868,7 +1868,7 @@ bool InsetMathNest::interpretChar(Cursor & cur, char_type const c)
// try auto-correction // try auto-correction
if (lyxrc.autocorrection_math && cur.autocorrect() && cur.pos() != 0 if (lyxrc.autocorrection_math && cur.autocorrect() && cur.pos() != 0
&& math_autocorrect(cur.prevAtom(), c)) && math_autocorrect(cur, c))
return true; return true;
// no special circumstances, so insert the character without any fuss // no special circumstances, so insert the character without any fuss

View File

@ -10,6 +10,7 @@
#include <config.h> #include <config.h>
#include "Cursor.h"
#include "MathAutoCorrect.h" #include "MathAutoCorrect.h"
#include "MathData.h" #include "MathData.h"
#include "InsetMath.h" #include "InsetMath.h"
@ -38,18 +39,18 @@ public:
/// \brief Correction /// \brief Correction
Correction() : from2_(0) {} Correction() : from2_(0) {}
/// ///
bool correct(MathAtom & at, char_type c) const; bool correct(Cursor & cur, char_type c) const;
/// ///
bool read(idocstream & is); bool read(idocstream & is);
/// ///
void write(odocstream & os) const; void write(odocstream & os) const;
private: private:
/// ///
MathAtom from1_; MathData from1_;
/// ///
char_type from2_; char_type from2_;
/// ///
MathAtom to_; MathData to_;
}; };
@ -64,26 +65,35 @@ bool Correction::read(idocstream & is)
MathData ar1, ar3; MathData ar1, ar3;
mathed_parse_cell(ar1, s1); mathed_parse_cell(ar1, s1);
mathed_parse_cell(ar3, s3); mathed_parse_cell(ar3, s3);
if (ar1.size() != 1 || ar3.size() != 1) from1_ = ar1;
return false;
from1_ = ar1.front();
from2_ = s2[0]; from2_ = s2[0];
to_ = ar3.front(); to_ = ar3;
return true; return true;
} }
bool Correction::correct(MathAtom & at, char_type c) const bool Correction::correct(Cursor & cur, char_type c) const
{ {
//LYXERR(Debug::MATHED, //LYXERR(Debug::MATHED,
// "trying to correct ar: " << at << " from: '" << from1_ << '\''); // "trying to correct ar: " << at << " from: '" << from1_ << '\'');
if (from2_ != c) if (from2_ != c)
return false; 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; 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_ << '\''); << " from: '" << from1_ << "' to '" << to_ << '\'');
at = to_;
cur.cell().erase(cur.pos() - n, cur.pos());
cur.pos() -= n;
cur.insert(to_);
return true; return true;
} }
@ -121,17 +131,17 @@ public:
/// ///
void insert(const Correction & corr) { data_.push_back(corr); } 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: private:
/// ///
vector<Correction> data_; 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) for (const_iterator it = data_.begin(); it != data_.end(); ++it)
if (it->correct(at, c)) if (it->correct(cur, c))
return true; return true;
return false; return false;
} }
@ -172,7 +182,7 @@ void initAutoCorrect()
} // namespace } // namespace
bool math_autocorrect(MathAtom & at, char_type c) bool math_autocorrect(Cursor & cur, char_type c)
{ {
static bool initialized = false; static bool initialized = false;
@ -181,8 +191,6 @@ bool math_autocorrect(MathAtom & at, char_type c)
initialized = true; initialized = true;
} }
return theCorrections.correct(at, c); return theCorrections.correct(cur, c);
} }
} // namespace lyx } // namespace lyx

View File

@ -16,10 +16,10 @@
namespace lyx { namespace lyx {
class MathAtom; class Cursor;
// make "corrections" according to file lib/autocorrect // 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 } // namespace lyx