]> git.wincent.com - wikitext.git/commitdiff
Make it easier to set a link_proc
authorWincent Colaiuta <win@wincent.com>
Sat, 16 Feb 2013 19:58:38 +0000 (11:58 -0800)
committerWincent Colaiuta <win@wincent.com>
Sat, 16 Feb 2013 20:03:02 +0000 (12:03 -0800)
In addition to being able to set a link_proc at parse time, make it
possible to do so at or after initialization as well.

This will be useful in the Rails context:

  Wikitext::Parser.shared_parser.link_proc = ...

See also:

  https://wincent.com/issues/2061

Signed-off-by: Wincent Colaiuta <win@wincent.com>
doc/rdoc.rb
ext/parser.c
ext/wikitext.c
spec/internal_link_spec.rb

index 851e63226a4c81c750e17deb79ca5124028891ec..b7405753c5a090eaa31dcf8ce6c38af526ed8ea3 100644 (file)
@@ -221,6 +221,15 @@ module Wikitext
   # queries then you should implement an appropriate caching strategy to
   # ensure that markup with many links does not overwhelm your database.
   #
+  # A +link_proc+ may also be set during initialization:
+  #
+  #     parser = Wikitext::Parser.new :link_proc => link_proc
+  #
+  # Or via setting an attribute on the parser:
+  #
+  #     parser = Wikitext::Parser.new
+  #     parser.link_proc = link_proc
+  #
   # Many more examples of link procs can be found in the spec suite:
   #
   # * http://git.wincent.com/wikitext.git/blob/HEAD:/spec/internal_link_spec.rb
index ed0488ae63500cf947c58abeead27e41bab9d411..da156a8a2b5168ae7f5340919f82370effbc2919 100644 (file)
@@ -1008,6 +1008,7 @@ VALUE Wikitext_parser_initialize(int argc, VALUE *argv, VALUE self)
     VALUE external_link_class           = rb_str_new2("external");
     VALUE external_link_rel             = Qnil;
     VALUE mailto_class                  = rb_str_new2("mailto");
+    VALUE link_proc                     = Qnil;
     VALUE internal_link_prefix          = rb_str_new2("/wiki/");
     VALUE img_prefix                    = rb_str_new2("/images/");
     VALUE output_style                  = ID2SYM(rb_intern("html"));
@@ -1025,6 +1026,7 @@ VALUE Wikitext_parser_initialize(int argc, VALUE *argv, VALUE self)
         external_link_class             = OVERRIDE_IF_SET(external_link_class);
         external_link_rel               = OVERRIDE_IF_SET(external_link_rel);
         mailto_class                    = OVERRIDE_IF_SET(mailto_class);
+        link_proc                       = OVERRIDE_IF_SET(link_proc);
         internal_link_prefix            = OVERRIDE_IF_SET(internal_link_prefix);
         img_prefix                      = OVERRIDE_IF_SET(img_prefix);
         output_style                    = OVERRIDE_IF_SET(output_style);
@@ -1039,6 +1041,7 @@ VALUE Wikitext_parser_initialize(int argc, VALUE *argv, VALUE self)
     rb_iv_set(self, "@external_link_class",             external_link_class);
     rb_iv_set(self, "@external_link_rel",               external_link_rel);
     rb_iv_set(self, "@mailto_class",                    mailto_class);
+    rb_iv_set(self, "@link_proc",                       link_proc);
     rb_iv_set(self, "@internal_link_prefix",            internal_link_prefix);
     rb_iv_set(self, "@img_prefix",                      img_prefix);
     rb_iv_set(self, "@output_style",                    output_style);
@@ -1083,6 +1086,7 @@ VALUE Wikitext_parser_parse(int argc, VALUE *argv, VALUE self)
     link_class          = NIL_P(link_class) ? Qnil : StringValue(link_class);
     VALUE link_rel      = rb_iv_get(self, "@external_link_rel");
     link_rel            = NIL_P(link_rel) ? Qnil : StringValue(link_rel);
+    VALUE link_proc     = rb_iv_get(self, "@link_proc");
     VALUE mailto_class  = rb_iv_get(self, "@mailto_class");
     mailto_class        = NIL_P(mailto_class) ? Qnil : StringValue(mailto_class);
     VALUE prefix        = rb_iv_get(self, "@internal_link_prefix");
@@ -1091,7 +1095,6 @@ VALUE Wikitext_parser_parse(int argc, VALUE *argv, VALUE self)
     // process options hash
     int base_indent = 0;
     int base_heading_level = NUM2INT(rb_iv_get(self, "@base_heading_level"));
