Skip to content

Commit

Permalink
Implement email escaping to prevent spam
Browse files Browse the repository at this point in the history
  • Loading branch information
ivantsepp committed Jul 16, 2014
1 parent d0877f1 commit 2bf960f
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 1 deletion.
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ autolink_email:
skip_tags: ['div'] # tags to skip
```

Jekyll::AutolinkEmail also provides a `escape: true` option. Turning this on will html encode the email address and url encode the link to prevent spam.

## Contributing

1. Fork it ( https://github.com/ivantsepp/jekyll-autolink_email/fork )
Expand Down
37 changes: 36 additions & 1 deletion lib/jekyll-autolink_email.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,18 @@
module Jekyll
class AutolinkEmail < Jekyll::Generator

HTML_ENTITIES = {
'@' => '&#064;',
'.' => '&#046;'
}

attr_accessor :email_addresses

safe true

def initialize(config)
config['autolink_email'] ||= {}
self.email_addresses = []
end

def generate(site)
Expand All @@ -19,7 +27,34 @@ def generate(site)
private

def autolinkify(page)
page.content = Rinku.auto_link(page.content, :email_addresses, link_attr, skip_tags)
page.content = Rinku.auto_link(page.content, :email_addresses, link_attr, skip_tags) do |email_address|
if escape?
email_addresses << email_address.dup
html_encode(email_address)
else
email_address
end
end
url_encode_email_addresses(page.content) if escape?
end

def html_encode(email_address)
HTML_ENTITIES.each do |char, code|
email_address.gsub!(char, code)
end
email_address
end

# A hack since Rinku doesn't offer a hook into changing what the link is
def url_encode_email_addresses(content)
content.gsub!(/mailto:(#{email_addresses.join('|')})/) do |m|
m[$1] = ERB::Util.url_encode($1)
m
end
end

def escape?
@site.config['autolink_email']['escape']
end

def link_attr
Expand Down
8 changes: 8 additions & 0 deletions test/test_autolink_email.rb
Original file line number Diff line number Diff line change
Expand Up @@ -48,5 +48,13 @@ class Jekyll::AutolinkEmailTest < Minitest::Test
@autolink_email.generate(@site)
assert_equal '<div>ivan.tse1@gmail.com</div>', @page.content
end

should 'escape email' do
@site.config['autolink_email']['escape'] = true
escaped_email_link = '<div><a href="mailto:ivan.tse1%40gmail.com">ivan&#046;tse1&#064;gmail&#046;com</a></div>'
@autolink_email.instance_variable_set(:@site, @site)
@autolink_email.send(:autolinkify, @page)
assert_equal escaped_email_link, @page.content
end
end
end

0 comments on commit 2bf960f

Please sign in to comment.