From e6c32bafc6346dc7ffbea9f849af228f6bed9b06 Mon Sep 17 00:00:00 2001
From: Alexey Verkhovsky
Date: Sat, 22 Jan 2005 16:38:33 +0000
Subject: [PATCH] Wiki links to files point to the appropriate actions (file,
pic)
---
app/models/chunks/chunk.rb | 2 +-
app/models/chunks/wiki.rb | 32 ++++++++++++++------------------
app/models/web.rb | 25 +++++++++++++++----------
app/models/wiki_content.rb | 8 ++++----
test/unit/chunks/wiki_test.rb | 2 +-
test/unit/revision_test.rb | 12 ++++++++++++
6 files changed, 47 insertions(+), 34 deletions(-)
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