]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/math_factory.C
rename commandtags.h to lfuns.h and renumber/cleanup. Rebuild the tree !
[lyx.git] / src / mathed / math_factory.C
index c6bd7ae99767dbcad2a9c77c270b049d392784d5..68166b7215bf57706eecdb7c2eeac1d2cf280212 100644 (file)
@@ -1,8 +1,4 @@
 
-#ifdef __GNUG__
-#pragma implementation 
-#endif
-
 #include <config.h>
 
 #include "math_parser.h"
@@ -35,6 +31,7 @@
 #include "math_stackrelinset.h"
 #include "math_substackinset.h"
 #include "math_symbolinset.h"
+#include "math_tabularinset.h"
 #include "math_undersetinset.h"
 #include "math_unknowninset.h"
 #include "math_xarrowinset.h"
 #include "math_support.h"
 #include "Lsstream.h"
 #include "support/filetools.h" // LibFileSearch
+#include "support/lstrings.h"
 #include "frontends/lyx_gui.h"
 
 #include <map>
 #include <fstream>
 
+bool has_math_fonts;
+
+using std::endl;
+
 
 namespace {
 
@@ -78,7 +80,8 @@ bool math_font_available(string & name)
        }
 
        lyxerr[Debug::MATHED]
-               << "font " << name << " not available and I can't fake it\n";
+               << "font " << name << " not available and I can't fake it"
+               << endl;
        return false;
 }
 
