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

[View source] [View on GitHub]

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

[View source] [View on GitHub]

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
[View source] [View on GitHub]

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. [@jsmith@somenet.foo]
  html.gsub!(%r{[@\A]<a(\sclass="email")? href="mailto:(.*?)">(.*?)</a>}) do
    "@#{$2}"
  end
  # restore user links with @ in login name eg. [user:jsmith@somenet.foo]
  html.gsub!(%r{\buser:<a(\sclass="email")? href="mailto:(.*?)">(.*?)<\/a>}) do
    "user:#{$2}"
  end
  # restore attachments links with @ in file name eg. [attachment:image@2x.png]
  html.gsub!(%r{\battachment:<a(\sclass="email")? href="mailto:(.*?)">(.*?)</a>}) do
    "attachment:#{$2}"
  end
  # restore hires images which are misrecognized as email address eg. [printscreen@2x.png]
  html.gsub!(%r{<a(\sclass="email")? href="mailto:[^"]+@\dx\.(bmp|gif|jpg|jpe|jpeg|png)">(.*?)</a>}) do
    "#{$3}"
  end
  html
end