-    VALUE link_proc = Qnil;
     if (!NIL_P(options) && TYPE(options) == T_HASH)
     {
         // :indent => 0 (or more)
index 9eb691aaca8aae7c6d73ddd9328abe47c93826a0..532db5042dc08bc596008d55d79ba92bf0beb321 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright 2008-2009 Wincent Colaiuta. All rights reserved.
+// Copyright 2008-2013 Wincent Colaiuta. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are met:
@@ -80,6 +80,7 @@ void Init_wikitext()
     rb_define_attr(cWikitextParser, "external_link_class", Qtrue, Qtrue);
     rb_define_attr(cWikitextParser, "external_link_rel", Qtrue, Qtrue);
     rb_define_attr(cWikitextParser, "mailto_class", Qtrue, Qtrue);
+    rb_define_attr(cWikitextParser, "link_proc", Qtrue, Qtrue);
     rb_define_attr(cWikitextParser, "autolink", Qtrue, Qtrue);
     rb_define_attr(cWikitextParser, "space_to_underscore", Qtrue, Qtrue);
     rb_define_attr(cWikitextParser, "minimum_fulltext_token_length", Qtrue, Qtrue);
index 8aa0c2fcdbe248fad15c3b0a7e29a78c886b14e8..e8d06ab3a726a080ec64d7d484109319ec9144c5 100644 (file)
@@ -1,5 +1,5 @@
 # encoding: utf-8
-# Copyright 2007-2010 Wincent Colaiuta. All rights reserved.
+# Copyright 2007-2013 Wincent Colaiuta. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are met:
@@ -113,26 +113,41 @@ describe Wikitext::Parser, 'internal links (space to underscore off)' do
   end
 
   describe '"red link" support' do
-    it 'should accept a Proc object via the optional "link_proc" parameter' do
+    it 'accepts a Proc object via the optional "link_proc" parameter' do
       @parser.parse('foo', :link_proc => Proc.new { }).should == %Q{<p>foo</p>\n}
     end
 
-    it 'should accept a lambda via the optional "link_proc" parameter' do
+    it 'accepts a lambda via the optional "link_proc" parameter' do
       @parser.parse('foo', :link_proc => lambda { }).should == %Q{<p>foo</p>\n}
     end
 
-    it 'should apply custom link CSS when supplied (Proc object version)' do
+    it 'applies custom link CSS when supplied (Proc object version)' do
       link_proc = Proc.new { |target| target == 'bar' ? 'redlink' : nil }
       expected = %Q{<p><a href="/wiki/foo">foo</a> <a href="/wiki/bar" class="redlink">bar</a></p>\n}
       @parser.parse('[[foo]] [[bar]]', :link_proc => link_proc).should == expected
     end
 
-    it 'should apply custom link CSS when supplied (lambda version)' do
+    it 'applies custom link CSS when supplied (lambda version)' do
       link_proc = lambda { |target| target == 'bar' ? 'redlink' : nil }
       expected = %Q{<p><a href="/wiki/foo">foo</a> <a href="/wiki/bar" class="redlink">bar</a></p>\n}
       @parser.parse('[[foo]] [[bar]]', :link_proc => link_proc).should == expected
     end
 
+    it 'uses a lamba passed in when the Parser is initialized' do
+      link_proc = lambda { |target| target == 'bar' ? 'redlink' : nil }
+      parser = Wikitext::Parser.new :link_proc => link_proc
+      expected = %Q{<p><a href="/wiki/foo">foo</a> <a href="/wiki/bar" class="redlink">bar</a></p>\n}
+      parser.parse('[[foo]] [[bar]]').should == expected
+    end
+
+    it 'uses a lamba set as an attribute on the Parser' do
+      link_proc = lambda { |target| target == 'bar' ? 'redlink' : nil }
+      parser = Wikitext::Parser.new
+      parser.link_proc = link_proc
+      expected = %Q{<p><a href="/wiki/foo">foo</a> <a href="/wiki/bar" class="redlink">bar</a></p>\n}
+      parser.parse('[[foo]] [[bar]]').should == expected
+    end
+
     it 'should apply no custom link CSS when supplied nil (Proc object version)' do
       expected = %Q{<p><a href="/wiki/foo">foo</a></p>\n}
       @parser.parse('[[foo]]', :link_proc => Proc.new { |target| nil }).should == expected