rinku 1.4.1 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.markdown CHANGED
@@ -23,53 +23,64 @@ Rinku is a standalone library
23
23
 
24
24
  It exports a single method called `Rinku.auto_link`.
25
25
 
26
- ~~~~ruby
26
+ ~~~~~ruby
27
27
  require 'rinku'
28
28
 
29
- auto_link(text, mode=:all, link_attr=nil)
30
- auto_link(text, mode=:all, link_attr=nil) { |link_text| ... }
31
- ~~~~~~~~~
29
+ Rinku.auto_link(text, mode=:all, link_attr=nil, skip_tags=nil)
30
+ Rinku.auto_link(text, mode=:all, link_attr=nil, skip_tags=nil) { |link_text| ... }
31
+ ~~~~~~
32
32
 
33
33
  Parses a block of text looking for "safe" urls or email addresses,
34
34
  and turns them into HTML links with the given attributes.
35
35
 
36
+ NOTE: The block of text may or may not be HTML; if the text is HTML,
37
+ Rinku will skip the relevant tags to prevent double-linking and linking
38
+ inside `pre` blocks by default.
39
+
40
+ NOTE: If the input text is HTML, it's expected to be already escaped.
41
+ Rinku will perform no escaping.
42
+
36
43
  NOTE: Currently the follow protocols are considered safe and are the
37
44
  only ones that will be autolinked.
38
45
 
39
- http:// https:// ftp:// mailto://
46
+ http:// https:// ftp:// mailto://
40
47
 
41
48
  Email addresses are also autolinked by default. URLs without a protocol
42
- specifier but starting with `www.` will also be autolinked, defaulting to
43
- the `http://` protocol.
49
+ specifier but starting with 'www.' will also be autolinked, defaulting to
50
+ the 'http://' protocol.
44
51
 
45
- - `text` is a string in plain text or HTML markup. If the string is formatted in
52
+ - `text` is a string in plain text or HTML markup. If the string is formatted in
46
53
  HTML, Rinku is smart enough to skip the links that are already enclosed in `<a>`
