~alexreg/mathtexdotnet/0.1

« back to all changes in this revision

Viewing changes to TexDotNet/Syntax/TexWriter.cs

  • Committer: Alex Regueiro
  • Date: 2009-09-22 01:27:08 UTC
  • Revision ID: alexreg@gmail.com-20090922012708-08rzfuxv1gty8w9g
Added 'Tex' prefix to all appropiate classes in project.
Improved error handling in lexer and parser. (Redesigned error functionality around TexErrorSourceInfoException and ITexErrorSourceInfo).
Implemented TexWriter class.
Started design of TexComposer class.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
using System;
 
2
using System.Collections.Generic;
 
3
using System.IO;
 
4
using System.Linq;
 
5
using System.Text;
 
6
 
 
7
namespace TexDotNet
 
8
{
 
9
    using TokenStream = IEnumerator<TexToken>;
 
10
 
 
11
    public class TexWriter
 
12
    {
 
13
        public TexWriter(TextWriter writer)
 
14
        {
 
15
            this.TextWriter = writer;
 
16
            this.IgnoreUnknownSymbols = true;
 
17
        }
 
18
 
 
19
        public TextWriter TextWriter
 
20
        {
 
21
            get;
 
22
            private set;
 
23
        }
 
24
 
 
25
        public bool IgnoreUnknownSymbols
 
26
        {
 
27
            get;
 
28
            set;
 
29
        }
 
30
 
 
31
        public void Write(TokenStream tokenStream)
 
32
        {
 
33
            while (tokenStream.MoveNext())
 
34
            {
 
35
                var chr = GetShortSymbol(tokenStream.Current);
 
36
                if (chr != null)
 
37
                {
 
38
                    this.TextWriter.Write(chr);
 
39
                    continue;
 
40
                }
 
41
                var str = GetLongSymbol(tokenStream.Current);
 
42
                if (str != null)
 
43
                {
 
44
                    this.TextWriter.Write('\\' + chr);
 
45
                    continue;
 
46
                }
 
47
 
 
48
                if (!this.IgnoreUnknownSymbols)
 
49
                    throw new WriterException(tokenStream.Current);
 
50
            }
 
51
        }
 
52
 
 
53
        private char? GetShortSymbol(TexToken token)
 
54
        {
 
55
            switch (token.Symbol)
 
56
            {
 
57
                case TexSymbolKind.RaiseToIndex:
 
58
                    return '^';
 
59
                case TexSymbolKind.LowerToIndex:
 
60
                    return '_';
 
61
                case TexSymbolKind.Prime:
 
62
                    return '\'';
 
63
                case TexSymbolKind.Colon:
 
64
                    return ':';
 
65
                case TexSymbolKind.Comma:
 
66
                    return ',';
 
67
                case TexSymbolKind.Letter:
 
68
                    return (char)token.Value;
 
69
 
 
70
                #region Relations
 
71
                case TexSymbolKind.Equals:
 
72
                    return '=';
 
73
                case TexSymbolKind.LessThan:
 
74
                    return '<';
 
75
                case TexSymbolKind.GreaterThan:
 
76
                    return '>';
 
77
                #endregion
 
78
 
 
79
                #region Operators
 
80
                case TexSymbolKind.Plus:
 
81
                    return '+';
 
82
                case TexSymbolKind.Minus:
 
83
                    return '-';
 
84
                case TexSymbolKind.Star:
 
85
                    return '*';
 
86
                case TexSymbolKind.Divide:
 
87
                    return '/';
 
88
                case TexSymbolKind.Factorial:
 
89
                    return '!';
 
90
                #endregion
 
91
 
 
92
                #region Brackets
 
93
                case TexSymbolKind.GroupOpen:
 
94
                    return '{';
 
95
                case TexSymbolKind.GroupClose:
 
96
                    return '}';
 
97
                case TexSymbolKind.RoundBracketOpen:
 
98
                    return '(';
 
99
                case TexSymbolKind.RoundBracketClose:
 
100
                    return ')';
 
101
                case TexSymbolKind.SquareBracketOpen:
 
102
                    return '[';
 
103
                case TexSymbolKind.SquareBracketClose:
 
104
                    return ']';
 
105
                case TexSymbolKind.ModulusBracket:
 
106
                    return '|';
 
107
                #endregion
 
108
 
 
109
                default:
 
110
                    return null;
 
111
            }
 
112
        }
 
113
 
 
114
        private string GetLongSymbol(TexToken token)
 
115
        {
 
116
            switch (token.Symbol)
 
117
            {
 
118
                case TexSymbolKind.Number:
 
119
                    var value = (double)token.Value;
 
120
                    if (double.IsPositiveInfinity(value))
 
121
                        return "infty";
 
122
                    else
 
123
                        return value.ToString();
 
124
                case TexSymbolKind.Text:
 
125
                    return string.Format("text{{0}}", (string)token.Value);
 
126
                case TexSymbolKind.GreekLetter:
 
127
                    return (string)token.Value;
 
128
 
 
129
                #region Brackets
 
130
                case TexSymbolKind.CurlyBracketOpen:
 
131
                    return "{";
 
132
                case TexSymbolKind.CurlyBracketClose:
 
133
                    return "}";
 
134
                case TexSymbolKind.AngleBracketOpen:
 
135
                    return "langle";
 
136
                case TexSymbolKind.AngleBracketClose:
 
137
                    return "rangle";
 
138
                case TexSymbolKind.FloorBracketOpen:
 
139
                    return "lfloor";
 
140
                case TexSymbolKind.FloorBracketClose:
 
141
                    return "rfloor";
 
142
                case TexSymbolKind.CeilingBracketOpen:
 
143
                    return "lceil";
 
144
                case TexSymbolKind.CeilingBracketClose:
 
145
                    return "rceil";
 
146
                case TexSymbolKind.NormBracket:
 
147
                    return "|";
 
148
                #endregion
 
149
 
 
150
                #region Relations
 
151
                case TexSymbolKind.NotEquals:
 
152
                    return "neq";
 
153
                case TexSymbolKind.DotEquals:
 
154
                    return "doteq";
 
155
                case TexSymbolKind.Approximates:
 
156
                    return "approx";
 
157
                case TexSymbolKind.Equivalent:
 
158
                    return "equiv";
 
159
                case TexSymbolKind.LessThanOrEqualTo:
 
160
                    return "leq";
 
161
                case TexSymbolKind.GreaterThanOrEqualTo:
 
162
                    return "geq";
 
163
                case TexSymbolKind.MuchLessThan:
 
164
                    return "ll";
 
165
                case TexSymbolKind.MuchGreaterThan:
 
166
                    return "gg";
 
167
                case TexSymbolKind.Proportional:
 
168
                    return "propto";
 
169
                case TexSymbolKind.Asymptotic:
 
170
                    return "asymp";
 
171
                case TexSymbolKind.Bowtie:
 
172
                    return "bowtie";
 
173
                case TexSymbolKind.Models:
 
174
                    return "models";
 
175
                case TexSymbolKind.Precedes:
 
176
                    return "prec";
 
177
                case TexSymbolKind.PrecedesOrEquals:
 
178
                    return "preceq";
 
179
                case TexSymbolKind.Succedes:
 
180
                    return "succ";
 
181
                case TexSymbolKind.SuccedesOrEquals:
 
182
                    return "succeq";
 
183
                case TexSymbolKind.Congruent:
 
184
                    return "cong";
 
185
                case TexSymbolKind.Similar:
 
186
                    return "sim";
 
187
                case TexSymbolKind.SimilarOrEquals:
 
188
                    return "simeq";
 
189
                case TexSymbolKind.Perpendicular:
 
190
                    return "perp";
 
191
                case TexSymbolKind.Middle:
 
192
                    return "mid";
 
193
                case TexSymbolKind.Subset:
 
194
                    return "subset";
 
195
                case TexSymbolKind.SubsetOrEqualTo:
 
196
                    return "subseteq";
 
197
                case TexSymbolKind.Superset:
 
198
                    return "supset";
 
199
                case TexSymbolKind.SupersetOrEqualTo:
 
200
                    return "supseteq";
 
201
                case TexSymbolKind.SquareSubset:
 
202
                    return "sqsubset";
 
203
                case TexSymbolKind.SquareSubsetOrEqualTo:
 
204
                    return "sqsubseteq";
 
205
                case TexSymbolKind.SquareSuperset:
 
206
                    return "sqsupset";
 
207
                case TexSymbolKind.SquareSupersetOrEqualTo:
 
208
                    return "sqsupseteq";
 
209
                case TexSymbolKind.Member:
 
210
                    return "in";
 
211
                case TexSymbolKind.NotMember:
 
212
                    return "nin";
 
213
                case TexSymbolKind.Contains:
 
214
                    return "ni";
 
215
                case TexSymbolKind.NotContains:
 
216
                    return "nni";
 
217
                case TexSymbolKind.Smile:
 
218
                    return "smile";
 
219
                case TexSymbolKind.Frown:
 
220
                    return "frown";
 
221
                case TexSymbolKind.VLineDash:
 
222
                    return "vdash";
 
223
                case TexSymbolKind.DashVLine:
 
224
                    return "dashv";
 
225
                #endregion
 
226
 
 
227
                #region Operators
 
228
                case TexSymbolKind.PlusMinus:
 
229
                    return "pm";
 
230
                case TexSymbolKind.MinusPlus:
 
231
                    return "mp";
 
232
                case TexSymbolKind.Cross:
 
233
                    return "times";
 
234
                case TexSymbolKind.Dot:
 
235
                    return "cdot";
 
236
                case TexSymbolKind.Divide:
 
237
                    return "div";
 
238
                case TexSymbolKind.Over:
 
239
                    return "over";
 
240
                #endregion
 
241
 
 
242
                #region Functions
 
243
                case TexSymbolKind.Fraction:
 
244
                    return "frac";
 
245
                case TexSymbolKind.Binomial:
 
246
                    return "binom";
 
247
                case TexSymbolKind.Root:
 
248
                    return "sqrt";
 
249
                case TexSymbolKind.Minimum:
 
250
                    return "min";
 
251
                case TexSymbolKind.Maximum:
 
252
                    return "max";
 
253
                case TexSymbolKind.GreatestCommonDenominator:
 
254
                    return "gcd";
 
255
                case TexSymbolKind.LowestCommonMultiple:
 
256
                    return "lcm";
 
257
                case TexSymbolKind.Exponent:
 
258
                    return "exp";
 
259
                case TexSymbolKind.Log:
 
260
                    return "log";
 
261
                case TexSymbolKind.NaturalLog:
 
262
                    return "ln";
 
263
                case TexSymbolKind.Argument:
 
264
                    return "arg";
 
265
                case TexSymbolKind.Limit:
 
266
                    return "lim";
 
267
                case TexSymbolKind.LimitInferior:
 
268
                    return "liminf";
 
269
                case TexSymbolKind.LimitSuperior:
 
270
                    return "limsup";
 
271
                case TexSymbolKind.Sine:
 
272
                    return "sin";
 
273
                case TexSymbolKind.Cosine:
 
274
                    return "cos";
 
275
                case TexSymbolKind.Tangent:
 
276
                    return "tan";
 
277
                case TexSymbolKind.Secant:
 
278
                    return "sec";
 
279
                case TexSymbolKind.Cosecant:
 
280
                    return "csc";
 
281
                case TexSymbolKind.Cotangent:
 
282
                    return "cot";
 
283
                case TexSymbolKind.ArcSine:
 
284
                    return "arcsin";
 
285
                case TexSymbolKind.ArcCosine:
 
286
                    return "arccos";
 
287
                case TexSymbolKind.ArcTangent:
 
288
                    return "arctan";
 
289
                case TexSymbolKind.ArcSecant:
 
290
                    return "arcsec";
 
291
                case TexSymbolKind.ArcCosecant:
 
292
                    return "arccsc";
 
293
                case TexSymbolKind.ArcCotangent:
 
294
                    return "arccot";
 
295
                case TexSymbolKind.HypSine:
 
296
                    return "sinh";
 
297
                case TexSymbolKind.HypCosine:
 
298
                    return "cosh";
 
299
                case TexSymbolKind.HypTangent:
 
300
                    return "tanh";
 
301
                case TexSymbolKind.HypSecant:
 
302
                    return "sech";
 
303
                case TexSymbolKind.HypCosecant:
 
304
                    return "csch";
 
305
                case TexSymbolKind.HypCotangent:
 
306
                    return "coth";
 
307
                case TexSymbolKind.ArHypSine:
 
308
                    return "arcsinh";
 
309
                case TexSymbolKind.ArHypCosine:
 
310
                    return "arccosh";
 
311
                case TexSymbolKind.ArHypTangent:
 
312
                    return "arctanh";
 
313
                case TexSymbolKind.ArHypSecant:
 
314
                    return "arcsech";
 
315
                case TexSymbolKind.ArHypCosecant:
 
316
                    return "arccsch";
 
317
                case TexSymbolKind.ArHypCotangent:
 
318
                    return "arccoth";
 
319
                case TexSymbolKind.InlineModulo:
 
320
                    return "bmod";
 
321
                case TexSymbolKind.IdentityModulo:
 
322
                    return "pmod";
 
323
                case TexSymbolKind.Sum:
 
324
                    return "sum";
 
325
                case TexSymbolKind.Product:
 
326
                    return "prod";
 
327
                case TexSymbolKind.Coproduct:
 
328
                    return "coprod";
 
329
                case TexSymbolKind.Integral:
 
330
                    return "int";
 
331
                case TexSymbolKind.DoubleIntegral:
 
332
                    return "iint";
 
333
                case TexSymbolKind.TripleIntegral:
 
334
                    return "iiint";
 
335
                case TexSymbolKind.QuadrupleIntegral:
 
336
                    return "iiiint";
 
337
                case TexSymbolKind.NtupleIntegral:
 
338
                    return "idotsint";
 
339
                case TexSymbolKind.ClosedIntegral:
 
340
                    return "oint";
 
341
                case TexSymbolKind.ClosedDoubleIntegral:
 
342
                    return "oiint";
 
343
                case TexSymbolKind.ClosedTripleIntegral:
 
344
                    return "oiiint";
 
345
                case TexSymbolKind.ClosedQuadrupleIntegral:
 
346
                    return "oiiiint";
 
347
                case TexSymbolKind.ClosedNtupleIntegral:
 
348
                    return "oidotsint";
 
349
                case TexSymbolKind.BigOPlus:
 
350
                    return "bigoplus";
 
351
                case TexSymbolKind.BigOTimes:
 
352
                    return "bigotimes";
 
353
                case TexSymbolKind.BigODot:
 
354
                    return "bigodot";
 
355
                case TexSymbolKind.BigCup:
 
356
                    return "bigcup";
 
357
                case TexSymbolKind.BigCap:
 
358
                    return "bigcap";
 
359
                case TexSymbolKind.BigCupPlus:
 
360
                    return "bigcupplus";
 
361
                case TexSymbolKind.BigSquareCup:
 
362
                    return "bigsqcup";
 
363
                case TexSymbolKind.BigSquareCap:
 
364
                    return "bigsqcap";
 
365
                case TexSymbolKind.BigVee:
 
366
                    return "bigveee";
 
367
                case TexSymbolKind.BigWedge:
 
368
                    return "bigwedge";
 
369
                #endregion
 
370
 
 
371
                #region Formatting
 
372
                case TexSymbolKind.Separator:
 
373
                    return ",";
 
374
                case TexSymbolKind.Left:
 
375
                    return "left";
 
376
                case TexSymbolKind.Right:
 
377
                    return "right";
 
378
                #endregion
 
379
 
 
380
                default:
 
381
                    return null;
 
382
            }
 
383
        }
 
384
    }
 
385
}