Module: Redmine::WikiFormatting::LinksHelper

Included in:
Markdown::Formatter, NullFormatter::Formatter, Textile::Formatter
Defined in:
lib/redmine/wiki_formatting/links_helper.rb

Constant Summary collapse

%r{
 (                          # leading text
   <\w+[^>]*?>|             # leading HTML tag, or
   [\s\(\[,;]|              # leading punctuation, or
   ^                        # beginning of line
 )
 (
   (?:https?://)|           # protocol spec, or
   (?:s?ftps?://)|
   (?:www\.)                # www.*
 )
 (
   ([^<]\S*?)               # url
   (\/)?                    # slash
 )
 ((?:&gt;)?|[^[:alnum:]_\=\/;\(\)\-]*?)             # post
 (?=<|\s|$)
}x

Instance Method Summary collapse

Instance Method Details

#auto_link!(text) ⇒ Object

Destructively replaces urls into clickable links



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/redmine/wiki_formatting/links_helper.rb', line 45

def auto_link!(text)
  text.gsub!(AUTO_LINK_RE) do
    all, leading, proto, url, post = $&, $1, $2, $3, $6
    if /<a\s/i.match?(leading) || /![<>=]?/.match?(leading)
      # don't replace URLs that are already linked
      # and URLs prefixed with ! !> !< != (textile images)
      all
    else
      # Idea below : an URL with unbalanced parenthesis and
      # ending by ')' is put into external parenthesis
      if url[-1] == ")" && ((url.count("(") - url.count(")")) < 0)
        url = url[0..-2] # discard closing parenthesis from url
        post = ")" + post # add closing parenthesis to post
      end
      content = proto + url
      href = "#{proto=="www."?"http://www.":proto}#{url}"
      %(#{leading}<a class="external" href="#{ERB::Util.html_escape href}">#{ERB::Util.html_escape content}</a>#{post}).html_safe
    end
  end
end

#auto_mailto!(text) ⇒ Object

Destructively replaces email addresses into clickable links



67
68
69
70
71
72
73
74
75
76
# File 'lib/redmine/wiki_formatting/links_helper.rb', line 67

def auto_mailto!(text)
  text.gsub!(/([\w\.!#\$%\-+.\/]+@[A-Za-z0-9\-]+(\.[A-Za-z0-9\-]+)+)/) do
    mail = $1
    if /<a\b[^>]*>(.*)(#{Regexp.escape(mail)})(.*)<\/a>/.match?(text)
      mail
    else
      %(<a class="email" href="mailto:#{ERB::Util.html_escape mail}">#{ERB::Util.html_escape mail}</a>).html_safe
    end
  end
end


78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/redmine/wiki_formatting/links_helper.rb', line 78

def restore_redmine_links(html)
  # restore wiki links eg. [[Foo]]
  html.gsub!(%r{\[<a href="(.*?)">(.*?)</a>\]}) do
    "[[#{$2}]]"
  end
  # restore Redmine links with double-quotes, eg. version:"1.0"
  html.gsub!(/(\w):&quot;(.+?)&quot;/) do
    "#{$1}:\"#{$2}\""
  end
  # restore user links with @ in login name eg. [@[email protected]]
  html.gsub!(%r{[@\A]<a(\sclass="email")? href="mailto:(.*?)">(.*?)</a>}) do
    "@#{$2}"
  end
  # restore user links with @ in login name eg. [user:[email protected]]
  html.gsub!(%r{\buser:<a(\sclass="email")? href="mailto:(.*?)">(.*?)<\/a>}) do
    "user:#{$2}"
  end
  # restore attachments links with @ in file name eg. [attachment:[email protected]]
  html.gsub!(%r{\battachment:<a(\sclass="email")? href="mailto:(.*?)">(.*?)</a>}) do
    "attachment:#{$2}"
  end
  # restore hires images which are misrecognized as email address eg. [[email protected]]
  html.gsub!(%r{<a(\sclass="email")? href="mailto:[^"]+@\dx\.(bmp|gif|jpg|jpe|jpeg|png)">(.*?)</a>}) do
    "#{$3}"
  end
  html
end