47
- tags.
54
+ tags.`
48
55
 
49
- - `mode` is a symbol, either :all, :urls or :email_addresses, which specifies which
50
- kind of links will be auto-linked.
56
+ - `mode` is a symbol, either `:all`, `:urls` or `:email_addresses`,
57
+ which specifies which kind of links will be auto-linked.
51
58
 
52
- - `link_attr` is a string containing the link attributes for each link that
59
+ - `link_attr` is a string containing the link attributes for each link that
53
60
  will be generated. These attributes are not sanitized and will be include as-is
54
61
  in each generated link, e.g.
55
62
 
56
- ~~~~ruby
57
- auto_link('http://www.pokemon.com', :all, 'target="_blank"')
58
- # => '<a href="http://www.pokemon.com" target="_blank">http://www.pokemon.com</a>'
59
- ~~~~
63
+ ~~~~~ruby
64
+ auto_link('http://www.pokemon.com', :all, 'target="_blank"')
65
+ # => '<a href="http://www.pokemon.com" target="_blank">http://www.pokemon.com</a>'
66
+ ~~~~~
60
67
 
61
- This string can be autogenerated from a hash using the Rails `tag_options` helper.
68
+ This string can be autogenerated from a hash using the Rails `tag_options` helper.
62
69
 
63
- - The method takes an optional block argument. If a block is passed, it will
70
+ - `skip_tags` is a list of strings with the names of HTML tags that will be skipped
71
+ when autolinking. If `nil`, this defaults to the value of the global `Rinku.skip_tags`,
72
+ which is initially `["a", "pre", "code", "kbd", "script"]`.
73
+
74
+ - `&block` is an optional block argument. If a block is passed, it will
64
75
  be yielded for each found link in the text, and its return value will be used instead
65
76
  of the name of the link. E.g.
66
-
67
- ~~~~ruby
68
- auto_link('Check it out at http://www.pokemon.com') do |url|
69
- "THE POKEMAN WEBSITEZ"
70
- end
71
- # => 'Check it out at <a href="http://www.pokemon.com">THE POKEMAN WEBSITEZ</a>'
72
- ~~~~
77
+
78
+ ~~~~~ruby
79
+ auto_link('Check it out at http://www.pokemon.com') do |url|
80
+ "THE POKEMAN WEBSITEZ"
81
+ end
82
+ # => 'Check it out at <a href="http://www.pokemon.com">THE POKEMAN WEBSITEZ</a>'
83
+ ~~~~~~
73
84
 
74
85
  Rinku is a drop-in replacement for Rails 3.1 `auto_link`
75
86
  ----------------------------------------------------
data/Rakefile CHANGED
@@ -50,3 +50,18 @@ file package('.gem') => %w[pkg/ rinku.gemspec] + $spec.files do |f|
50
50
  end
51
51
 
52
52
  # GEMSPEC HELPERS ==========================================================
53
+ task :gather => 'sundown/src/autolink.h' do |t|
54
+ files =
55
+ FileList[
56
+ 'sundown/src/{buffer,autolink}.h',
57
+ 'sundown/src/{buffer,autolink}.c',
58
+ ]
59
+ cp files, 'ext/rinku/',
60
+ :preserve => true,
61
+ :verbose => true
62
+ end
63
+
64
+
65
+ file 'sundown/src/autolink.h' do |t|
66
+ abort "The Sundown submodule is required."
67
+ end
data/ext/rinku/autolink.c CHANGED
@@ -24,9 +24,9 @@
24
24
  int
25
25
  sd_autolink_issafe(const uint8_t *link, size_t link_len)
26
26
  {
27
- static const size_t valid_uris_count = 4;
27
+ static const size_t valid_uris_count = 5;
28
28
  static const char *valid_uris[] = {
29
- "http://", "https://", "ftp://", "mailto://"
29
+ "/", "http://", "https://", "ftp://", "mailto:"
30
30
  };
31
31
 
32
32
  size_t i;
@@ -140,10 +140,9 @@ check_domain(uint8_t *data, size_t size)
140
140
  else if (!isalnum(data[i]) && data[i] != '-') break;
141
141
  }
142
142
 
143
- if (!isalnum(data[i - 1]) || np == 0)
144
- return 0;
145
-
146
- return i;
143
+ /* a valid domain needs to have at least a dot.
144
+ * that's as far as we get */
145
+ return np ? i : 0;
147
146
  }
148
147
 
149
148
  size_t
data/ext/rinku/buffer.c CHANGED
@@ -113,9 +113,35 @@ bufprintf(struct buf *buf, const char *fmt, ...)
113
113
  if (!buf || !buf->unit)
114
114
  return;
115
115
 
116
+ int n;
117
+
118
+ if (buf == 0 || (buf->size >= buf->asize && bufgrow(buf, buf->size + 1)) < 0)
119
+ return;
120
+
116
121
  va_start(ap, fmt);
117
- vbufprintf(buf, fmt, ap);
122
+ n = _buf_vsnprintf((char *)buf->data + buf->size, buf->asize - buf->size, fmt, ap);
118
123
  va_end(ap);
124
+
125
+ if (n < 0) {
126
+ #ifdef _MSC_VER
127
+ n = _vscprintf(fmt, ap);
128
+ #else
129
+ return;
130
+ #endif
131
+ }
132
+
133
+ if ((size_t)n >= buf->asize - buf->size) {
134
+ if (bufgrow(buf, buf->size + n + 1) < 0)
135
+ return;
136
+ va_start(ap, fmt);
137
+ n = _buf_vsnprintf((char *)buf->data + buf->size, buf->asize - buf->size, fmt, ap);
138
+ va_end(ap);
139
+ }
140
+
141
+ if (n < 0)
142
+ return;
143
+
144
+ buf->size += n;
119
145
  }
120
146
 
121
147
  /* bufput: appends raw data to a buffer */
@@ -198,31 +224,6 @@ bufslurp(struct buf *buf, size_t len)
198
224
  void
199
225
  vbufprintf(struct buf *buf, const char *fmt, va_list ap)
200
226
  {
201
- int n;
202
227
 
203
- if (buf == 0 || (buf->size >= buf->asize && bufgrow(buf, buf->size + 1)) < 0)
204
- return;
205
-
206
- n = _buf_vsnprintf((char *)buf->data + buf->size, buf->asize - buf->size, fmt, ap);
207
-
208
- if (n < 0) {
209
- #ifdef _MSC_VER
210
- n = _vscprintf(fmt, ap);
211
- #else
212
- return;
213
- #endif
214
- }
215
-
216
- if ((size_t)n >= buf->asize - buf->size) {
217
- if (bufgrow(buf, buf->size + n + 1) < 0)
218
- return;
219
-
220
- n = _buf_vsnprintf((char *)buf->data + buf->size, buf->asize - buf->size, fmt, ap);
221
- }
222
-
223
- if (n < 0)
224
- return;
225
-
226
- buf->size += n;
227
228
  }
228
229
 
data/ext/rinku/buffer.h CHANGED
@@ -15,8 +15,8 @@
15
15
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16
16
  */
17
17
 
18
- #ifndef __GEN_BUFFER_H__
19
- #define __GEN_BUFFER_H__
18
+ #ifndef BUFFER_H__
19
+ #define BUFFER_H__
20
20
 
21
21
  #include <stddef.h>
22
22
  #include <stdarg.h>
@@ -85,7 +85,4 @@ void bufslurp(struct buf *, size_t);
85
85
  /* bufprintf: formatted printing to a buffer */
86
86
  void bufprintf(struct buf *, const char *, ...) __attribute__ ((format (printf, 2, 3)));
87
87
 
88
- /* vbufprintf: stdarg variant of formatted printing into a buffer */
89
- void vbufprintf(struct buf *, const char * , va_list);
90
-
91
88
  #endif
data/ext/rinku/rinku.c CHANGED
@@ -116,20 +116,21 @@ autolink__skip_tag(
116
116
  struct buf *ob,
117
117
  const uint8_t *text,
118
118
  size_t size,
119
- const char **skip_tags,
120
- size_t skip_tags_count)
119
+ const char **skip_tags)
121
120
  {
122
- size_t tag, i = 0;
121
+ size_t i = 0;
123
122
 
124
123
  while (i < size && text[i] != '>')
125
124
  i++;
126
125
 
127
- for (tag = 0; tag < skip_tags_count; ++tag) {
128
- if (html_is_tag(text, size, skip_tags[tag]) == HTML_TAG_OPEN)
126
+ while (*skip_tags != NULL) {
127
+ if (html_is_tag(text, size, *skip_tags) == HTML_TAG_OPEN)
129
128
  break;
129
+
130
+ skip_tags++;
130
131
  }
131
132
 
132
- if (tag < skip_tags_count) {
133
+ if (*skip_tags != NULL) {
133
134
  for (;;) {
134
135
  while (i < size && text[i] != '<')
135
136
  i++;
@@ -137,7 +138,7 @@ autolink__skip_tag(
137
138
  if (i == size)
138
139
  break;
139
140
 
140
- if (html_is_tag(text + i, size - i, skip_tags[tag]) == HTML_TAG_CLOSE)
141
+ if (html_is_tag(text + i, size - i, *skip_tags) == HTML_TAG_CLOSE)
141
142
  break;
142
143
 
143
144
  i++;
@@ -159,7 +160,6 @@ rinku_autolink(
159
160
  unsigned int flags,
160
161
  const char *link_attr,
161
162
  const char **skip_tags,
162
- size_t skip_tags_count,
163
163
  void (*link_text_cb)(struct buf *ob, const struct buf *link, void *payload),
164
164
  void *payload)
165
165
  {
@@ -212,8 +212,7 @@ rinku_autolink(
212
212
 
213
213
  if (action == AUTOLINK_ACTION_SKIP_TAG) {
214
214
  end += autolink__skip_tag(ob,
215
- text + end, size - end,
216
- skip_tags, skip_tags_count);
215
+ text + end, size - end, skip_tags);
217
216
 
218
217
  continue;
219
218
  }
@@ -266,6 +265,26 @@ autolink_callback(struct buf *link_text, const struct buf *link, void *block)
266
265
  bufput(link_text, RSTRING_PTR(rb_link_text), RSTRING_LEN(rb_link_text));
267
266
  }
268
267
 
268
+ const char **rinku_load_tags(VALUE rb_skip)
269
+ {
270
+ const char **skip_tags;
271
+ size_t i, count;
272
+
273
+ Check_Type(rb_skip, T_ARRAY);
274
+
275
+ count = RARRAY_LEN(rb_skip);
276
+ skip_tags = xmalloc(sizeof(void *) * (count + 1));
277
+
278
+ for (i = 0; i < count; ++i) {
279
+ VALUE tag = rb_ary_entry(rb_skip, i);
280
+ Check_Type(tag, T_STRING);
281
+ skip_tags[i] = StringValueCStr(tag);
282
+ }
283
+
284
+ skip_tags[count] = NULL;
285
+ return skip_tags;
286
+ }
287
+
269
288
  /*
270
289
  * Document-method: auto_link
271
290
  *
@@ -286,52 +305,55 @@ autolink_callback(struct buf *link_text, const struct buf *link, void *block)
286
305
  * NOTE: Currently the follow protocols are considered safe and are the
287
306
  * only ones that will be autolinked.
288
307
  *
289
- * http:// https:// ftp:// mailto://
308
+ * http:// https:// ftp:// mailto://
290
309
  *
291
310
  * Email addresses are also autolinked by default. URLs without a protocol
292
311
  * specifier but starting with 'www.' will also be autolinked, defaulting to
293
312
  * the 'http://' protocol.
294
313
  *
295
- * +text+ is a string in plain text or HTML markup. If the string is formatted in
296
- * HTML, Rinku is smart enough to skip the links that are already enclosed in <a>
297
- * tags.
314
+ * - `text` is a string in plain text or HTML markup. If the string is formatted in
315
+ * HTML, Rinku is smart enough to skip the links that are already enclosed in `<a>`
316
+ * tags.`
298
317
  *
