]> git.wincent.com - wikitext.git/commitdiff
Build Ragel scanner with -G2 switch
authorWincent Colaiuta <win@wincent.com>
Tue, 5 Feb 2008 01:21:46 +0000 (02:21 +0100)
committerWincent Colaiuta <win@wincent.com>
Tue, 5 Feb 2008 01:21:46 +0000 (02:21 +0100)
At the recommendation of Adrian Thurston I tried using the -G2 switch to
turn on the "really fast goto-driven FSM" code generation style (as
opposed to the default table-driven one).

The tokenizer saw a four-fold speed increase (making it almost 38 times
faster than ANTLR instead of just 10 times). As a flow-on effect, this
reduces the total parse time by about 15%, and there is still plenty of
scope for optimization in the parser itself.

Signed-off-by: Wincent Colaiuta <win@wincent.com>
Rakefile
benchmarks/NOTES.txt
ext/wikitext_ragel.c

index f3ad181b59ccb01e96dff2d2818c131bcdcf2cc9..6eeff6e8ffe263b9902ca4db28f965d301bb2be5 100644 (file)
--- a/Rakefile
+++ b/Rakefile
@@ -49,7 +49,7 @@ file ragel => ['ext/wikitext_ragel.rl'] do
   Dir.chdir('ext') do
     # pass the -s switch here because otherwise Ragel is totally silent
     # I like to have visual confirmation that it's actually run
-    sh 'ragel -s wikitext_ragel.rl'
+    sh 'ragel -G2 -s wikitext_ragel.rl'
   end
 end
 
index ad47d8783b0dd81d8e8dee7ba3614f22b9a22254..45bcb9b05dc821ada9a019fc0e5ad825a5857a6d 100644 (file)
@@ -19,3 +19,8 @@ After adding custom C replacement for Ruby Array class:
   Biggest drain is st_init_strtable (42%), something to do with string
   followed by 14% for rb_str_append
   (next_token function now up to 22%)
+
+After speeding up Ragel scanner with -G2 switch:
+
+  short slab of ASCII text    2.870000   0.000000   2.870000 (  2.929794)
+  short slab of UTF-8 text    5.390000   0.010000   5.400000 (  5.399399)
index 5e32277b9f76e3a7e6df4706a0a0c7fdc1cb4845..9d0e8c44da34279903b7c54b8ed4e79e516cdab8 100644 (file)
 
 
 #line 35 "wikitext_ragel.c"
-static const char _wikitext_actions[] = {
-       0, 1, 0, 1, 1, 1, 5, 1, 
-       6, 1, 7, 1, 10, 1, 11, 1, 
-       12, 1, 13, 1, 14, 1, 15, 1, 
-       16, 1, 17, 1, 18, 1, 19, 1, 
-       20, 1, 21, 1, 22, 1, 23, 1, 
-       24, 1, 25, 1, 26, 1, 27, 1, 
-       28, 1, 30, 1, 31, 1, 32, 1, 
-       33, 1, 34, 1, 35, 1, 36, 1, 
-       37, 1, 38, 1, 39, 1, 40, 1, 
-       41, 1, 42, 1, 43, 1, 44, 2, 
-       1, 29, 2, 2, 29, 2, 3, 29, 
-       2, 4, 29, 2, 7, 8, 2, 7, 
-       9, 2, 28, 1
-};
-
-static const short _wikitext_key_offsets[] = {
-       0, 0, 2, 4, 6, 8, 10, 12, 
-       16, 19, 25, 32, 39, 42, 50, 58, 
-       65, 73, 81, 89, 96, 100, 102, 104, 
-       106, 108, 110, 111, 113, 114, 116, 118, 
-       120, 122, 124, 125, 127, 128, 144, 177, 
-       178, 179, 194, 201, 202, 203, 204, 205, 
-       210, 212, 213, 214, 231, 248, 264, 280, 
-       296, 321, 337, 362, 379, 396, 413, 414
-};
-
-static const char _wikitext_trans_keys[] = {
-       -128, -65, -128, -65, -128, -65, -128, -65, 
-       -128, -65, -128, -65, 88, 120, 48, 57, 
-       59, 48, 57, 48, 57, 65, 70, 97, 
-       102, 59, 48, 57, 65, 70, 97, 102, 
-       59, 48, 57, 65, 90, 97, 122, 59, 
-       48, 57, 59, 109, 48, 57, 65, 90, 
-       97, 122, 59, 112, 48, 57, 65, 90, 
-       97, 122, 59, 48, 57, 65, 90, 97, 
-       122, 59, 117, 48, 57, 65, 90, 97, 
-       122, 59, 111, 48, 57, 65, 90, 97, 
-       122, 59, 116, 48, 57, 65, 90, 97, 
-       122, 59, 48, 57, 65, 90, 97, 122, 
-       78, 84, 110, 116, 79, 111, 87, 119, 
-       73, 105, 75, 107, 73, 105, 62, 84, 
-       116, 62, 79, 111, 87, 119, 73, 105, 
-       75, 107, 73, 105, 62, 84, 116, 62, 
-       33, 41, 44, 46, 61, 63, 95, 126, 
-       35, 57, 58, 59, 64, 90, 97, 122, 
-       10, 13, 32, 34, 35, 38, 39, 42, 
-       60, 61, 62, 70, 72, 83, 91, 93, 
-       96, 102, 104, 115, 124, 126, 127, -62, 
-       -33, -32, -17, -16, -12, 1, 31, 33, 
-       123, 10, 32, 33, 92, 126, 36, 37, 
-       40, 41, 43, 59, 63, 90, 94, 95, 
-       97, 123, 35, 97, 113, 65, 90, 98, 
-       122, 39, 39, 39, 39, 47, 78, 84, 
-       110, 116, 32, 61, 32, 32, 33, 84, 
-       92, 116, 126, 36, 37, 40, 41, 43, 
-       59, 63, 90, 94, 95, 97, 123, 33, 
-       80, 92, 112, 126, 36, 37, 40, 41, 
-       43, 59, 63, 90, 94, 95, 97, 123, 
-       33, 58, 92, 126, 36, 37, 40, 41, 
-       43, 59, 63, 90, 94, 95, 97, 123, 
-       33, 47, 92, 126, 36, 37, 40, 41, 
-       43, 59, 63, 90, 94, 95, 97, 123, 
-       33, 47, 92, 126, 36, 37, 40, 41, 
-       43, 59, 63, 90, 94, 95, 97, 123, 
-       33, 35, 40, 41, 44, 46, 61, 63, 
-       92, 94, 95, 123, 126, 36, 37, 38, 
-       42, 43, 57, 58, 59, 64, 90, 97, 
-       122, 33, 41, 44, 46, 61, 63, 95, 
-       126, 35, 57, 58, 59, 64, 90, 97, 
-       122, 33, 35, 40, 41, 44, 46, 61, 
-       63, 92, 94, 95, 123, 126, 36, 37, 
-       38, 42, 43, 57, 58, 59, 64, 90, 
-       97, 122, 33, 84, 92, 116, 126, 36, 
-       37, 40, 41, 43, 59, 63, 90, 94, 
-       95, 97, 123, 33, 86, 92, 118, 126, 
-       36, 37, 40, 41, 43, 59, 63, 90, 
-       94, 95, 97, 123, 33, 78, 92, 110, 
-       126, 36, 37, 40, 41, 43, 59, 63, 
-       90, 94, 95, 97, 123, 91, 93, 0
-};
-
-static const char _wikitext_single_lengths[] = {
-       0, 0, 0, 0, 0, 0, 0, 2, 
-       1, 0, 1, 1, 1, 2, 2, 1, 
-       2, 2, 2, 1, 4, 2, 2, 2, 
-       2, 2, 1, 2, 1, 2, 2, 2, 
-       2, 2, 1, 2, 1, 8, 23, 1, 
-       1, 3, 3, 1, 1, 1, 1, 5, 
-       2, 1, 1, 5, 5, 4, 4, 4, 
-       13, 8, 13, 5, 5, 5, 1, 1
-};
-
-static const char _wikitext_range_lengths[] = {
-       0, 1, 1, 1, 1, 1, 1, 1, 
-       1, 3, 3, 3, 1, 3, 3, 3, 
-       3, 3, 3, 3, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 4, 5, 0, 
-       0, 6, 2, 0, 0, 0, 0, 0, 
-       0, 0, 0, 6, 6, 6, 6, 6, 
-       6, 4, 6, 6, 6, 6, 0, 0
-};
-
-static const short _wikitext_index_offsets[] = {
-       0, 0, 2, 4, 6, 8, 10, 12, 
-       16, 19, 23, 28, 33, 36, 42, 48, 
-       53, 59, 65, 71, 76, 81, 84, 87, 
-       90, 93, 96, 98, 101, 103, 106, 109, 
-       112, 115, 118, 120, 123, 125, 138, 167, 
-       169, 171, 181, 187, 189, 191, 193, 195, 
-       201, 204, 206, 208, 220, 232, 243, 254, 
-       265, 285, 298, 318, 330, 342, 354, 356
-};
-
-static const char _wikitext_indicies[] = {
-       0, 1, 2, 1, 3, 1, 4, 1, 
-       5, 1, 6, 1, 9, 9, 8, 7, 
-       10, 8, 7, 11, 11, 11, 7, 12, 
-       11, 11, 11, 7, 14, 13, 15, 15, 
-       7, 14, 13, 7, 14, 16, 13, 15, 
-       15, 7, 14, 17, 13, 15, 15, 7, 
-       18, 13, 15, 15, 7, 14, 19, 13, 
-       15, 15, 7, 14, 20, 13, 15, 15, 
-       7, 14, 21, 13, 15, 15, 7, 22, 
-       13, 15, 15, 7, 24, 25, 24, 25, 
-       23, 26, 26, 23, 27, 27, 23, 28, 
-       28, 23, 29, 29, 23, 30, 30, 23, 
-       31, 23, 32, 32, 23, 33, 23, 34, 
-       34, 23, 35, 35, 23, 36, 36, 23, 
-       37, 37, 23, 38, 38, 23, 39, 23, 
-       40, 40, 23, 41, 23, 43, 43, 43, 
-       43, 44, 43, 44, 44, 44, 43, 44, 
-       44, 42, 49, 50, 51, 53, 54, 55, 
-       56, 57, 58, 59, 60, 61, 62, 63, 
-       64, 65, 66, 61, 62, 63, 67, 52, 
-       48, 45, 46, 47, 48, 52, 1, 69, 
-       68, 71, 70, 52, 52, 52, 52, 52, 
-       52, 52, 52, 52, 72, 74, 75, 76, 
-       15, 15, 73, 78, 77, 79, 77, 80, 
-       77, 81, 77, 83, 84, 85, 84, 85, 
-       82, 87, 59, 86, 87, 86, 89, 88, 
-       52, 90, 52, 90, 52, 52, 52, 52, 
-       52, 52, 52, 72, 52, 91, 52, 91, 
-       52, 52, 52, 52, 52, 52, 52, 72, 
-       52, 92, 52, 52, 52, 52, 52, 52, 
-       52, 52, 72, 52, 93, 52, 52, 52, 
-       52, 52, 52, 52, 52, 72, 52, 94, 
-       52, 52, 52, 52, 52, 52, 52, 52, 
-       72, 52, 44, 95, 52, 52, 52, 44, 
-       52, 52, 52, 95, 52, 95, 95, 44, 
-       95, 52, 95, 95, 72, 43, 43, 43, 
-       43, 44, 43, 44, 44, 44, 43, 44, 
-       44, 96, 98, 44, 95, 98, 98, 98, 
-       44, 98, 52, 52, 95, 52, 95, 95, 
-       44, 95, 98, 95, 95, 97, 52, 61, 
-       52, 61, 52, 52, 52, 52, 52, 52, 
-       52, 72, 52, 99, 52, 99, 52, 52, 
-       52, 52, 52, 52, 52, 72, 52, 91, 
-       52, 91, 52, 52, 52, 52, 52, 52, 
-       52, 72, 101, 100, 103, 102, 0
-};
-
-static const char _wikitext_trans_targs_wi[] = {
-       38, 0, 3, 38, 5, 6, 38, 38, 
-       8, 9, 38, 10, 38, 12, 38, 11, 
-       14, 15, 38, 17, 18, 19, 38, 38, 
-       21, 27, 22, 23, 24, 25, 26, 38, 
-       28, 38, 30, 31, 32, 33, 34, 38, 
-       36, 38, 38, 37, 57, 1, 2, 4, 
-       38, 38, 39, 40, 41, 38, 38, 42, 
-       43, 38, 47, 48, 50, 51, 59, 60, 
-       62, 63, 38, 38, 38, 38, 38, 40, 
-       38, 38, 7, 13, 16, 38, 44, 45, 
-       46, 38, 38, 20, 29, 35, 38, 49, 
-       38, 38, 52, 53, 54, 55, 56, 58, 
-       38, 38, 58, 61, 38, 38, 38, 38
-};
-
-static const char _wikitext_trans_actions_wi[] = {
-       82, 0, 0, 85, 0, 0, 88, 73, 
-       0, 0, 43, 0, 41, 0, 39, 0, 
-       0, 0, 37, 0, 0, 0, 35, 75, 
-       0, 0, 0, 0, 0, 0, 0, 13, 
-       0, 21, 0, 0, 0, 0, 0, 11, 
-       0, 19, 71, 0, 9, 0, 0, 0, 
-       79, 97, 3, 1, 0, 45, 25, 9, 
-       0, 27, 9, 1, 1, 0, 0, 0, 
-       0, 0, 17, 33, 67, 47, 53, 0, 
-       69, 63, 0, 0, 0, 49, 0, 0, 
-       0, 15, 65, 0, 0, 0, 55, 0, 
-       51, 23, 0, 0, 0, 0, 0, 91, 
-       57, 77, 94, 0, 59, 29, 61, 31
-};
-
-static const char _wikitext_to_state_actions[] = {
-       0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 5, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0
-};
-
-static const char _wikitext_from_state_actions[] = {
-       0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 7, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0
-};
-
-static const char _wikitext_eof_trans[] = {
-       0, 0, 0, 0, 0, 0, 0, 8, 
-       8, 8, 8, 8, 8, 8, 8, 8, 
-       8, 8, 8, 8, 24, 24, 24, 24, 
-       24, 24, 24, 24, 24, 24, 24, 24, 
-       24, 24, 24, 24, 24, 43, 0, 69, 
-       71, 73, 74, 78, 78, 78, 78, 83, 
-       87, 87, 89, 73, 73, 73, 73, 73, 
-       73, 97, 98, 73, 73, 73, 101, 103
-};
-
 static const int wikitext_start = 38;
 static const int wikitext_first_final = 38;
 static const int wikitext_error = 0;
