From 6171a4d8ebd1602b987bc6d93fd19443696c155b Mon Sep 17 00:00:00 2001 From: randx Date: Fri, 3 Aug 2012 03:28:02 +0300 Subject: [PATCH] Fixed dashboard broken messages cause of glm --- app/assets/stylesheets/sections/notes.scss | 9 ++- app/helpers/application_helper.rb | 80 --------------------- app/helpers/gitlab_markdown_helper.rb | 81 ++++++++++++++++++++++ app/views/notes/_form.html.haml | 33 ++++----- 4 files changed, 104 insertions(+), 99 deletions(-) create mode 100644 app/helpers/gitlab_markdown_helper.rb diff --git a/app/assets/stylesheets/sections/notes.scss b/app/assets/stylesheets/sections/notes.scss index 17805de4..c10edae6 100644 --- a/app/assets/stylesheets/sections/notes.scss +++ b/app/assets/stylesheets/sections/notes.scss @@ -175,10 +175,17 @@ td .line_note_link { top:7px; } + .note_advanced_opts { + h6 { + line-height: 32px; + margin-right: 12px; + } + } + div.attachments { position:relative; width: 350px; - height: 36px; + height: 50px; overflow:hidden; margin:0 0 5px !important; } diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 06cfa5b6..87536e00 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -42,86 +42,6 @@ module ApplicationHelper grouped_options_for_select(options, @ref || @project.default_branch) end - def gfm(text, html_options = {}) - return text if text.nil? - raise "@project is not set" if @project.nil? - - # Extract pre blocks - # from http://github.github.com/github-flavored-markdown/ - extractions = {} - text.gsub!(%r{
.*?
|.*?}m) do |match| - md5 = Digest::MD5.hexdigest(match) - extractions[md5] = match - "{gfm-extraction-#{md5}}" - end - - # match 1 2 3 4 5 6 - text.gsub!(/(\W)?(@([\w\._]+)|[#!$](\d+)|([\h]{6,40}))(\W)?/) do |match| - prefix = $1 - reference = $2 - user_name = $3 - issue_id = $4 - merge_request_id = $4 - snippet_id = $4 - commit_id = $5 - suffix = $6 - - # TODO: add popups with additional information - ref_link = case reference - - # team member: @foo - when /^@/ - user = @project.users.where(:name => user_name).first - member = @project.users_projects.where(:user_id => user).first if user - link_to("@#{user_name}", project_team_member_path(@project, member), html_options.merge(:class => "gfm gfm-team_member #{html_options[:class]}")) if member - - # issue: #123 - when /^#/ - # avoid HTML entities - unless prefix.try(:end_with?, "&") && suffix.try(:start_with?, ";") - issue = @project.issues.where(:id => issue_id).first - 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 - end - - # merge request: !123 - when /^!/ - merge_request = @project.merge_requests.where(:id => merge_request_id).first - 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 - - # snippet: $123 - when /^\$/ - snippet = @project.snippets.where(:id => snippet_id).first - 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 - - # commit: 123456... - when /^\h/ - commit = @project.commit(commit_id) - 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 - - end # case - - ref_link.nil? ? match : "#{prefix}#{ref_link}#{suffix}" - end # gsub - - # Insert pre block extractions - text.gsub!(/\{gfm-extraction-(\h{32})\}/) do - extractions[$1] - end - - text.html_safe - end - - # circumvents nesting links, which will behave bad in browsers - def link_to_gfm(body, url, html_options = {}) - gfm_body = gfm(body, html_options) - - gfm_body.gsub!(%r{.*?}m) do |match| - "#{match}#{link_to("", url, html_options)[0..-5]}" # "".length +1 - end - - link_to(gfm_body.html_safe, url, html_options) - end - def markdown(text) @__renderer ||= Redcarpet::Markdown.new(Redcarpet::Render::GitlabHTML.new(self, filter_html: true, with_toc_data: true), { no_intra_emphasis: true, diff --git a/app/helpers/gitlab_markdown_helper.rb b/app/helpers/gitlab_markdown_helper.rb new file mode 100644 index 00000000..df8a1b6c --- /dev/null +++ b/app/helpers/gitlab_markdown_helper.rb @@ -0,0 +1,81 @@ +module GitlabMarkdownHelper + def gfm(text, html_options = {}) + return text if text.nil? + return text if @project.nil? + + # Extract pre blocks + # from http://github.github.com/github-flavored-markdown/ + extractions = {} + text.gsub!(%r{
.*?
|.*?}m) do |match| + md5 = Digest::MD5.hexdigest(match) + extractions[md5] = match + "{gfm-extraction-#{md5}}" + end + + # match 1 2 3 4 5 6 + text.gsub!(/(\W)?(@([\w\._]+)|[#!$](\d+)|([\h]{6,40}))(\W)?/) do |match| + prefix = $1 + reference = $2 + user_name = $3 + issue_id = $4 + merge_request_id = $4 + snippet_id = $4 + commit_id = $5 + suffix = $6 + + # TODO: add popups with additional information + ref_link = case reference + + # team member: @foo + when /^@/ + user = @project.users.where(:name => user_name).first + member = @project.users_projects.where(:user_id => user).first if user + link_to("@#{user_name}", project_team_member_path(@project, member), html_options.merge(:class => "gfm gfm-team_member #{html_options[:class]}")) if member + + # issue: #123 + when /^#/ + # avoid HTML entities + unless prefix.try(:end_with?, "&") && suffix.try(:start_with?, ";") + issue = @project.issues.where(:id => issue_id).first + 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 + end + + # merge request: !123 + when /^!/ + merge_request = @project.merge_requests.where(:id => merge_request_id).first + 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 + + # snippet: $123 + when /^\$/ + snippet = @project.snippets.where(:id => snippet_id).first + 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 + + # commit: 123456... + when /^\h/ + commit = @project.commit(commit_id) + 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 + + end # case + + ref_link.nil? ? match : "#{prefix}#{ref_link}#{suffix}" + end # gsub + + # Insert pre block extractions + text.gsub!(/\{gfm-extraction-(\h{32})\}/) do + extractions[$1] + end + + text.html_safe + end + + # circumvents nesting links, which will behave bad in browsers + def link_to_gfm(body, url, html_options = {}) + gfm_body = gfm(body, html_options) + + gfm_body.gsub!(%r{.*?}m) do |match| + "#{match}#{link_to("", url, html_options)[0..-5]}" # "".length +1 + end + + link_to(gfm_body.html_safe, url, html_options) + end +end diff --git a/app/views/notes/_form.html.haml b/app/views/notes/_form.html.haml index 55f69f8f..4e87353b 100644 --- a/app/views/notes/_form.html.haml +++ b/app/views/notes/_form.html.haml @@ -13,24 +13,21 @@ is enabled. .row.note_advanced_opts.hide - .span4 - %h5 Notify via email: - .clearfix - = label_tag :notify do - = check_box_tag :notify, 1, @note.noteable_type != "Commit" - %span Project team + .span4.notify_opts + %h6.left Notify via email: + = label_tag :notify do + = check_box_tag :notify, 1, @note.noteable_type != "Commit" + %span Project team - - if @note.notify_only_author?(current_user) - = label_tag :notify_author do - = check_box_tag :notify_author, 1 , @note.noteable_type == "Commit" - %span Commit author - .span8 - %h5 Attachment: - .clearfix - .attachments - %div.file_name File name... - %button.file_upload.btn.small Upload File - .input= f.file_field :attachment, :class => "input-file" - %span Any file less than 10 MB + - if @note.notify_only_author?(current_user) + = label_tag :notify_author do + = check_box_tag :notify_author, 1 , @note.noteable_type == "Commit" + %span Commit author + .span8.attachments + %h6.left Attachment: + %span.file_name File name... + %button.file_upload.btn.small Upload File + .input= f.file_field :attachment, :class => "input-file" + %span.hint Any file less than 10 MB = f.submit 'Add Comment', :class => "btn primary submit_note", :id => "submit_note"