299
- * +mode+ is a symbol, either :all, :in_code, :urls or :email_addresses,
300
- * which specifies which kind of links will be auto-linked. The :in_code symbol
301
- * will autolink e
318
+ * - `mode` is a symbol, either `:all`, `:urls` or `:email_addresses`,
319
+ * which specifies which kind of links will be auto-linked.
302
320
  *
303
- * +link_attr+ is a string containing the link attributes for each link that
321
+ * - `link_attr` is a string containing the link attributes for each link that
304
322
  * will be generated. These attributes are not sanitized and will be include as-is
305
323
  * in each generated link, e.g.
306
324
  *
307
- * auto_link('http://www.pokemon.com', :all, 'target="_blank"')
308
- * # => '<a href="http://www.pokemon.com" target="_blank">http://www.pokemon.com</a>'
325
+ * ~~~~~ruby
326
+ * auto_link('http://www.pokemon.com', :all, 'target="_blank"')
327
+ * # => '<a href="http://www.pokemon.com" target="_blank">http://www.pokemon.com</a>'
328
+ * ~~~~~
309
329
  *
310
- * This string can be autogenerated from a hash using the Rails `tag_options` helper.
330
+ * This string can be autogenerated from a hash using the Rails `tag_options` helper.
311
331
  *
312
- * +skip_tags+ is a list of strings with the names of HTML tags that will be skipped
313
- * when autolinking. If nil, this defaults to ["a", "pre", "code", "kbd", "script"].
332
+ * - `skip_tags` is a list of strings with the names of HTML tags that will be skipped
333
+ * when autolinking. If `nil`, this defaults to the value of the global `Rinku.skip_tags`,
334
+ * which is initially `["a", "pre", "code", "kbd", "script"]`.
314
335
  *