@@ -309,7 +81,7 @@ void next_token(token_t *out, token_t *last_token, char *p, char *pe)
     char    *te;        // token end (scanner)
     int     act;        // identity of last patterned matched (scanner)
     
-#line 313 "wikitext_ragel.c"
+#line 85 "wikitext_ragel.c"
        {
        cs = wikitext_start;
        ts = 0;
@@ -318,121 +90,40 @@ void next_token(token_t *out, token_t *last_token, char *p, char *pe)
        }
 #line 391 "wikitext_ragel.rl"
     
-#line 322 "wikitext_ragel.c"
+#line 94 "wikitext_ragel.c"
        {
-       int _klen;
-       unsigned int _trans;
-       const char *_acts;
-       unsigned int _nacts;
-       const char *_keys;
-
        if ( p == pe )
                goto _test_eof;
-       if ( cs == 0 )
-               goto _out;
-_resume:
-       _acts = _wikitext_actions + _wikitext_from_state_actions[cs];
-       _nacts = (unsigned int) *_acts++;
-       while ( _nacts-- > 0 ) {
-               switch ( *_acts++ ) {
-       case 6:
-#line 1 "wikitext_ragel.rl"
-       {ts = p;}
-       break;
-#line 343 "wikitext_ragel.c"
-               }
-       }
-
-       _keys = _wikitext_trans_keys + _wikitext_key_offsets[cs];
-       _trans = _wikitext_index_offsets[cs];
-
-       _klen = _wikitext_single_lengths[cs];
-       if ( _klen > 0 ) {
-               const char *_lower = _keys;
-               const char *_mid;
-               const char *_upper = _keys + _klen - 1;
-               while (1) {
-                       if ( _upper < _lower )
-                               break;
-
-                       _mid = _lower + ((_upper-_lower) >> 1);
-                       if ( (*p) < *_mid )
-                               _upper = _mid - 1;
-                       else if ( (*p) > *_mid )
-                               _lower = _mid + 1;
-                       else {
-                               _trans += (_mid - _keys);
-                               goto _match;
-                       }
-               }
-               _keys += _klen;
-               _trans += _klen;
-       }
-
-       _klen = _wikitext_range_lengths[cs];
-       if ( _klen > 0 ) {
-               const char *_lower = _keys;
-               const char *_mid;
-               const char *_upper = _keys + (_klen<<1) - 2;
-               while (1) {
-                       if ( _upper < _lower )
-                               break;
-
-                       _mid = _lower + (((_upper-_lower) >> 1) & ~1);
-                       if ( (*p) < _mid[0] )
-                               _upper = _mid - 2;
-                       else if ( (*p) > _mid[1] )
-                               _lower = _mid + 2;
-                       else {
-                               _trans += ((_mid - _keys)>>1);
-                               goto _match;
-                       }
-               }
-               _trans += _klen;
-       }
-
-_match:
-       _trans = _wikitext_indicies[_trans];
-_eof_trans:
-       cs = _wikitext_trans_targs_wi[_trans];
-
-       if ( _wikitext_trans_actions_wi[_trans] == 0 )
-               goto _again;
-
-       _acts = _wikitext_actions + _wikitext_trans_actions_wi[_trans];
-       _nacts = (unsigned int) *_acts++;
-       while ( _nacts-- > 0 )
-       {
-               switch ( *_acts++ )
-               {
-       case 0:
-#line 36 "wikitext_ragel.rl"
+       switch ( cs )
        {
-        MARK();
-    }
-       break;
-       case 1:
-#line 41 "wikitext_ragel.rl"
-       {
-        out->code_point = *p & 0x7f;
-    }
-       break;
-       case 2:
+tr0:
 #line 46 "wikitext_ragel.rl"
        {
         out->code_point = ((uint32_t)(*(p - 1)) & 0x1f) << 6 |
             (*p & 0x3f);
     }
-       break;
-       case 3:
+#line 340 "wikitext_ragel.rl"
+       {te = p+1;{
+            EMIT(DEFAULT);
+            out->column_stop = out->column_start + 1;
+            {p++; cs = 38; goto _out;}
+        }}
+       goto st38;
+tr3:
 #line 52 "wikitext_ragel.rl"
        {
         out->code_point = ((uint32_t)(*(p - 2)) & 0x0f) << 12 |
             ((uint32_t)(*(p - 1)) & 0x3f) << 6 |
             (*p & 0x3f);
     }
-       break;
-       case 4:
+#line 340 "wikitext_ragel.rl"
+       {te = p+1;{
+            EMIT(DEFAULT);
+            out->column_stop = out->column_start + 1;
+            {p++; cs = 38; goto _out;}
+        }}
+       goto st38;
+tr6:
 #line 59 "wikitext_ragel.rl"
        {
         out->code_point = ((uint32_t)(*(p - 3)) & 0x07) << 18 |
@@ -440,187 +131,209 @@ _eof_trans:
             ((uint32_t)(*(p - 1)) & 0x3f) << 6 |
             (*p & 0x3f);
     }
-       break;
-       case 7:
-#line 1 "wikitext_ragel.rl"
-       {te = p+1;}
-       break;
-       case 8:
-#line 218 "wikitext_ragel.rl"
-       {act = 12;}
-       break;
-       case 9:
-#line 320 "wikitext_ragel.rl"
-       {act = 28;}
-       break;
-       case 10:
-#line 73 "wikitext_ragel.rl"
+#line 340 "wikitext_ragel.rl"
        {te = p+1;{
-            EMIT(NO_WIKI_START);
-            {p++; goto _out; }
+            EMIT(DEFAULT);
+            out->column_stop = out->column_start + 1;
+            {p++; cs = 38; goto _out;}
         }}
-       break;
-       case 11:
+       goto st38;
+tr7:
+#line 290 "wikitext_ragel.rl"
+       {{p = ((te))-1;}{
+            EMIT(AMP);
+            {p++; cs = 38; goto _out;}
+        }}
+       goto st38;
+tr10:
+#line 278 "wikitext_ragel.rl"
+       {te = p+1;{
+            EMIT(DECIMAL_ENTITY);
+            {p++; cs = 38; goto _out;}
+        }}
+       goto st38;
+tr12:
+#line 272 "wikitext_ragel.rl"
+       {te = p+1;{
+            EMIT(HEX_ENTITY);
+            {p++; cs = 38; goto _out;}
+        }}
+       goto st38;
+tr14:
+#line 266 "wikitext_ragel.rl"
+       {te = p+1;{
+            EMIT(NAMED_ENTITY);
+            {p++; cs = 38; goto _out;}
+        }}
+       goto st38;
+tr18:
+#line 260 "wikitext_ragel.rl"
+       {te = p+1;{
+            EMIT(AMP_ENTITY);
+            {p++; cs = 38; goto _out;}
+        }}
+       goto st38;
+tr22:
+#line 254 "wikitext_ragel.rl"
+       {te = p+1;{
+            EMIT(QUOT_ENTITY);
+            {p++; cs = 38; goto _out;}
+        }}
+       goto st38;
+tr23:
+#line 296 "wikitext_ragel.rl"
+       {{p = ((te))-1;}{
+            EMIT(LESS);
+            {p++; cs = 38; goto _out;}
+        }}
+       goto st38;
+tr31:
 #line 79 "wikitext_ragel.rl"
        {te = p+1;{
             EMIT(NO_WIKI_END);
-            {p++; goto _out; }
+            {p++; cs = 38; goto _out;}
         }}
-       break;
-       case 12:
-#line 85 "wikitext_ragel.rl"
+       goto st38;
+tr33:
+#line 115 "wikitext_ragel.rl"
        {te = p+1;{
-            if (DISTANCE() == 5)
-                EMIT(STRONG_EM);
-            else if (DISTANCE() == 4)
-            {
-                p--;
-                EMIT(STRONG_EM);
-            }
-            else if (DISTANCE() == 3)
-                EMIT(STRONG);
-            else if (DISTANCE() == 2)
-                EMIT(EM);
-            else
-                EMIT(PRINTABLE);
-            {p++; goto _out; }
+            EMIT(TT_END);
+            {p++; cs = 38; goto _out;}
         }}
-       break;
-       case 13:
-#line 103 "wikitext_ragel.rl"
+       goto st38;
+tr39:
+#line 73 "wikitext_ragel.rl"
        {te = p+1;{
-            EMIT(TT);
-            {p++; goto _out; }
+            EMIT(NO_WIKI_START);
+            {p++; cs = 38; goto _out;}
         }}
-       break;
-       case 14:
+       goto st38;
+tr41:
 #line 109 "wikitext_ragel.rl"
        {te = p+1;{
             EMIT(TT_START);
-            {p++; goto _out; }
+            {p++; cs = 38; goto _out;}
         }}
-       break;
-       case 15:
-#line 115 "wikitext_ragel.rl"
+       goto st38;
+tr42:
+#line 218 "wikitext_ragel.rl"
+       {{p = ((te))-1;}{
+            EMIT(URI);
+            {p++; cs = 38; goto _out;}
+        }}
+       goto st38;
+tr48:
+#line 41 "wikitext_ragel.rl"
+       {
+        out->code_point = *p & 0x7f;
+    }
+#line 340 "wikitext_ragel.rl"
        {te = p+1;{
-            EMIT(TT_END);
-            {p++; goto _out; }
+            EMIT(DEFAULT);
+            out->column_stop = out->column_start + 1;
+            {p++; cs = 38; goto _out;}
         }}
-       break;
-       case 16:
-#line 122 "wikitext_ragel.rl"
+       goto st38;
+tr49:
+#line 308 "wikitext_ragel.rl"
        {te = p+1;{
-            if (out->column_start == 1 || last_token_type == BLOCKQUOTE)
-                EMIT(BLOCKQUOTE);
-            else
-            {
-                REWIND();
-                EMIT(GREATER);
-            }
-            {p++; goto _out; }
+            EMIT(CRLF);
+            out->column_stop = 1;
+            out->line_stop++;
+            {p++; cs = 38; goto _out;}
         }}
-       break;
-       case 17:
+#line 41 "wikitext_ragel.rl"
+       {
+        out->code_point = *p & 0x7f;
+    }
+       goto st38;
+tr53:
+#line 284 "wikitext_ragel.rl"
+       {te = p+1;{
+            EMIT(QUOT);
+            {p++; cs = 38; goto _out;}
+        }}
+       goto st38;
+tr54:
 #line 148 "wikitext_ragel.rl"
        {te = p+1;{
             if (out->column_start == 1 || last_token_type == OL || last_token_type == UL || last_token_type == BLOCKQUOTE)
                 EMIT(OL);
             else
                 EMIT(PRINTABLE);
-            {p++; goto _out; }
+            {p++; cs = 38; goto _out;}
         }}
-       break;
-       case 18:
+       goto st38;
+tr57:
 #line 157 "wikitext_ragel.rl"
        {te = p+1;{
             if (out->column_start == 1 || last_token_type == OL || last_token_type == UL || last_token_type == BLOCKQUOTE)
                 EMIT(UL);
             else
                 EMIT(PRINTABLE);
-            {p++; goto _out; }
+            {p++; cs = 38; goto _out;}
         }}
-       break;
-       case 19:
-#line 224 "wikitext_ragel.rl"
-       {te = p+1;{
-            EMIT(LINK_START);
-            {p++; goto _out; }
-        }}
-       break;
-       case 20:
-#line 230 "wikitext_ragel.rl"
+       goto st38;
+tr66:
+#line 103 "wikitext_ragel.rl"
        {te = p+1;{
-            EMIT(LINK_END);
-            {p++; goto _out; }
+            EMIT(TT);
+            {p++; cs = 38; goto _out;}
         }}
-       break;
-       case 21:
+       goto st38;
+tr67:
 #line 236 "wikitext_ragel.rl"
        {te = p+1;{
             EMIT(SEPARATOR);
-            {p++; goto _out; }
-        }}
-       break;
-       case 22:
-#line 254 "wikitext_ragel.rl"
-       {te = p+1;{
-            EMIT(QUOT_ENTITY);
-            {p++; goto _out; }
-        }}
-       break;
-       case 23:
-#line 260 "wikitext_ragel.rl"
-       {te = p+1;{
-            EMIT(AMP_ENTITY);
-            {p++; goto _out; }
-        }}
-       break;
-       case 24:
-#line 266 "wikitext_ragel.rl"
-       {te = p+1;{
-            EMIT(NAMED_ENTITY);
-            {p++; goto _out; }
+            {p++; cs = 38; goto _out;}
         }}
-       break;
-       case 25:
-#line 272 "wikitext_ragel.rl"
-       {te = p+1;{
-            EMIT(HEX_ENTITY);
-            {p++; goto _out; }
-        }}
-       break;
-       case 26:
-#line 278 "wikitext_ragel.rl"
-       {te = p+1;{
-            EMIT(DECIMAL_ENTITY);
-            {p++; goto _out; }
-        }}
-       break;
-       case 27:
-#line 284 "wikitext_ragel.rl"
-       {te = p+1;{
-            EMIT(QUOT);
-            {p++; goto _out; }
+       goto st38;
+tr68:
+#line 308 "wikitext_ragel.rl"
+       {te = p;p--;{
+            EMIT(CRLF);
+            out->column_stop = 1;
+            out->line_stop++;
+            {p++; cs = 38; goto _out;}
         }}
-       break;
-       case 28:
+       goto st38;
+tr69:
 #line 308 "wikitext_ragel.rl"
        {te = p+1;{
             EMIT(CRLF);
             out->column_stop = 1;
             out->line_stop++;
-            {p++; goto _out; }
+            {p++; cs = 38; goto _out;}
         }}
-       break;
-       case 29:
-#line 340 "wikitext_ragel.rl"
-       {te = p+1;{
-            EMIT(DEFAULT);
-            out->column_stop = out->column_start + 1;
-            {p++; goto _out; }
+       goto st38;
+tr70:
+#line 136 "wikitext_ragel.rl"
+       {te = p;p--;{
+            if (out->column_start == 1 || last_token_type == BLOCKQUOTE)
+            {
+                REWIND();
+                EMIT(PRE);
+            }
+            else
+                EMIT(SPACE);
+            {p++; cs = 38; goto _out;}
         }}
-       break;
-       case 30:
+       goto st38;
+tr72:
+#line 320 "wikitext_ragel.rl"
+       {te = p;p--;{
+            EMIT(PRINTABLE);
+            {p++; cs = 38; goto _out;}
+        }}
+       goto st38;
+tr73:
+#line 290 "wikitext_ragel.rl"
+       {te = p;p--;{
+            EMIT(AMP);
+            {p++; cs = 38; goto _out;}
+        }}
+       goto st38;
+tr77:
 #line 85 "wikitext_ragel.rl"
        {te = p;p--;{
             if (DISTANCE() == 5)
@@ -636,36 +349,36 @@ _eof_trans:
                 EMIT(EM);
             else
                 EMIT(PRINTABLE);
-            {p++; goto _out; }
+            {p++; cs = 38; goto _out;}
         }}
-       break;
-       case 31:
-#line 122 "wikitext_ragel.rl"
-       {te = p;p--;{
-            if (out->column_start == 1 || last_token_type == BLOCKQUOTE)
-                EMIT(BLOCKQUOTE);
-            else
+       goto st38;
+tr81:
+#line 85 "wikitext_ragel.rl"
+       {te = p+1;{
+            if (DISTANCE() == 5)
+                EMIT(STRONG_EM);
+            else if (DISTANCE() == 4)
             {
-                REWIND();
-                EMIT(GREATER);
+                p--;
+                EMIT(STRONG_EM);
             }
-            {p++; goto _out; }
+            else if (DISTANCE() == 3)
+                EMIT(STRONG);
+            else if (DISTANCE() == 2)
+                EMIT(EM);
+            else
+                EMIT(PRINTABLE);
+            {p++; cs = 38; goto _out;}
         }}
-       break;
-       case 32:
-#line 136 "wikitext_ragel.rl"
+       goto st38;
+tr82:
+#line 296 "wikitext_ragel.rl"
        {te = p;p--;{
-            if (out->column_start == 1 || last_token_type == BLOCKQUOTE)
-            {
-                REWIND();
-                EMIT(PRE);
-            }
-            else
-                EMIT(SPACE);
-            {p++; goto _out; }
+            EMIT(LESS);
+            {p++; cs = 38; goto _out;}
         }}
-       break;
-       case 33:
+       goto st38;
+tr86:
 #line 166 "wikitext_ragel.rl"
        {te = p;p--;{
             if (out->column_start == 1 || last_token_type == BLOCKQUOTE)
@@ -715,127 +428,1186 @@ _eof_trans:
                 REWIND();
                 EMIT(PRINTABLE);
             }
-            {p++; goto _out; }
+            {p++; cs = 38; goto _out;}
         }}
-       break;
-       case 34:
-#line 218 "wikitext_ragel.rl"
-       {te = p;p--;{
-            EMIT(URI);
-            {p++; goto _out; }
-        }}
-       break;
-       case 35:
-#line 242 "wikitext_ragel.rl"
-       {te = p;p--;{
-            EMIT(EXT_LINK_START);
-            {p++; goto _out; }
-        }}
-       break;
-       case 36:
-#line 248 "wikitext_ragel.rl"
-       {te = p;p--;{
-            EMIT(EXT_LINK_END);
-            {p++; goto _out; }
-        }}
-       break;
-       case 37:
-#line 290 "wikitext_ragel.rl"
-       {te = p;p--;{
-            EMIT(AMP);
-            {p++; goto _out; }
-        }}
-       break;
-       case 38:
-#line 296 "wikitext_ragel.rl"
-       {te = p;p--;{
-            EMIT(LESS);
-            {p++; goto _out; }
-        }}
-       break;
-       case 39:
-#line 308 "wikitext_ragel.rl"
+       goto st38;
+tr88:
+#line 122 "wikitext_ragel.rl"
        {te = p;p--;{
-            EMIT(CRLF);
-            out->column_stop = 1;
-            out->line_stop++;
-            {p++; goto _out; }
+            if (out->column_start == 1 || last_token_type == BLOCKQUOTE)
+                EMIT(BLOCKQUOTE);
+            else
+            {
+                REWIND();
+                EMIT(GREATER);
+            }
+            {p++; cs = 38; goto _out;}
         }}
-       break;
-       case 40:
-#line 320 "wikitext_ragel.rl"
-       {te = p;p--;{
-            EMIT(PRINTABLE);
-            {p++; goto _out; }
+       goto st38;
+tr89:
+#line 122 "wikitext_ragel.rl"
+       {te = p+1;{
+            if (out->column_start == 1 || last_token_type == BLOCKQUOTE)
+                EMIT(BLOCKQUOTE);
+            else
+            {
+                REWIND();
+                EMIT(GREATER);
+            }
+            {p++; cs = 38; goto _out;}
         }}
-       break;
-       case 41:
+       goto st38;
+tr96:
 #line 218 "wikitext_ragel.rl"
-       {{p = ((te))-1;}{
+       {te = p;p--;{
             EMIT(URI);
-            {p++; goto _out; }
-        }}
-       break;
-       case 42:
-#line 290 "wikitext_ragel.rl"
-       {{p = ((te))-1;}{
-            EMIT(AMP);
-            {p++; goto _out; }
-        }}
-       break;
-       case 43:
-#line 296 "wikitext_ragel.rl"
-       {{p = ((te))-1;}{
-            EMIT(LESS);
-            {p++; goto _out; }
+            {p++; cs = 38; goto _out;}
         }}
-       break;
-       case 44:
+       goto st38;
+tr97:
 #line 1 "wikitext_ragel.rl"
        {       switch( act ) {
        case 12:
        {{p = ((te))-1;}
             EMIT(URI);
-            {p++; goto _out; }
+            {p++; cs = 38; goto _out;}
         }
        break;
        case 28:
        {{p = ((te))-1;}
             EMIT(PRINTABLE);
-            {p++; goto _out; }
+            {p++; cs = 38; goto _out;}
         }
        break;
        default: break;
        }
        }
-       break;
-#line 813 "wikitext_ragel.c"
-               }
-       }
-
-_again:
-       _acts = _wikitext_actions + _wikitext_to_state_actions[cs];
-       _nacts = (unsigned int) *_acts++;
-       while ( _nacts-- > 0 ) {
-               switch ( *_acts++ ) {
-       case 5:
+       goto st38;
+tr100:
+#line 242 "wikitext_ragel.rl"
+       {te = p;p--;{
+            EMIT(EXT_LINK_START);
+            {p++; cs = 38; goto _out;}
+        }}
+       goto st38;
+tr101:
+#line 224 "wikitext_ragel.rl"
+       {te = p+1;{
+            EMIT(LINK_START);
+            {p++; cs = 38; goto _out;}
+        }}
+       goto st38;
+tr102:
+#line 248 "wikitext_ragel.rl"
+       {te = p;p--;{
+            EMIT(EXT_LINK_END);
+            {p++; cs = 38; goto _out;}
+        }}
+       goto st38;
+tr103:
+#line 230 "wikitext_ragel.rl"
+       {te = p+1;{
+            EMIT(LINK_END);
+            {p++; cs = 38; goto _out;}
+        }}
+       goto st38;
+st38:
 #line 1 "wikitext_ragel.rl"
        {ts = 0;}
-       break;
-#line 826 "wikitext_ragel.c"
-               }
+       if ( ++p == pe )
+               goto _test_eof38;
+case 38:
+#line 1 "wikitext_ragel.rl"
+       {ts = p;}
+#line 523 "wikitext_ragel.c"
+       switch( (*p) ) {
+               case 10: goto tr49;
+               case 13: goto tr50;
+               case 32: goto tr51;
+               case 34: goto tr53;
+               case 35: goto tr54;
+               case 38: goto tr55;
+               case 39: goto st43;
+               case 42: goto tr57;
+               case 60: goto tr58;
+               case 61: goto tr59;
+               case 62: goto tr60;
+               case 70: goto st51;
+               case 72: goto st59;
+               case 83: goto st60;
+               case 91: goto st62;
+               case 93: goto st63;
+               case 96: goto tr66;
+               case 102: goto st51;
+               case 104: goto st59;
+               case 115: goto st60;
+               case 124: goto tr67;
+               case 126: goto st41;
+               case 127: goto tr48;
+       }
+       if ( (*p) < -16 ) {
+               if ( (*p) > -33 ) {
+                       if ( -32 <= (*p) && (*p) <= -17 )
+                               goto st2;
+               } else if ( (*p) >= -62 )
+                       goto st1;
+       } else if ( (*p) > -12 ) {
+               if ( (*p) > 31 ) {
+                       if ( 33 <= (*p) && (*p) <= 123 )
+                               goto st41;
+               } else if ( (*p) >= 1 )
+                       goto tr48;
+       } else
+               goto st4;
+       goto st0;
+st0:
+cs = 0;
+       goto _out;
+st1:
+       if ( ++p == pe )
+               goto _test_eof1;
+case 1:
+       if ( (*p) <= -65 )
+               goto tr0;
+       goto st0;
+st2:
+       if ( ++p == pe )
+               goto _test_eof2;
+case 2:
+       if ( (*p) <= -65 )
+               goto st3;
+       goto st0;
+st3:
+       if ( ++p == pe )
+               goto _test_eof3;
+case 3:
+       if ( (*p) <= -65 )
+               goto tr3;
+       goto st0;
+st4:
+       if ( ++p == pe )
+               goto _test_eof4;
+case 4:
+       if ( (*p) <= -65 )
+               goto st5;
+       goto st0;
+st5:
+       if ( ++p == pe )
+               goto _test_eof5;
+case 5:
+       if ( (*p) <= -65 )
+               goto st6;
+       goto st0;
+st6:
+       if ( ++p == pe )
+               goto _test_eof6;
+case 6:
+       if ( (*p) <= -65 )
+               goto tr6;
+       goto st0;
+tr50:
+#line 41 "wikitext_ragel.rl"
+       {
+        out->code_point = *p & 0x7f;
+    }
+       goto st39;
+st39:
+       if ( ++p == pe )
+               goto _test_eof39;
+case 39:
+#line 619 "wikitext_ragel.c"
+       if ( (*p) == 10 )
+               goto tr69;
+       goto tr68;
+tr51:
+#line 36 "wikitext_ragel.rl"
+       {
+        MARK();
+    }
+       goto st40;
+st40:
+       if ( ++p == pe )
+               goto _test_eof40;
+case 40:
+#line 633 "wikitext_ragel.c"
+       if ( (*p) == 32 )
+               goto st40;
+       goto tr70;
+st41:
+       if ( ++p == pe )
+               goto _test_eof41;
+case 41:
+       switch( (*p) ) {
+               case 33: goto st41;
+               case 92: goto st41;
+               case 126: goto st41;
+       }
+       if ( (*p) < 43 ) {
+               if ( (*p) > 37 ) {
+                       if ( 40 <= (*p) && (*p) <= 41 )
+                               goto st41;
+               } else if ( (*p) >= 36 )
+                       goto st41;
+       } else if ( (*p) > 59 ) {
+               if ( (*p) < 94 ) {
+                       if ( 63 <= (*p) && (*p) <= 90 )
+                               goto st41;
+               } else if ( (*p) > 95 ) {
+                       if ( 97 <= (*p) && (*p) <= 123 )
+                               goto st41;
+               } else
+                       goto st41;
+       } else
+               goto st41;
+       goto tr72;
+tr55:
+#line 1 "wikitext_ragel.rl"
+       {te = p+1;}
+       goto st42;
+st42:
+       if ( ++p == pe )
+               goto _test_eof42;
+case 42:
+#line 672 "wikitext_ragel.c"
+       switch( (*p) ) {
+               case 35: goto st7;
+               case 97: goto st13;
+               case 113: goto st16;
+       }
+       if ( (*p) > 90 ) {
+               if ( 98 <= (*p) && (*p) <= 122 )
+                       goto st11;
+       } else if ( (*p) >= 65 )
+               goto st11;
+       goto tr73;
+st7:
+       if ( ++p == pe )
+               goto _test_eof7;
+case 7:
+       switch( (*p) ) {
+               case 88: goto st9;
+               case 120: goto st9;
+       }
+       if ( 48 <= (*p) && (*p) <= 57 )
+               goto st8;
+       goto tr7;
+st8:
+       if ( ++p == pe )
+               goto _test_eof8;
+case 8:
+       if ( (*p) == 59 )
+               goto tr10;
+       if ( 48 <= (*p) && (*p) <= 57 )
+               goto st8;
+       goto tr7;
+st9:
+       if ( ++p == pe )
+               goto _test_eof9;
+case 9:
+       if ( (*p) < 65 ) {
+               if ( 48 <= (*p) && (*p) <= 57 )
+                       goto st10;
+       } else if ( (*p) > 70 ) {
+               if ( 97 <= (*p) && (*p) <= 102 )
+                       goto st10;
+       } else
+               goto st10;
+       goto tr7;
+st10:
+       if ( ++p == pe )
+               goto _test_eof10;
+case 10:
+       if ( (*p) == 59 )
+               goto tr12;
+       if ( (*p) < 65 ) {
+               if ( 48 <= (*p) && (*p) <= 57 )
+                       goto st10;
+       } else if ( (*p) > 70 ) {
+               if ( 97 <= (*p) && (*p) <= 102 )
+                       goto st10;
+       } else
+               goto st10;
+       goto tr7;
+st11:
+       if ( ++p == pe )
+               goto _test_eof11;
+case 11:
+       if ( (*p) == 59 )
+               goto tr14;
+       if ( (*p) < 65 ) {
+               if ( 48 <= (*p) && (*p) <= 57 )
+                       goto st12;
+       } else if ( (*p) > 90 ) {
+               if ( 97 <= (*p) && (*p) <= 122 )
+                       goto st11;
+       } else
+               goto st11;
+       goto tr7;
+st12:
+       if ( ++p == pe )
+               goto _test_eof12;
+case 12:
+       if ( (*p) == 59 )
+               goto tr14;
+       if ( 48 <= (*p) && (*p) <= 57 )
+               goto st12;
+       goto tr7;
+st13:
+       if ( ++p == pe )
+               goto _test_eof13;
+case 13:
+       switch( (*p) ) {
+               case 59: goto tr14;
+               case 109: goto st14;
+       }
+       if ( (*p) < 65 ) {
+               if ( 48 <= (*p) && (*p) <= 57 )
+                       goto st12;
+       } else if ( (*p) > 90 ) {
+               if ( 97 <= (*p) && (*p) <= 122 )
+                       goto st11;
+       } else
+               goto st11;
+       goto tr7;
+st14:
+       if ( ++p == pe )
+               goto _test_eof14;
+case 14:
+       switch( (*p) ) {
+               case 59: goto tr14;
+               case 112: goto st15;
+       }
+       if ( (*p) < 65 ) {
+               if ( 48 <= (*p) && (*p) <= 57 )
+                       goto st12;
+       } else if ( (*p) > 90 ) {
+               if ( 97 <= (*p) && (*p) <= 122 )
+                       goto st11;
+       } else
+               goto st11;
+       goto tr7;
+st15:
+       if ( ++p == pe )
+               goto _test_eof15;
+case 15:
+       if ( (*p) == 59 )
+               goto tr18;
+       if ( (*p) < 65 ) {
+               if ( 48 <= (*p) && (*p) <= 57 )
+                       goto st12;
+       } else if ( (*p) > 90 ) {
+               if ( 97 <= (*p) && (*p) <= 122 )
+                       goto st11;
+       } else
+               goto st11;
+       goto tr7;
+st16:
+       if ( ++p == pe )
+               goto _test_eof16;
+case 16:
+       switch( (*p) ) {
+               case 59: goto tr14;
+               case 117: goto st17;
+       }
+       if ( (*p) < 65 ) {
+               if ( 48 <= (*p) && (*p) <= 57 )
+                       goto st12;
+       } else if ( (*p) > 90 ) {
+               if ( 97 <= (*p) && (*p) <= 122 )
+                       goto st11;
+       } else
+               goto st11;
+       goto tr7;
+st17:
+       if ( ++p == pe )
+               goto _test_eof17;
+case 17:
+       switch( (*p) ) {
+               case 59: goto tr14;
+               case 111: goto st18;
+       }
+       if ( (*p) < 65 ) {
+               if ( 48 <= (*p) && (*p) <= 57 )
+                       goto st12;
+       } else if ( (*p) > 90 ) {
+               if ( 97 <= (*p) && (*p) <= 122 )
+                       goto st11;
+       } else
+               goto st11;
+       goto tr7;
+st18:
+       if ( ++p == pe )
+               goto _test_eof18;
+case 18:
+       switch( (*p) ) {
+               case 59: goto tr14;
+               case 116: goto st19;
+       }
+       if ( (*p) < 65 ) {
+               if ( 48 <= (*p) && (*p) <= 57 )
+                       goto st12;
+       } else if ( (*p) > 90 ) {
+               if ( 97 <= (*p) && (*p) <= 122 )
+                       goto st11;
+       } else
+               goto st11;
+       goto tr7;
+st19:
+       if ( ++p == pe )
+               goto _test_eof19;
+case 19:
+       if ( (*p) == 59 )
+               goto tr22;
+       if ( (*p) < 65 ) {
+               if ( 48 <= (*p) && (*p) <= 57 )
+                       goto st12;
+       } else if ( (*p) > 90 ) {
+               if ( 97 <= (*p) && (*p) <= 122 )
+                       goto st11;
+       } else
+               goto st11;
+       goto tr7;
+st43:
+       if ( ++p == pe )
+               goto _test_eof43;
+case 43:
+       if ( (*p) == 39 )
+               goto st44;
+       goto tr77;
+st44:
+       if ( ++p == pe )
+               goto _test_eof44;
+case 44:
+       if ( (*p) == 39 )
+               goto st45;
+       goto tr77;
+st45:
+       if ( ++p == pe )
+               goto _test_eof45;
+case 45:
+       if ( (*p) == 39 )
+               goto st46;
+       goto tr77;
+st46:
+       if ( ++p == pe )
+               goto _test_eof46;
+case 46:
+       if ( (*p) == 39 )
+               goto tr81;
+       goto tr77;
+tr58:
+#line 1 "wikitext_ragel.rl"
+       {te = p+1;}
+       goto st47;
+st47:
+       if ( ++p == pe )
+               goto _test_eof47;
+case 47:
+#line 907 "wikitext_ragel.c"
+       switch( (*p) ) {
+               case 47: goto st20;
+               case 78: goto st29;
+               case 84: goto st35;
+               case 110: goto st29;
+               case 116: goto st35;
+       }
+       goto tr82;
+st20:
+       if ( ++p == pe )
+               goto _test_eof20;
+case 20:
+       switch( (*p) ) {
+               case 78: goto st21;
+               case 84: goto st27;
+               case 110: goto st21;
+               case 116: goto st27;
+       }
+       goto tr23;
+st21:
+       if ( ++p == pe )
+               goto _test_eof21;
+case 21:
+       switch( (*p) ) {
+               case 79: goto st22;
+               case 111: goto st22;
+       }
+       goto tr23;
+st22:
+       if ( ++p == pe )
+               goto _test_eof22;
+case 22:
+       switch( (*p) ) {
+               case 87: goto st23;
+               case 119: goto st23;
+       }
+       goto tr23;
+st23:
+       if ( ++p == pe )
+               goto _test_eof23;
+case 23:
+       switch( (*p) ) {
+               case 73: goto st24;
+               case 105: goto st24;
+       }
+       goto tr23;
+st24:
+       if ( ++p == pe )
+               goto _test_eof24;
+case 24:
+       switch( (*p) ) {
+               case 75: goto st25;
+               case 107: goto st25;
+       }
+       goto tr23;
+st25:
+       if ( ++p == pe )
+               goto _test_eof25;
+case 25:
+       switch( (*p) ) {
+               case 73: goto st26;
+               case 105: goto st26;
+       }
+       goto tr23;
+st26:
+       if ( ++p == pe )
+               goto _test_eof26;
+case 26:
+       if ( (*p) == 62 )
+               goto tr31;
+       goto tr23;
+st27:
+       if ( ++p == pe )
+               goto _test_eof27;
+case 27:
+       switch( (*p) ) {
+               case 84: goto st28;
+               case 116: goto st28;
+       }
+       goto tr23;
+st28:
+       if ( ++p == pe )
+               goto _test_eof28;
+case 28:
+       if ( (*p) == 62 )
+               goto tr33;
+       goto tr23;
+st29:
+       if ( ++p == pe )
+               goto _test_eof29;
+case 29:
+       switch( (*p) ) {
+               case 79: goto st30;
+               case 111: goto st30;
+       }
+       goto tr23;
+st30:
+       if ( ++p == pe )
+               goto _test_eof30;
+case 30:
+       switch( (*p) ) {
+               case 87: goto st31;
+               case 119: goto st31;
+       }
+       goto tr23;
+st31:
+       if ( ++p == pe )
+               goto _test_eof31;
+case 31:
+       switch( (*p) ) {
+               case 73: goto st32;
+               case 105: goto st32;
+       }
+       goto tr23;
+st32:
+       if ( ++p == pe )
+               goto _test_eof32;
+case 32:
+       switch( (*p) ) {
+               case 75: goto st33;
+               case 107: goto st33;
+       }
+       goto tr23;
+st33:
+       if ( ++p == pe )
+               goto _test_eof33;
+case 33:
+       switch( (*p) ) {
+               case 73: goto st34;
+               case 105: goto st34;
+       }
+       goto tr23;
+st34:
+       if ( ++p == pe )
+               goto _test_eof34;
+case 34:
+       if ( (*p) == 62 )
+               goto tr39;
+       goto tr23;
+st35:
+       if ( ++p == pe )
+               goto _test_eof35;
+case 35:
+       switch( (*p) ) {
+               case 84: goto st36;
+               case 116: goto st36;
+       }
+       goto tr23;
+st36:
+       if ( ++p == pe )
+               goto _test_eof36;
+case 36:
+       if ( (*p) == 62 )
+               goto tr41;
+       goto tr23;
+tr59:
+#line 36 "wikitext_ragel.rl"
+       {
+        MARK();
+    }
+       goto st48;
+st48:
+       if ( ++p == pe )
+               goto _test_eof48;
+case 48:
+#line 1073 "wikitext_ragel.c"
+       switch( (*p) ) {
+               case 32: goto st49;
+               case 61: goto tr59;
+       }
+       goto tr86;
+st49:
+       if ( ++p == pe )
+               goto _test_eof49;
+case 49:
+       if ( (*p) == 32 )
+               goto st49;
+       goto tr86;
+tr60:
+#line 36 "wikitext_ragel.rl"
+       {
+        MARK();
+    }
+       goto st50;
+st50:
+       if ( ++p == pe )
+               goto _test_eof50;
+case 50:
+#line 1096 "wikitext_ragel.c"
+       if ( (*p) == 32 )
+               goto tr89;
+       goto tr88;
+st51:
+       if ( ++p == pe )
+               goto _test_eof51;
+case 51:
+       switch( (*p) ) {
+               case 33: goto st41;
+               case 84: goto st52;
+               case 92: goto st41;
+               case 116: goto st52;
+               case 126: goto st41;
+       }
+       if ( (*p) < 43 ) {
+               if ( (*p) > 37 ) {
+                       if ( 40 <= (*p) && (*p) <= 41 )
+                               goto st41;
+               } else if ( (*p) >= 36 )
+                       goto st41;
+       } else if ( (*p) > 59 ) {
+               if ( (*p) < 94 ) {
+                       if ( 63 <= (*p) && (*p) <= 90 )
+                               goto st41;
+               } else if ( (*p) > 95 ) {
+                       if ( 97 <= (*p) && (*p) <= 123 )
+                               goto st41;
+               } else
+                       goto st41;
+       } else
+               goto st41;
+       goto tr72;
+st52:
+       if ( ++p == pe )
+               goto _test_eof52;
+case 52:
+       switch( (*p) ) {
+               case 33: goto st41;
+               case 80: goto st53;
+               case 92: goto st41;
+               case 112: goto st53;
+               case 126: goto st41;
+       }
+       if ( (*p) < 43 ) {
+               if ( (*p) > 37 ) {
+                       if ( 40 <= (*p) && (*p) <= 41 )
+                               goto st41;
+               } else if ( (*p) >= 36 )
+                       goto st41;
+       } else if ( (*p) > 59 ) {
+               if ( (*p) < 94 ) {
+                       if ( 63 <= (*p) && (*p) <= 90 )
+                               goto st41;
+               } else if ( (*p) > 95 ) {
+                       if ( 97 <= (*p) && (*p) <= 123 )
+                               goto st41;
+               } else
+                       goto st41;
+       } else
+               goto st41;
+       goto tr72;
+st53:
+       if ( ++p == pe )
+               goto _test_eof53;
+case 53:
+       switch( (*p) ) {
+               case 33: goto st41;
+               case 58: goto st54;
+               case 92: goto st41;
+               case 126: goto st41;
+       }
+       if ( (*p) < 43 ) {
+               if ( (*p) > 37 ) {
+                       if ( 40 <= (*p) && (*p) <= 41 )
+                               goto st41;
+               } else if ( (*p) >= 36 )
+                       goto st41;
+       } else if ( (*p) > 59 ) {
+               if ( (*p) < 94 ) {
+                       if ( 63 <= (*p) && (*p) <= 90 )
+                               goto st41;
+               } else if ( (*p) > 95 ) {
+                       if ( 97 <= (*p) && (*p) <= 123 )
+                               goto st41;
+               } else
+                       goto st41;
+       } else
+               goto st41;
+       goto tr72;
+st54:
+       if ( ++p == pe )
+               goto _test_eof54;
+case 54:
+       switch( (*p) ) {
+               case 33: goto st41;
+               case 47: goto st55;
+               case 92: goto st41;
+               case 126: goto st41;
+       }
+       if ( (*p) < 43 ) {
+               if ( (*p) > 37 ) {
+                       if ( 40 <= (*p) && (*p) <= 41 )
+                               goto st41;
+               } else if ( (*p) >= 36 )
+                       goto st41;
+       } else if ( (*p) > 59 ) {
+               if ( (*p) < 94 ) {
+                       if ( 63 <= (*p) && (*p) <= 90 )
+                               goto st41;
+               } else if ( (*p) > 95 ) {
+                       if ( 97 <= (*p) && (*p) <= 123 )
+                               goto st41;
+               } else
+                       goto st41;
+       } else
+               goto st41;
+       goto tr72;
+st55:
+       if ( ++p == pe )
+               goto _test_eof55;
+case 55:
+       switch( (*p) ) {
+               case 33: goto st41;
+               case 47: goto st56;
+               case 92: goto st41;
+               case 126: goto st41;
+       }
+       if ( (*p) < 43 ) {
+               if ( (*p) > 37 ) {
+                       if ( 40 <= (*p) && (*p) <= 41 )
+                               goto st41;
+               } else if ( (*p) >= 36 )
+                       goto st41;
+       } else if ( (*p) > 59 ) {
+               if ( (*p) < 94 ) {
+                       if ( 63 <= (*p) && (*p) <= 90 )
+                               goto st41;
+               } else if ( (*p) > 95 ) {
+                       if ( 97 <= (*p) && (*p) <= 123 )
+                               goto st41;
+               } else
+                       goto st41;
+       } else
+               goto st41;
+       goto tr72;
+st56:
+       if ( ++p == pe )
+               goto _test_eof56;
+case 56:
+       switch( (*p) ) {
+               case 33: goto st41;
+               case 35: goto tr44;
+               case 40: goto tr95;
+               case 41: goto st41;
+               case 44: goto st41;
+               case 46: goto st41;
+               case 61: goto tr44;
+               case 63: goto st41;
+               case 92: goto st41;
+               case 94: goto st41;
+               case 95: goto tr95;
+               case 123: goto st41;
+               case 126: goto tr95;
+       }
+       if ( (*p) < 43 ) {
+               if ( (*p) > 37 ) {
+                       if ( 38 <= (*p) && (*p) <= 42 )
+                               goto tr44;
+               } else if ( (*p) >= 36 )
+                       goto tr95;
+       } else if ( (*p) > 57 ) {
+               if ( (*p) < 64 ) {
+                       if ( 58 <= (*p) && (*p) <= 59 )
+                               goto st41;
+               } else if ( (*p) > 90 ) {
+                       if ( 97 <= (*p) && (*p) <= 122 )
+                               goto tr95;
+               } else
+                       goto tr95;
+       } else
+               goto tr95;
+       goto tr72;
+tr44:
+#line 1 "wikitext_ragel.rl"
+       {te = p+1;}
+       goto st57;
+st57:
+       if ( ++p == pe )
+               goto _test_eof57;
+case 57:
+#line 1287 "wikitext_ragel.c"
+       switch( (*p) ) {
+               case 33: goto st37;
+               case 41: goto st37;
+               case 44: goto st37;
+               case 46: goto st37;
+               case 61: goto tr44;
+               case 63: goto st37;
+               case 95: goto tr44;
+               case 126: goto tr44;
+       }
+       if ( (*p) < 58 ) {
+               if ( 35 <= (*p) && (*p) <= 57 )
+                       goto tr44;
+       } else if ( (*p) > 59 ) {
+               if ( (*p) > 90 ) {
+                       if ( 97 <= (*p) && (*p) <= 122 )
+                               goto tr44;
+               } else if ( (*p) >= 64 )
+                       goto tr44;
+       } else
+               goto st37;
+       goto tr96;
+st37:
+       if ( ++p == pe )
+               goto _test_eof37;
+case 37:
+       switch( (*p) ) {
+               case 33: goto st37;
+               case 41: goto st37;
+               case 44: goto st37;
+               case 46: goto st37;
+               case 61: goto tr44;
+               case 63: goto st37;
+               case 95: goto tr44;
+               case 126: goto tr44;
+       }
+       if ( (*p) < 58 ) {
+               if ( 35 <= (*p) && (*p) <= 57 )
+                       goto tr44;
+       } else if ( (*p) > 59 ) {
+               if ( (*p) > 90 ) {
+                       if ( 97 <= (*p) && (*p) <= 122 )
+                               goto tr44;
+               } else if ( (*p) >= 64 )
+                       goto tr44;
+       } else
+               goto st37;
+       goto tr42;
+tr95:
+#line 1 "wikitext_ragel.rl"
+       {te = p+1;}
+#line 218 "wikitext_ragel.rl"
+       {act = 12;}
+       goto st58;
+tr98:
+#line 1 "wikitext_ragel.rl"
+       {te = p+1;}
+#line 320 "wikitext_ragel.rl"
+       {act = 28;}
+       goto st58;
+st58:
+       if ( ++p == pe )
+               goto _test_eof58;
+case 58:
+#line 1352 "wikitext_ragel.c"
+       switch( (*p) ) {
+               case 33: goto tr98;
+               case 35: goto tr44;
+               case 40: goto tr95;
+               case 41: goto tr98;
+               case 44: goto tr98;
+               case 46: goto tr98;
+               case 61: goto tr44;
+               case 63: goto tr98;
+               case 92: goto st41;
+               case 94: goto st41;
+               case 95: goto tr95;
+               case 123: goto st41;
+               case 126: goto tr95;
+       }
+       if ( (*p) < 43 ) {
+               if ( (*p) > 37 ) {
+                       if ( 38 <= (*p) && (*p) <= 42 )
+                               goto tr44;
+               } else if ( (*p) >= 36 )
+                       goto tr95;
+       } else if ( (*p) > 57 ) {
+               if ( (*p) < 64 ) {
+                       if ( 58 <= (*p) && (*p) <= 59 )
+                               goto tr98;
+               } else if ( (*p) > 90 ) {
+                       if ( 97 <= (*p) && (*p) <= 122 )
+                               goto tr95;
+               } else
+                       goto tr95;
+       } else
+               goto tr95;
+       goto tr97;
+st59:
+       if ( ++p == pe )
+               goto _test_eof59;
+case 59:
+       switch( (*p) ) {
+               case 33: goto st41;
+               case 84: goto st51;
+               case 92: goto st41;
+               case 116: goto st51;
+               case 126: goto st41;
+       }
+       if ( (*p) < 43 ) {
+               if ( (*p) > 37 ) {
+                       if ( 40 <= (*p) && (*p) <= 41 )
+                               goto st41;
+               } else if ( (*p) >= 36 )
+                       goto st41;
+       } else if ( (*p) > 59 ) {
+               if ( (*p) < 94 ) {
+                       if ( 63 <= (*p) && (*p) <= 90 )
+                               goto st41;
+               } else if ( (*p) > 95 ) {
+                       if ( 97 <= (*p) && (*p) <= 123 )
+                               goto st41;
+               } else
+                       goto st41;
+       } else
+               goto st41;
+       goto tr72;
+st60:
+       if ( ++p == pe )
+               goto _test_eof60;
+case 60:
+       switch( (*p) ) {
+               case 33: goto st41;
+               case 86: goto st61;
+               case 92: goto st41;
+               case 118: goto st61;
+               case 126: goto st41;
+       }
+       if ( (*p) < 43 ) {
+               if ( (*p) > 37 ) {
+                       if ( 40 <= (*p) && (*p) <= 41 )
+                               goto st41;
+               } else if ( (*p) >= 36 )
+                       goto st41;
+       } else if ( (*p) > 59 ) {
+               if ( (*p) < 94 ) {
+                       if ( 63 <= (*p) && (*p) <= 90 )
+                               goto st41;
+               } else if ( (*p) > 95 ) {
+                       if ( 97 <= (*p) && (*p) <= 123 )
+                               goto st41;
+               } else
+                       goto st41;
+       } else
+               goto st41;
+       goto tr72;
+st61:
+       if ( ++p == pe )
+               goto _test_eof61;
+case 61:
+       switch( (*p) ) {
+               case 33: goto st41;
+               case 78: goto st53;
+               case 92: goto st41;
+               case 110: goto st53;
+               case 126: goto st41;
+       }
+       if ( (*p) < 43 ) {
+               if ( (*p) > 37 ) {
+                       if ( 40 <= (*p) && (*p) <= 41 )
+                               goto st41;
+               } else if ( (*p) >= 36 )
+                       goto st41;
+       } else if ( (*p) > 59 ) {
+               if ( (*p) < 94 ) {
+                       if ( 63 <= (*p) && (*p) <= 90 )
+                               goto st41;
+               } else if ( (*p) > 95 ) {
+                       if ( 97 <= (*p) && (*p) <= 123 )
+                               goto st41;
+               } else
+                       goto st41;
+       } else
+               goto st41;
+       goto tr72;
+st62:
+       if ( ++p == pe )
+               goto _test_eof62;
+case 62:
+       if ( (*p) == 91 )
+               goto tr101;
+       goto tr100;
+st63:
+       if ( ++p == pe )
+               goto _test_eof63;
+case 63:
+       if ( (*p) == 93 )
+               goto tr103;
+       goto tr102;
        }
+       _test_eof38: cs = 38; goto _test_eof; 
+       _test_eof1: cs = 1; goto _test_eof; 
+       _test_eof2: cs = 2; goto _test_eof; 
+       _test_eof3: cs = 3; goto _test_eof; 
+       _test_eof4: cs = 4; goto _test_eof; 
+       _test_eof5: cs = 5; goto _test_eof; 
+       _test_eof6: cs = 6; goto _test_eof; 
+       _test_eof39: cs = 39; goto _test_eof; 
+       _test_eof40: cs = 40; goto _test_eof; 
+       _test_eof41: cs = 41; goto _test_eof; 
+       _test_eof42: cs = 42; goto _test_eof; 
+       _test_eof7: cs = 7; goto _test_eof; 
+       _test_eof8: cs = 8; goto _test_eof; 
+       _test_eof9: cs = 9; goto _test_eof; 
+       _test_eof10: cs = 10; goto _test_eof; 
+       _test_eof11: cs = 11; goto _test_eof; 
+       _test_eof12: cs = 12; goto _test_eof; 
+       _test_eof13: cs = 13; goto _test_eof; 
+       _test_eof14: cs = 14; goto _test_eof; 
+       _test_eof15: cs = 15; goto _test_eof; 
+       _test_eof16: cs = 16; goto _test_eof; 
+       _test_eof17: cs = 17; goto _test_eof; 
+       _test_eof18: cs = 18; goto _test_eof; 
+       _test_eof19: cs = 19; goto _test_eof; 
+       _test_eof43: cs = 43; goto _test_eof; 
+       _test_eof44: cs = 44; goto _test_eof; 
+       _test_eof45: cs = 45; goto _test_eof; 
+       _test_eof46: cs = 46; goto _test_eof; 
+       _test_eof47: cs = 47; goto _test_eof; 
+       _test_eof20: cs = 20; goto _test_eof; 
+       _test_eof21: cs = 21; goto _test_eof; 
+       _test_eof22: cs = 22; goto _test_eof; 
+       _test_eof23: cs = 23; goto _test_eof; 
+       _test_eof24: cs = 24; goto _test_eof; 
+       _test_eof25: cs = 25; goto _test_eof; 
+       _test_eof26: cs = 26; goto _test_eof; 
+       _test_eof27: cs = 27; goto _test_eof; 
+       _test_eof28: cs = 28; goto _test_eof; 
+       _test_eof29: cs = 29; goto _test_eof; 
+       _test_eof30: cs = 30; goto _test_eof; 
+       _test_eof31: cs = 31; goto _test_eof; 
+       _test_eof32: cs = 32; goto _test_eof; 
+       _test_eof33: cs = 33; goto _test_eof; 
+       _test_eof34: cs = 34; goto _test_eof; 
+       _test_eof35: cs = 35; goto _test_eof; 
+       _test_eof36: cs = 36; goto _test_eof; 
+       _test_eof48: cs = 48; goto _test_eof; 
+       _test_eof49: cs = 49; goto _test_eof; 
+       _test_eof50: cs = 50; goto _test_eof; 
+       _test_eof51: cs = 51; goto _test_eof; 
+       _test_eof52: cs = 52; goto _test_eof; 
+       _test_eof53: cs = 53; goto _test_eof; 
+       _test_eof54: cs = 54; goto _test_eof; 
+       _test_eof55: cs = 55; goto _test_eof; 
+       _test_eof56: cs = 56; goto _test_eof; 
+       _test_eof57: cs = 57; goto _test_eof; 
+       _test_eof37: cs = 37; goto _test_eof; 
+       _test_eof58: cs = 58; goto _test_eof; 
+       _test_eof59: cs = 59; goto _test_eof; 
+       _test_eof60: cs = 60; goto _test_eof; 
+       _test_eof61: cs = 61; goto _test_eof; 
+       _test_eof62: cs = 62; goto _test_eof; 
+       _test_eof63: cs = 63; goto _test_eof; 
 
-       if ( cs == 0 )
-               goto _out;
-       if ( ++p != pe )
-               goto _resume;
        _test_eof: {}
        if ( p == eof )
        {
-       if ( _wikitext_eof_trans[cs] > 0 ) {
-               _trans = _wikitext_eof_trans[cs] - 1;
-               goto _eof_trans;
+       switch ( cs ) {
+       case 39: goto tr68;
+       case 40: goto tr70;
+       case 41: goto tr72;
+       case 42: goto tr73;
+       case 7: goto tr7;
+       case 8: goto tr7;
+       case 9: goto tr7;
+       case 10: goto tr7;
+       case 11: goto tr7;
+       case 12: goto tr7;
+       case 13: goto tr7;
+       case 14: goto tr7;
+       case 15: goto tr7;
+       case 16: goto tr7;
+       case 17: goto tr7;
+       case 18: goto tr7;
+       case 19: goto tr7;
+       case 43: goto tr77;
+       case 44: goto tr77;
+       case 45: goto tr77;
+       case 46: goto tr77;
+       case 47: goto tr82;
+       case 20: goto tr23;
+       case 21: goto tr23;
+       case 22: goto tr23;
+       case 23: goto tr23;
+       case 24: goto tr23;
+       case 25: goto tr23;
+       case 26: goto tr23;
+       case 27: goto tr23;
+       case 28: goto tr23;
+       case 29: goto tr23;
+       case 30: goto tr23;
+       case 31: goto tr23;
+       case 32: goto tr23;
+       case 33: goto tr23;
+       case 34: goto tr23;
+       case 35: goto tr23;
+       case 36: goto tr23;
+       case 48: goto tr86;
+       case 49: goto tr86;
+       case 50: goto tr88;
+       case 51: goto tr72;
+       case 52: goto tr72;
+       case 53: goto tr72;
+       case 54: goto tr72;
+       case 55: goto tr72;
+       case 56: goto tr72;
+       case 57: goto tr96;
+       case 37: goto tr42;
+       case 58: goto tr97;
+       case 59: goto tr72;
+       case 60: goto tr72;
+       case 61: goto tr72;
+       case 62: goto tr100;
+       case 63: goto tr102;
        }
        }