diff --git a/app/models/chunks/chunk.rb b/app/models/chunks/chunk.rb index 59511814..d374eb63 100755 --- a/app/models/chunks/chunk.rb +++ b/app/models/chunks/chunk.rb @@ -36,7 +36,7 @@ module Chunk end def revert(content) - content.sub!( Regexp.new(mask(content)), text ) + content.sub!( Regexp.new(mask(content)), text ) end def unmask(content) diff --git a/app/models/chunks/wiki.rb b/app/models/chunks/wiki.rb index f6b20e83..f1a79d05 100755 --- a/app/models/chunks/wiki.rb +++ b/app/models/chunks/wiki.rb @@ -11,6 +11,13 @@ module WikiChunk # another wiki page. class WikiLink < Chunk::Abstract + attr_reader :page_name, :link_text, :link_type + + def initialize(*args) + super + @link_type = 'show' + end + def self.apply_to(content) content.gsub!( self.pattern ) do |matched_text| chunk = self.new($~) @@ -31,21 +38,20 @@ module WikiChunk # By default, no escaped text def escaped_text() nil end - # Delimit the link text with markers to replace later unless - # the word is escaped. In that case, just return the link text - def mask(content) escaped_text || pre_mask + link_text + post_mask end + # Replace link with a mask, but if the word is escaped, then don't replace it + def mask(content) escaped_text || "#{pre_mask}#{link_text}#{post_mask}" end - def regexp() /#{pre_mask}(.*)?#{post_mask}/ end + def regexp() /#{pre_mask}(.*)#{post_mask}/ end def revert(content) content.sub!(regexp, text) end - + # Do not keep this chunk if it is escaped. # Otherwise, pass the link procedure a page_name and link_text and # get back a string of HTML to replace the mask with. def unmask(content) return nil if escaped_text return self if content.sub!(regexp) do |match| - content.page_link(page_name, $1) + content.page_link(page_name, $1, link_type) end end @@ -64,8 +70,6 @@ module WikiChunk WIKI_WORD end - attr_reader :page_name - def initialize(match_data) super(match_data) @textile_link_suffix, @escape, @page_name = match_data[1..3] @@ -94,24 +98,16 @@ module WikiChunk def self.pattern() WIKI_LINK end - - attr_reader :page_name, :link_text, :link_type - def initialize(match_data) super(match_data) - @textile_link_suffix, @page_name = match_data[1..2] - - # defaults - @link_type = 'show' @link_text = @page_name - separate_link_type separate_alias end private - + # if link wihin the brackets has a form of [[filename:file]] or [[filename:pic]], # this means a link to a picture or a file def separate_link_type @@ -121,7 +117,7 @@ module WikiChunk @link_type = link_type_match[2..3].compact[0] end end - + # link text may be different from page name. this will look like [[actual page|link text]] def separate_alias alias_match = ALIAS_SEPARATION.match(@page_name) diff --git a/app/models/web.rb b/app/models/web.rb index 7d09c1e5..1a56002e 100755 --- a/app/models/web.rb +++ b/app/models/web.rb @@ -48,18 +48,23 @@ class Web page = pages[name] text = text || WikiWords.separate(name) link = CGI.escape(name) - + link_type = options[:link_type] || :show + case options[:mode] - when :export - if page then "#{text}" - else "#{text}" end - when :publish - if page then "#{text}" - else "#{text}" end - else - if page then "#{text}" - else "#{text}?" end + when :export + if page then "#{text}" + else "#{text}" end + when :publish + if page then "#{text}" + else "#{text}" end + else + if page + "#{text}" + else + "#{text}?" + end end + end diff --git a/app/models/wiki_content.rb b/app/models/wiki_content.rb index 7ad11744..7ef5d790 100755 --- a/app/models/wiki_content.rb +++ b/app/models/wiki_content.rb @@ -39,9 +39,8 @@ require 'chunks/nowiki' # UPDATED: 22nd May 2004 class WikiContent < String - PRE_ENGINE_ACTIONS = [ NoWiki, Category, Include, - URIChunk, LocalURIChunk, - WikiChunk::Link, WikiChunk::Word ] + PRE_ENGINE_ACTIONS = [ NoWiki, Category, Include, URIChunk, LocalURIChunk, WikiChunk::Link, + WikiChunk::Word ] POST_ENGINE_ACTIONS = [ Literal::Pre, Literal::Tags ] DEFAULT_OPTS = { :pre_engine_actions => PRE_ENGINE_ACTIONS, @@ -76,7 +75,8 @@ class WikiContent < String end # Call @web.page_link using current options. - def page_link(name, text) + def page_link(name, text, link_type) + @options[:link_type] = link_type || :show @web.make_link(name, text, @options) end diff --git a/test/unit/chunks/wiki_test.rb b/test/unit/chunks/wiki_test.rb index 600d9350..fa8e64a1 100755 --- a/test/unit/chunks/wiki_test.rb +++ b/test/unit/chunks/wiki_test.rb @@ -76,6 +76,6 @@ class WikiTest < Test::Unit::TestCase assert_equal expected_link_text, chunk.link_text assert_equal expected_link_type, chunk.link_type end - + end diff --git a/test/unit/revision_test.rb b/test/unit/revision_test.rb index 3081fc89..6f7e2bf3 100755 --- a/test/unit/revision_test.rb +++ b/test/unit/revision_test.rb @@ -210,6 +210,18 @@ class RevisionTest < Test::Unit::TestCase "today

", @page.revisions.last.display_diff end + def test_link_to_file + assert_markup_parsed_as( + '

doc.pdf?

', + '[[doc.pdf:file]]') + end + + def test_link_to_pic + assert_markup_parsed_as( + '

Square?

', + '[[square.jpg|Square:pic]]') + end + # TODO Remove the leading underscores from this test when upgrading to RedCloth 3.0.1; # also add a test for the "Unhappy Face" problem (another interesting RedCloth bug) def __test_list_with_tildas