315
- * +block+ The method takes an optional block argument. If a block is passed, it will
336
+ * - `&block` is an optional block argument. If a block is passed, it will
316
337
  * be yielded for each found link in the text, and its return value will be used instead
317
338
  * of the name of the link. E.g.
318
339
  *
319
- * auto_link('Check it out at http://www.pokemon.com') do |url|
320
- * "THE POKEMAN WEBSITEZ"
321
- * end
322
- * # => 'Check it out at <a href="http://www.pokemon.com">THE POKEMAN WEBSITEZ</a>'
340
+ * ~~~~~ruby
341
+ * auto_link('Check it out at http://www.pokemon.com') do |url|
342
+ * "THE POKEMAN WEBSITEZ"
343
+ * end
344
+ * # => 'Check it out at <a href="http://www.pokemon.com">THE POKEMAN WEBSITEZ</a>'
345
+ * ~~~~~~
323
346
  */
324
347
  static VALUE
325
348
  rb_rinku_autolink(int argc, VALUE *argv, VALUE self)
326
349
  {
327
- static const char *SKIP_TAGS[] = {"a", "pre", "code", "kbd", "script"};
350
+ static const char *SKIP_TAGS[] = {"a", "pre", "code", "kbd", "script", NULL};
328
351
 
329
352
  VALUE result, rb_text, rb_mode, rb_html, rb_skip, rb_block;
330
353
  struct buf *output_buf;
331
354
  int link_mode, count;
332
355
  const char *link_attr = NULL;
333
356
  const char **skip_tags = NULL;
334
- size_t skip_tags_count;
335
357
  ID mode_sym;
336
358
 
337
359
  rb_scan_args(argc, argv, "13&", &rb_text, &rb_mode, &rb_html, &rb_skip, &rb_block);
@@ -350,25 +372,13 @@ rb_rinku_autolink(int argc, VALUE *argv, VALUE self)
350
372
  link_attr = RSTRING_PTR(rb_html);
351
373
  }
