wikitext 1.5.1 → 1.5.2

Sign up to get free protection for your applications and to get access to all the features.
data/ext/parser.c CHANGED
@@ -31,6 +31,7 @@ typedef struct
31
31
  VALUE link_target; // short term "memory" for parsing links
32
32
  VALUE link_text; // short term "memory" for parsing links
33
33
  VALUE external_link_class; // CSS class applied to external links
34
+ VALUE mailto_class; // CSS class applied to email (mailto) links
34
35
  VALUE img_prefix; // path prepended when emitting img tags
35
36
  ary_t *scope; // stack for tracking scope
36
37
  ary_t *line; // stack for tracking scope as implied by current line
@@ -220,12 +221,20 @@ VALUE _Wikitext_downcase(VALUE string)
220
221
  return string;
221
222
  }
222
223
 
223
- VALUE _Wikitext_hyperlink(VALUE link_prefix, VALUE link_target, VALUE link_text, VALUE link_class)
224
+ VALUE _Wikitext_hyperlink(parser_t *parser, VALUE link_prefix, VALUE link_target, VALUE link_text, VALUE link_class)
224
225
  {
225
226
  VALUE string = rb_str_new(a_start, sizeof(a_start) - 1); // <a href="
226
227
  if (!NIL_P(link_prefix))
227
228
  rb_str_append(string, link_prefix);
228
229
  rb_str_append(string, link_target);
230
+
231
+ /* special handling for mailto URIs */
232
+ const char *mailto = "mailto:";
233
+ if (NIL_P(link_prefix) &&
234
+ RSTRING_LEN(link_target) >= (long)sizeof(mailto) &&
235
+ strncmp(mailto, RSTRING_PTR(link_target), sizeof(mailto)) == 0)
236
+ link_class = parser->mailto_class; // use mailto_class from parser
237
+
229
238
  if (link_class != Qnil)
230
239
  {
231
240
  rb_str_cat(string, a_class, sizeof(a_class) - 1); // " class="
@@ -457,6 +466,12 @@ void _Wikitext_pop_from_stack_up_to(parser_t *parser, VALUE target, int item, VA
457
466
  } while (continue_looping);
458
467
  }
459
468
 
469
+ void _Wikitext_pop_all_from_stack(parser_t *parser, VALUE target)
470
+ {
471
+ while (!NO_ITEM(ary_entry(parser->scope, -1)))
472
+ _Wikitext_pop_from_stack(parser, target);
473
+ }
474
+
460
475
  void _Wikitext_start_para_if_necessary(parser_t *parser)
461
476
  {
462
477
  if (!NIL_P(parser->capture)) // we don't do anything if in capturing mode
@@ -864,7 +879,7 @@ void _Wikitext_rollback_failed_external_link(parser_t *parser)
864
879
  if (!NIL_P(parser->link_target))
865
880
  {
866
881
  if (parser->autolink == Qtrue)
867
- parser->link_target = _Wikitext_hyperlink(Qnil, parser->link_target, parser->link_target, parser->external_link_class);
882
+ parser->link_target = _Wikitext_hyperlink(parser, Qnil, parser->link_target, parser->link_target, parser->external_link_class);
868
883
  rb_str_append(parser->output, parser->link_target);
869
884
  if (scope_includes_space)
870
885
  {
@@ -989,6 +1004,7 @@ VALUE Wikitext_parser_parse(int argc, VALUE *argv, VALUE self)
989
1004
  parser->link_target = Qnil;
990
1005
  parser->link_text = Qnil;
991
1006
  parser->external_link_class = link_class;
1007
+ parser->mailto_class = mailto_class;
992
1008
  parser->img_prefix = rb_iv_get(self, "@img_prefix");
993
1009
  parser->scope = ary_new();
994
1010
  GC_WRAP_ARY(parser->scope, scope_gc);
@@ -1119,11 +1135,23 @@ VALUE Wikitext_parser_parse(int argc, VALUE *argv, VALUE self)
1119
1135
  }
1120
1136
  else if (IN(BLOCKQUOTE))
1121
1137
  {
1122
- // PRE_START is illegal
1123
- i = NIL_P(parser->capture) ? parser->output : parser->capture;
1124
- _Wikitext_pop_excess_elements(parser);
1125
- _Wikitext_start_para_if_necessary(parser);
1126
- rb_str_cat(i, escaped_pre_start, sizeof(escaped_pre_start) - 1);
1138
+ if (token->column_start == 1) // only allowed in first column
1139
+ {
1140
+ _Wikitext_rollback_failed_link(parser); // if any
1141
+ _Wikitext_rollback_failed_external_link(parser); // if any
1142
+ _Wikitext_pop_all_from_stack(parser, Qnil);
1143
+ _Wikitext_indent(parser);
1144
+ rb_str_cat(parser->output, pre_start, sizeof(pre_start) - 1);
1145
+ ary_push(parser->scope, PRE_START);
1146
+ ary_push(parser->line, PRE_START);
1147
+ }
1148
+ else // PRE_START illegal here
1149
+ {
1150
+ i = NIL_P(parser->capture) ? parser->output : parser->capture;
1151
+ _Wikitext_pop_excess_elements(parser);
1152
+ _Wikitext_start_para_if_necessary(parser);
1153
+ rb_str_cat(i, escaped_pre_start, sizeof(escaped_pre_start) - 1);
1154
+ }
1127
1155
  }
1128
1156
  else
1129
1157
  {
@@ -1230,11 +1258,24 @@ VALUE Wikitext_parser_parse(int argc, VALUE *argv, VALUE self)
1230
1258
  }
1231
1259
  else if (IN(BLOCKQUOTE))
1232
1260
  {
1233
- // illegal here
1234
- i = NIL_P(parser->capture) ? parser->output : parser->capture;
1235
- _Wikitext_pop_excess_elements(parser);
1236
- _Wikitext_start_para_if_necessary(parser);
1237
- rb_str_cat(i, escaped_blockquote_start, sizeof(escaped_blockquote_start) - 1);
1261
+ if (token->column_start == 1) // only allowed in first column
1262
+ {
1263
+ _Wikitext_rollback_failed_link(parser); // if any
1264
+ _Wikitext_rollback_failed_external_link(parser); // if any
1265
+ _Wikitext_pop_all_from_stack(parser, Qnil);
1266
+ _Wikitext_indent(parser);
1267
+ rb_str_cat(parser->output, blockquote_start, sizeof(blockquote_start) - 1);
1268
+ rb_str_cat(parser->output, parser->line_ending->ptr, parser->line_ending->len);
1269
+ ary_push(parser->scope, BLOCKQUOTE_START);
1270
+ ary_push(parser->line, BLOCKQUOTE_START);
1271
+ }
1272
+ else // BLOCKQUOTE_START illegal here
1273
+ {
1274
+ i = NIL_P(parser->capture) ? parser->output : parser->capture;
1275
+ _Wikitext_pop_excess_elements(parser);
1276
+ _Wikitext_start_para_if_necessary(parser);
1277
+ rb_str_cat(i, escaped_blockquote_start, sizeof(escaped_blockquote_start) - 1);
1278
+ }
1238
1279
  }
1239
1280
  else
1240
1281
  {
@@ -1884,7 +1925,7 @@ VALUE Wikitext_parser_parse(int argc, VALUE *argv, VALUE self)
1884
1925
  _Wikitext_start_para_if_necessary(parser);
1885
1926
  i = TOKEN_TEXT(token);
1886
1927
  if (parser->autolink == Qtrue)
1887
- i = _Wikitext_hyperlink(rb_str_new2("mailto:"), i, i, mailto_class);
1928
+ i = _Wikitext_hyperlink(parser, rb_str_new2("mailto:"), i, i, mailto_class);
1888
1929
  rb_str_append(parser->output, i);
1889
1930
  }
1890
1931
  break;
@@ -1900,7 +1941,7 @@ VALUE Wikitext_parser_parse(int argc, VALUE *argv, VALUE self)
1900
1941
  _Wikitext_rollback_failed_link(parser);
1901
1942
  i = TOKEN_TEXT(token);
1902
1943
  if (parser->autolink == Qtrue)
1903
- i = _Wikitext_hyperlink(Qnil, i, i, parser->external_link_class); // link target, link text
1944
+ i = _Wikitext_hyperlink(parser, Qnil, i, i, parser->external_link_class); // link target, link text
1904
1945
  rb_str_append(parser->output, i);
1905
1946
  }
1906
1947
  else if (IN(EXT_LINK_START))
@@ -1926,7 +1967,7 @@ VALUE Wikitext_parser_parse(int argc, VALUE *argv, VALUE self)
1926
1967
  _Wikitext_start_para_if_necessary(parser);
1927
1968
  rb_str_cat(parser->output, ext_link_start, sizeof(ext_link_start) - 1);
1928
1969
  if (parser->autolink == Qtrue)
1929
- i = _Wikitext_hyperlink(Qnil, i, i, parser->external_link_class); // link target, link text
1970
+ i = _Wikitext_hyperlink(parser, Qnil, i, i, parser->external_link_class); // link target, link text
1930
1971
  rb_str_append(parser->output, i);
1931
1972
  }
1932
1973
  }
