Commit 8ce390333a7e08c2956d6334f587e1db7668133e
1 parent
de2770bb
Exists in
master
and in
4 other branches
Add GFM helper
Showing
1 changed file
with
68 additions
and
0 deletions
Show diff stats
app/helpers/application_helper.rb
| @@ -42,6 +42,74 @@ module ApplicationHelper | @@ -42,6 +42,74 @@ module ApplicationHelper | ||
| 42 | grouped_options_for_select(options, @ref || @project.default_branch) | 42 | grouped_options_for_select(options, @ref || @project.default_branch) |
| 43 | end | 43 | end |
| 44 | 44 | ||
| 45 | + def gfm(text, html_options = {}) | ||
| 46 | + return text if text.nil? | ||
| 47 | + | ||
| 48 | + # Extract pre blocks | ||
| 49 | + # from http://github.github.com/github-flavored-markdown/ | ||
| 50 | + extractions = {} | ||
| 51 | + text.gsub!(%r{<pre>.*?</pre>|<code>.*?</code>}m) do |match| | ||
| 52 | + md5 = Digest::MD5.hexdigest(match) | ||
| 53 | + extractions[md5] = match | ||
| 54 | + "{gfm-extraction-#{md5}}" | ||
| 55 | + end | ||
| 56 | + | ||
| 57 | + # match 1 2 3 4 5 6 | ||
| 58 | + text.gsub!(/(\W)?(@([\w\._]+)|[#!$](\d+)|([\h]{6,40}))(\W)?/) do |match| | ||
| 59 | + prefix = $1 | ||
| 60 | + reference = $2 | ||
| 61 | + user_name = $3 | ||
| 62 | + issue_id = $4 | ||
| 63 | + merge_request_id = $4 | ||
| 64 | + snippet_id = $4 | ||
| 65 | + commit_id = $5 | ||
| 66 | + suffix = $6 | ||
| 67 | + | ||
| 68 | + # TODO: add popups with additional information | ||
| 69 | + ref_link = case reference | ||
| 70 | + | ||
| 71 | + # team member: @foo | ||
| 72 | + when /^@/ | ||
| 73 | + user = @project.users.where(:name => user_name).first | ||
| 74 | + member = @project.users_projects.where(:user_id => user).first if user | ||
| 75 | + link_to("@#{user_name}", project_team_member_path(@project, member), html_options.merge(:class => "gfm gfm-team_member #{html_options[:class]}")) if member | ||
| 76 | + | ||
| 77 | + # issue: #123 | ||
| 78 | + when /^#/ | ||
| 79 | + # avoid HTML entities | ||
| 80 | + unless prefix.try(:end_with?, "&") && suffix.try(:start_with?, ";") | ||
| 81 | + issue = @project.issues.where(:id => issue_id).first | ||
| 82 | + link_to("##{issue_id}", project_issue_path(@project, issue), html_options.merge(:title => "Issue: #{issue.title}", :class => "gfm gfm-issue #{html_options[:class]}")) if issue | ||
| 83 | + end | ||
| 84 | + | ||
| 85 | + # merge request: !123 | ||
| 86 | + when /^!/ | ||
| 87 | + merge_request = @project.merge_requests.where(:id => merge_request_id).first | ||
| 88 | + link_to("!#{merge_request_id}", project_merge_request_path(@project, merge_request), html_options.merge(:title => "Merge Request: #{merge_request.title}", :class => "gfm gfm-merge_request #{html_options[:class]}")) if merge_request | ||
| 89 | + | ||
| 90 | + # snippet: $123 | ||
| 91 | + when /^\$/ | ||
| 92 | + snippet = @project.snippets.where(:id => snippet_id).first | ||
| 93 | + link_to("$#{snippet_id}", project_snippet_path(@project, snippet), html_options.merge(:title => "Snippet: #{snippet.title}", :class => "gfm gfm-snippet #{html_options[:class]}")) if snippet | ||
| 94 | + | ||
| 95 | + # commit: 123456... | ||
| 96 | + when /^\h/ | ||
| 97 | + commit = @project.commit(commit_id) | ||
| 98 | + link_to(commit_id, project_commit_path(@project, :id => commit.id), html_options.merge(:title => "Commit: #{commit.author_name} - #{CommitDecorator.new(commit).title}", :class => "gfm gfm-commit #{html_options[:class]}")) if commit | ||
| 99 | + | ||
| 100 | + end # case | ||
| 101 | + | ||
| 102 | + ref_link.nil? ? match : "#{prefix}#{ref_link}#{suffix}" | ||
| 103 | + end # gsub | ||
| 104 | + | ||
| 105 | + # Insert pre block extractions | ||
| 106 | + text.gsub!(/\{gfm-extraction-(\h{32})\}/) do | ||
| 107 | + extractions[$1] | ||
| 108 | + end | ||
| 109 | + | ||
| 110 | + text.html_safe | ||
| 111 | + end | ||
| 112 | + | ||
| 45 | def markdown(text) | 113 | def markdown(text) |
| 46 | @__renderer ||= Redcarpet::Markdown.new(Redcarpet::Render::GitlabHTML.new(self, filter_html: true), { | 114 | @__renderer ||= Redcarpet::Markdown.new(Redcarpet::Render::GitlabHTML.new(self, filter_html: true), { |
| 47 | no_intra_emphasis: true, | 115 | no_intra_emphasis: true, |