# version:"1.0 beta 2" -> Link to version named "1.0 beta 2"
# Attachments:
# attachment:file.zip -> Link to the attachment of the current object named file.zip
- text = text.gsub(%r{([\s\(,-^])(!)?(attachment|document|version|commit)?((#|r)(\d+)|(:)([^"][^\s<>]+|"[^"]+"))(?=[[:punct:]]|\s|<|$)}) do |m|
+ # Source files:
+ # source:some/file -> Link to the file located at /some/file in the project's repository
+ # source:some/file@52 -> Link to the file's revision 52
+ # source:some/file#L120 -> Link to line 120 of the file
+ # source:some/file@52#L120 -> Link to line 120 of the file's revision 52
+ # export:some/file -> Force the download of the file
+ text = text.gsub(%r{([\s\(,-^])(!)?(attachment|document|version|commit|source|export)?((#|r)(\d+)|(:)([^"][^\s<>]+|"[^"]+"))(?=[[:punct:]]|\s|<|$)}) do |m|
leading, esc, prefix, sep, oid = $1, $2, $3, $5 || $7, $6 || $8
link = nil
if esc.nil?
if prefix.nil? && sep == 'r'
if project && (changeset = project.changesets.find_by_revision(oid))
- link = link_to("r#{oid}", {:only_path => only_path, :controller => 'repositories', :action => 'revision', :id => project.id, :rev => oid},
+ link = link_to("r#{oid}", {:only_path => only_path, :controller => 'repositories', :action => 'revision', :id => project, :rev => oid},
:class => 'changeset',
:title => truncate(changeset.comments, 100))
end
end
when 'commit'
if project && (changeset = project.changesets.find(:first, :conditions => ["scmid LIKE ?", "#{name}%"]))
- link = link_to h("#{name}"), {:only_path => only_path, :controller => 'repositories', :action => 'revision', :id => project.id, :rev => changeset.revision}, :class => 'changeset', :title => truncate(changeset.comments, 100)
+ link = link_to h("#{name}"), {:only_path => only_path, :controller => 'repositories', :action => 'revision', :id => project, :rev => changeset.revision}, :class => 'changeset', :title => truncate(changeset.comments, 100)
+ end
+ when 'source', 'export'
+ if project && project.repository
+ name =~ %r{^[/\\]*(.*?)(@([0-9a-f]+))?(#(L\d+))?$}
+ path, rev, anchor = $1, $3, $5
+ link = link_to h("#{prefix}:#{name}"), {:controller => 'repositories', :action => 'entry', :id => project, :path => path,
+ :rev => rev,
+ :anchor => anchor,
+ :format => (prefix == 'export' ? 'raw' : nil)},
+ :class => (prefix == 'export' ? 'source download' : 'source')
end
when 'attachment'
if attachments && attachment = attachments.detect {|a| a.filename == name }
issue_link = link_to('#3', {:controller => 'issues', :action => 'show', :id => 3},
:class => 'issue', :title => 'Error 281 when updating a recipe (New)')
- changeset_link = link_to('r1', {:controller => 'repositories', :action => 'revision', :id => 1, :rev => 1},
+ changeset_link = link_to('r1', {:controller => 'repositories', :action => 'revision', :id => 'ecookbook', :rev => 1},
:class => 'changeset', :title => 'My very first commit')
document_link = link_to('Test document', {:controller => 'documents', :action => 'show', :id => 1},
version_link = link_to('1.0', {:controller => 'versions', :action => 'show', :id => 2},
:class => 'version')
+
+ source_url = {:controller => 'repositories', :action => 'entry', :id => 'ecookbook', :path => 'some/file'}
to_test = {
- '#3, #3 and #3.' => "#{issue_link}, #{issue_link} and #{issue_link}.",
- 'r1' => changeset_link,
- 'document#1' => document_link,
- 'document:"Test document"' => document_link,
- 'version#2' => version_link,
- 'version:1.0' => version_link,
- 'version:"1.0"' => version_link,
+ # tickets
+ '#3, #3 and #3.' => "#{issue_link}, #{issue_link} and #{issue_link}.",
+ # changesets
+ 'r1' => changeset_link,
+ # documents
+ 'document#1' => document_link,
+ 'document:"Test document"' => document_link,
+ # versions
+ 'version#2' => version_link,
+ 'version:1.0' => version_link,
+ 'version:"1.0"' => version_link,
+ # source
+ 'source:/some/file' => link_to('source:/some/file', source_url, :class => 'source'),
+ 'source:/some/file@52' => link_to('source:/some/file@52', source_url.merge(:rev => 52), :class => 'source'),
+ 'source:/some/file#L110' => link_to('source:/some/file#L110', source_url.merge(:anchor => 'L110'), :class => 'source'),
+ 'source:/some/file@52#L110' => link_to('source:/some/file@52#L110', source_url.merge(:rev => 52, :anchor => 'L110'), :class => 'source'),
+ 'export:/some/file' => link_to('export:/some/file', source_url.merge(:format => 'raw'), :class => 'source download'),
# escaping
- '!#3.' => '#3.',
- '!r1' => 'r1',
- '!document#1' => 'document#1',
- '!document:"Test document"' => 'document:"Test document"',
- '!version#2' => 'version#2',
- '!version:1.0' => 'version:1.0',
- '!version:"1.0"' => 'version:"1.0"',
+ '!#3.' => '#3.',
+ '!r1' => 'r1',
+ '!document#1' => 'document#1',
+ '!document:"Test document"' => 'document:"Test document"',
+ '!version#2' => 'version#2',
+ '!version:1.0' => 'version:1.0',
+ '!version:"1.0"' => 'version:"1.0"',
+ '!source:/some/file' => 'source:/some/file',
}
@project = Project.find(1)
to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text) }