]> git.wincent.com - wikitext.git/blob - ext/wikitext_ragel.c
Fix tokenization of OL and UL symbols
[wikitext.git] / ext / wikitext_ragel.c
1 #line 1 "wikitext_ragel.rl"
2 // Copyright 2008 Wincent Colaiuta
3 // This program is free software: you can redistribute it and/or modify
4 // it under the terms of the GNU General Public License as published by
5 // the Free Software Foundation, either version 3 of the License, or
6 // (at your option) any later version.
7 //
8 // This program is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 // GNU General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
15
16 //----------------------------------------------------------------------//
17 // NOTE: wikitext_ragel.c is generated from wikitext_ragel.rl, so       //
18 //       if you make changes to the former they will be overwritten.    //
19 //       You should perform all your edits in wikitext_ragel.rl.        //
20 //----------------------------------------------------------------------//
21
22 #include "wikitext_ragel.h"
23 #include "wikitext.h"
24 #include <stdio.h>
25
26 #define EMIT(t)     do { out->type = t; out->stop = p + 1; out->column_stop += (out->stop - out->start); } while (0)
27 #define MARK()      do { mark = p; } while (0)
28 #define REWIND()    do { p = mark; } while (0)
29 #define AT_END()    (p + 1 == pe)
30 #define DISTANCE()  (p + 1 - ts)
31 #define NEXT_CHAR() (*(p + 1))
32
33
34 #line 35 "wikitext_ragel.c"
35 static const char _wikitext_actions[] = {
36         0, 1, 0, 1, 1, 1, 5, 1, 
37         6, 1, 7, 1, 10, 1, 11, 1, 
38         12, 1, 13, 1, 14, 1, 15, 1, 
39         16, 1, 17, 1, 18, 1, 19, 1, 
40         20, 1, 21, 1, 22, 1, 23, 1, 
41         24, 1, 25, 1, 26, 1, 27, 1, 
42         28, 1, 30, 1, 31, 1, 32, 1, 
43         33, 1, 34, 1, 35, 1, 36, 1, 
44         37, 1, 38, 1, 39, 1, 40, 1, 
45         41, 1, 42, 1, 43, 1, 44, 2, 
46         1, 29, 2, 2, 29, 2, 3, 29, 
47         2, 4, 29, 2, 7, 8, 2, 7, 
48         9, 2, 28, 1
49 };
50
51 static const short _wikitext_key_offsets[] = {
52         0, 0, 2, 4, 6, 8, 10, 12, 
53         16, 19, 25, 32, 39, 42, 50, 58, 
54         65, 73, 81, 89, 96, 100, 102, 104, 
55         106, 108, 110, 111, 113, 114, 116, 118, 
56         120, 122, 124, 125, 127, 128, 144, 177, 
57         178, 179, 194, 201, 202, 203, 204, 205, 
58         210, 212, 213, 214, 231, 248, 264, 280, 
59         296, 321, 337, 362, 379, 396, 413, 414
60 };
61
62 static const char _wikitext_trans_keys[] = {
63         -128, -65, -128, -65, -128, -65, -128, -65, 
64         -128, -65, -128, -65, 88, 120, 48, 57, 
65         59, 48, 57, 48, 57, 65, 70, 97, 
66         102, 59, 48, 57, 65, 70, 97, 102, 
67         59, 48, 57, 65, 90, 97, 122, 59, 
68         48, 57, 59, 109, 48, 57, 65, 90, 
69         97, 122, 59, 112, 48, 57, 65, 90, 
70         97, 122, 59, 48, 57, 65, 90, 97, 
71         122, 59, 117, 48, 57, 65, 90, 97, 
72         122, 59, 111, 48, 57, 65, 90, 97, 
73         122, 59, 116, 48, 57, 65, 90, 97, 
74         122, 59, 48, 57, 65, 90, 97, 122, 
75         78, 84, 110, 116, 79, 111, 87, 119, 
76         73, 105, 75, 107, 73, 105, 62, 84, 
77         116, 62, 79, 111, 87, 119, 73, 105, 
78         75, 107, 73, 105, 62, 84, 116, 62, 
79         33, 41, 44, 46, 61, 63, 95, 126, 
80         35, 57, 58, 59, 64, 90, 97, 122, 
81         10, 13, 32, 34, 35, 38, 39, 42, 
82         60, 61, 62, 70, 72, 83, 91, 93, 
83         96, 102, 104, 115, 124, 126, 127, -62, 
84         -33, -32, -17, -16, -12, 1, 31, 33, 
85         123, 10, 32, 33, 92, 126, 36, 37, 
86         40, 41, 43, 59, 63, 90, 94, 95, 
87         97, 123, 35, 97, 113, 65, 90, 98, 
88         122, 39, 39, 39, 39, 47, 78, 84, 
89         110, 116, 32, 61, 32, 32, 33, 84, 
90         92, 116, 126, 36, 37, 40, 41, 43, 
91         59, 63, 90, 94, 95, 97, 123, 33, 
92         80, 92, 112, 126, 36, 37, 40, 41, 
93         43, 59, 63, 90, 94, 95, 97, 123, 
94         33, 58, 92, 126, 36, 37, 40, 41, 
95         43, 59, 63, 90, 94, 95, 97, 123, 
96         33, 47, 92, 126, 36, 37, 40, 41, 
97         43, 59, 63, 90, 94, 95, 97, 123, 
98         33, 47, 92, 126, 36, 37, 40, 41, 
99         43, 59, 63, 90, 94, 95, 97, 123, 
100         33, 35, 40, 41, 44, 46, 61, 63, 
101         92, 94, 95, 123, 126, 36, 37, 38, 
102         42, 43, 57, 58, 59, 64, 90, 97, 
103         122, 33, 41, 44, 46, 61, 63, 95, 
104         126, 35, 57, 58, 59, 64, 90, 97, 
105         122, 33, 35, 40, 41, 44, 46, 61, 
106         63, 92, 94, 95, 123, 126, 36, 37, 
107         38, 42, 43, 57, 58, 59, 64, 90, 
108         97, 122, 33, 84, 92, 116, 126, 36, 
109         37, 40, 41, 43, 59, 63, 90, 94, 
110         95, 97, 123, 33, 86, 92, 118, 126, 
111         36, 37, 40, 41, 43, 59, 63, 90, 
112         94, 95, 97, 123, 33, 78, 92, 110, 
113         126, 36, 37, 40, 41, 43, 59, 63, 
114         90, 94, 95, 97, 123, 91, 93, 0
115 };
116
117 static const char _wikitext_single_lengths[] = {
118         0, 0, 0, 0, 0, 0, 0, 2, 
119         1, 0, 1, 1, 1, 2, 2, 1, 
120         2, 2, 2, 1, 4, 2, 2, 2, 
121         2, 2, 1, 2, 1, 2, 2, 2, 
122         2, 2, 1, 2, 1, 8, 23, 1, 
123         1, 3, 3, 1, 1, 1, 1, 5, 
124         2, 1, 1, 5, 5, 4, 4, 4, 
125         13, 8, 13, 5, 5, 5, 1, 1
126 };
127
128 static const char _wikitext_range_lengths[] = {
129         0, 1, 1, 1, 1, 1, 1, 1, 
130         1, 3, 3, 3, 1, 3, 3, 3, 
131         3, 3, 3, 3, 0, 0, 0, 0, 
132         0, 0, 0, 0, 0, 0, 0, 0, 
133         0, 0, 0, 0, 0, 4, 5, 0, 
134         0, 6, 2, 0, 0, 0, 0, 0, 
135         0, 0, 0, 6, 6, 6, 6, 6, 
136         6, 4, 6, 6, 6, 6, 0, 0
137 };
138
139 static const short _wikitext_index_offsets[] = {
140         0, 0, 2, 4, 6, 8, 10, 12, 
141         16, 19, 23, 28, 33, 36, 42, 48, 
142         53, 59, 65, 71, 76, 81, 84, 87, 
143         90, 93, 96, 98, 101, 103, 106, 109, 
144         112, 115, 118, 120, 123, 125, 138, 167, 
145         169, 171, 181, 187, 189, 191, 193, 195, 
146         201, 204, 206, 208, 220, 232, 243, 254, 
147         265, 285, 298, 318, 330, 342, 354, 356
148 };
149
150 static const char _wikitext_indicies[] = {
151         0, 1, 2, 1, 3, 1, 4, 1, 
152         5, 1, 6, 1, 9, 9, 8, 7, 
153         10, 8, 7, 11, 11, 11, 7, 12, 
154         11, 11, 11, 7, 14, 13, 15, 15, 
155         7, 14, 13, 7, 14, 16, 13, 15, 
156         15, 7, 14, 17, 13, 15, 15, 7, 
157         18, 13, 15, 15, 7, 14, 19, 13, 
158         15, 15, 7, 14, 20, 13, 15, 15, 
159         7, 14, 21, 13, 15, 15, 7, 22, 
160         13, 15, 15, 7, 24, 25, 24, 25, 
161         23, 26, 26, 23, 27, 27, 23, 28, 
162         28, 23, 29, 29, 23, 30, 30, 23, 
163         31, 23, 32, 32, 23, 33, 23, 34, 
164         34, 23, 35, 35, 23, 36, 36, 23, 
165         37, 37, 23, 38, 38, 23, 39, 23, 
166         40, 40, 23, 41, 23, 43, 43, 43, 
167         43, 44, 43, 44, 44, 44, 43, 44, 
168         44, 42, 49, 50, 51, 53, 54, 55, 
169         56, 57, 58, 59, 60, 61, 62, 63, 
170         64, 65, 66, 61, 62, 63, 67, 52, 
171         48, 45, 46, 47, 48, 52, 1, 69, 
172         68, 71, 70, 52, 52, 52, 52, 52, 
173         52, 52, 52, 52, 72, 74, 75, 76, 
174         15, 15, 73, 78, 77, 79, 77, 80, 
175         77, 81, 77, 83, 84, 85, 84, 85, 
176         82, 87, 59, 86, 87, 86, 89, 88, 
177         52, 90, 52, 90, 52, 52, 52, 52, 
178         52, 52, 52, 72, 52, 91, 52, 91, 
179         52, 52, 52, 52, 52, 52, 52, 72, 
180         52, 92, 52, 52, 52, 52, 52, 52, 
181         52, 52, 72, 52, 93, 52, 52, 52, 
182         52, 52, 52, 52, 52, 72, 52, 94, 
183         52, 52, 52, 52, 52, 52, 52, 52, 
184         72, 52, 44, 95, 52, 52, 52, 44, 
185         52, 52, 52, 95, 52, 95, 95, 44, 
186         95, 52, 95, 95, 72, 43, 43, 43, 
187         43, 44, 43, 44, 44, 44, 43, 44, 
188         44, 96, 98, 44, 95, 98, 98, 98, 
189         44, 98, 52, 52, 95, 52, 95, 95, 
190         44, 95, 98, 95, 95, 97, 52, 61, 
191         52, 61, 52, 52, 52, 52, 52, 52, 
192         52, 72, 52, 99, 52, 99, 52, 52, 
193         52, 52, 52, 52, 52, 72, 52, 91, 
194         52, 91, 52, 52, 52, 52, 52, 52, 
195         52, 72, 101, 100, 103, 102, 0
196 };
197
198 static const char _wikitext_trans_targs_wi[] = {
199         38, 0, 3, 38, 5, 6, 38, 38, 
200         8, 9, 38, 10, 38, 12, 38, 11, 
201         14, 15, 38, 17, 18, 19, 38, 38, 
202         21, 27, 22, 23, 24, 25, 26, 38, 
203         28, 38, 30, 31, 32, 33, 34, 38, 
204         36, 38, 38, 37, 57, 1, 2, 4, 
205         38, 38, 39, 40, 41, 38, 38, 42, 
206         43, 38, 47, 48, 50, 51, 59, 60, 
207         62, 63, 38, 38, 38, 38, 38, 40, 
208         38, 38, 7, 13, 16, 38, 44, 45, 
209         46, 38, 38, 20, 29, 35, 38, 49, 
210         38, 38, 52, 53, 54, 55, 56, 58, 
211         38, 38, 58, 61, 38, 38, 38, 38
212 };
213
214 static const char _wikitext_trans_actions_wi[] = {
215         82, 0, 0, 85, 0, 0, 88, 73, 
216         0, 0, 43, 0, 41, 0, 39, 0, 
217         0, 0, 37, 0, 0, 0, 35, 75, 
218         0, 0, 0, 0, 0, 0, 0, 13, 
219         0, 21, 0, 0, 0, 0, 0, 11, 
220         0, 19, 71, 0, 9, 0, 0, 0, 
221         79, 97, 3, 1, 0, 45, 25, 9, 
222         0, 27, 9, 1, 1, 0, 0, 0, 
223         0, 0, 17, 33, 67, 47, 53, 0, 
224         69, 63, 0, 0, 0, 49, 0, 0, 
225         0, 15, 65, 0, 0, 0, 55, 0, 
226         51, 23, 0, 0, 0, 0, 0, 91, 
227         57, 77, 94, 0, 59, 29, 61, 31
228 };
229
230 static const char _wikitext_to_state_actions[] = {
231         0, 0, 0, 0, 0, 0, 0, 0, 
232         0, 0, 0, 0, 0, 0, 0, 0, 
233         0, 0, 0, 0, 0, 0, 0, 0, 
234         0, 0, 0, 0, 0, 0, 0, 0, 
235         0, 0, 0, 0, 0, 0, 5, 0, 
236         0, 0, 0, 0, 0, 0, 0, 0, 
237         0, 0, 0, 0, 0, 0, 0, 0, 
238         0, 0, 0, 0, 0, 0, 0, 0
239 };
240
241 static const char _wikitext_from_state_actions[] = {
242         0, 0, 0, 0, 0, 0, 0, 0, 
243         0, 0, 0, 0, 0, 0, 0, 0, 
244         0, 0, 0, 0, 0, 0, 0, 0, 
245         0, 0, 0, 0, 0, 0, 0, 0, 
246         0, 0, 0, 0, 0, 0, 7, 0, 
247         0, 0, 0, 0, 0, 0, 0, 0, 
248         0, 0, 0, 0, 0, 0, 0, 0, 
249         0, 0, 0, 0, 0, 0, 0, 0
250 };
251
252 static const char _wikitext_eof_trans[] = {
253         0, 0, 0, 0, 0, 0, 0, 8, 
254         8, 8, 8, 8, 8, 8, 8, 8, 
255         8, 8, 8, 8, 24, 24, 24, 24, 
256         24, 24, 24, 24, 24, 24, 24, 24, 
257         24, 24, 24, 24, 24, 43, 0, 69, 
258         71, 73, 74, 78, 78, 78, 78, 83, 
259         87, 87, 89, 73, 73, 73, 73, 73, 
260         73, 97, 98, 73, 73, 73, 101, 103
261 };
262
263 static const int wikitext_start = 38;
264 static const int wikitext_first_final = 38;
265 static const int wikitext_error = 0;
266
267 static const int wikitext_en_main = 38;
268
269 #line 349 "wikitext_ragel.rl"
270
271
272 // for now we use the scanner as a tokenizer that returns one token at a time, just like ANTLR
273 // ultimately we could look at embedding all of the transformation inside the scanner itself (combined scanner/parser)
274 // pass in the last token because that's useful for the scanner to know
275 // p data pointer (required by Ragel machine); overriden with contents of last_token if supplied
276 // pe data end pointer (required by Ragel machine)
277 void next_token(token_t *out, token_t *last_token, char *p, char *pe)
278 {
279     int last_token_type = NO_TOKEN;
280     if (last_token)
281     {
282         last_token_type     = last_token->type;
283         p = last_token->stop;
284         out->line_start     = out->line_stop    = last_token->line_stop;
285         out->column_start   = out->column_stop  = last_token->column_stop;
286     }
287     else
288     {
289         out->line_start     = 1;
290         out->column_start   = 1;
291         out->line_stop      = 1;
292         out->column_stop    = 1;
293     }
294     out->type       = NO_TOKEN;
295     out->code_point = 0;
296     out->start      = p;
297     if (p == pe)
298     {
299         // all done, have reached end of input
300         out->stop  = p;
301         out->type  = END_OF_FILE;
302         return;
303     }
304
305     char    *mark;      // for manual backtracking
306     char    *eof = pe;  // required for backtracking (longest match determination)
307     int     cs;         // current state (standard Ragel)
308     char    *ts;        // token start (scanner)
309     char    *te;        // token end (scanner)
310     int     act;        // identity of last patterned matched (scanner)
311     
312 #line 313 "wikitext_ragel.c"
313         {
314         cs = wikitext_start;
315         ts = 0;
316         te = 0;
317         act = 0;
318         }
319 #line 391 "wikitext_ragel.rl"
320     
321 #line 322 "wikitext_ragel.c"
322         {
323         int _klen;
324         unsigned int _trans;
325         const char *_acts;
326         unsigned int _nacts;
327         const char *_keys;
328
329         if ( p == pe )
330                 goto _test_eof;
331         if ( cs == 0 )
332                 goto _out;
333 _resume:
334         _acts = _wikitext_actions + _wikitext_from_state_actions[cs];
335         _nacts = (unsigned int) *_acts++;
336         while ( _nacts-- > 0 ) {
337                 switch ( *_acts++ ) {
338         case 6:
339 #line 1 "wikitext_ragel.rl"
340         {ts = p;}
341         break;
342 #line 343 "wikitext_ragel.c"
343                 }
344         }
345
346         _keys = _wikitext_trans_keys + _wikitext_key_offsets[cs];
347         _trans = _wikitext_index_offsets[cs];
348
349         _klen = _wikitext_single_lengths[cs];
350         if ( _klen > 0 ) {
351                 const char *_lower = _keys;
352                 const char *_mid;
353                 const char *_upper = _keys + _klen - 1;
354                 while (1) {
355                         if ( _upper < _lower )
356                                 break;
357
358                         _mid = _lower + ((_upper-_lower) >> 1);
359                         if ( (*p) < *_mid )
360                                 _upper = _mid - 1;
361                         else if ( (*p) > *_mid )
362                                 _lower = _mid + 1;
363                         else {
364                                 _trans += (_mid - _keys);
365                                 goto _match;
366                         }
367                 }
368                 _keys += _klen;
369                 _trans += _klen;
370         }
371
372         _klen = _wikitext_range_lengths[cs];
373         if ( _klen > 0 ) {
374                 const char *_lower = _keys;
375                 const char *_mid;
376                 const char *_upper = _keys + (_klen<<1) - 2;
377                 while (1) {
378                         if ( _upper < _lower )
379                                 break;
380
381                         _mid = _lower + (((_upper-_lower) >> 1) & ~1);
382                         if ( (*p) < _mid[0] )
383                                 _upper = _mid - 2;
384                         else if ( (*p) > _mid[1] )
385                                 _lower = _mid + 2;
386                         else {
387                                 _trans += ((_mid - _keys)>>1);
388                                 goto _match;
389                         }
390                 }
391                 _trans += _klen;
392         }
393
394 _match:
395         _trans = _wikitext_indicies[_trans];
396 _eof_trans:
397         cs = _wikitext_trans_targs_wi[_trans];
398
399         if ( _wikitext_trans_actions_wi[_trans] == 0 )
400                 goto _again;
401
402         _acts = _wikitext_actions + _wikitext_trans_actions_wi[_trans];
403         _nacts = (unsigned int) *_acts++;
404         while ( _nacts-- > 0 )
405         {
406                 switch ( *_acts++ )
407                 {
408         case 0:
409 #line 36 "wikitext_ragel.rl"
410         {
411         MARK();
412     }
413         break;
414         case 1:
415 #line 41 "wikitext_ragel.rl"
416         {
417         out->code_point = *p & 0x7f;
418     }
419         break;
420         case 2:
421 #line 46 "wikitext_ragel.rl"
422         {
423         out->code_point = ((uint32_t)(*(p - 1)) & 0x1f) << 6 |
424             (*p & 0x3f);
425     }
426         break;
427         case 3:
428 #line 52 "wikitext_ragel.rl"
429         {
430         out->code_point = ((uint32_t)(*(p - 2)) & 0x0f) << 12 |
431             ((uint32_t)(*(p - 1)) & 0x3f) << 6 |
432             (*p & 0x3f);
433     }
434         break;
435         case 4:
436 #line 59 "wikitext_ragel.rl"
437         {
438         out->code_point = ((uint32_t)(*(p - 3)) & 0x07) << 18 |
439             ((uint32_t)(*(p - 2)) & 0x3f) << 12 |
440             ((uint32_t)(*(p - 1)) & 0x3f) << 6 |
441             (*p & 0x3f);
442     }
443         break;
444         case 7:
445 #line 1 "wikitext_ragel.rl"
446         {te = p+1;}
447         break;
448         case 8:
449 #line 218 "wikitext_ragel.rl"
450         {act = 12;}
451         break;
452         case 9:
453 #line 320 "wikitext_ragel.rl"
454         {act = 28;}
455         break;
456         case 10:
457 #line 73 "wikitext_ragel.rl"
458         {te = p+1;{
459             EMIT(NO_WIKI_START);
460             {p++; goto _out; }
461         }}
462         break;
463         case 11:
464 #line 79 "wikitext_ragel.rl"
465         {te = p+1;{
466             EMIT(NO_WIKI_END);
467             {p++; goto _out; }
468         }}
469         break;
470         case 12:
471 #line 85 "wikitext_ragel.rl"
472         {te = p+1;{
473             if (DISTANCE() == 5)
474                 EMIT(STRONG_EM);
475             else if (DISTANCE() == 4)
476             {
477                 p--;
478                 EMIT(STRONG_EM);
479             }
480             else if (DISTANCE() == 3)
481                 EMIT(STRONG);
482             else if (DISTANCE() == 2)
483                 EMIT(EM);
484             else
485                 EMIT(PRINTABLE);
486             {p++; goto _out; }
487         }}
488         break;
489         case 13:
490 #line 103 "wikitext_ragel.rl"
491         {te = p+1;{
492             EMIT(TT);
493             {p++; goto _out; }
494         }}
495         break;
496         case 14:
497 #line 109 "wikitext_ragel.rl"
498         {te = p+1;{
499             EMIT(TT_START);
500             {p++; goto _out; }
501         }}
502         break;
503         case 15:
504 #line 115 "wikitext_ragel.rl"
505         {te = p+1;{
506             EMIT(TT_END);
507             {p++; goto _out; }
508         }}
509         break;
510         case 16:
511 #line 122 "wikitext_ragel.rl"
512         {te = p+1;{
513             if (out->column_start == 1 || last_token_type == BLOCKQUOTE)
514                 EMIT(BLOCKQUOTE);
515             else
516             {
517                 REWIND();
518                 EMIT(GREATER);
519             }
520             {p++; goto _out; }
521         }}
522         break;
523         case 17:
524 #line 148 "wikitext_ragel.rl"
525         {te = p+1;{
526             if (out->column_start == 1 || last_token_type == OL || last_token_type == UL || last_token_type == BLOCKQUOTE)
527                 EMIT(OL);
528             else
529                 EMIT(PRINTABLE);
530             {p++; goto _out; }
531         }}
532         break;
533         case 18:
534 #line 157 "wikitext_ragel.rl"
535         {te = p+1;{
536             if (out->column_start == 1 || last_token_type == OL || last_token_type == UL || last_token_type == BLOCKQUOTE)
537                 EMIT(UL);
538             else
539                 EMIT(PRINTABLE);
540             {p++; goto _out; }
541         }}
542         break;
543         case 19:
544 #line 224 "wikitext_ragel.rl"
545         {te = p+1;{
546             EMIT(LINK_START);
547             {p++; goto _out; }
548         }}
549         break;
550         case 20:
551 #line 230 "wikitext_ragel.rl"
552         {te = p+1;{
553             EMIT(LINK_END);
554             {p++; goto _out; }
555         }}
556         break;
557         case 21:
558 #line 236 "wikitext_ragel.rl"
559         {te = p+1;{
560             EMIT(SEPARATOR);
561             {p++; goto _out; }
562         }}
563         break;
564         case 22:
565 #line 254 "wikitext_ragel.rl"
566         {te = p+1;{
567             EMIT(QUOT_ENTITY);
568             {p++; goto _out; }
569         }}
570         break;
571         case 23:
572 #line 260 "wikitext_ragel.rl"
573         {te = p+1;{
574             EMIT(AMP_ENTITY);
575             {p++; goto _out; }
576         }}
577         break;
578         case 24:
579 #line 266 "wikitext_ragel.rl"
580         {te = p+1;{
581             EMIT(NAMED_ENTITY);
582             {p++; goto _out; }
583         }}
584         break;
585         case 25:
586 #line 272 "wikitext_ragel.rl"
587         {te = p+1;{
588             EMIT(HEX_ENTITY);
589             {p++; goto _out; }
590         }}
591         break;
592         case 26:
593 #line 278 "wikitext_ragel.rl"
594         {te = p+1;{
595             EMIT(DECIMAL_ENTITY);
596             {p++; goto _out; }
597         }}
598         break;
599         case 27:
600 #line 284 "wikitext_ragel.rl"
601         {te = p+1;{
602             EMIT(QUOT);
603             {p++; goto _out; }
604         }}
605         break;
606         case 28:
607 #line 308 "wikitext_ragel.rl"
608         {te = p+1;{
609             EMIT(CRLF);
610             out->column_stop = 1;
611             out->line_stop++;
612             {p++; goto _out; }
613         }}
614         break;
615         case 29:
616 #line 340 "wikitext_ragel.rl"
617         {te = p+1;{
618             EMIT(DEFAULT);
619             out->column_stop = out->column_start + 1;
620             {p++; goto _out; }
621         }}
622         break;
623         case 30:
624 #line 85 "wikitext_ragel.rl"
625         {te = p;p--;{
626             if (DISTANCE() == 5)
627                 EMIT(STRONG_EM);
628             else if (DISTANCE() == 4)
629             {
630                 p--;
631                 EMIT(STRONG_EM);
632             }
633             else if (DISTANCE() == 3)
634                 EMIT(STRONG);
635             else if (DISTANCE() == 2)
636                 EMIT(EM);
637             else
638                 EMIT(PRINTABLE);
639             {p++; goto _out; }
640         }}
641         break;
642         case 31:
643 #line 122 "wikitext_ragel.rl"
644         {te = p;p--;{
645             if (out->column_start == 1 || last_token_type == BLOCKQUOTE)
646                 EMIT(BLOCKQUOTE);
647             else
648             {
649                 REWIND();
650                 EMIT(GREATER);
651             }
652             {p++; goto _out; }
653         }}
654         break;
655         case 32:
656 #line 136 "wikitext_ragel.rl"
657         {te = p;p--;{
658             if (out->column_start == 1 || last_token_type == BLOCKQUOTE)
659             {
660                 REWIND();
661                 EMIT(PRE);
662             }
663             else
664                 EMIT(SPACE);
665             {p++; goto _out; }
666         }}
667         break;
668         case 33:
669 #line 166 "wikitext_ragel.rl"
670         {te = p;p--;{
671             if (out->column_start == 1 || last_token_type == BLOCKQUOTE)
672             {
673                 REWIND();
674                 if (DISTANCE() == 1)
675                     EMIT(H1_START);
676                 else if (DISTANCE() == 2)
677                     EMIT(H2_START);
678                 else if (DISTANCE() == 3)
679                     EMIT(H3_START);
680                 else if (DISTANCE() == 4)
681                     EMIT(H4_START);
682                 else if (DISTANCE() == 5)
683                     EMIT(H5_START);
684                 else if (DISTANCE() == 6)
685                     EMIT(H6_START);
686                 else if (DISTANCE() > 6)
687                 {
688                     p = ts + 6;
689                     EMIT(H6_START);
690                 }
691             }
692             else if (AT_END() || NEXT_CHAR() == '\n' || NEXT_CHAR() == '\r')
693             {
694                 REWIND();
695                 if (DISTANCE() == 1)
696                     EMIT(H1_END);
697                 else if (DISTANCE() == 2)
698                     EMIT(H2_END);
699                 else if (DISTANCE() == 3)
700                     EMIT(H3_END);
701                 else if (DISTANCE() == 4)
702                     EMIT(H4_END);
703                 else if (DISTANCE() == 5)
704                     EMIT(H5_END);
705                 else if (DISTANCE() == 6)
706                     EMIT(H6_END);
707                 else if (DISTANCE() > 6)
708                 {
709                     p -= 6; // will scan the H6 on the next scan
710                     EMIT(PRINTABLE);
711                 }
712             }
713             else
714             {
715                 REWIND();
716                 EMIT(PRINTABLE);
717             }
718             {p++; goto _out; }
719         }}
720         break;
721         case 34:
722 #line 218 "wikitext_ragel.rl"
723         {te = p;p--;{
724             EMIT(URI);
725             {p++; goto _out; }
726         }}
727         break;
728         case 35:
729 #line 242 "wikitext_ragel.rl"
730         {te = p;p--;{
731             EMIT(EXT_LINK_START);
732             {p++; goto _out; }
733         }}
734         break;
735         case 36:
736 #line 248 "wikitext_ragel.rl"
737         {te = p;p--;{
738             EMIT(EXT_LINK_END);
739             {p++; goto _out; }
740         }}
741         break;
742         case 37:
743 #line 290 "wikitext_ragel.rl"
744         {te = p;p--;{
745             EMIT(AMP);
746             {p++; goto _out; }
747         }}
748         break;
749         case 38:
750 #line 296 "wikitext_ragel.rl"
751         {te = p;p--;{
752             EMIT(LESS);
753             {p++; goto _out; }
754         }}
755         break;
756         case 39:
757 #line 308 "wikitext_ragel.rl"
758         {te = p;p--;{
759             EMIT(CRLF);
760             out->column_stop = 1;
761             out->line_stop++;
762             {p++; goto _out; }
763         }}
764         break;
765         case 40:
766 #line 320 "wikitext_ragel.rl"
767         {te = p;p--;{
768             EMIT(PRINTABLE);
769             {p++; goto _out; }
770         }}
771         break;
772         case 41:
773 #line 218 "wikitext_ragel.rl"
774         {{p = ((te))-1;}{
775             EMIT(URI);
776             {p++; goto _out; }
777         }}
778         break;
779         case 42:
780 #line 290 "wikitext_ragel.rl"
781         {{p = ((te))-1;}{
782             EMIT(AMP);
783             {p++; goto _out; }
784         }}
785         break;
786         case 43:
787 #line 296 "wikitext_ragel.rl"
788         {{p = ((te))-1;}{
789             EMIT(LESS);
790             {p++; goto _out; }
791         }}
792         break;
793         case 44:
794 #line 1 "wikitext_ragel.rl"
795         {       switch( act ) {
796         case 12:
797         {{p = ((te))-1;}
798             EMIT(URI);
799             {p++; goto _out; }
800         }
801         break;
802         case 28:
803         {{p = ((te))-1;}
804             EMIT(PRINTABLE);
805             {p++; goto _out; }
806         }
807         break;
808         default: break;
809         }
810         }
811         break;
812 #line 813 "wikitext_ragel.c"
813                 }
814         }
815
816 _again:
817         _acts = _wikitext_actions + _wikitext_to_state_actions[cs];
818         _nacts = (unsigned int) *_acts++;
819         while ( _nacts-- > 0 ) {
820                 switch ( *_acts++ ) {
821         case 5:
822 #line 1 "wikitext_ragel.rl"
823         {ts = 0;}
824         break;
825 #line 826 "wikitext_ragel.c"
826                 }
827         }
828
829         if ( cs == 0 )
830                 goto _out;
831         if ( ++p != pe )
832                 goto _resume;
833         _test_eof: {}
834         if ( p == eof )
835         {
836         if ( _wikitext_eof_trans[cs] > 0 ) {
837                 _trans = _wikitext_eof_trans[cs] - 1;
838                 goto _eof_trans;
839         }
840         }
841
842         _out: {}
843         }
844 #line 392 "wikitext_ragel.rl"
845     if (cs == wikitext_error)
846         rb_raise(eWikitextParserError, "failed before finding a token");
847     else if (out->type == NO_TOKEN)
848         rb_raise(eWikitextParserError, "failed to produce a token");
849 }