]> git.lyx.org Git - features.git/commitdiff
small step to a unified parser for file & interactive input
authorAndré Pönitz <poenitz@gmx.net>
Mon, 13 Aug 2001 14:02:37 +0000 (14:02 +0000)
committerAndré Pönitz <poenitz@gmx.net>
Mon, 13 Aug 2001 14:02:37 +0000 (14:02 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@2501 a592a061-630c-0410-9148-cb99ea01b6c8

src/mathed/ChangeLog
src/mathed/Makefile.am
src/mathed/formulabase.C
src/mathed/math_cursor.C
src/mathed/math_cursor.h
src/mathed/math_defs.h
src/mathed/math_hash.C
src/mathed/math_macrotable.C
src/mathed/math_parser.C
src/mathed/math_parser.h

index a2784e6cb4269621c2e99db90e14f61ce7366edf..02a744d5b9d24f96f2de00433961aea28f841ff8 100644 (file)
@@ -1,4 +1,12 @@
 
+2001-08-13  André Pönitz  <poenitz@gmx.net>
+
+       * math_factory.[Ch]: new files for the creation of math insets
+
+       * math_parser.C:
+               math_cursor.C:
+               math_hash.C: simplifications
+
 2001-08-10  André Pönitz  <poenitz@gmx.net>
 
        *       math_scopeinset.[Ch]: new inset for {} blocks
index dd26fecdac35976c2e6811a60d47ebffb0046edc..7ba7b4df3e62122adf46d9de32015cd7acc5cf16 100644 (file)
@@ -37,6 +37,8 @@ libmathed_la_SOURCES = \
        math_diminset.h \
        math_dotsinset.C \
        math_dotsinset.h \
+       math_factory.C \
+       math_factory.h \
        math_fracinset.C \
        math_fracinset.h \
        math_fracbase.C \
index b68844fa55391112895afa06584d13e8f8e3f6f1..aaba69af14e1f9b8830fe505ee6b42bee2895c57 100644 (file)
@@ -344,6 +344,7 @@ void InsetFormulaBase::insetKeyPress(XKeyEvent *)
 }
 
 