@@ -1947,7 +1988,7 @@ VALUE Wikitext_parser_parse(int argc, VALUE *argv, VALUE self)
1947
1988
  _Wikitext_start_para_if_necessary(parser);
1948
1989
  i = TOKEN_TEXT(token);
1949
1990
  if (parser->autolink == Qtrue)
1950
- i = _Wikitext_hyperlink(Qnil, i, i, parser->external_link_class); // link target, link text
1991
+ i = _Wikitext_hyperlink(parser, Qnil, i, i, parser->external_link_class); // link target, link text
1951
1992
  rb_str_append(parser->output, i);
1952
1993
  }
1953
1994
  break;
@@ -2125,7 +2166,7 @@ VALUE Wikitext_parser_parse(int argc, VALUE *argv, VALUE self)
2125
2166
  _Wikitext_parser_encode_link_target(parser);
2126
2167
  _Wikitext_pop_from_stack_up_to(parser, i, LINK_START, Qtrue);
2127
2168
  parser->capture = Qnil;
2128
- i = _Wikitext_hyperlink(prefix, parser->link_target, parser->link_text, Qnil);
2169
+ i = _Wikitext_hyperlink(parser, prefix, parser->link_target, parser->link_text, Qnil);
2129
2170
  rb_str_append(parser->output, i);