352
374
 
353
- if (!NIL_P(rb_skip)) {
354
- size_t i;
355
-
356
- Check_Type(rb_skip, T_ARRAY);
357
-
358
- skip_tags_count = RARRAY_LEN(rb_skip);
359
- skip_tags = malloc(sizeof(void *) * skip_tags_count);
360
- if (!skip_tags)
361
- rb_raise(rb_eNoMemError, "Out of memory");
362
-
363
- for (i = 0; i < skip_tags_count; ++i) {
364
- VALUE tag = rb_ary_entry(rb_skip, i);
365
- Check_Type(tag, T_STRING);
375
+ if (NIL_P(rb_skip))
376
+ rb_skip = rb_iv_get(self, "@skip_tags");
366
377
 
367
- skip_tags[i] = StringValueCStr(tag);
368
- }
369
- } else {
378
+ if (NIL_P(rb_skip)) {
370
379
  skip_tags = SKIP_TAGS;
371
- skip_tags_count = sizeof(SKIP_TAGS) / sizeof(SKIP_TAGS[0]);
380
+ } else {
381
+ skip_tags = rinku_load_tags(rb_skip);
372
382
  }
373
383
 
374
384
  output_buf = bufnew(32);
@@ -390,7 +400,6 @@ rb_rinku_autolink(int argc, VALUE *argv, VALUE self)
390
400
  link_mode,
391
401
  link_attr,
392
402
  skip_tags,
393
- skip_tags_count,
394
403
  RTEST(rb_block) ? &autolink_callback : NULL,
395
404
  (void*)rb_block);
396
405
 
@@ -402,7 +411,7 @@ rb_rinku_autolink(int argc, VALUE *argv, VALUE self)
402
411
  }
403
412
 
404
413
  if (skip_tags != SKIP_TAGS)
405
- free(skip_tags);
414
+ xfree(skip_tags);
406
415
 
407
416
  bufrelease(output_buf);
408
417
  return result;
@@ -414,4 +423,3 @@ void Init_rinku()
414
423
  rb_define_method(rb_mRinku, "auto_link", rb_rinku_autolink, -1);
415
424
  }
416
425
 
417
-
data/lib/rails_rinku.rb CHANGED
@@ -8,11 +8,16 @@ module RailsRinku
8
8
  unless args.empty?
9
9
  options[:link] = args[0] || :all
10
10
  options[:html] = args[1] || {}
11
+ options[:skip] = args[2]
11
12
  end
12
13
  options.reverse_merge!(:link => :all, :html => {})
13
14
  text = text.html_safe unless text.html_safe?
14
15
 
15
- Rinku.auto_link(text.html_safe, options[:link], tag_options(options[:html]), &block)
16
+ Rinku.auto_link text,
17
+ options[:link],
18
+ tag_options(options[:html]),
19
+ options[:skip],
20
+ &block
16
21
  end
17
22
  end
18
23
 
data/lib/rinku.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  module Rinku
2
2
  VERSION = "1.2.2"