+int greek_kb_flag = 0;
 
 UpdatableInset::RESULT
 InsetFormulaBase::localDispatch(BufferView * bv, kb_action action,
@@ -352,22 +353,17 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action,
        //lyxerr << "InsetFormulaBase::LocalDispatch: act: " << action
        //      << " arg: '" << arg << "' cursor: " << mathcursor << "\n";
 
-       static int greek_kb_flag = 0;
 
        if (!mathcursor) 
                return UNDISPATCHED;
 
-       MathTextCodes varcode = LM_TC_MIN;
-       bool was_macro = mathcursor->inMacroMode();
-       bool sel = false;
+       RESULT result      = DISPATCHED;
+       bool sel           = false;
+       bool was_macro     = mathcursor->inMacroMode();
        bool was_selection = mathcursor->selection();
-       RESULT result = DISPATCHED;
 
        hideInsetCursor(bv);
 
-       if (mathcursor->getLastCode() == LM_TC_TEX)
-               varcode = LM_TC_TEX;
-
        mathcursor->normalize();
 
        switch (action) {
@@ -457,8 +453,7 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action,
                //      sprintf(dispatch_buffer, "%d %d",);
                //      dispatch_result = dispatch_buffer;
                //      break;
-       case LFUN_SETXY:
-       {
+       case LFUN_SETXY: {
                lyxerr << "LFUN_SETXY broken!\n";
                int x;
                int y;
@@ -469,9 +464,8 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action,
                par()->getXY(x1, y1);
                mathcursor->setPos(x1 + x, y1 + y);
                updateLocal(bv, false);
+               break;
        }
-       break;
-
 
        case LFUN_PASTE:
                if (was_macro)
@@ -499,42 +493,26 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action,
 
                // --- accented characters ------------------------------
 
-       case LFUN_UMLAUT:     handleAccent(bv, "ddot"); break;
-       case LFUN_CIRCUMFLEX: handleAccent(bv, "hat"); break;
-       case LFUN_GRAVE:      handleAccent(bv, "grave"); break;
-       case LFUN_ACUTE:      handleAccent(bv, "acute"); break;
-       case LFUN_TILDE:      handleAccent(bv, "tilde"); break;
-       case LFUN_MACRON:     handleAccent(bv, "bar"); break;
-       case LFUN_DOT:        handleAccent(bv, "dot"); break;
-       case LFUN_CARON:      handleAccent(bv, "check"); break;
-       case LFUN_BREVE:      handleAccent(bv, "breve"); break;
-       case LFUN_VECTOR:     handleAccent(bv, "vec"); break;
-
-               // Greek mode
-       case LFUN_GREEK:
-               if (!greek_kb_flag) {
-                       greek_kb_flag = 1;
-                       bv->owner()->message(_("Math greek mode on"));
-               } else
-                       greek_kb_flag = 0;
-               break;
-
-               // Greek keyboard
-       case LFUN_GREEK_TOGGLE:
-               greek_kb_flag = greek_kb_flag ? 0 : 2;
-               if (greek_kb_flag)
-                       bv->owner()->message(_("Math greek keyboard on"));
-               else
-                       bv->owner()->message(_("Math greek keyboard off"));
-               break;
-
-               //  Math fonts
-       case LFUN_BOLD:    handleFont(bv, LM_TC_BF); break;
-       case LFUN_SANS:    handleFont(bv, LM_TC_SF); break;
-       case LFUN_EMPH:    handleFont(bv, LM_TC_CAL); break;
-       case LFUN_ROMAN:   handleFont(bv, LM_TC_RM); break;
-       case LFUN_CODE:    handleFont(bv, LM_TC_TT); break;
-       case LFUN_DEFAULT: handleFont(bv, LM_TC_VAR); break;
+       case LFUN_UMLAUT:       handleAccent(bv, "ddot"); break;
+       case LFUN_CIRCUMFLEX:   handleAccent(bv, "hat"); break;
+       case LFUN_GRAVE:        handleAccent(bv, "grave"); break;
+       case LFUN_ACUTE:        handleAccent(bv, "acute"); break;
+       case LFUN_TILDE:        handleAccent(bv, "tilde"); break;
+       case LFUN_MACRON:       handleAccent(bv, "bar"); break;
+       case LFUN_DOT:          handleAccent(bv, "dot"); break;
+       case LFUN_CARON:        handleAccent(bv, "check"); break;
+       case LFUN_BREVE:        handleAccent(bv, "breve"); break;
+       case LFUN_VECTOR:       handleAccent(bv, "vec"); break;
+
+       //  Math fonts
+       case LFUN_GREEK:        handleFont(bv, LM_TC_GREEK1); break;
+       case LFUN_GREEK_TOGGLE: handleFont(bv, LM_TC_GREEK); break;
+       case LFUN_BOLD:         handleFont(bv, LM_TC_BF); break;
+       case LFUN_SANS:         handleFont(bv, LM_TC_SF); break;
+       case LFUN_EMPH:         handleFont(bv, LM_TC_CAL); break;
+       case LFUN_ROMAN:        handleFont(bv, LM_TC_RM); break;
+       case LFUN_CODE:         handleFont(bv, LM_TC_TT); break;
+       case LFUN_DEFAULT:      handleFont(bv, LM_TC_VAR); break;
 
        case LFUN_MATH_MODE:
                handleFont(bv, LM_TC_TEXTRM);
@@ -564,14 +542,6 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action,
                }
                break;
 
-       case LFUN_INSERT_MATH:
-               if (!arg.empty()) {
-                       bv->lockedInsetStoreUndo(Undo::INSERT);
-                       mathcursor->interpret(arg);
-                       updateLocal(bv, true);
-               }
-               break;
-
        case LFUN_MATH_SPACE:
        {
                bv->lockedInsetStoreUndo(Undo::EDIT);
@@ -696,129 +666,23 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action,
                result = UNDISPATCHED;
                break;
 
-       default:
-               if ((action == -1 || action == LFUN_SELFINSERT) && !arg.empty()) {
-                       unsigned char c = arg[0];
-
-                       lyxerr << "Action: " << action << endl;
-                       
-                       lyxerr << "char: '" << c << "'  int: " << int(c) << endl;
-                       //owner_->getIntl()->getTrans().TranslateAndInsert(c, lt);      
-                       //lyxerr << "trans: '" << c << "'  int: " << int(c) << endl;
+       case -1:
+       case LFUN_INSERT_MATH:
+       case LFUN_SELFINSERT:
+               if (!arg.empty()) {
                        bv->lockedInsetStoreUndo(Undo::INSERT);
-
-                       if (c == 0) {      // Dead key, do nothing
-                               //lyxerr << "deadkey" << endl;
-                               break;
-                       }
-
-                       if (isalpha(c)) {
-                               if (mathcursor->getLastCode() == LM_TC_TEX) {
-                                       mathcursor->macroModeOpen();
-                                       mathcursor->clearLastCode();
-                                       varcode = LM_TC_MIN;
-                               } else if (!varcode) {          
-                                       MathTextCodes f = mathcursor->getLastCode() ?
-                                               mathcursor->getLastCode() :
-                                               mathcursor->nextCode();
-                                       varcode = MathIsAlphaFont(f) ?
-                                               static_cast<MathTextCodes>(f) :
-                                               LM_TC_VAR;
-                               }
-                               
-                               //           lyxerr << "Varcode << vardoce;
-                               MathTextCodes char_code = varcode;
-                               if (greek_kb_flag) {
-                                       char greek[26] =
-                                       {'A', 'B', 'X',  0 , 'E',  0 ,  0 , 'H', 'I',  0 ,
-                                        'K',  0 , 'M', 'N', 'O',  0 ,  0 , 'P',  0 , 'T',
-                                        0,  0,   0,   0,   0 , 'Z' };
-                                       
-                                       if ('A' <= c && c <= 'Z' && greek[c - 'A']) {
-                                               char_code = LM_TC_RM;
-                                               c = greek[c - 'A'];
-                                       } else
-                                               char_code = LM_TC_SYMB;
-                               }
-                               
-                               mathcursor->insert(c, char_code);
-                               
-                               if (greek_kb_flag && char_code == LM_TC_RM)
-                                       mathcursor->setLastCode(LM_TC_VAR);
-                               
-                               varcode = LM_TC_MIN;
-                               
-                               if (greek_kb_flag < 2)
-                                       greek_kb_flag = 0;
-                               
-                       } else if (c == '{') {
-                               mathcursor->insert(new MathScopeInset);
-                               mathcursor->left();
-                               mathcursor->clearLastCode();
-                       } else if (strchr("!,:;", c) && (varcode == LM_TC_TEX||was_macro)) {
-                               mathcursor->insert(c, LM_TC_TEX);
-                               mathcursor->clearLastCode();
-                       } else if (c == '_' && varcode == LM_TC_TEX) {
-                               mathcursor->insert(c, LM_TC_SPECIAL);
-                               mathcursor->clearLastCode();
-                       } else if ('0' <= c && c <= '9' && (varcode == LM_TC_TEX||was_macro)) {
-                               mathcursor->macroModeOpen();
-                               mathcursor->clearLastCode();
-                               mathcursor->insert(c, LM_TC_MIN);
-                       } else if (('0' <= c && c <= '9') || strchr(";:!|[]().,?", c)) {
-                               MathTextCodes code = mathcursor->getLastCode();
-                               if (code != LM_TC_TEXTRM)
-                                       code = LM_TC_CONST;
-                               mathcursor->insert(c, code);
-                       } else if (strchr("+/-*<>=", c)) {
-                               MathTextCodes code = mathcursor->getLastCode();
-                               if (code != LM_TC_TEXTRM)
-                                       code = LM_TC_BOP;
-                               mathcursor->insert(c, code);
-                       } else if (strchr("#$%{|}", c)) {
-                               MathTextCodes code = mathcursor->getLastCode();
-                               if (code != LM_TC_TEXTRM)
-                                       code = LM_TC_SPECIAL;
-                               mathcursor->insert(c, code);
-                       } else if (c == '_' || c == '^') {
-                               char s[2];
-                               s[0] = c;
-                               s[1] = 0;
-                               mathcursor->interpret(s);
-                       } else if (c == ' ') {
-                               if (!varcode) { 
-                                       MathTextCodes f = (mathcursor->getLastCode()) ?
-                                               mathcursor->getLastCode() :
-                                               mathcursor->nextCode();
-                                       varcode = MathIsAlphaFont(f) ? f : LM_TC_VAR;
-                               }
-                               
-                               if (varcode == LM_TC_TEXTRM)
-                                       mathcursor->insert(c, LM_TC_TEXTRM);
-                               else if (was_macro)
-                                       mathcursor->macroModeClose();
-                               else if (mathcursor->popRight())
-                                       ;
-                               else {
-                                       // this would not work if the inset is in an table!
-                                       //bv->text->cursorRight(bv, true);
-                                       result = FINISHED;
-                               }
-                       } else if (c == '\'' || c == '@') {
-                               mathcursor->insert(c, LM_TC_VAR);
-                       } else if (c == '\\') {
-                               if (was_macro)
-                                       mathcursor->macroModeClose();
-                               bv->owner()->message(_("TeX mode"));
-                               mathcursor->setLastCode(LM_TC_TEX);
-                       }
+                       mathcursor->interpret(arg);
                        updateLocal(bv, true);
-               } else if (action == LFUN_MATH_PANEL) {
-                       result = UNDISPATCHED;
-               } else {
-                       lyxerr << "Closed by action " << action << endl;
-                       result =  FINISHED;
                }
+               break;
+
+       case LFUN_MATH_PANEL:
+               result = UNDISPATCHED;
+               break;
+
+       default:
+               lyxerr << "Closed by action " << action << endl;
+               result =  FINISHED;
        }
 
        mathcursor->normalize();
index 0fa40b8ee779beea5c0d95792b594a149e6a23dc..6279fdfaeb453fab771d48648cfda7c0c6b9d593 100644 (file)
 #include <algorithm>
 #include <cctype>
 
+#include "support/lstrings.h"
 #include "debug.h"
 #include "LColor.h"
 #include "Painter.h"
-#include "mathed/support.h"
+#include "support.h"
 #include "formulabase.h"
 #include "math_cursor.h"
+#include "math_factory.h"
 #include "math_arrayinset.h"
-#include "math_bigopinset.h"
 #include "math_charinset.h"
-#include "math_symbolinset.h"
 #include "math_decorationinset.h"
 #include "math_deliminset.h"
-#include "math_dotsinset.h"
-#include "math_fracinset.h"
 #include "math_funcinset.h"
-#include "math_funcliminset.h"
-#include "math_gridinset.h"
 #include "math_macro.h"
-#include "math_macroarg.h"
 #include "math_macrotable.h"
-#include "math_macrotemplate.h"
 #include "math_matrixinset.h"
-#include "math_noglyphinset.h"
-#include "math_rootinset.h"
-#include "math_spaceinset.h"
-#include "math_sqrtinset.h"
-#include "math_stackrelinset.h"
-#include "support/lstrings.h"
+#include "math_scopeinset.h"
 #include "math_scriptinset.h"
+#include "math_spaceinset.h"
 #include "math_parser.h"
 
 using std::endl;
@@ -131,7 +121,7 @@ std::ostream & operator<<(std::ostream & os, MathCursorPos const & p)
 
 
 MathCursor::MathCursor(InsetFormulaBase * formula)
-       : formula_(formula), lastcode_(LM_TC_MIN), imacro_(0), selection_(false)
+       : formula_(formula), lastcode_(LM_TC_VAR), imacro_(0), selection_(false)
 {
        first();
 }
@@ -142,6 +132,7 @@ MathCursor::~MathCursor()
        delete imacro_;
 }
 
+
 void MathCursor::pushLeft(MathInset * par)
 {
        MathCursorPos p;
@@ -279,7 +270,7 @@ bool MathCursor::left(bool sel)
                return true;
        }
        selHandle(sel);
-       clearLastCode();
+       lastcode_ = LM_TC_VAR;
 
        MathInset * p = prevInset();
        if (openable(p, sel, false)) {
@@ -299,7 +290,7 @@ bool MathCursor::right(bool sel)
                return true;
        }
        selHandle(sel);
-       clearLastCode();
+       lastcode_ = LM_TC_VAR;
 
        MathInset * p = nextInset();
        if (openable(p, sel, false)) {
@@ -331,7 +322,7 @@ void MathCursor::setPos(int x, int y)
        //lyxerr << "MathCursor::setPos x: " << x << " y: " << y << "\n";
 
        macroModeClose();
-       lastcode_ = LM_TC_MIN;
+       lastcode_ = LM_TC_VAR;
        first();
 
        cursor().par_  = outerPar();
@@ -375,7 +366,7 @@ void MathCursor::home()
 {
        dump("home 1");
        macroModeClose();
-       clearLastCode();
+       lastcode_ = LM_TC_VAR;
        if (!par()->idxHome(idx(), pos())) 
                popLeft();
        dump("home 2");
@@ -386,7 +377,7 @@ void MathCursor::end()
 {
        dump("end 1");
        macroModeClose();
-       clearLastCode();
+       lastcode_ = LM_TC_VAR;
        if (!par()->idxEnd(idx(), pos()))
                popRight();
        dump("end 2");
@@ -405,14 +396,14 @@ void MathCursor::insert(char c, MathTextCodes t)
        if (selection_)
                selDel();
 
-       if (t != LM_TC_MIN)
+       if (t != LM_TC_VAR)
                lastcode_ = t;
 
-       if (imacro_ && !(MathIsAlphaFont(t) || t == LM_TC_MIN))
+       if (imacro_ && !(MathIsAlphaFont(t) || t == LM_TC_VAR))
                macroModeClose();
 
        if (imacro_) {
-               if (MathIsAlphaFont(t) || t == LM_TC_MIN) {
+               if (MathIsAlphaFont(t) || t == LM_TC_VAR) {
                        // was MacroModeinsert(c);
                        imacro_->setName(imacro_->name() + c);
                        return;
@@ -440,6 +431,23 @@ void MathCursor::insert(MathInset * p)
 }
 
 
+void MathCursor::niceInsert(MathInset * p) 
+{
+       if (!p) {
+               lyxerr << "should not happen\n";
+               return;
+       }
+       selCut();
+       insert(p);
+       if (p->nargs()) {
+               posLeft();
+               right();  // do not push for e.g. MathSymbolInset
+               selPaste();
+       }
+       p->metrics(p->size());
+}
+
+
 void MathCursor::insert(MathArray const & ar)
 {
        macroModeClose();
@@ -609,141 +617,6 @@ void MathCursor::setSize(MathStyles size)
 }
 
 
-void MathCursor::interpret(string const & t)
-{
-       //lyxerr << "interpret: '" << s << "'\n";
-       //lyxerr << "in: " << in_word_set(s) << " \n";
-
-       if (t.empty())
-               return;
-
-       // temporary glue code
-       string s = t;
-       if (s[0] == '\\')
-               s = s.substr(1);
-
-       if (s[0] == '^' || s[0] == '_') {
-               bool const up = (s[0] == '^');
-               selCut();       
-               MathScriptInset * p = prevScriptInset();
-               if (!p) {
-                       MathInset * b = prevInset();
-                       if (b && b->isScriptable()) {
-                               p = new MathScriptInset(up, !up, b->clone());
-                               posLeft();
-                               plainErase();
-                       } else {
-                               p = new MathScriptInset(up, !up);
-                       }
-                       insert(p);
-               }
-               pushRight(p);
-               if (up)
-                       p->up(true);
-               else
-                       p->down(true);
-               idx() = up ? 0 : 1;
-               pos() = 0;
-               selPaste();
-               return;
-       }
-
-       if (s[0] == '!' || s[0] == ','  || s[0] == ':' || s[0] == ';') {
-               int sp = (s[0] == ',') ? 1:((s[0] == ':') ? 2:((s[0] == ';') ? 3: 0));
-               insert(new MathSpaceInset(sp));
-               return;
-       }
-
-       MathInset * p = 0;
-       latexkeys const * l = in_word_set(s);
-
-       if (l == 0) {
-               if (s == "root") 
-                       p = new MathRootInset;
-               else if (MathMacroTable::hasTemplate(s))
-                       p = new MathMacro(MathMacroTable::provideTemplate(s));
-               else if (s.size() > 7 && s.substr(0, 7) == "matrix ") {
-                       int m = 1;
-                       int n = 1;
-                       string v_align;
-                       string h_align;
-                       istringstream is(s.substr(7).c_str());
-                       is >> m >> n >> v_align >> h_align;
-                       m = std::max(1, m);
-                       n = std::max(1, n);
-                       v_align += 'c';
-                       MathArrayInset * pp = new MathArrayInset(m, n);
-                       pp->valign(v_align[0]);
-                       pp->halign(h_align);
-                       p = pp;
-               }
-               else
-                       p = new MathFuncInset(s);
-       } else {
-               switch (l->token) {
-                       case LM_TK_NOGLYPH:
-                       case LM_TK_NOGLYPHB:
-                               p = new MathNoglyphInset(l);
-                               break;
-
-                       case LM_TK_BIGSYM:
-                               p = new MathBigopInset(l);
-                               break;
-
-                       case LM_TK_FUNCLIM:
-                               p = new MathFuncLimInset(l);
-                               break;
-
-                       case LM_TK_SYM: 
-                               p = new MathSymbolInset(l);
-                               break;
-
-                       case LM_TK_STACK:
-                               p = new MathStackrelInset;
-                               break;
-
-                       case LM_TK_FRAC:
-                               p = new MathFracInset;
-                               break;
-
-                       case LM_TK_SQRT:
-                               p = new MathSqrtInset;
-                               break;
-
-                       case LM_TK_DECORATION:
-                               p = new MathDecorationInset(l);
-                               break;
-
-                       case LM_TK_SPACE:
-                               p = new MathSpaceInset(l->id);
-                               break;
-
-                       case LM_TK_DOTS:
-                               p = new MathDotsInset(l);
-                               break;
-
-                       case LM_TK_MACRO:
-                               p = new MathMacro(MathMacroTable::provideTemplate(s));
-                               break;
-
-                       default:
-                               p = new MathFuncInset(l->name);
-                               break;
-               }
-       }
-
-       if (p) {
-               selCut();
-               insert(p);
-               if (p->nargs()) {
-                       posLeft();
-                       right();  // do not push for e.g. MathSymbolInset
-                       selPaste();
-               }
-               p->metrics(p->size());
-       }
-}
-
 
 void MathCursor::macroModeOpen()
 {
@@ -764,7 +637,7 @@ void MathCursor::macroModeClose()
                posLeft();
                plainErase();
                imacro_ = 0;
-               interpret(name);
+               interpret("\\" + name);
        }
 }
 
@@ -859,7 +732,6 @@ void MathCursor::drawSelection(Painter & pain) const
                int y2 = c.yo() + c.descent();
                pain.fillRectangle(x1, y1, x2 - x1, y2 - y1, LColor::selection);
        } else {
-
                std::vector<int> indices = i1.par_->idxBetween(i1.idx_, i2.idx_);
                for (unsigned i = 0; i < indices.size(); ++i) {
                        MathXArray & c = i1.xcell(indices[i]);
@@ -875,13 +747,14 @@ void MathCursor::drawSelection(Painter & pain) const
 
 MathTextCodes MathCursor::nextCode() const
 {
-       //return (pos() == size()) ? LM_TC_MIN : nextInset()->code();
-       return LM_TC_MIN;
+       //return (pos() == size()) ? LM_TC_VAR : nextInset()->code();
+       return LM_TC_VAR;
 }
 
 
 void MathCursor::handleFont(MathTextCodes t)
 {
+       macroModeClose();
        if (selection_) {
                MathCursorPos i1;
                MathCursorPos i2;
@@ -979,24 +852,6 @@ bool MathCursor::selection() const
 }
 
 
-void MathCursor::clearLastCode()
-{
-       lastcode_ = LM_TC_MIN;
-}
-
-
-void MathCursor::setLastCode(MathTextCodes t)
-{
-       lastcode_ = t;
-}
-
-
-MathTextCodes MathCursor::getLastCode() const
-{
-       return lastcode_;
-}
-
-
 MathArrayInset * MathCursor::enclosingArray(int & idx) const
 {
        for (int i = Cursor_.size() - 1; i >= 0; --i) {
@@ -1365,6 +1220,7 @@ MathArray & MathCursorPos::cell(int idx) const
        return par_->cell(idx);
 }
 
+
 MathArray & MathCursorPos::cell() const
 {
        return par_->cell(idx_);
@@ -1393,3 +1249,183 @@ MathCursorPos MathCursor::normalAnchor() const
        }
        return normal;
 }
+
+
+void MathCursor::interpret(string const & s)
+{
+       //lyxerr << "interpret: '" << s << "'\n";
+       //lyxerr << "in: " << in_word_set(s) << " \n";
+
+       if (s.empty())
+               return;
+
+       char c = s[0];
+
+       lyxerr << "char: '" << c << "'  int: " << int(c) << endl;
+       //owner_->getIntl()->getTrans().TranslateAndInsert(c, lt);      
+       //lyxerr << "trans: '" << c << "'  int: " << int(c) << endl;
+
+       latexkeys const * l = in_word_set(s.substr(1));
+       if (l) {
+               lastcode_ = LM_TC_VAR;
+               niceInsert(createMathInset(l));
+               return;
+       }
+
+       if (MathMacroTable::hasTemplate(s.substr(1))) {
+               niceInsert(new MathMacro(MathMacroTable::provideTemplate(s.substr(1))));
+               return;
+       }
+
+       if (s.size() > 8 && s.substr(0, 8) == "\\matrix ") {
+               int m = 1;
+               int n = 1;
+               string v_align;
+               string h_align;
+               istringstream is(s.substr(8).c_str());
+               is >> m >> n >> v_align >> h_align;
+               m = std::max(1, m);
+               n = std::max(1, n);
+               v_align += 'c';
+               MathArrayInset * pp = new MathArrayInset(m, n);
+               pp->valign(v_align[0]);
+               pp->halign(h_align);
+               niceInsert(pp);
+               return;
+       }
+
+       if (s.size() > 1)
+               return niceInsert(new MathFuncInset(s.substr(1)));
+
+
+       // we got just a single char now
+
+       if (c == '^' || c == '_') {
+               bool const up = (s[0] == '^');
+               selCut();       
+               MathScriptInset * p = prevScriptInset();
+               if (!p) {
+                       MathInset * b = prevInset();
+                       if (b && b->isScriptable()) {
+                               p = new MathScriptInset(up, !up, b->clone());
+                               posLeft();
+                               plainErase();
+                       } else 
+                               p = new MathScriptInset(up, !up);
+                       insert(p);
+               }
+               pushRight(p);
+               if (up)
+                       p->up(true);
+               else
+                       p->down(true);
+               idx() = up ? 0 : 1;
+               pos() = 0;
+               selPaste();
+               return;
+       }
+
+       if (c == '{') {
+               niceInsert(new MathScopeInset);
+               return;
+       }
+
+       if (isalpha(c) && (lastcode_ == LM_TC_GREEK || lastcode_ == LM_TC_GREEK1)) {
+               static char const greek[26] =
+                       {'A', 'B', 'X',  0 , 'E',  0 ,  0 , 'H', 'I',  0 ,
+                        'K',  0 , 'M', 'N', 'O',  0 ,  0 , 'P',  0 , 'T',
+                        0,  0,   0,   0,   0 , 'Z' };
+                       
+               MathTextCodes code = LM_TC_SYMB;
+               if ('A' <= c && c <= 'Z' && greek[c - 'A']) {
+                       code = LM_TC_RM;
+                       c = greek[c - 'A'];
+               }
+               insert(c, code);
+       
+#warning greek insert problem? look here!
+               //if (lastcode_ == LM_TC_GREEK1)
+                       lastcode_ = LM_TC_VAR;
+               return; 
+       }
+
+       if (c == '_' && lastcode_ == LM_TC_TEX) {
+               lastcode_ = LM_TC_VAR;
+               insert(c, LM_TC_SPECIAL);
+               return;
+       }
+
+       if ('0' <= c && c <= '9' && (lastcode_ == LM_TC_TEX || imacro_)) {
+               macroModeOpen();
+               lastcode_ = LM_TC_VAR;
+               insert(c, lastcode_);
+               return;
+       }
+
+       if (('0' <= c && c <= '9') || strchr(";:!|[]().,?", c)) {
+               if (lastcode_ != LM_TC_TEXTRM)
+                       lastcode_ = LM_TC_CONST;
+               insert(c, lastcode_);
+               return;
+       }
+
+       if (strchr("+/-*<>=", c)) {
+               if (lastcode_ != LM_TC_TEXTRM)
+                       lastcode_ = LM_TC_BOP;
+               insert(c, lastcode_);
+               return;
+       }
+
+       if (strchr("#$%{|}", c)) {
+               if (lastcode_ != LM_TC_TEXTRM)
+                       lastcode_ = LM_TC_SPECIAL;
+               insert(c, lastcode_);
+               return;
+       }
+
+       if (c == ' ') {
+               if (imacro_) {
+                       lastcode_ = LM_TC_VAR;
+                       macroModeClose();
+                       return;
+               }
+
+               if (lastcode_ == LM_TC_TEXTRM) {
+                       insert(c, LM_TC_TEXTRM);
+                       return;
+               }
+
+               if (mathcursor->popRight())
+                       return;
+
+#warning look here
+                       // this would not work if the inset is in an table!
+                       //bv->text->cursorRight(bv, true);
+                       //result = FINISHED;
+               return;
+       }
+
+       if (c == '\'' || c == '@') {
+               insert(c, LM_TC_VAR);
+               return;
+       }
+
+       if (c == '\\') {
+               if (imacro_)
+                       macroModeClose();
+               //bv->owner()->message(_("TeX mode"));
+               lastcode_ = LM_TC_TEX;
+               return; 
+       }
+
+       if (isalpha(c)) {
+               if (lastcode_ == LM_TC_TEX) {
+                       macroModeOpen();
+                       lastcode_ = LM_TC_VAR;
+               }
+               insert(c, lastcode_);
+               return; 
+       }
+
+}
+
index 836c43ee007a1ecfa34ad3037635acf14af7845c..389ce3dc201f33e6b348c10e8d6f71689434c6fd 100644 (file)
@@ -113,6 +113,8 @@ public:
        ///
        void plainInsert(MathInset * p);
        ///
+       void niceInsert(MathInset * p);
+       ///
        void delLine();
        /// This is in pixels from (maybe?) the top of inset
        void setPos(int, int);
@@ -164,10 +166,6 @@ public:
        ///
        void drawSelection(Painter & pain) const;
        ///
-       void clearLastCode();
-       ///
-       void setLastCode(MathTextCodes t);
-       ///
        void handleFont(MathTextCodes t);
        ///
        void handleAccent(string const & name);
index 4dc01bf78f32c4d7e65bd0de0334194a43483331..c38323a2e70c2b4805e3af6188402c95ce9648b6 100644 (file)
@@ -73,11 +73,15 @@ enum MathTextCodes  {
        LM_TC_IT,
        ///
        LM_TC_TEXTRM,
-       /// Math mode TeX characters ",;:{}"  20
+       /// Math mode TeX characters ",;:{}"  
        LM_TC_TEX,
        /// Special characters "{}&#_%"
        LM_TC_SPECIAL,
-       /// Internal code for operators  22
+       /// Internal code when typing greek
+       LM_TC_GREEK,
+       /// Internal code when typing a single greek character
+       LM_TC_GREEK1,
+       /// Internal code for operators 
        LM_TC_BOP,
        /// Internal code for symbols
        LM_TC_SYMB,
index 45f91615162f72b264b3fe9737f297da0eb60483..3fe70743b3b0705ac10b6f851f1c4b0ced1fea37 100644 (file)
@@ -121,7 +121,6 @@ latexkeys wordlist[] =
        {"doteq",  LM_TK_NOGLYPH, 0, LMB_RELATION},
        {"downarrow",  LM_TK_SYM, LM_downarrow, LMB_NONE},
        {"ell",  LM_TK_NOGLYPH, 0, LMB_NONE},
-       {"emptyset",  LM_TK_MACRO, LM_emptyset, LMB_NONE},
        {"end",  LM_TK_END, 0, LMB_NONE},
        {"epsilon",  LM_TK_NOGLYPH, 0, LMB_NONE},
        {"equiv",  LM_TK_SYM, LM_equiv, LMB_RELATION},
@@ -200,7 +199,6 @@ latexkeys wordlist[] =
        {"nolimits",  LM_TK_LIMIT, static_cast<unsigned>(-1), LMB_NONE},
        {"nonumber",  LM_TK_NONUM, 0, LMB_NONE},
        {"not",  LM_TK_DECORATION, LM_not, LMB_NONE},
-       {"notin",  LM_TK_MACRO, LM_notin, LMB_RELATION},
        {"nu",  LM_TK_SYM, LM_nu, LMB_NONE},
        {"nwarrow",  LM_TK_NOGLYPH, 0, LMB_NONE},
        {"odot",  LM_TK_NOGLYPH, 0, LMB_OPERATOR},
@@ -209,13 +207,13 @@ latexkeys wordlist[] =
        {"oplus",  LM_TK_SYM, LM_oplus, LMB_OPERATOR},
        {"oslash",  LM_TK_SYM, LM_oslash, LMB_OPERATOR},
        {"otimes",  LM_TK_SYM, LM_otimes, LMB_OPERATOR},
+       {"over",  LM_TK_OVER, 0, LMB_NONE},
        {"overbrace",  LM_TK_DECORATION, LM_overbrace, LMB_NONE},
        {"overleftarrow",  LM_TK_DECORATION, LM_overleftarrow, LMB_NONE},
        {"overline",  LM_TK_DECORATION, LM_overline, LMB_NONE},
        {"overrightarrow",  LM_TK_DECORATION, LM_overightarrow, LMB_NONE},
        {"parallel",  LM_TK_NOGLYPH, 0, LMB_RELATION},
        {"partial",  LM_TK_SYM, LM_partial, LMB_NONE},
-       {"perp",  LM_TK_MACRO, LM_perp, LMB_RELATION},
        {"phi",  LM_TK_SYM, LM_phi, LMB_NONE},
        {"pi",  LM_TK_SYM, LM_pi, LMB_NONE},
        {"pm",  LM_TK_SYM, LM_pm, LMB_OPERATOR},
@@ -237,6 +235,7 @@ latexkeys wordlist[] =
        {"rightharpoondown",  LM_TK_NOGLYPH, 0, LMB_NONE},
        {"rightharpoonup",  LM_TK_NOGLYPH, 0, LMB_NONE},
        {"rightleftharpoons",  LM_TK_NOGLYPH, 0, LMB_NONE},
+       {"root",  LM_TK_ROOT, 0, LMB_NONE},
        //{"scriptscriptstyle",  LM_TK_STY, LM_ST_SCRIPTSCRIPT, LMB_NONE},
        //{"scriptstyle",  LM_TK_STY, LM_ST_SCRIPT, LMB_NONE},
        {"searrow",  LM_TK_NOGLYPH, 0, LMB_NONE},
index c50033d5818ccb8007414722dad5b40b17f81d63..4706c764a0c068dd34575286120ef48c979f32b0 100644 (file)
@@ -95,7 +95,7 @@ void MathMacroTable::builtinMacros()
        createTemplate("notin",        0, "\\not\\in");
        createTemplate("perp",         0, "\\bot");
        createTemplate("to",           0, "\\rightarrow");
-       //createTemplate("lint",       4, "\\int_{#1}^{#2}#3 d#4");
+       //createTemplate("lint",       4, "\\int_#1^#2#3 d#4");
        //createTemplate("silentmult", 0, "\\cdot");
-       createTemplate("binom",        2, "\\left(\\frac{#1}{#2}\\right)");
+       createTemplate("binom",        2, "\\left(\\frac#1#2\\right)");
 }
index 5697ad31441c120205fe950221f4cc6ce8d5b51e..cb7188d962a8671344036f2f59c169de1e2bcd17 100644 (file)
 #include "array.h"
 #include "math_inset.h"
 #include "math_arrayinset.h"
-#include "math_bigopinset.h"
 #include "math_charinset.h"
-#include "math_dotsinset.h"
-#include "math_decorationinset.h"
 #include "math_deliminset.h"
-#include "math_fracinset.h"
+#include "math_factory.h"
 #include "math_funcinset.h"
-#include "math_funcliminset.h"
 #include "math_macro.h"
 #include "math_macrotable.h"
 #include "math_macrotemplate.h"
 #include "math_matrixinset.h"
-#include "math_noglyphinset.h"
 #include "math_rootinset.h"
 #include "math_scopeinset.h"
 #include "math_sqrtinset.h"
 #include "math_scriptinset.h"
-#include "math_sizeinset.h"
-#include "math_spaceinset.h"
 #include "math_sqrtinset.h"
-#include "math_stackrelinset.h"
-#include "math_symbolinset.h"
 #include "debug.h"
-#include "mathed/support.h"
+#include "support.h"
 #include "lyxlex.h"
 #include "support/lstrings.h"
 
@@ -92,12 +83,9 @@ MathInset * lastScriptInset(MathArray & array, bool up, bool down, int limits)
 
 // These are lexical codes, not semantic
 enum lexcode_enum {
-       LexNone,
        LexESC,
        LexAlpha,
        LexBOP,         // Binary operators or relations
-       LexOpen,
-       LexClose,
        LexComment,
        LexArgument,
        LexSpace,
@@ -111,19 +99,18 @@ lexcode_enum lexcode[256];
 
 
 const unsigned char LM_TK_OPEN  = '{';
-const unsigned char LM_TK_CLOSE = '}';
 
 enum {
-       FLAG_BRACE      = 1 << 0,  //  A { needed              //}
-       FLAG_BRACE_LAST = 1 << 1,  //  // { Last } ends the parsing process
-       FLAG_RIGHT      = 1 << 2,  //  Next right ends the parsing process
-       FLAG_END        = 1 << 3,  //  Next end ends the parsing process
-       FLAG_BRACK_END  = 1 << 5,  //  // [ Next ] ends the parsing process
-       FLAG_AMPERSAND  = 1 << 6,  //  Next & ends the parsing process
-       FLAG_NEWLINE    = 1 << 7,  //  Next \\ ends the parsing process
-       FLAG_ITEM       = 1 << 8,  //  read a (possibly braced token)
+       FLAG_BRACE      = 1 << 0,  //  an opening brace needed
+       FLAG_BRACE_LAST = 1 << 1,  //  last closing brace ends the parsing process
+       FLAG_RIGHT      = 1 << 2,  //  next right ends the parsing process
+       FLAG_END        = 1 << 3,  //  next end ends the parsing process
+       FLAG_BRACK_END  = 1 << 4,  //  next closing bracket ends the parsing process
+       FLAG_AMPERSAND  = 1 << 5,  //  next & ends the parsing process
+       FLAG_NEWLINE    = 1 << 6,  //  next \\ ends the parsing process
+       FLAG_ITEM       = 1 << 7,  //  read a (possibly braced token)
+       FLAG_BLOCK      = 1 << 8,  //  next block ends the parsing process
        FLAG_LEAVE      = 1 << 9,  //  marker for leaving the 
-       FLAG_OPTARG     = 1 << 10  //  reads an argument in []
 };
 
 
@@ -181,9 +168,10 @@ void lexInit()
        lexcode['['] = lexcode[']'] = lexcode['^'] = lexcode['_'] = 
                lexcode['&'] = LexSelf;  
        
+       lexcode['{'] = LexSelf;
+       lexcode['}'] = LexSelf;
+
        lexcode['\\'] = LexESC;
-       lexcode['{'] = LexOpen;
-       lexcode['}'] = LexClose;
 }
 
 
@@ -333,10 +321,6 @@ int Parser::yylex()
                        c = getuchar();
                        ival_ = c - '0';
                        return LM_TK_ARGUMENT; 
-               } else if (lexcode[c] == LexOpen) {
-                       return LM_TK_OPEN;
-               } else if (lexcode[c] == LexClose) {
-                       return LM_TK_CLOSE;
                } else if (lexcode[c] == LexESC)   {
                        c = getuchar();
                        //lyxerr << "reading second byte: '" << c << "' code: " << lexcode[c] << endl;
@@ -364,21 +348,18 @@ int Parser::yylex()
                        
                                //lyxerr[Debug::MATHED] << "reading: text '" << sval_ << "'\n";
                                //lyxerr << "reading: text '" << sval_ << "'\n";
-                               latexkeys const * l = in_word_set(sval_);
-                               if (!l) 
+                               lval_ = in_word_set(sval_);
+                               if (!lval_
                                        return LM_TK_UNDEF;
 
-                               if (l->token == LM_TK_BEGIN || l->token == LM_TK_END) { 
+                               if (lval_->token == LM_TK_BEGIN || lval_->token == LM_TK_END) { 
                                        string name = lexArg('{');
                                        int i = 0;
                                        while (i < latex_mathenv_num && name != latex_mathenv[i].name)
                                                 ++i;
                                        ival_ = i;
-                               } else if (l->token == LM_TK_SPACE) 
-                                       ival_ = l->id;
-                               else
-                                       lval_ = l;
-                               return l->token;
+                               }
+                               return lval_->token;
                        }
                }
        }
@@ -574,22 +555,32 @@ void Parser::parse_into(MathArray & array, unsigned flags)
                        if (t == LM_TK_OPEN) { 
                                // skip the brace and collect everything to the next matching
                                // closing brace
-                               t = yylex();
                                flags |= FLAG_BRACE_LAST;
+                               t = yylex();
                        } else {
                                // take only this single token
                                flags |= FLAG_LEAVE;
                        }
                }
 
-               if ((flags & FLAG_BRACE) && t != LM_TK_OPEN) {
-                       error("Expected {. Maybe you forgot to enclose an argument in {}");
-                       panic = true;
-                       break;
+               if (flags & FLAG_BRACE) {
+                       if (t != LM_TK_OPEN) {
+                               error("Expected {. Maybe you forgot to enclose an argument in {}");
+                               panic = true;
+                               break;
+                       } else {
+                               flags &= ~FLAG_BRACE;
+                               t = yylex();
+                               continue;
+                       }
                }
 
                switch (t) {
                        
+               case LM_TK_MATH:
+               case LM_TK_END:
+                       return;
+
                case LM_TK_ALPHA:
                        if (!isspace(ival_) || yyvarcode == LM_TC_TEXTRM)
                                array.push_back(new MathCharInset(ival_, yyvarcode));
@@ -610,15 +601,15 @@ void Parser::parse_into(MathArray & array, unsigned flags)
                        array.push_back(new MathCharInset(ival_, LM_TC_CONST));
                        break;
 
-               case LM_TK_OPEN:
+               case '{':
+                       //lyxerr << " creating ScopeInset\n";
                        array.push_back(new MathScopeInset);
                        parse_into(array.back()->cell(0), FLAG_BRACE_LAST);
                        break;
 
-               case LM_TK_CLOSE:
-                       if (flags & FLAG_BRACE_LAST) {
+               case '}':
+                       if (flags & FLAG_BRACE_LAST)
                                flags |= FLAG_LEAVE;
-                       }
                        break;
                
                case '[':
@@ -671,58 +662,10 @@ void Parser::parse_into(MathArray & array, unsigned flags)
                case LM_TK_PROTECT: 
                        break;
 
-               case LM_TK_NOGLYPH: 
-               case LM_TK_NOGLYPHB: 
-                       limits = 0;
-                       array.push_back(new MathNoglyphInset(lval_));
-                       break;
-
-               case LM_TK_BIGSYM:  
-                       limits = 0;
-                       array.push_back(new MathBigopInset(lval_));
-                       break;
-
-               case LM_TK_FUNCLIM:
-                       limits = 0;
-                       array.push_back(new MathFuncLimInset(lval_));
-                       break;
-
-               case LM_TK_SYM:
-                       limits = 0;
-                       array.push_back(new MathSymbolInset(lval_));
-                       break;
-
                case LM_TK_BOP:
                        array.push_back(new MathCharInset(ival_, LM_TC_BOP));
                        break;
 
-               case LM_TK_SPACE:
-                       if (ival_ >= 0) 
-                               array.push_back(new MathSpaceInset(ival_));
-                       break;
-
-               case LM_TK_DOTS:
-                       array.push_back(new MathDotsInset(lval_));
-                       break;
-               
-               case LM_TK_STACK:
-               {
-                       MathStackrelInset * p = new MathStackrelInset;
-                       parse_into(p->cell(0), FLAG_ITEM);
-                       parse_into(p->cell(1), FLAG_ITEM);
-                       array.push_back(p);
-                       break;
-               }
-
-               case LM_TK_FRAC:
-               {
-                       MathFracInset * p = new MathFracInset;
-                       parse_into(p->cell(0), FLAG_ITEM);
-                       parse_into(p->cell(1), FLAG_ITEM);
-                       array.push_back(p);
-                       break;
-               }
-
                case LM_TK_SQRT:
                {
                        unsigned char c = getuchar();
@@ -782,22 +725,10 @@ void Parser::parse_into(MathArray & array, unsigned flags)
                        break; 
                }
 
-               case LM_TK_DECORATION:
-               {  
-                       MathDecorationInset * p = new MathDecorationInset(lval_);
-                       parse_into(p->cell(0), FLAG_ITEM);
-                       array.push_back(p);
-                       break;
-               }
-                       
                case LM_TK_NONUM:
                        curr_num_ = false;
                        break;
                
-               case LM_TK_FUNC:
-                       array.push_back(new MathSymbolInset(lval_));
-                       break;
-               
                case LM_TK_UNDEF: 
                        if (MathMacroTable::hasTemplate(sval_)) {
                                MathMacro * m = MathMacroTable::cloneTemplate(sval_);
@@ -809,10 +740,6 @@ void Parser::parse_into(MathArray & array, unsigned flags)
                                array.push_back(new MathFuncInset(sval_));
                        break;
                
-               case LM_TK_MATH:
-               case LM_TK_END:
-                       return;
-
                case LM_TK_BEGIN:
                {
                        int i = ival_;
@@ -836,18 +763,29 @@ void Parser::parse_into(MathArray & array, unsigned flags)
                        break;
                }
        
-               case LM_TK_MACRO:
-                       array.push_back(MathMacroTable::cloneTemplate(lval_->name));
-                       break;
-               
                case LM_TK_LABEL:
                        curr_label_ = lexArg('{', true);
                        break;
+
+               case LM_TK_OVER:
+               {
+                       MathArray ar;
+                       parse_into(ar, FLAG_BLOCK);
+                       break;
+               }
                
                default:
-                       error("Unrecognized token");
-                       lyxerr[Debug::MATHED] << "[" << t << " " << sval_ << "]" << endl;
-                       break;
+                       limits = 0;
+                       MathInset * p = createMathInset(lval_);
+                       if (p) {
+                               for (int i = 0; i < p->nargs(); ++i)
+                                       parse_into(p->cell(i), FLAG_ITEM);
+                               array.push_back(p);
+                       } else {
+                               error("Unrecognized token");
+                               //lyxerr[Debug::MATHED] << "[" << t << " " << sval_ << "]\n";
+                               lyxerr << "[" << t << " " << sval_ << "]\n";
+                       }
 
                } // end of big switch
 
@@ -857,7 +795,7 @@ void Parser::parse_into(MathArray & array, unsigned flags)
                }
 
                if (panic) {
-                       lyxerr << " Math Panic, expect problems!" << endl;
+                       lyxerr << " Math Panic, expect problems!\n";
                        //   Search for the end command. 
                        do {
                                t = yylex();
@@ -879,8 +817,9 @@ void parse_end(LyXLex & lex, int lineno)
                lex.nextToken();
                if (lex.getString() == "\\end_inset")
                        break;
-               lyxerr[Debug::MATHED] << "InsetFormula::Read: Garbage before \\end_inset,"
-                       " or missing \\end_inset!" << endl;
+               //lyxerr[Debug::MATHED] << "InsetFormula::Read: Garbage before \\end_inset,"
+               lyxerr << "InsetFormula::Read: Garbage before \\end_inset,"
+                       " or missing \\end_inset!\n";
        }
 }
 
@@ -942,4 +881,3 @@ MathMatrixInset * mathed_parse_normal(LyXLex & lex)
        parse_end(lex, parser.lineno());
        return p;
 }
-
index b8a2494379c9b64cbf77bfcbcf675ba28e736817..5a34b89e72647d0017b08f3384a5a993afd560ce 100644 (file)
@@ -45,10 +45,16 @@ enum MathTokenEnum
        ///
        LM_TK_SYM,
        ///
+       LM_TK_OVER,
+       ///
+       LM_TK_CHOOSE,
+       ///
        LM_TK_FRAC,
        ///
        LM_TK_SQRT,
        ///
+       LM_TK_ROOT,
+       ///
        LM_TK_BEGIN,
        ///
        LM_TK_END,
@@ -91,8 +97,6 @@ enum MathTokenEnum
        ///
        LM_TK_STY,
        ///
-       LM_TK_MACRO,
-       ///
        LM_TK_SPECIAL,
        ///
        LM_TK_ARGUMENT,