@@ -86,24 +89,24 @@ bool math_font_available(string & name)
 void initSymbols()
 {
        string const filename = LibFileSearch(string(), "symbols");
-       lyxerr[Debug::MATHED] << "read symbols from " << filename << "\n";
+       lyxerr[Debug::MATHED] << "read symbols from " << filename << endl;
        if (filename.empty()) {
-               lyxerr << "Could not find symbols file\n";
+               lyxerr << "Could not find symbols file" << endl;
                return;
        }
 
        std::ifstream fs(filename.c_str());
        string line;
        bool skip = false;
-       while (std::getline(fs, line)) {
+       while (getline(fs, line)) {
                int charid     = 0;
                int fallbackid = 0;
-               if (line.size() > 0 && line[0] == '#')
+               if (!line.empty() && line[0] == '#')
                        continue;
 
-               // special case of \iffont / \fi
+               // special case of iffont/else/endif
                if (line.size() >= 7 && line.substr(0, 6) == "iffont") {
-                       istringstream is(line);
+                       istringstream is(STRCONV(line));
                        string tmp;
                        is >> tmp;
                        is >> tmp;
@@ -119,64 +122,75 @@ void initSymbols()
 
                // special case of pre-defined macros
                if (line.size() > 8 && line.substr(0, 5) == "\\def\\") {
-                       //lyxerr << "defining: '" << line << "'\n";
-                       istringstream is(line);
+                       //lyxerr << "defining: '" << line << '\'' << endl;
+                       istringstream is(STRCONV(line));
                        MathMacroTable::create(MathAtom(new MathMacroTemplate(is)));
                        continue;
                }
 
-               istringstream is(line);
+               istringstream is(STRCONV(line));
                latexkeys tmp;
                is >> tmp.name >> tmp.inset;
-               if (isFontName(tmp.inset)) 
+               if (isFontName(tmp.inset))
                        is >> charid >> fallbackid >> tmp.extra >> tmp.xmlname;
                else
                        is >> tmp.extra;
                if (!is) {
-                       lyxerr[Debug::MATHED] << "skipping line '" << line << "'\n";
+                       lyxerr[Debug::MATHED] << "skipping line '" << line << '\'' << endl;
                        lyxerr[Debug::MATHED]
-                               << tmp.name << ' ' << tmp.inset << ' ' << tmp.extra << "\n";
+                               << tmp.name << ' ' << tmp.inset << ' ' << tmp.extra << endl;
                        continue;
                }
 
                if (isFontName(tmp.inset)) {
                        // tmp.inset _is_ the fontname here.
                        // create fallbacks if necessary
-                       if (tmp.extra=="func" || tmp.extra=="funclim" || tmp.extra=="special") {
-                               lyxerr[Debug::MATHED] << "symbol abuse for " << tmp.name << "\n";
+
+                       // symbol font is not available sometimes
+                       string symbol_font = "lyxsymbol";
+
+                       if (tmp.extra == "func" || tmp.extra == "funclim" || tmp.extra == "special") {
+                               lyxerr[Debug::MATHED] << "symbol abuse for " << tmp.name << endl;
                                tmp.draw = tmp.name;
                        } else if (math_font_available(tmp.inset)) {
-                               lyxerr[Debug::MATHED] << "symbol available for " << tmp.name << "\n";
+                               lyxerr[Debug::MATHED] << "symbol available for " << tmp.name << endl;
                                tmp.draw += char(charid);
-                       } else if (fallbackid) {
+                       } else if (fallbackid && math_font_available(symbol_font)) {
                                if (tmp.inset == "cmex")
                                        tmp.inset  = "lyxsymbol";
                                else
                                        tmp.inset  = "lyxboldsymbol";
-                               lyxerr[Debug::MATHED] << "symbol fallback for " << tmp.name << "\n";
-                               tmp.draw += char(fallbackid); 
+                               lyxerr[Debug::MATHED] << "symbol fallback for " << tmp.name << endl;
+                               tmp.draw += char(fallbackid);
                        } else {
-                               lyxerr[Debug::MATHED] << "faking " << tmp.name << "\n";
+                               lyxerr[Debug::MATHED] << "faking " << tmp.name << endl;
                                tmp.draw = tmp.name;
                                tmp.inset = "lyxtex";
                        }
                } else {
                        // it's a proper inset
-                       lyxerr[Debug::MATHED] << "inset " << tmp.inset << " used for "
-                               << tmp.name << "\n";
+                       lyxerr[Debug::MATHED] << "inset " << tmp.inset
+                                             << " used for " << tmp.name
+                                             << endl;
                }
 
                if (theWordList.find(tmp.name) != theWordList.end())
-                       lyxerr[Debug::MATHED] << "readSymbols: inset " << tmp.name
-                               << " already exists.\n";
+                       lyxerr[Debug::MATHED]
+                               << "readSymbols: inset " << tmp.name
+                               << " already exists." << endl;
                else
                        theWordList[tmp.name] = tmp;
-               lyxerr[Debug::MATHED] << "read symbol '" << tmp.name
-                                       <<  "  inset: " << tmp.inset
-                                       <<  "  draw: " << int(tmp.draw[0])
-                                       <<  "  extra: " << tmp.extra
-                                       << "'\n";
+
+               lyxerr[Debug::MATHED]
+                       << "read symbol '" << tmp.name
+                       << "  inset: " << tmp.inset
+                       << "  draw: " << int(tmp.draw.empty() ? 0 : tmp.draw[0])
+                       << "  extra: " << tmp.extra
+                       << '\'' << endl;
        }
+       string tmp = "cmm";
+       string tmp2 = "cmsy";
+       has_math_fonts = math_font_available(tmp) && math_font_available(tmp2);
 }
 
 
@@ -197,18 +211,20 @@ latexkeys const * in_word_set(string const & str)
 {
        WordList::iterator it = theWordList.find(str);
        //lyxerr << "looking up '" << str << "' found: "
-       // << (it != theWordList.end()) << "\n";
+       // << (it != theWordList.end()) << endl;
        return (it != theWordList.end()) ? &(it->second) : 0;
 }
 
 
 MathAtom createMathInset(string const & s)
 {
-       lyxerr[Debug::MATHED] << "creating inset with name: '" << s << "'\n";
+       lyxerr[Debug::MATHED] << "creating inset with name: '"
+                             << s << '\'' << endl;;
        latexkeys const * l = in_word_set(s);
        if (l) {
                string const & inset = l->inset;
-               lyxerr[Debug::MATHED] << " found inset: '" << inset << "'\n";
+               lyxerr[Debug::MATHED] << " found inset: '" <<
+                       inset << '\'' << endl;
                if (inset == "ref")
                        return MathAtom(new RefInset(l->name));
                if (inset == "underset")
@@ -261,6 +277,8 @@ MathAtom createMathInset(string const & s)
                return MathAtom(new MathSqrtInset);
        if (s == "root")
                return MathAtom(new MathRootInset);
+       if (s == "tabular")
+               return MathAtom(new MathTabularInset(s, 1, 1));
        if (s == "stackrel")
                return MathAtom(new MathStackrelInset);
        if (s == "binom" || s == "choose")
@@ -279,6 +297,31 @@ MathAtom createMathInset(string const & s)
        if (MathMacroTable::has(s))
                return MathAtom(new MathMacro(s));
 
-       //lyxerr[Debug::MATHED] << "creating inset 2 with name: '" << s << "'\n";
+       //lyxerr[Debug::MATHED] << "creating inset 2 with name: '" << s << '\'' << endl;
        return MathAtom(new MathUnknownInset(s));
 }
+
+
+bool createMathInset_fromDialogStr(string const & str, MathArray & ar)
+{
+       // An example str:
+       // "ref LatexCommand \\ref{sec:Title}\n\\end_inset\n\n";
+       string name;
+       string body = split(str, name, ' ');
+
+       if (name != "ref" )
+               return false;
+
+       // body comes with a head "LatexCommand " and a
+       // tail "\nend_inset\n\n". Strip them off.
+       string trimmed;
+       body = split(body, trimmed, ' ');
+       split(body, trimmed, '\n');
+
+       mathed_parse_cell(ar, trimmed);
+       if (ar.size() != 1)
+               return false;
+
+       return ar[0].nucleus();
+}
+