diff options
author | Robert Schilling <rschilling@student.tugraz.at> | 2014-09-01 19:47:28 +0400 |
---|---|---|
committer | Robert Schilling <rschilling@student.tugraz.at> | 2014-09-26 03:32:33 +0400 |
commit | 390183a4269684f64e2e290869bee21cf18bf160 (patch) | |
tree | 6f23a073c64509f7ceded3bf119baf3134cb45c1 | |
parent | 9cd5ff043a72001201b4c8192a45f8029ebe84ac (diff) |
Factor out Emoji parsing using html-pipeline-gitlab
-rw-r--r-- | Gemfile | 5 | ||||
-rw-r--r-- | Gemfile.lock | 7 | ||||
-rw-r--r-- | app/helpers/application_helper.rb | 6 | ||||
-rw-r--r-- | lib/gitlab/markdown.rb | 36 | ||||
-rw-r--r-- | spec/helpers/gitlab_markdown_helper_spec.rb | 16 |
5 files changed, 35 insertions, 35 deletions
@@ -79,6 +79,9 @@ gem "six" # Seed data gem "seed-fu" +# Markup pipeline for GitLab +gem 'html-pipeline-gitlab', '~> 0.1.0' + # Markdown to HTML gem "github-markup" @@ -157,7 +160,7 @@ gem "rack-attack" # Ace editor gem 'ace-rails-ap' -# Keyboard shortcuts +# Keyboard shortcuts gem 'mousetrap-rails' # Semantic UI Sass for Sidebar diff --git a/Gemfile.lock b/Gemfile.lock index bd7ebf3ef44..a2660342ac6 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -239,6 +239,12 @@ GEM hipchat (0.14.0) httparty httparty + html-pipeline (1.11.0) + activesupport (>= 2) + nokogiri (~> 1.4) + html-pipeline-gitlab (0.1.0) + gitlab_emoji (~> 0.0.1.1) + html-pipeline (~> 1.11.0) http_parser.rb (0.5.3) httparty (0.13.0) json (~> 1.8) @@ -629,6 +635,7 @@ DEPENDENCIES guard-spinach haml-rails hipchat (~> 0.14.0) + html-pipeline-gitlab (~> 0.1.0) httparty jasmine (= 2.0.2) jquery-atwho-rails (~> 0.3.3) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 07938b8065d..728c5041074 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -151,12 +151,6 @@ module ApplicationHelper sanitize(str, tags: %w(a span)) end - def image_url(source) - # prevent relative_root_path being added twice (it's part of root_url and path_to_image) - root_url.sub(/#{root_path}$/, path_to_image(source)) - end - - alias_method :url_to_image, :image_url def body_data_page path = controller.controller_path.split('/') diff --git a/lib/gitlab/markdown.rb b/lib/gitlab/markdown.rb index 6017a4c86c1..d346acf0d32 100644 --- a/lib/gitlab/markdown.rb +++ b/lib/gitlab/markdown.rb @@ -1,3 +1,6 @@ +require 'html/pipeline' +require 'html/pipeline/gitlab' + module Gitlab # Custom parser for GitLab-flavored Markdown # @@ -62,6 +65,16 @@ module Gitlab insert_piece($1) end + # Context passed to the markdoqwn pipeline + markdown_context = { + asset_root: File.join(root_url, + Gitlab::Application.config.assets.prefix) + } + + result = HTML::Pipeline::Gitlab::MarkdownPipeline.call(text, + markdown_context) + text = result[:output].to_html(save_with: 0) + allowed_attributes = ActionView::Base.sanitized_allowed_attributes allowed_tags = ActionView::Base.sanitized_allowed_tags @@ -91,7 +104,6 @@ module Gitlab # Returns parsed text def parse(text, project = @project) parse_references(text, project) if project - parse_emoji(text) text end @@ -136,28 +148,6 @@ module Gitlab end end - EMOJI_PATTERN = %r{(:(\S+):)}.freeze - - def parse_emoji(text) - # parse emoji - text.gsub!(EMOJI_PATTERN) do |match| - if valid_emoji?($2) - image_tag(url_to_image("emoji/#{$2}.png"), class: 'emoji', title: $1, alt: $1, size: "20x20") - else - match - end - end - end - - # Private: Checks if an emoji icon exists in the image asset directory - # - # emoji - Identifier of the emoji as a string (e.g., "+1", "heart") - # - # Returns boolean - def valid_emoji?(emoji) - Emoji.find_by_name(emoji) - end - # Private: Dispatches to a dedicated processing method based on reference # # reference - Object reference ("@1234", "!567", etc.) diff --git a/spec/helpers/gitlab_markdown_helper_spec.rb b/spec/helpers/gitlab_markdown_helper_spec.rb index 46337f8bafd..6c865b1e079 100644 --- a/spec/helpers/gitlab_markdown_helper_spec.rb +++ b/spec/helpers/gitlab_markdown_helper_spec.rb @@ -14,6 +14,10 @@ describe GitlabMarkdownHelper do let(:snippet) { create(:project_snippet, project: project) } let(:member) { project.project_members.where(user_id: user).first } + def url_helper(image_name) + File.join(root_url, 'assets', image_name) + end + before do # Helper expects a @project instance variable @project = project @@ -38,8 +42,8 @@ describe GitlabMarkdownHelper do it "should not touch HTML entities" do @project.issues.stub(:where).with(id: '39').and_return([issue]) - actual = expected = "We'll accept good pull requests." - gfm(actual).should == expected + actual = 'We'll accept good pull requests.' + gfm(actual).should == "We'll accept good pull requests." end it "should forward HTML options to links" do @@ -330,7 +334,8 @@ describe GitlabMarkdownHelper do end it "keeps whitespace intact" do - gfm("This deserves a :+1: big time.").should match(/deserves a <img.+\/> big time/) + gfm('This deserves a :+1: big time.'). + should match(/deserves a <img.+> big time/) end it "ignores invalid emoji" do @@ -448,7 +453,8 @@ describe GitlabMarkdownHelper do end it "should leave inline code untouched" do - markdown("\nDon't use `$#{snippet.id}` here.\n").should == "<p>Don't use <code>$#{snippet.id}</code> here.</p>\n" + markdown("\nDon't use `$#{snippet.id}` here.\n").should == + "<p>Don't use <code>$#{snippet.id}</code> here.</p>\n" end it "should leave ref-like autolinks untouched" do @@ -468,7 +474,7 @@ describe GitlabMarkdownHelper do end it "should generate absolute urls for emoji" do - markdown(":smile:").should include("src=\"#{url_to_image("emoji/smile")}") + markdown(":smile:").should include("src=\"#{url_helper('emoji/smile')}") end it "should handle relative urls for a file in master" do |