]> git.lyx.org Git - lyx.git/blob - src/mathed/math_hash.C
use stream-like syntax for LaTeX output
[lyx.git] / src / mathed / math_hash.C
1 #include <config.h>
2
3 #include "math_parser.h"
4 #include "lyxlex.h"
5 #include "debug.h"
6 #include "support/filetools.h" // LibFileSearch
7
8 #include <map>
9
10
11 namespace {
12
13 struct latexkeys_a {
14         ///
15         char const * name;
16         ///
17         short token;
18         ///
19         unsigned int id;
20 };
21
22 latexkeys_a wordlist_array[] = 
23 {
24         {"!",  LM_TK_SPACE, 0},
25         {"#",  LM_TK_SPECIAL, '#'},
26         {"$",  LM_TK_SPECIAL, '$'},
27         {"%",  LM_TK_SPECIAL, '%'},
28         {"&",  LM_TK_SPECIAL, '&'},
29         {"(",  LM_TK_BEGIN, LM_OT_SIMPLE},
30         {")",  LM_TK_END, LM_OT_SIMPLE},
31         {",",  LM_TK_SPACE, 1},
32         {".",  LM_TK_SPECIAL, '.'},
33         {":",  LM_TK_SPACE, 2},
34         {";",  LM_TK_SPACE, 3},
35         {"Pr",  LM_TK_FUNCLIM, 0},
36         {"[",  LM_TK_BEGIN, LM_OT_EQUATION},
37         {"\\",  LM_TK_NEWLINE, static_cast<unsigned>(-1)}, // -1 needed in mathed_parse_lines!
38         {"]",  LM_TK_END, LM_OT_EQUATION},
39         {"_",  LM_TK_SPECIAL, '_'},
40         {"acute",  LM_TK_DECORATION, 0},
41         {"arccos",  LM_TK_FUNC, 0},
42         {"arcsin",  LM_TK_FUNC, 0},
43         {"arctan",  LM_TK_FUNC, 0},
44         {"arg",  LM_TK_FUNC, 0},
45         {"atop",  LM_TK_ATOP, 0},
46         {"bar",  LM_TK_DECORATION, 0},
47         {"begin",  LM_TK_BEGIN, 0},
48         {"binom",  LM_TK_BINOM, 0},
49         {"bmod",  LM_TK_FUNC, 0},
50         {"breve",  LM_TK_DECORATION, 0},
51         {"cal",  LM_TK_OLDFONT, LM_TC_CAL},
52         {"cdots",  LM_TK_DOTS, 0},
53         {"check",  LM_TK_DECORATION, 0},
54         {"choose",  LM_TK_CHOOSE, 0},
55         {"cos",  LM_TK_FUNC, 0},
56         {"cosh",  LM_TK_FUNC, 0},
57         {"cot",  LM_TK_FUNC, 0},
58         {"coth",  LM_TK_FUNC, 0},
59         {"csc",  LM_TK_FUNC, 0},
60         {"ddot",  LM_TK_DECORATION, 0},
61         {"ddots",  LM_TK_DOTS, 0},
62         {"deg",  LM_TK_FUNC, 0},
63         {"det",  LM_TK_FUNCLIM, 0},
64         {"dim",  LM_TK_FUNC, 0},
65         //{"displaystyle",  LM_TK_STY, LM_ST_DISPLAY},
66         {"dot",  LM_TK_DECORATION, 0},
67         {"end",  LM_TK_END, 0},
68         {"exp",  LM_TK_FUNC, 0},
69         {"frac",  LM_TK_FRAC, 0},
70         {"gcd",  LM_TK_FUNCLIM, 0},
71         {"grave",  LM_TK_DECORATION, 0},
72         {"hat",  LM_TK_DECORATION, 0},
73         {"hom",  LM_TK_FUNC, 0},
74         {"inf",  LM_TK_FUNCLIM, 0},
75         {"ker",  LM_TK_FUNC, 0},
76         {"kern",  LM_TK_KERN, 0},
77         {"label",  LM_TK_LABEL, 0},
78         {"lefteqn",  LM_TK_LEFTEQN, 1},
79         {"ldots",  LM_TK_DOTS, 0},
80         {"left",  LM_TK_LEFT, 0},
81         {"lg",  LM_TK_FUNC, 0},
82         {"lim",  LM_TK_FUNCLIM, 0},
83         {"liminf",  LM_TK_FUNCLIM, 0},
84         {"limits",  LM_TK_LIMIT, 1 },
85         {"limsup",  LM_TK_FUNCLIM, 0},
86         {"ln",  LM_TK_FUNC, 0},
87         {"log",  LM_TK_FUNC, 0},
88         {"mathbb",  LM_TK_FONT, LM_TC_BB},
89         {"mathbf",  LM_TK_FONT, LM_TC_BF},
90         {"mathcal",  LM_TK_FONT, LM_TC_CAL},
91         {"mathit",  LM_TK_FONT, LM_TC_IT},
92         {"mathnormal",  LM_TK_FONT, LM_TC_VAR},
93         {"mathrm",  LM_TK_FONT, LM_TC_RM},
94         {"mathsf",  LM_TK_FONT, LM_TC_SF},
95         {"mathtt",  LM_TK_FONT, LM_TC_TT},
96         {"max",  LM_TK_FUNCLIM, 0},
97         //{"mbox",  LM_TK_BOX, 0},
98         {"min",  LM_TK_FUNCLIM, 0},
99         {"newcommand",  LM_TK_NEWCOMMAND, 0 },
100         {"nolimits",  LM_TK_LIMIT, static_cast<unsigned>(-1)},
101         {"nonumber",  LM_TK_NONUM, 0},
102         {"not",  LM_TK_NOT, 0},
103         {"over",  LM_TK_OVER, 0},
104         {"overbrace",  LM_TK_DECORATION, 0},
105         {"overleftarrow",  LM_TK_DECORATION, 0},
106         {"overline",  LM_TK_DECORATION, 0},
107         {"overrightarrow",  LM_TK_DECORATION, 0},
108         {"protect",  LM_TK_PROTECT, 0},
109         {"qquad",  LM_TK_SPACE, 5},
110         {"quad",  LM_TK_SPACE, 4},
111         {"right",  LM_TK_RIGHT, 0},
112         {"root",  LM_TK_ROOT, 0},
113         //{"scriptscriptstyle",  LM_TK_STY, LM_ST_SCRIPTSCRIPT},
114         //{"scriptstyle",  LM_TK_STY, LM_ST_SCRIPT},
115         {"sec",  LM_TK_FUNC, 0},
116         {"sin",  LM_TK_FUNC, 0},
117         {"sinh",  LM_TK_FUNC, 0},
118         {"sqrt",  LM_TK_SQRT, 0},
119         {"stackrel",  LM_TK_STACK, 0},
120         {"sup",  LM_TK_FUNCLIM, 0},
121         {"tan",  LM_TK_FUNC, 0},
122         {"tanh",  LM_TK_FUNC, 0},
123         {"textrm",  LM_TK_FONT, LM_TC_TEXTRM},
124         //{"textstyle",  LM_TK_STY, LM_ST_TEXT},
125         {"tilde",  LM_TK_DECORATION, 0},
126         {"underbrace",  LM_TK_DECORATION, 0},
127         {"underline",  LM_TK_DECORATION, 0},
128         {"vdots",  LM_TK_DOTS, 0},
129         {"vec",  LM_TK_DECORATION, 0},
130         {"widehat",  LM_TK_DECORATION, 0},
131         {"widetilde",  LM_TK_DECORATION, 0},
132         {"{",  LM_TK_SPECIAL, '{'},
133         {"}",  LM_TK_SPECIAL, '}'}
134 };
135
136
137 std::map<string, latexkeys> wordlist;
138
139
140
141 MathTokenEnum tokenEnum(const string & font)
142 {
143         if (font == "cmr")
144                 return LM_TK_CMR;
145         if (font == "cmsy")
146                 return LM_TK_CMSY;
147         if (font == "cmm")
148                 return LM_TK_CMM;
149         if (font == "cmex")
150                 return LM_TK_CMEX;
151         if (font == "msa")
152                 return LM_TK_MSA;
153         if (font == "msb")
154                 return LM_TK_MSB;
155         return LM_TK_SYM;
156 }
157
158
159 MathSymbolTypes symbolType(const string & type)
160 {
161         if (type == "mathrel")
162                 return LMB_RELATION;
163         if (type == "mathbin")
164                 return LMB_OPERATOR;    
165         return LMB_NONE;
166 }
167
168
169 } // namespace anon
170
171
172 void ReadSymbols(string const & filename)
173 {
174         LyXLex lex(0, 0);
175         lex.setFile(filename);
176         while (lex.isOK() && lex.next()) {
177                 latexkeys tmp;
178                 tmp.name = lex.getString();
179                 if (lex.next())
180                         tmp.token = tokenEnum(lex.getString());
181                 if (lex.next())
182                         tmp.latex_font_id = lex.getInteger();
183                 if (lex.next())
184                         tmp.id = lex.getInteger();
185                 if (lex.next())
186                         tmp.type = symbolType(lex.getString());
187                 if (wordlist.find(tmp.name) != wordlist.end())
188                         lyxerr << "ReadSymbols: token " << tmp.name
189                                << " already exists.\n";
190                 else
191                         wordlist[tmp.name] = tmp;
192         }
193 }
194
195
196 void initSymbols()
197 {
198         unsigned const n = sizeof(wordlist_array) / sizeof(wordlist_array[0]);
199         for (latexkeys_a * p = wordlist_array; p != wordlist_array + n; ++p) {
200                 latexkeys tmp;
201                 tmp.name          = p->name;
202                 tmp.token         = p->token;
203                 tmp.id            = p->id;
204                 tmp.type          = LMB_NONE;
205                 tmp.latex_font_id = 0;
206                 wordlist[p->name] = tmp;
207         }
208
209         lyxerr[Debug::MATHED] << "Reading symbols file\n";
210         string const file = LibFileSearch(string(), "symbols");
211         if (file.empty())
212                 lyxerr << "Could not find symbols file\n";
213         else
214                 ReadSymbols(file);
215 }
216
217
218 latexkeys const * in_word_set(string const & str)
219 {
220         static bool initialized = false;
221
222         if (!initialized) {
223                 initSymbols();
224                 initialized = true;
225         }
226
227         std::map<string, latexkeys>::iterator it = wordlist.find(str);
228         return (it != wordlist.end()) ? &(it->second) : 0;
229 }