redcarpet 1.14.2 → 1.15.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of redcarpet might be problematic. Click here for more details.

@@ -40,7 +40,7 @@ markdown = Redcarpet.new("Hello World!")
40
40
  puts markdown.to_html
41
41
  ~~~~~~
42
42
 
43
- Additional processing options can be turned on when creating the
43
+ [Additional processing options](http://rdoc.info/github/tanoku/redcarpet/master/Redcarpet#autolink-instance_method) can be turned on when creating the
44
44
  Redcarpet object:
45
45
 
46
46
  ~~~~~~ {ruby}
@@ -57,7 +57,9 @@ and behavior as the RDiscount library, which acts as a drop-in replacement.
57
57
  License
58
58
  -------
59
59
 
60
- Permission to use, copy, modify, and distribute this software for any
60
+ Copyright (c) 2011, Vicent Martí
61
+
62
+ Permission to use, copy, modify, and/or distribute this software for any
61
63
  purpose with or without fee is hereby granted, provided that the above
62
64
  copyright notice and this permission notice appear in all copies.
63
65
 
@@ -21,7 +21,6 @@
21
21
 
22
22
  #include <stdlib.h>
23
23
 
24
-
25
24
  /********************
26
25
  * TYPE DEFINITIONS *
27
26
  ********************/
@@ -21,6 +21,13 @@
21
21
 
22
22
  #include <stddef.h>
23
23
 
24
+ #if defined(_MSC_VER)
25
+ #define __attribute__(x)
26
+ #define inline
27
+ #define strncasecmp _strnicmp
28
+ #define snprintf _snprintf
29
+ #define va_copy(d,s) ((d) = (s))
30
+ #endif
24
31
 
25
32
  /********************
26
33
  * TYPE DEFINITIONS *
@@ -72,7 +79,7 @@ bufcmp(const struct buf *, const struct buf *);
72
79
  int
73
80
  bufcmps(const struct buf *, const char *);
74
81
 
75
- /* bufprefix * compare the beggining of a buffer with a string */
82
+ /* bufprefix * compare the beginning of a buffer with a string */
76
83
  int
77
84
  bufprefix(const struct buf *buf, const char *prefix);
78
85
 
@@ -22,7 +22,7 @@
22
22
 
23
23
  #include <assert.h>
24
24
  #include <string.h>
25
- #include <strings.h> /* for strncasecmp */
25
+ //#include <strings.h> /* for strncasecmp */
26
26
  #include <ctype.h>
27
27
  #include <stdio.h>
28
28
 
@@ -56,7 +56,9 @@ static size_t char_codespan(struct buf *ob, struct render *rndr, char *data, siz
56
56
  static size_t char_escape(struct buf *ob, struct render *rndr, char *data, size_t offset, size_t size);
57
57
  static size_t char_entity(struct buf *ob, struct render *rndr, char *data, size_t offset, size_t size);
58
58
  static size_t char_langle_tag(struct buf *ob, struct render *rndr, char *data, size_t offset, size_t size);
59
- static size_t char_autolink(struct buf *ob, struct render *rndr, char *data, size_t offset, size_t size);
59
+ static size_t char_autolink_url(struct buf *ob, struct render *rndr, char *data, size_t offset, size_t size);
60
+ static size_t char_autolink_email(struct buf *ob, struct render *rndr, char *data, size_t offset, size_t size);
61
+ static size_t char_autolink_www(struct buf *ob, struct render *rndr, char *data, size_t offset, size_t size);
60
62
  static size_t char_link(struct buf *ob, struct render *rndr, char *data, size_t offset, size_t size);
61
63
 
62
64
  enum markdown_char_t {
@@ -68,7 +70,9 @@ enum markdown_char_t {
68
70
  MD_CHAR_LANGLE,
69
71
  MD_CHAR_ESCAPE,
70
72
  MD_CHAR_ENTITITY,
71
- MD_CHAR_AUTOLINK,
73
+ MD_CHAR_AUTOLINK_URL,
74
+ MD_CHAR_AUTOLINK_EMAIL,
75
+ MD_CHAR_AUTOLINK_WWW
72
76
  };
73
77
 
74
78
  static char_trigger markdown_char_ptrs[] = {
@@ -80,7 +84,9 @@ static char_trigger markdown_char_ptrs[] = {
80
84
  &char_langle_tag,
81
85
  &char_escape,
82
86
  &char_entity,
83
- &char_autolink,
87
+ &char_autolink_url,
88
+ &char_autolink_email,
89
+ &char_autolink_www,
84
90
  };
85
91
 
86
92
  /* render • structure containing one particular render */
@@ -142,12 +148,22 @@ static struct html_tag block_tags[] = {
142
148
  /*10*/ { "del", 3 },
143
149
  { "div", 3 },
144
150
  /*12*/ { "ins", 3 },
151
+ { "nav", 3 },
145
152
  { "pre", 3 },
153
+ { "abbr", 4 },
146
154
  { "form", 4 },
147
155
  { "math", 4 },
156
+ { "aside", 5 },
148
157
  { "table", 5 },
158
+ { "canvas", 6 },
159
+ { "figure", 6 },
160
+ { "footer", 6 },
161
+ { "header", 6 },
162
+ { "hgroup", 6 },
149
163
  { "iframe", 6 },
150
164
  { "script", 6 },
165
+ { "article", 7 },
166
+ { "section", 7 },
151
167
  { "fieldset", 8 },
152
168
  { "noscript", 8 },
153
169
  { "blockquote", 10 }
@@ -224,7 +240,7 @@ cmp_html_tag(const void *a, const void *b)
224
240
  {
225
241
  const struct html_tag *hta = a;
226
242
  const struct html_tag *htb = b;
227
- if (hta->size != htb->size) return (int)((ssize_t)hta->size - (ssize_t)htb->size);
243
+ if (hta->size != htb->size) return (int)(hta->size - htb->size);
228
244
  return strncasecmp(hta->text, htb->text, hta->size);
229
245
  }
230
246
 
@@ -306,7 +322,7 @@ tag_length(char *data, size_t size, enum mkd_autolink *autolink)
306
322
  /* scheme test */
307
323
  *autolink = MKDA_NOT_AUTOLINK;
308
324
 
309
- /* try to find the beggining of an URI */
325
+ /* try to find the beginning of an URI */
310
326
  while (i < size && (isalnum(data[i]) || data[i] == '.' || data[i] == '+' || data[i] == '-'))
311
327
  i++;
312
328
 
@@ -357,7 +373,7 @@ parse_inline(struct buf *ob, struct render *rndr, char *data, size_t size)
357
373
  struct buf work = { 0, 0, 0, 0, 0 };
358
374
 
359
375
  if (rndr->work_bufs[BUFFER_SPAN].size +
360
- rndr->work_bufs[BUFFER_BLOCK].size > rndr->max_nesting)
376
+ rndr->work_bufs[BUFFER_BLOCK].size > (int)rndr->max_nesting)
361
377
  return;
362
378
 
363
379
  while (i < size) {
@@ -670,7 +686,7 @@ char_escape(struct buf *ob, struct render *rndr, char *data, size_t offset, size
670
686
  }
671
687
 
672
688
  /* char_entity • '&' escaped when it doesn't belong to an entity */
673
- /* valid entities are assumed to be anything mathing &#?[A-Za-z0-9]+; */
689
+ /* valid entities are assumed to be anything matching &#?[A-Za-z0-9]+; */
674
690
  static size_t
675
691
  char_entity(struct buf *ob, struct render *rndr, char *data, size_t offset, size_t size)
676
692
  {
@@ -725,32 +741,44 @@ char_langle_tag(struct buf *ob, struct render *rndr, char *data, size_t offset,
725
741
  }
726
742
 
727
743
  static size_t
728
- char_autolink(struct buf *ob, struct render *rndr, char *data, size_t offset, size_t size)
744
+ autolink_delim(char *data, size_t link_end, size_t offset, size_t size)
729
745
  {
730
- struct buf work = { data, 0, 0, 0, 0 };
731
746
  char copen = 0;
732
- size_t link_end;
733
747
 
734
- if (offset > 0) {
735
- if (!isspace(data[-1]) && !ispunct(data[-1]))
736
- return 0;
748
+ /* See if the link finishes with a punctuation sign that can be skipped. */
749
+ switch (data[link_end - 1]) {
750
+ case '?':
751
+ case '!':
752
+ case '.':
753
+ case ',':
754
+ link_end--;
755
+ break;
756
+
757
+ case ';':
758
+ {
759
+ size_t new_end = link_end - 2;
760
+
761
+ while (new_end > 0 && isalpha(data[new_end]))
762
+ new_end--;
763
+
764
+ if (new_end < link_end - 2 && data[new_end] == '&')
765
+ link_end = new_end;
766
+ else
767
+ link_end--;
768
+
769
+ break;
737
770
  }
738
771
 
739
- if (!is_safe_link(data, size))
740
- return 0;
772
+ case '>':
773
+ while (link_end > 0 && data[link_end] != '<')
774
+ link_end--;
741
775
 
742
- link_end = 0;
743
- while (link_end < size && !isspace(data[link_end]))
744
- link_end++;
776
+ if (link_end == 0)
777
+ return 0;
745
778
 
746
- /* Skip punctuation at the end of the link */
747
- if ((data[link_end - 1] == '.' ||
748
- data[link_end - 1] == ',' ||
749
- data[link_end - 1] == ';') &&
750
- data[link_end - 2] != '\\')
751
- link_end--;
779
+ break;
780
+ }
752
781
 
753
- /* See if the link finishes with a punctuation sign that can be closed. */
754
782
  switch (data[link_end - 1]) {
755
783
  case '"': copen = '"'; break;
756
784
  case '\'': copen = '\''; break;
@@ -762,8 +790,7 @@ char_autolink(struct buf *ob, struct render *rndr, char *data, size_t offset, si
762
790
  if (copen != 0) {
763
791
  char *buf_start = data - offset;
764
792
  char *buf_end = data + link_end - 2;
765
-
766
- size_t open_delim = 1;
793
+ char *open_delim = NULL;
767
794
 
768
795
  /* Try to close the final punctuation sign in this same line;
769
796
  * if we managed to close it outside of the URL, that means that it's
@@ -785,31 +812,161 @@ char_autolink(struct buf *ob, struct render *rndr, char *data, size_t offset, si
785
812
  * => foo http://www.pokemon.com/Pikachu_(Electric)
786
813
  */
787
814
 
788
- while (buf_end >= buf_start && *buf_end != '\n' && open_delim) {
789
- if (*buf_end == data[link_end - 1])
790
- open_delim++;
791
-
815
+ while (buf_end >= buf_start && *buf_end != '\n') {
792
816
  if (*buf_end == copen)
793
- open_delim--;
817
+ open_delim = buf_end;
794
818
 
795
819
  buf_end--;
796
820
  }
797
821
 
798
- if (open_delim == 0)
822
+ if (open_delim != NULL && open_delim < data)
799
823
  link_end--;
800
824
  }
801
825
 
826
+ return link_end;
827
+ }
828
+
829
+
830
+ static size_t
831
+ char_autolink_www(struct buf *ob, struct render *rndr, char *data, size_t offset, size_t size)
832
+ {
833
+ struct buf work = { 0, 0, 0, 0, 0 };
834
+ size_t link_end;
835
+ int np = 0;
836
+
837
+ if (offset > 0 && !ispunct(data[-1]) && !isspace(data[-1]))
838
+ return 0;
839
+
840
+ if (size < 4 || memcmp(data, "www.", STRLEN("www.")) != 0)
841
+ return 0;
842
+
843
+ link_end = 0;
844
+ while (link_end < size && !isspace(data[link_end])) {
845
+ if (data[link_end] == '.')
846
+ np++;
847
+
848
+ link_end++;
849
+ }
850
+
851
+ if (np < 2)
852
+ return 0;
853
+
854
+ link_end = autolink_delim(data, link_end, offset, size);
855
+
856
+ if (link_end == 0)
857
+ return 0;
858
+
802
859
  work.size = link_end;
860
+ work.data = data;
861
+
862
+ if (rndr->make.link) {
863
+ struct buf *u_link = rndr_newbuf(rndr, BUFFER_SPAN);
864
+ BUFPUTSL(u_link, "http://");
865
+ unscape_text(u_link, &work);
866
+
867
+ rndr->make.link(ob, u_link, NULL, &work, rndr->make.opaque);
868
+ rndr_popbuf(rndr, BUFFER_SPAN);
869
+ }
870
+
871
+ return link_end;
872
+ }
873
+
874
+ static size_t
875
+ char_autolink_email(struct buf *ob, struct render *rndr, char *data, size_t offset, size_t size)
876
+ {
877
+ struct buf work = { 0, 0, 0, 0, 0 };
878
+ size_t link_end, rewind;
879
+ int nb = 0, np = 0;
880
+
881
+ for (rewind = 0; rewind < offset; ++rewind) {
882
+ char c = data[-rewind - 1];
883
+
884
+ if (isalnum(c))
885
+ continue;
886
+
887
+ if (strchr(".!#$%&*+-/=?^_`|~", c) != NULL)
888
+ continue;
889
+
890
+ break;
891
+ }
892
+
893
+ if (rewind == 0)
894
+ return 0;
895
+
896
+ for (link_end = 0; link_end < size; ++link_end) {
897
+ char c = data[link_end];
898
+
899
+ if (isalnum(c))
900
+ continue;
901
+
902
+ if (c == '@')
903
+ nb++;
904
+ else if (c == '.')
905
+ np++;
906
+ else if (c != '-' && c != '_')
907
+ break;
908
+ }
909
+
910
+ if (link_end < 2 || nb != 1 || np == 0)
911
+ return 0;
912
+
913
+ link_end = autolink_delim(data, link_end, offset, size);
914
+
915
+ if (link_end == 0)
916
+ return 0;
917
+
918
+ work.size = link_end + rewind;
919
+ work.data = data - rewind;
920
+
921
+ if (rndr->make.autolink) {
922
+ struct buf *u_link = rndr_newbuf(rndr, BUFFER_SPAN);
923
+ unscape_text(u_link, &work);
924
+
925
+ ob->size -= rewind;
926
+ rndr->make.autolink(ob, u_link, MKDA_EMAIL, rndr->make.opaque);
927
+ rndr_popbuf(rndr, BUFFER_SPAN);
928
+ }
929
+
930
+ return link_end;
931
+ }
932
+
933
+ static size_t
934
+ char_autolink_url(struct buf *ob, struct render *rndr, char *data, size_t offset, size_t size)
935
+ {
936
+ struct buf work = { 0, 0, 0, 0, 0 };
937
+ size_t link_end, rewind = 0;
938
+
939
+ if (size < 4 || data[1] != '/' || data[2] != '/')
940
+ return 0;
941
+
942
+ while (rewind < offset && isalpha(data[-rewind - 1]))
943
+ rewind++;
944
+
945
+ if (!is_safe_link(data - rewind, size + rewind))
946
+ return 0;
947
+
948
+ link_end = 0;
949
+ while (link_end < size && !isspace(data[link_end]))
950
+ link_end++;
951
+
952
+ link_end = autolink_delim(data, link_end, offset, size);
953
+
954
+ if (link_end == 0)
955
+ return 0;
956
+
957
+ work.size = link_end + rewind;
958
+ work.data = data - rewind;
803
959
 
804
960
  if (rndr->make.autolink) {
805
961
  struct buf *u_link = rndr_newbuf(rndr, BUFFER_SPAN);
806
962
  unscape_text(u_link, &work);
807
963
 
964
+ ob->size -= rewind;
808
965
  rndr->make.autolink(ob, u_link, MKDA_NORMAL, rndr->make.opaque);
809
966
  rndr_popbuf(rndr, BUFFER_SPAN);
810
967
  }
811
968
 
812
- return work.size;
969
+ return link_end;
813
970
  }
814
971
 
815
972
  /* char_link • '[': parsing a link or an image */
@@ -1124,7 +1281,7 @@ is_codefence(char *data, size_t size, struct buf *syntax)
1124
1281
  if (i == size || data[i] != '}')
1125
1282
  return 0;
1126
1283
 
1127
- /* strip all whitespace at the beggining and the end
1284
+ /* strip all whitespace at the beginning and the end
1128
1285
  * of the {} block */
1129
1286
  while (syn > 0 && isspace(syntax->data[0])) {
1130
1287
  syntax->data++; syn--;
@@ -1255,7 +1412,7 @@ static void parse_block(struct buf *ob, struct render *rndr,
1255
1412
  char *data, size_t size);
1256
1413
 
1257
1414
 
1258
- /* parse_blockquote • hanldes parsing of a blockquote fragment */
1415
+ /* parse_blockquote • handles parsing of a blockquote fragment */
1259
1416
  static size_t
1260
1417
  parse_blockquote(struct buf *ob, struct render *rndr, char *data, size_t size)
1261
1418
  {
@@ -1300,7 +1457,7 @@ parse_blockquote(struct buf *ob, struct render *rndr, char *data, size_t size)
1300
1457
  static size_t
1301
1458
  parse_htmlblock(struct buf *ob, struct render *rndr, char *data, size_t size, int do_render);
1302
1459
 
1303
- /* parse_blockquote • hanldes parsing of a regular paragraph */
1460
+ /* parse_blockquote • handles parsing of a regular paragraph */
1304
1461
  static size_t
1305
1462
  parse_paragraph(struct buf *ob, struct render *rndr, char *data, size_t size)
1306
1463
  {
@@ -1380,7 +1537,7 @@ parse_paragraph(struct buf *ob, struct render *rndr, char *data, size_t size)
1380
1537
  return end;
1381
1538
  }
1382
1539
 
1383
- /* parse_fencedcode • hanldes parsing of a block-level code fragment */
1540
+ /* parse_fencedcode • handles parsing of a block-level code fragment */
1384
1541
  static size_t
1385
1542
  parse_fencedcode(struct buf *ob, struct render *rndr, char *data, size_t size)
1386
1543
  {
@@ -1474,7 +1631,7 @@ parse_listitem(struct buf *ob, struct render *rndr, char *data, size_t size, int
1474
1631
  size_t beg = 0, end, pre, sublist = 0, orgpre = 0, i;
1475
1632
  int in_empty = 0, has_inside_empty = 0;
1476
1633
 
1477
- /* keeping book of the first indentation prefix */
1634
+ /* keeping track of the first indentation prefix */
1478
1635
  while (orgpre < 3 && orgpre < size && data[orgpre] == ' ')
1479
1636
  orgpre++;
1480
1637
 
@@ -1650,7 +1807,7 @@ htmlblock_end(struct html_tag *tag, struct render *rndr, char *data, size_t size
1650
1807
 
1651
1808
  /* assuming data[0] == '<' && data[1] == '/' already tested */
1652
1809
 
1653
- /* checking tag is a match */
1810
+ /* checking if tag is a match */
1654
1811
  if (tag->size + 3 >= size
1655
1812
  || strncasecmp(data + 2, tag->text, tag->size)
1656
1813
  || data[tag->size + 2] != '>')
@@ -1949,7 +2106,7 @@ parse_block(struct buf *ob, struct render *rndr, char *data, size_t size)
1949
2106
  beg = 0;
1950
2107
 
1951
2108
  if (rndr->work_bufs[BUFFER_SPAN].size +
1952
- rndr->work_bufs[BUFFER_BLOCK].size > rndr->max_nesting)
2109
+ rndr->work_bufs[BUFFER_BLOCK].size > (int)rndr->max_nesting)
1953
2110
  return;
1954
2111
 
1955
2112
  while (beg < size) {
@@ -2187,14 +2344,9 @@ ups_markdown(struct buf *ob, struct buf *ib, const struct mkd_renderer *rndrer,
2187
2344
  rndr.active_char['&'] = MD_CHAR_ENTITITY;
2188
2345
 
2189
2346
  if (extensions & MKDEXT_AUTOLINK) {
2190
- rndr.active_char['h'] = MD_CHAR_AUTOLINK; // http, https
2191
- rndr.active_char['H'] = MD_CHAR_AUTOLINK;
2192
-
2193
- rndr.active_char['f'] = MD_CHAR_AUTOLINK; // ftp
2194
- rndr.active_char['F'] = MD_CHAR_AUTOLINK;
2195
-
2196
- rndr.active_char['m'] = MD_CHAR_AUTOLINK; // mailto
2197
- rndr.active_char['M'] = MD_CHAR_AUTOLINK;
2347
+ rndr.active_char[':'] = MD_CHAR_AUTOLINK_URL;
2348
+ rndr.active_char['@'] = MD_CHAR_AUTOLINK_EMAIL;
2349
+ rndr.active_char['w'] = MD_CHAR_AUTOLINK_WWW;
2198
2350
  }
2199
2351
 
2200
2352
  /* Extension data */
@@ -21,10 +21,10 @@
21
21
 
22
22
  #include "buffer.h"
23
23
 
24
- #define UPSKIRT_VERSION "1.14.2"
24
+ #define UPSKIRT_VERSION "1.15.0"
25
25
  #define UPSKIRT_VER_MAJOR 1
26
- #define UPSKIRT_VER_MINOR 14
27
- #define UPSKIRT_VER_REVISION 2
26
+ #define UPSKIRT_VER_MINOR 15
27
+ #define UPSKIRT_VER_REVISION 0
28
28
 
29
29
  /********************
30
30
  * TYPE DEFINITIONS *
@@ -26,7 +26,7 @@
26
26
  # end
27
27
  #
28
28
  class Redcarpet
29
- VERSION = '1.14.2'
29
+ VERSION = '1.15.0'
30
30
 
31
31
  # Original Markdown formatted text.
32
32
  attr_reader :text
@@ -1,9 +1,9 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'redcarpet'
3
- s.version = '1.14.2'
3
+ s.version = '1.15.0'
4
4
  s.summary = "Ruby bindings for libupskirt"
5
5
  s.description = 'A fast and safe Markdown to (X)HTML parser'
6
- s.date = '2011-05-20'
6
+ s.date = '2011-06-02'
7
7
  s.email = 'vicent@github.com'
8
8
  s.homepage = 'http://github.com/tanoku/redcarpet'
9
9
  s.authors = ["Natacha Porté", "Vicent Martí"]
@@ -30,6 +30,7 @@ Gem::Specification.new do |s|
30
30
  test/benchmark.rb
31
31
  test/benchmark.txt
32
32
  test/markdown_test.rb
33
+ test/rails_test.rb
33
34
  test/redcarpet_test.rb
34
35
  upskirt
35
36
  ]
@@ -0,0 +1,121 @@
1
+ # encoding: utf-8
2
+ rootdir = File.dirname(File.dirname(__FILE__))
3
+ $LOAD_PATH.unshift "#{rootdir}/lib"
4
+
5
+ require 'test/unit'
6
+ require 'cgi'
7
+ require 'redcarpet'
8
+
9
+ class RedcarpetRailsTest < Test::Unit::TestCase
10
+ def assert_linked(expected, url)
11
+ assert_equal "<p>#{expected}</p>", Redcarpet.new(url, :autolink).to_html.strip
12
+ end
13
+
14
+ def test_auto_link_works
15
+ url = "http://example.com/"
16
+ assert_linked "<a href=\"#{url}\">#{url}</a>", url
17
+ end
18
+
19
+ def test_does_not_autolink_www
20
+ assert_linked "Awww... man", "Awww... man"
21
+ end
22
+
23
+ def test_does_not_terminate_on_dash
24
+ url = "http://example.com/Notification_Center-GitHub-20101108-140050.jpg"
25
+ assert_linked "<a href=\"#{url}\">#{url}</a>", url
26
+ end
27
+
28
+ def test_does_not_include_gt
29
+ url = "http://example.com/"
30
+ assert_linked "&lt;<a href=\"#{url}\">#{url}</a>&gt;", "&lt;#{url}&gt;"
31
+ end
32
+
33
+ def test_links_with_anchors
34
+ url = "https://github.com/github/hubot/blob/master/scripts/cream.js#L20-20"
35
+ assert_linked "<a href=\"#{url}\">#{url}</a>", url
36
+ end
37
+
38
+ def test_links_like_rails
39
+ urls = %w(http://www.rubyonrails.com
40
+ http://www.rubyonrails.com:80
41
+ http://www.rubyonrails.com/~minam
42
+ https://www.rubyonrails.com/~minam
43
+ http://www.rubyonrails.com/~minam/url%20with%20spaces
44
+ http://www.rubyonrails.com/foo.cgi?something=here
45
+ http://www.rubyonrails.com/foo.cgi?something=here&and=here
46
+ http://www.rubyonrails.com/contact;new
47
+ http://www.rubyonrails.com/contact;new%20with%20spaces
48
+ http://www.rubyonrails.com/contact;new?with=query&string=params
49
+ http://www.rubyonrails.com/~minam/contact;new?with=query&string=params
50
+ http://en.wikipedia.org/wiki/Wikipedia:Today%27s_featured_picture_%28animation%29/January_20%2C_2007
51
+ http://www.mail-archive.com/rails@lists.rubyonrails.org/
52
+ http://www.amazon.com/Testing-Equal-Sign-In-Path/ref=pd_bbs_sr_1?ie=UTF8&s=books&qid=1198861734&sr=8-1
53
+ http://en.wikipedia.org/wiki/Sprite_(computer_graphics)
54
+ http://en.wikipedia.org/wiki/Texas_hold'em
55
+ https://www.google.com/doku.php?id=gps:resource:scs:start
56
+ )
57
+
58
+ urls.each do |url|
59
+ assert_linked %(<a href="#{url}">#{CGI.escapeHTML(url)}</a>), url
60
+ end
61
+ end
62
+
63
+ def test_like_rails_rules
64
+ email_raw = 'david@loudthinking.com'
65
+ email_result = %{<a href="mailto:#{email_raw}">#{email_raw}</a>}
66
+ email2_raw = '+david@loudthinking.com'
67
+ email2_result = %{<a href="mailto:#{email2_raw}">#{email2_raw}</a>}
68
+ link_raw = 'http://www.rubyonrails.com'
69
+ link_result = %{<a href="#{link_raw}">#{link_raw}</a>}
70
+ link_result_with_options = %{<a href="#{link_raw}" target="_blank">#{CGI.escapeHTML(link_raw)}</a>}
71
+ link2_raw = 'www.rubyonrails.com'
72
+ link2_result = %{<a href="http://#{link2_raw}">#{CGI.escapeHTML(link2_raw)}</a>}
73
+ link3_raw = 'http://manuals.ruby-on-rails.com/read/chapter.need_a-period/103#page281'
74
+ link3_result = %{<a href="#{link3_raw}">#{CGI.escapeHTML(link3_raw)}</a>}
75
+ link4_raw = 'http://foo.example.com/controller/action?parm=value&p2=v2#anchor123'
76
+ link4_result = %{<a href="#{link4_raw}">#{CGI.escapeHTML(link4_raw)}</a>}
77
+ link5_raw = 'http://foo.example.com:3000/controller/action'
78
+ link5_result = %{<a href="#{link5_raw}">#{CGI.escapeHTML(link5_raw)}</a>}
79
+ link6_raw = 'http://foo.example.com:3000/controller/action+pack'
80
+ link6_result = %{<a href="#{link6_raw}">#{CGI.escapeHTML(link6_raw)}</a>}
81
+ link7_raw = 'http://foo.example.com/controller/action?parm=value&p2=v2#anchor-123'
82
+ link7_result = %{<a href="#{link7_raw}">#{CGI.escapeHTML(link7_raw)}</a>}
83
+ link8_raw = 'http://foo.example.com:3000/controller/action.html'
84
+ link8_result = %{<a href="#{link8_raw}">#{CGI.escapeHTML(link8_raw)}</a>}
85
+ link9_raw = 'http://business.timesonline.co.uk/article/0,,9065-2473189,00.html'
86
+ link9_result = %{<a href="#{link9_raw}">#{CGI.escapeHTML(link9_raw)}</a>}
87
+ link10_raw = 'http://www.mail-archive.com/ruby-talk@ruby-lang.org/'
88
+ link10_result = %{<a href="#{link10_raw}">#{CGI.escapeHTML(link10_raw)}</a>}
89
+
90
+ assert_linked %(Go to #{link_result} and say hello to #{email_result}), "Go to #{link_raw} and say hello to #{email_raw}"
91
+ assert_linked %(Link #{link_result}), "Link #{link_raw}"
92
+ assert_linked %(#{link_result} Link), "#{link_raw} Link"
93
+ assert_linked %(Go to #{link_result}.), %(Go to #{link_raw}.)
94
+ assert_linked %(Go to #{link_result}, then say hello to #{email_result}.), %(Go to #{link_raw}, then say hello to #{email_raw}.)
95
+ assert_linked %(Link #{link2_result}), "Link #{link2_raw}"
96
+ assert_linked %(#{link2_result} Link), "#{link2_raw} Link"
97
+ assert_linked %(Go to #{link2_result}.), %(Go to #{link2_raw}.)
98
+ assert_linked %(Say hello to #{email_result}, then go to #{link2_result}.), %(Say hello to #{email_raw}, then go to #{link2_raw}.)
99
+ assert_linked %(Link #{link3_result}), "Link #{link3_raw}"
100
+ assert_linked %(#{link3_result} Link), "#{link3_raw} Link"
101
+ assert_linked %(Go to #{link3_result}.), %(Go to #{link3_raw}.)
102
+ assert_linked %(Go to #{link3_result}. seriously, #{link3_result}? i think I'll say hello to #{email_result}. instead.), %(Go to #{link3_raw}. seriously, #{link3_raw}? i think I'll say hello to #{email_raw}. instead.)
103
+ assert_linked %(Link #{link4_result}), "Link #{link4_raw}"
104
+ assert_linked %(#{link4_result} Link), "#{link4_raw} Link"
105
+ assert_linked %(#{link5_result} Link), "#{link5_raw} Link"
106
+ assert_linked %(#{link6_result} Link), "#{link6_raw} Link"
107
+ assert_linked %(#{link7_result} Link), "#{link7_raw} Link"
108
+ assert_linked %(Link #{link8_result}), "Link #{link8_raw}"
109
+ assert_linked %(#{link8_result} Link), "#{link8_raw} Link"
110
+ assert_linked %(Go to #{link8_result}.), %(Go to #{link8_raw}.)
111
+ assert_linked %(Go to #{link8_result}. seriously, #{link8_result}? i think I'll say hello to #{email_result}. instead.), %(Go to #{link8_raw}. seriously, #{link8_raw}? i think I'll say hello to #{email_raw}. instead.)
112
+ assert_linked %(Link #{link9_result}), "Link #{link9_raw}"
113
+ #assert_linked %(#{link9_result} Link), "#{link9_raw} Link"
114
+ assert_linked %(Go to #{link9_result}.), %(Go to #{link9_raw}.)
115
+ #assert_linked %(Go to #{link9_result}. seriously, #{link9_result}? i think I'll say hello to #{email_result}. instead.), %(Go to #{link9_raw}. seriously, #{link9_raw}? i think I'll say hello to #{email_raw}. instead.)
116
+ #assert_linked %(#{link10_result} Link), "#{link10_raw} Link"
117
+ assert_linked email2_result, email2_raw
118
+ assert_linked "#{link_result} #{link_result} #{link_result}", "#{link_raw} #{link_raw} #{link_raw}"
119
+ assert_linked '<a href="http://www.rubyonrails.com">Ruby On Rails</a>', '<a href="http://www.rubyonrails.com">Ruby On Rails</a>'
120
+ end
121
+ end
metadata CHANGED
@@ -5,9 +5,9 @@ version: !ruby/object:Gem::Version
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
- - 14
9
- - 2
10
- version: 1.14.2
8
+ - 15
9
+ - 0
10
+ version: 1.15.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - "Natacha Port\xC3\xA9"
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2011-05-20 00:00:00 +03:00
19
+ date: 2011-06-02 00:00:00 +02:00
20
20
  default_executable:
21
21
  dependencies: []
22
22
 
@@ -50,6 +50,7 @@ files:
50
50
  - test/benchmark.rb
51
51
  - test/benchmark.txt
52
52
  - test/markdown_test.rb
53
+ - test/rails_test.rb
53
54
  - test/redcarpet_test.rb
54
55
  has_rdoc: true
55
56
  homepage: http://github.com/tanoku/redcarpet