3
+ attr_accessor :skip_tags
3
4
  extend self
4
5
  end
5
6
 
data/rinku.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = 'rinku'
5
- s.version = '1.4.1'
5
+ s.version = '1.5.0'
6
6
  s.summary = "Mostly autolinking"
7
7
  s.description = <<-EOF
8
8
  A fast and very smart autolinking library that
@@ -15,6 +15,26 @@ class RedcarpetAutolinkTest < Test::Unit::TestCase
15
15
  assert_equal expected, Rinku.auto_link(url)
16
16
  end
17
17
 
18
+ def test_global_skip_tags
19
+ assert_equal Rinku.skip_tags, nil
20
+ Rinku.skip_tags = ['pre']
21
+ assert_equal Rinku.skip_tags, ['pre']
22
+
23
+ Rinku.skip_tags = ['pa']
24
+ url = 'This is just a <pa>http://www.pokemon.com</pa> test'
25
+ assert_equal Rinku.auto_link(url), url
26
+
27
+ Rinku.skip_tags = nil
28
+ assert_not_equal Rinku.auto_link(url), url
29
+ end
30
+
31
+ def test_auto_link_with_single_trailing_punctuation_and_space
32
+ url = "http://www.youtube.com"
33
+ url_result = generate_result(url)
34
+ assert_equal url_result, Rinku.auto_link(url)
35
+ assert_equal "link: #{url_result}. foo?", Rinku.auto_link("link: #{url}. foo?")
36
+ end
37
+
18
38
  def test_does_not_segfault
19
39
  assert_linked "< this is just a test", "< this is just a test"
20
40
  end
metadata CHANGED
@@ -1,25 +1,32 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: rinku
3
- version: !ruby/object:Gem::Version
4
- version: 1.4.1
3
+ version: !ruby/object:Gem::Version
4
+ hash: 3
5
5
  prerelease:
6
+ segments:
7
+ - 1
8
+ - 5
9
+ - 0
10
+ version: 1.5.0
6
11
  platform: ruby
7
- authors:
8
- - Vicent Martí
12
+ authors:
13
+ - "Vicent Mart\xC3\xAD"
9
14
  autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
- date: 2011-11-10 00:00:00.000000000 Z
17
+
18
+ date: 2011-12-04 00:00:00 Z
13
19
  dependencies: []
14
- description: ! " A fast and very smart autolinking library that\n acts as a
15
- drop-in replacement for Rails `auto_link`\n"
20
+
21
+ description: " A fast and very smart autolinking library that\n acts as a drop-in replacement for Rails `auto_link`\n"
16
22
  email: vicent@github.com
17
23
  executables: []
18
- extensions:
24
+
25
+ extensions:
19
26
  - ext/rinku/extconf.rb
20
- extra_rdoc_files:
27
+ extra_rdoc_files:
21
28
  - COPYING
22
- files:
29
+ files:
23
30
  - COPYING
24
31
  - README.markdown
25
32
  - Rakefile
@@ -35,27 +42,36 @@ files:
35
42
  - test/autolink_test.rb
36
43
  homepage: http://github.com/tanoku/rinku
37
44
  licenses: []
45
+
38
46
  post_install_message:
39
47
  rdoc_options: []
40
- require_paths:
48
+
49
+ require_paths:
41
50
  - lib
42
- required_ruby_version: !ruby/object:Gem::Requirement
51
+ required_ruby_version: !ruby/object:Gem::Requirement
43
52
  none: false
44
- requirements:
45
- - - ! '>='
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- required_rubygems_version: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ hash: 3
57
+ segments:
58
+ - 0
59
+ version: "0"
60
+ required_rubygems_version: !ruby/object:Gem::Requirement
49
61
  none: false
50
- requirements:
51
- - - ! '>='
52
- - !ruby/object:Gem::Version
53
- version: '0'
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ hash: 3
66
+ segments:
67
+ - 0
68
+ version: "0"
54
69
  requirements: []
70
+
55
71
  rubyforge_project:
56
72
  rubygems_version: 1.8.6
57
73
  signing_key:
58
74
  specification_version: 3
59
75
  summary: Mostly autolinking
60
- test_files:
76
+ test_files:
61
77
  - test/autolink_test.rb