X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2FMathAutoCorrect.cpp;h=5d5a7d098c4782057603ac8e373f64529052cbae;hb=c609e9cbcf;hp=fcc9f7705af445c692303fa50f579f59956790ce;hpb=78bc661ff8a1811051b8f58388f08f6abcc50dc2;p=lyx.git diff --git a/src/mathed/MathAutoCorrect.cpp b/src/mathed/MathAutoCorrect.cpp index fcc9f7705a..5d5a7d098c 100644 --- a/src/mathed/MathAutoCorrect.cpp +++ b/src/mathed/MathAutoCorrect.cpp @@ -11,6 +11,8 @@ #include #include "MathAutoCorrect.h" + +#include "Cursor.h" #include "MathData.h" #include "InsetMath.h" #include "MathSupport.h" @@ -35,20 +37,21 @@ namespace { class Correction { public: /// - Correction() {} + /// \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_; }; @@ -63,37 +66,56 @@ 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; } -void Correction::write(odocstream & os) const -{ - os << "from: '" << from1_ << "' and '" << from2_ - << "' to '" << to_ << '\'' << endl; -} - - -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_; + + /* To allow undoing the completion, we proceed in 4 steps + * - inset the raw character + * - split undo group so that we have two separate undo actions + * - record undo, delete the character we just entered and the from1_ part + * - finally, do the insertion of the correction. + */ + cur.insert(c); + cur.splitUndoGroup(); + cur.recordUndoSelection(); + cur.cell().erase(cur.pos() - n - 1, cur.pos()); + cur.pos() -= n + 1; + + cur.insert(to_); return true; } +#if 0 +void Correction::write(odocstream & os) const +{ + os << "from: '" << from1_ << "' and '" << from2_ + << "' to '" << to_ << '\'' << endl; +} + + idocstream & operator>>(idocstream & is, Correction & corr) { corr.read(is); @@ -106,7 +128,7 @@ odocstream & operator<<(odocstream & os, Correction & corr) corr.write(os); return os; } - +#endif @@ -119,17 +141,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 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; } @@ -149,7 +171,7 @@ void initAutoCorrect() string line; ifstream is(file.toFilesystemEncoding().c_str()); while (getline(is, line)) { - if (line.size() == 0 || line[0] == '#') { + if (line.empty() || line[0] == '#') { //LYXERR(Debug::MATHED, "ignoring line '" << line << '\''); continue; } @@ -167,10 +189,10 @@ void initAutoCorrect() } -} // namespace anon +} // namespace -bool math_autocorrect(MathAtom & at, char_type c) +bool math_autocorrect(Cursor & cur, char_type c) { static bool initialized = false; @@ -179,8 +201,6 @@ bool math_autocorrect(MathAtom & at, char_type c) initialized = true; } - return theCorrections.correct(at, c); + return theCorrections.correct(cur, c); } - - } // namespace lyx