2130
2171
  parser->link_target = Qnil;
2131
2172
  parser->link_text = Qnil;
@@ -2209,7 +2250,7 @@ VALUE Wikitext_parser_parse(int argc, VALUE *argv, VALUE self)
2209
2250
  j = IN(PATH) ? Qnil : parser->external_link_class;
2210
2251
  _Wikitext_pop_from_stack_up_to(parser, i, EXT_LINK_START, Qtrue);
2211
2252
  parser->capture = Qnil;
2212
- i = _Wikitext_hyperlink(Qnil, parser->link_target, parser->link_text, j);
2253
+ i = _Wikitext_hyperlink(parser, Qnil, parser->link_target, parser->link_text, j);
2213
2254
  rb_str_append(parser->output, i);
2214
2255
  }
2215
2256
  parser->link_target = Qnil;
data/ext/wikitext_ragel.c CHANGED
@@ -1,3 +1,4 @@
1
+
1
2
  #line 1 "wikitext_ragel.rl"
2
3
  // Copyright 2008-2009 Wincent Colaiuta
3
4
  // This program is free software: you can redistribute it and/or modify
@@ -31,13 +32,14 @@
31
32
  #define NEXT_CHAR() (*(p + 1))
32
33
 
33
34
 
34
- #line 35 "wikitext_ragel.c"
35
+ #line 36 "wikitext_ragel.c"
35
36
  static const int wikitext_start = 94;
36
37
  static const int wikitext_first_final = 94;
37
38
  static const int wikitext_error = 0;
38
39
 
39
40
  static const int wikitext_en_main = 94;
40
41
 
42
+
41
43
  #line 468 "wikitext_ragel.rl"
42
44
 
43
45
 
@@ -81,16 +83,17 @@ void next_token(token_t *out, token_t *last_token, char *p, char *pe)
81
83
  char *te; // token end (scanner)
82
84
  int act; // identity of last patterned matched (scanner)
83
85
 
84
- #line 85 "wikitext_ragel.c"
86
+ #line 87 "wikitext_ragel.c"
85
87
  {
86
88
  cs = wikitext_start;
87
89
  ts = 0;
88
90
  te = 0;
89
91
  act = 0;
90
92
  }
93
+
91
94
  #line 510 "wikitext_ragel.rl"
92
95
 
93
- #line 94 "wikitext_ragel.c"
96
+ #line 97 "wikitext_ragel.c"
94
97
  {
95
98
  if ( p == pe )
96
99
  goto _test_eof;
@@ -213,7 +216,6 @@ tr23:
213
216
  {p++; cs = 94; goto _out;}
214
217
  }
215
218
  break;
216
- default: break;
217
219
  }
218
220
  }
219
221
  goto st94;
@@ -665,7 +667,7 @@ st94:
665
667
  case 94:
666
668
  #line 1 "wikitext_ragel.rl"
667
669
  {ts = p;}
