* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
- * \author André Pönitz
+ * \author André Pönitz
*
* Full author contact details are available in file CREDITS.
*/
#include <config.h>
#include "MathAutoCorrect.h"
+
+#include "Cursor.h"
#include "MathData.h"
#include "InsetMath.h"
#include "MathSupport.h"
#include "MathParser.h"
-#include "support/debug.h"
+#include "support/debug.h"
+#include "support/FileName.h"
#include "support/filetools.h" // LibFileSearch
#include "support/docstream.h"
#include <fstream>
#include <sstream>
+using namespace std;
namespace lyx {
using support::libFileSearch;
-using std::string;
-using std::ifstream;
-using std::endl;
-using std::vector;
-
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_;
};
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);
corr.write(os);
return os;
}
-
+#endif
///
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;
}
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;
}
}
-} // namespace anon
+} // namespace
-bool math_autocorrect(MathAtom & at, char c)
+bool math_autocorrect(Cursor & cur, char_type c)
{
static bool initialized = false;
initialized = true;
}
- return theCorrections.correct(at, c);
+ return theCorrections.correct(cur, c);
}
-
-
} // namespace lyx