summaryrefslogtreecommitdiff
path: root/lib/banzai
diff options
context:
space:
mode:
authorconnorshea <connor.james.shea@gmail.com>2016-03-30 16:03:49 -0600
committerconnorshea <connor.james.shea@gmail.com>2016-04-04 19:44:07 -0600
commitb9abf938edf52e762d320b1eb8732155e23d7b72 (patch)
treefa58191817cb644a1eeb969b23e1d2cc58e654cb /lib/banzai
parent67136007933425414293602bc75d2ba4822f2a93 (diff)
downloadgitlab-ce-b9abf938edf52e762d320b1eb8732155e23d7b72.tar.gz
Wrap images in discussions and wikis with a link to the image source using ImageLinkFilter.
Resolves #14411. See merge request !3464
Diffstat (limited to 'lib/banzai')
-rw-r--r--lib/banzai/filter/image_link_filter.rb27
-rw-r--r--lib/banzai/pipeline/gfm_pipeline.rb1
2 files changed, 28 insertions, 0 deletions
diff --git a/lib/banzai/filter/image_link_filter.rb b/lib/banzai/filter/image_link_filter.rb
new file mode 100644
index 00000000000..ccd106860bd
--- /dev/null
+++ b/lib/banzai/filter/image_link_filter.rb
@@ -0,0 +1,27 @@
+module Banzai
+ module Filter
+ # HTML filter that wraps links around inline images.
+ class ImageLinkFilter < HTML::Pipeline::Filter
+
+ # Find every image that isn't already wrapped in an `a` tag, create
+ # a new node (a link to the image source), copy the image as a child
+ # of the anchor, and then replace the img with the link-wrapped version.
+ def call
+ doc.xpath('descendant-or-self::img[not(ancestor::a)]').each do |img|
+
+ link = doc.document.create_element(
+ 'a',
+ class: 'no-attachment-icon',
+ href: img['src'],
+ target: '_blank'
+ )
+
+ link.children = img.clone
+ img.replace(link)
+ end
+
+ doc
+ end
+ end
+ end
+end
diff --git a/lib/banzai/pipeline/gfm_pipeline.rb b/lib/banzai/pipeline/gfm_pipeline.rb
index 8cd4b50e65a..ed3cfd6b023 100644
--- a/lib/banzai/pipeline/gfm_pipeline.rb
+++ b/lib/banzai/pipeline/gfm_pipeline.rb
@@ -7,6 +7,7 @@ module Banzai
Filter::SanitizationFilter,
Filter::UploadLinkFilter,
+ Filter::ImageLinkFilter,
Filter::EmojiFilter,
Filter::TableOfContentsFilter,
Filter::AutolinkFilter,