668
- #line 669 "wikitext_ragel.c"
670
+ #line 671 "wikitext_ragel.c"
669
671
  switch( (*p) ) {
670
672
  case 10: goto tr111;
671
673
  case 13: goto tr112;
@@ -786,7 +788,7 @@ st95:
786
788
  if ( ++p == pe )
787
789
  goto _test_eof95;
788
790
  case 95:
789
- #line 790 "wikitext_ragel.c"
791
+ #line 792 "wikitext_ragel.c"
790
792
  if ( (*p) == 10 )
791
793
  goto tr139;
792
794
  goto tr138;
@@ -800,7 +802,7 @@ st96:
800
802
  if ( ++p == pe )
801
803
  goto _test_eof96;
802
804
  case 96:
803
- #line 804 "wikitext_ragel.c"
805
+ #line 806 "wikitext_ragel.c"
804
806
  if ( (*p) == 32 )
805
807
  goto st96;
806
808
  goto tr140;
@@ -846,7 +848,7 @@ st99:
846
848
  if ( ++p == pe )
847
849
  goto _test_eof99;
848
850
  case 99:
849
- #line 850 "wikitext_ragel.c"
851
+ #line 852 "wikitext_ragel.c"
850
852
  switch( (*p) ) {
851
853
  case 35: goto st7;
852
854
  case 97: goto st13;
@@ -1083,7 +1085,7 @@ st104:
1083
1085
  if ( ++p == pe )
1084
1086
  goto _test_eof104;
1085
1087
  case 104:
1086
- #line 1087 "wikitext_ragel.c"
1088
+ #line 1089 "wikitext_ragel.c"
1087
1089
  switch( (*p) ) {
1088
1090
  case 43: goto st98;
1089
1091
  case 45: goto tr121;
@@ -1192,7 +1194,7 @@ st105:
1192
1194
  if ( ++p == pe )
1193
1195
  goto _test_eof105;
1194
1196
  case 105:
1195
- #line 1196 "wikitext_ragel.c"
1197
+ #line 1198 "wikitext_ragel.c"
1196
1198
  if ( (*p) == 46 )
1197
1199
  goto st23;
1198
1200
  if ( (*p) < 65 ) {
@@ -1214,7 +1216,7 @@ st106:
1214
1216
  if ( ++p == pe )
1215
1217
  goto _test_eof106;
1216
1218
  case 106:
1217
- #line 1218 "wikitext_ragel.c"
1219
+ #line 1220 "wikitext_ragel.c"
1218
1220
  if ( (*p) == 46 )
1219
1221
  goto st23;
1220
1222
  if ( (*p) < 65 ) {
@@ -1236,7 +1238,7 @@ st107:
1236
1238
  if ( ++p == pe )
1237
1239
  goto _test_eof107;
1238
1240
  case 107:
1239
- #line 1240 "wikitext_ragel.c"
1241
+ #line 1242 "wikitext_ragel.c"
1240
1242
  if ( (*p) == 46 )
1241
1243
  goto st23;
1242
1244
  if ( (*p) < 65 ) {
@@ -1258,7 +1260,7 @@ st108:
1258
1260
  if ( ++p == pe )
1259
1261
  goto _test_eof108;
1260
1262
  case 108:
1261
- #line 1262 "wikitext_ragel.c"
1263
+ #line 1264 "wikitext_ragel.c"
1262
1264
  if ( (*p) == 46 )
1263
1265
  goto st23;
1264
1266
  if ( (*p) < 65 ) {
@@ -1280,7 +1282,7 @@ st109:
1280
1282
  if ( ++p == pe )
1281
1283
  goto _test_eof109;
1282
1284
  case 109:
1283
- #line 1284 "wikitext_ragel.c"
1285
+ #line 1286 "wikitext_ragel.c"
1284
1286
  switch( (*p) ) {
1285
1287
  case 43: goto st98;
1286
1288
  case 45: goto st98;
@@ -1314,7 +1316,7 @@ st110:
1314
1316
  if ( ++p == pe )
1315
1317
  goto _test_eof110;
1316
1318
  case 110:
1317
- #line 1318 "wikitext_ragel.c"
1319
+ #line 1320 "wikitext_ragel.c"
1318
1320
  switch( (*p) ) {
1319
1321
  case 33: goto st97;
1320
1322
  case 44: goto st97;
@@ -1436,7 +1438,7 @@ st115:
1436
1438
  if ( ++p == pe )
1437
1439
  goto _test_eof115;
1438
1440
  case 115:
1439
- #line 1440 "wikitext_ragel.c"
1441
+ #line 1442 "wikitext_ragel.c"
1440
1442
  switch( (*p) ) {
1441
1443
  case 64: goto st21;
1442
1444
  case 95: goto st20;
@@ -1461,7 +1463,7 @@ st116:
1461
1463
  if ( ++p == pe )
1462
1464
  goto _test_eof116;
1463
1465
  case 116:
1464
- #line 1465 "wikitext_ragel.c"
1466
+ #line 1467 "wikitext_ragel.c"
1465
1467
  switch( (*p) ) {
1466
1468
  case 47: goto st25;
1467
1469
  case 66: goto st55;
@@ -2005,7 +2007,7 @@ st117:
2005
2007
  if ( ++p == pe )
2006
2008
  goto _test_eof117;
2007
2009
  case 117:
2008
- #line 2009 "wikitext_ragel.c"
2010
+ #line 2011 "wikitext_ragel.c"
2009
2011
  switch( (*p) ) {
2010
2012
  case 32: goto st118;
2011
2013
  case 61: goto tr126;
@@ -2028,7 +2030,7 @@ st119:
2028
2030
  if ( ++p == pe )
2029
2031
  goto _test_eof119;
2030
2032
  case 119:
2031
- #line 2032 "wikitext_ragel.c"
2033
+ #line 2034 "wikitext_ragel.c"
2032
2034
  if ( (*p) == 32 )
2033
2035
  goto tr174;
2034
2036
  goto tr173;
@@ -2042,7 +2044,7 @@ st120:
2042
2044
  if ( ++p == pe )
2043
2045
  goto _test_eof120;
2044
2046
  case 120:
2045
- #line 2046 "wikitext_ragel.c"
2047
+ #line 2048 "wikitext_ragel.c"
2046
2048
  switch( (*p) ) {
2047
2049
  case 64: goto st21;
2048
2050
  case 84: goto tr175;
@@ -2071,7 +2073,7 @@ st121:
2071
2073
  if ( ++p == pe )
2072
2074
  goto _test_eof121;
2073
2075
  case 121:
2074
- #line 2075 "wikitext_ragel.c"
2076
+ #line 2077 "wikitext_ragel.c"
2075
2077
  switch( (*p) ) {
2076
2078
  case 64: goto st21;
2077
2079
  case 80: goto tr176;
@@ -2100,7 +2102,7 @@ st122:
2100
2102
  if ( ++p == pe )
2101
2103
  goto _test_eof122;
2102
2104
  case 122:
2103
- #line 2104 "wikitext_ragel.c"
2105
+ #line 2106 "wikitext_ragel.c"
2104
2106
  switch( (*p) ) {
2105
2107
  case 58: goto st84;
2106
2108
  case 64: goto st21;
@@ -2165,7 +2167,7 @@ st123:
2165
2167
  if ( ++p == pe )
2166
2168
  goto _test_eof123;
2167
2169
  case 123:
2168
- #line 2169 "wikitext_ragel.c"
2170
+ #line 2171 "wikitext_ragel.c"
2169
2171
  switch( (*p) ) {
2170
2172
  case 33: goto st87;
2171
2173
  case 41: goto st87;
@@ -2224,7 +2226,7 @@ st124:
2224
2226
  if ( ++p == pe )
2225
2227
  goto _test_eof124;
2226
2228
  case 124:
2227
- #line 2228 "wikitext_ragel.c"
2229
+ #line 2230 "wikitext_ragel.c"
2228
2230
  switch( (*p) ) {
2229
2231
  case 64: goto st21;
2230
2232
  case 84: goto tr179;
@@ -2253,7 +2255,7 @@ st125:
2253
2255
  if ( ++p == pe )
2254
2256
  goto _test_eof125;
2255
2257
  case 125:
2256
- #line 2257 "wikitext_ragel.c"
2258
+ #line 2259 "wikitext_ragel.c"
2257
2259
  switch( (*p) ) {
2258
2260
  case 64: goto st21;
2259
2261
  case 84: goto tr180;
@@ -2282,7 +2284,7 @@ st126:
2282
2284
  if ( ++p == pe )
2283
2285
  goto _test_eof126;
2284
2286
  case 126:
2285
- #line 2286 "wikitext_ragel.c"
2287
+ #line 2288 "wikitext_ragel.c"
2286
2288
  switch( (*p) ) {
2287
2289
  case 64: goto st21;
2288
2290
  case 80: goto tr181;
@@ -2311,7 +2313,7 @@ st127:
2311
2313
  if ( ++p == pe )
2312
2314
  goto _test_eof127;
2313
2315
  case 127:
2314
- #line 2315 "wikitext_ragel.c"
2316
+ #line 2317 "wikitext_ragel.c"
2315
2317
  switch( (*p) ) {
2316
2318
  case 58: goto st84;
2317
2319
  case 64: goto st21;
@@ -2341,7 +2343,7 @@ st128:
2341
2343
  if ( ++p == pe )
2342
2344
  goto _test_eof128;
2343
2345
  case 128:
2344
- #line 2345 "wikitext_ragel.c"
2346
+ #line 2347 "wikitext_ragel.c"
2345
2347
  switch( (*p) ) {
2346
2348
  case 64: goto st21;
2347
2349
  case 65: goto tr182;
@@ -2370,7 +2372,7 @@ st129:
2370
2372
  if ( ++p == pe )
2371
2373
  goto _test_eof129;
2372
2374
  case 129:
2373
- #line 2374 "wikitext_ragel.c"
2375
+ #line 2376 "wikitext_ragel.c"
2374
2376
  switch( (*p) ) {
2375
2377
  case 64: goto st21;
2376
2378
  case 73: goto tr183;
@@ -2399,7 +2401,7 @@ st130:
2399
2401
  if ( ++p == pe )
2400
2402
  goto _test_eof130;
2401
2403
  case 130:
2402
- #line 2403 "wikitext_ragel.c"
2404
+ #line 2405 "wikitext_ragel.c"
2403
2405
  switch( (*p) ) {
2404
2406
  case 64: goto st21;
2405
2407
  case 76: goto tr184;
@@ -2428,7 +2430,7 @@ st131:
2428
2430
  if ( ++p == pe )
2429
2431
  goto _test_eof131;
2430
2432
  case 131:
2431
- #line 2432 "wikitext_ragel.c"
2433
+ #line 2434 "wikitext_ragel.c"
2432
2434
  switch( (*p) ) {
2433
2435
  case 64: goto st21;
2434
2436
  case 84: goto tr185;
@@ -2457,7 +2459,7 @@ st132:
2457
2459
  if ( ++p == pe )
2458
2460
  goto _test_eof132;
2459
2461
  case 132:
2460
- #line 2461 "wikitext_ragel.c"
2462
+ #line 2463 "wikitext_ragel.c"
2461
2463
  switch( (*p) ) {
2462
2464
  case 64: goto st21;
2463
2465
  case 79: goto tr186;
@@ -2486,7 +2488,7 @@ st133:
2486
2488
  if ( ++p == pe )
2487
2489
  goto _test_eof133;
2488
2490
  case 133:
2489
- #line 2490 "wikitext_ragel.c"
2491
+ #line 2492 "wikitext_ragel.c"
2490
2492
  switch( (*p) ) {
2491
2493
  case 58: goto st88;
2492
2494
  case 64: goto st21;
@@ -2608,7 +2610,7 @@ st134:
2608
2610
  if ( ++p == pe )
2609
2611
  goto _test_eof134;
2610
2612
  case 134:
2611
- #line 2612 "wikitext_ragel.c"
2613
+ #line 2614 "wikitext_ragel.c"
2612
2614
  if ( (*p) == 46 )
2613
2615
  goto st92;
2614
2616
  if ( (*p) < 65 ) {
@@ -2630,7 +2632,7 @@ st135:
2630
2632
  if ( ++p == pe )
2631
2633
  goto _test_eof135;
2632
2634
  case 135:
2633
- #line 2634 "wikitext_ragel.c"
2635
+ #line 2636 "wikitext_ragel.c"
2634
2636
  if ( (*p) == 46 )
2635
2637
  goto st92;
2636
2638
  if ( (*p) < 65 ) {
@@ -2652,7 +2654,7 @@ st136:
2652
2654
  if ( ++p == pe )
2653
2655
  goto _test_eof136;
2654
2656
  case 136:
2655
- #line 2656 "wikitext_ragel.c"
2657
+ #line 2658 "wikitext_ragel.c"
2656
2658
  if ( (*p) == 46 )
2657
2659
  goto st92;
2658
2660
  if ( (*p) < 65 ) {
@@ -2674,7 +2676,7 @@ st137:
2674
2676
  if ( ++p == pe )
2675
2677
  goto _test_eof137;
2676
2678
  case 137:
2677
- #line 2678 "wikitext_ragel.c"
2679
+ #line 2680 "wikitext_ragel.c"
2678
2680
  if ( (*p) == 46 )
2679
2681
  goto st92;
2680
2682
  if ( (*p) < 65 ) {
@@ -2696,7 +2698,7 @@ st138:
2696
2698
  if ( ++p == pe )
2697
2699
  goto _test_eof138;
2698
2700
  case 138:
2699
- #line 2700 "wikitext_ragel.c"
2701
+ #line 2702 "wikitext_ragel.c"
2700
2702
  switch( (*p) ) {
2701
2703
  case 64: goto st21;
2702
2704
  case 86: goto tr191;
@@ -2725,7 +2727,7 @@ st139:
2725
2727
  if ( ++p == pe )
2726
2728
  goto _test_eof139;
2727
2729
  case 139:
2728
- #line 2729 "wikitext_ragel.c"
2730
+ #line 2731 "wikitext_ragel.c"
2729
2731
  switch( (*p) ) {
2730
2732
  case 64: goto st21;
2731
2733
  case 78: goto tr176;
@@ -3062,6 +3064,7 @@ case 143:
3062
3064
 
3063
3065
  _out: {}
3064
3066
  }
3067
+
3065
3068
  #line 511 "wikitext_ragel.rl"
3066
3069
  if (cs == wikitext_error)
3067
3070
  rb_raise(eWikitextParserError, "failed before finding a token");
@@ -13,5 +13,5 @@
13
13
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
14
14
 
15
15
  module Wikitext
16
- VERSION = '1.5.1'
16
+ VERSION = '1.5.2'
17
17
  end # module Wikitext
data/rails/init.rb CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright 2008 Wincent Colaiuta
1
+ # Copyright 2008-2009 Wincent Colaiuta
2
2
  # This program is free software: you can redistribute it and/or modify
3
3
  # it under the terms of the GNU General Public License as published by
4
4
  # the Free Software Foundation, either version 3 of the License, or
@@ -12,6 +12,10 @@
12
12
  # You should have received a copy of the GNU General Public License
13
13
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
14
14
 
15
- require 'wikitext/nil_class'
16
- require 'wikitext/string'
17
- require 'wikitext/rails'
15
+ # Avoid Rails bug #2266 by not requiring during "rake gems:build"
16
+ # See: https://rails.lighthouseapp.com/projects/8994/tickets/2266
17
+ unless $gems_build_rake_task
18
+ require 'wikitext/nil_class'
19
+ require 'wikitext/string'
20
+ require 'wikitext/rails'
21
+ end
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
- # Copyright 2007-2008 Wincent Colaiuta
2
+ # Copyright 2007-2009 Wincent Colaiuta
3
3
  # This program is free software: you can redistribute it and/or modify
4
4
  # it under the terms of the GNU General Public License as published by
5
5
  # the Free Software Foundation, either version 3 of the License, or
@@ -43,7 +43,7 @@ describe Wikitext::Parser, 'autolinking' do
43
43
 
44
44
  it 'should convert mailto URIs into hyperlinks' do
45
45
  uri = 'mailto:user@example.com'
46
- @parser.parse(uri).should == %Q{<p><a href="mailto:user@example.com" class="external">mailto:user@example.com</a></p>\n}
46
+ @parser.parse(uri).should == %Q{<p><a href="mailto:user@example.com" class="mailto">mailto:user@example.com</a></p>\n}
47
47
  end
48
48
 
49
49
  it 'should convert SVN URIs into hyperlinks' do
@@ -81,18 +81,30 @@ describe Wikitext::Parser, 'autolinking' do
81
81
  @parser.parse(uri).should == %Q{<p><a href="mailto:user@example.com" class="mailto">user@example.com</a></p>\n}
82
82
  end
83
83
 
84
- it 'should apply the mailto CSS class if set' do
84
+ it 'should apply the mailto CSS class if set (raw address)' do
85
85
  uri = 'user@example.com'
86
86
  @parser.mailto_class = 'foo'
87
87
  @parser.parse(uri).should == %Q{<p><a href="mailto:user@example.com" class="foo">user@example.com</a></p>\n}
88
88
  end
89
89
 
90
- it 'should apply no CSS if the mailto class is set to nil' do
90
+ it 'should apply the mailto CSS class if set (mailto URI)' do
91
+ uri = 'mailto:user@example.com'
92
+ @parser.mailto_class = 'foo'
93
+ @parser.parse(uri).should == %Q{<p><a href="mailto:user@example.com" class="foo">mailto:user@example.com</a></p>\n}
94
+ end
95
+
96
+ it 'should apply no CSS if the mailto class is set to nil (raw address)' do
91
97
  uri = 'user@example.com'
92
98
  @parser.mailto_class = nil
93
99
  @parser.parse(uri).should == %Q{<p><a href="mailto:user@example.com">user@example.com</a></p>\n}
94
100
  end
95
101
 
102
+ it 'should apply no CSS if the mailto class is set to nil (mailto URI)' do
103
+ uri = 'mailto:user@example.com'
104
+ @parser.mailto_class = nil
105
+ @parser.parse(uri).should == %Q{<p><a href="mailto:user@example.com">mailto:user@example.com</a></p>\n}
106
+ end
107
+
96
108
  it 'should pass through emails unchanged inside <nowiki></nowiki> spans' do
97
109
  @parser.parse("<nowiki>user@example.com</nowiki>").should == "<p>user@example.com</p>\n" # was a crasher
98
110
  end
@@ -476,37 +488,37 @@ describe Wikitext::Parser, 'autolinking' do
476
488
  describe 'after "mailto:" URIs' do
477
489
  it 'should terminate if followed by a period' do
478
490
  input = 'Try mailto:user@example.com.'
479
- expected = %Q{<p>Try <a href="mailto:user@example.com" class="external">mailto:user@example.com</a>.</p>\n}
491
+ expected = %Q{<p>Try <a href="mailto:user@example.com" class="mailto">mailto:user@example.com</a>.</p>\n}
480
492
  @parser.parse(input).should == expected
481
493
  end
482
494
 
483
495
  it 'should not terminate on periods that occur within the URI' do
484
496
  input = 'Try mailto:user.name@example.com.'
485
- expected = %Q{<p>Try <a href="mailto:user.name@example.com" class="external">mailto:user.name@example.com</a>.</p>\n}
497
+ expected = %Q{<p>Try <a href="mailto:user.name@example.com" class="mailto">mailto:user.name@example.com</a>.</p>\n}
486
498
  @parser.parse(input).should == expected
487
499
  end
488
500
 
489
501
  it 'should terminate if followed by a colon' do
490
502
  input = 'Try mailto:user@example.com:'
491
- expected = %Q{<p>Try <a href="mailto:user@example.com" class="external">mailto:user@example.com</a>:</p>\n}
503
+ expected = %Q{<p>Try <a href="mailto:user@example.com" class="mailto">mailto:user@example.com</a>:</p>\n}
492
504
  @parser.parse(input).should == expected
493
505
  end
494
506
 
495
507
  it 'should terminate if followed by a comma' do
496
508
  input = 'Try mailto:user@example.com,'
497
- expected = %Q{<p>Try <a href="mailto:user@example.com" class="external">mailto:user@example.com</a>,</p>\n}
509
+ expected = %Q{<p>Try <a href="mailto:user@example.com" class="mailto">mailto:user@example.com</a>,</p>\n}
498
510
  @parser.parse(input).should == expected
499
511
  end
500
512
 
501
513
  it 'should terminate if followed by an exclamation mark' do
502
514
  input = 'Try mailto:user@example.com!'
503
- expected = %Q{<p>Try <a href="mailto:user@example.com" class="external">mailto:user@example.com</a>!</p>\n}
515
+ expected = %Q{<p>Try <a href="mailto:user@example.com" class="mailto">mailto:user@example.com</a>!</p>\n}
504
516
  @parser.parse(input).should == expected
505
517
  end
506
518
 
507
519
  it 'should terminate if followed by a question mark' do
508
520
  input = 'Try mailto:user@example.com?'
509
- expected = %Q{<p>Try <a href="mailto:user@example.com" class="external">mailto:user@example.com</a>?</p>\n}
521
+ expected = %Q{<p>Try <a href="mailto:user@example.com" class="mailto">mailto:user@example.com</a>?</p>\n}
510
522
  @parser.parse(input).should == expected
511
523
  end
512
524
 
@@ -520,13 +532,13 @@ describe Wikitext::Parser, 'autolinking' do
520
532
 
521
533
  it 'should terminate if followed by a semi-colon' do
522
534
  input = 'Try mailto:user@example.com;'
523
- expected = %Q{<p>Try <a href="mailto:user@example.com" class="external">mailto:user@example.com</a>;</p>\n}
535
+ expected = %Q{<p>Try <a href="mailto:user@example.com" class="mailto">mailto:user@example.com</a>;</p>\n}
524
536
  @parser.parse(input).should == expected
525
537
  end
526
538
 
527
539
  it 'should terminate if followed by a right parenthesis' do
528
540
  input = '(Try mailto:user@example.com)'
529
- expected = %Q{<p>(Try <a href="mailto:user@example.com" class="external">mailto:user@example.com</a>)</p>\n}
541
+ expected = %Q{<p>(Try <a href="mailto:user@example.com" class="mailto">mailto:user@example.com</a>)</p>\n}
530
542
  @parser.parse(input).should == expected
531
543
  end
532
544
  end
@@ -43,12 +43,15 @@ describe Wikitext::Parser, 'external links' do
43
43
  end
44
44
 
45
45
  it 'should format valid external mailto links' do
46
- # although note in this case the CSS class is "external" rather than "mailto"
47
- # this is because we're matching this as a (generic) URI rather than an email address
48
- expected = %Q{<p><a href="mailto:user@example.com" class="external">john</a></p>\n}
46
+ expected = %Q{<p><a href="mailto:user@example.com" class="mailto">john</a></p>\n}
49
47
  @parser.parse('[mailto:user@example.com john]').should == expected
50
48
  end
51
49
 
50
+ it 'should not treat raw email addresses as valid link targets' do
51
+ expected = %Q{<p>[<a href="mailto:user@example.com" class="mailto">user@example.com</a> john]</p>\n}
52
+ @parser.parse('[user@example.com john]').should == expected
53
+ end
54
+
52
55
  it 'should format absolute path links' do
53
56
  expected = %Q{<p><a href="/foo/bar">fb</a></p>\n} # note no "external" class
54
57
  @parser.parse('[/foo/bar fb]').should == expected
@@ -763,4 +763,76 @@ describe Wikitext::Parser, 'regressions' do
763
763
  END
764
764
  @parser.parse(input).should == expected
765
765
  end
766
+
767
+ # https://wincent.com/issues/818
768
+ it 'should handle BLOCKQUOTE_START blocks which follow BLOCKQUOTE shorthand' do
769
+ input = dedent <<-END
770
+ > foo
771
+ <blockquote>bar</blockquote>
772
+ END
773
+ expected = dedent <<-END
774
+ <blockquote>
775
+ <p>foo</p>
776
+ </blockquote>
777
+ <blockquote>
778
+ <p>bar</p>
779
+ </blockquote>
780
+ END
781
+ @parser.parse(input).should == expected
782
+ end
783
+
784
+ # https://wincent.com/issues/818
785
+ it 'should handle PRE_START blocks which follow BLOCKQUOTE shorthand' do
786
+ input = dedent <<-END
787
+ > foo
788
+ <pre>bar</pre>
789
+ END
790
+ expected = dedent <<-END
791
+ <blockquote>
792
+ <p>foo</p>
793
+ </blockquote>
794
+ <pre>bar</pre>
795
+ END
796
+ @parser.parse(input).should == expected
797
+ end
798
+
799
+ # https://wincent.com/issues/818
800
+ it 'should handle BLOCKQUOTE_START blocks which follow nested BLOCKQUOTE shorthand' do
801
+ input = dedent <<-END
802
+ >>> foo
803
+ <blockquote>bar</blockquote>
804
+ END
805
+ expected = dedent <<-END
806
+ <blockquote>
807
+ <blockquote>
808
+ <blockquote>
809
+ <p>foo</p>
810
+ </blockquote>
811
+ </blockquote>
812
+ </blockquote>
813
+ <blockquote>
814
+ <p>bar</p>
815
+ </blockquote>
816
+ END
817
+ @parser.parse(input).should == expected
818
+ end
819
+
820
+ # https://wincent.com/issues/818
821
+ it 'should handle PRE_START blocks which follow nested BLOCKQUOTE shorthand' do
822
+ input = dedent <<-END
823
+ >>> foo
824
+ <pre>bar</pre>
825
+ END
826
+ expected = dedent <<-END
827
+ <blockquote>
828
+ <blockquote>
829
+ <blockquote>
830
+ <p>foo</p>
831
+ </blockquote>
832
+ </blockquote>
833
+ </blockquote>
834
+ <pre>bar</pre>
835
+ END
836
+ @parser.parse(input).should == expected
837
+ end
766
838
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wikitext
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.1
4
+ version: 1.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wincent Colaiuta
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-03-17 00:00:00 +01:00
12
+ date: 2009-03-27 00:00:00 +01:00
13
13
  default_executable:
14
14
  dependencies: []
15
15