Module: Redmine::WikiFormatting::LinksHelper

Included in:
Markdown::Formatter, NullFormatter::Formatter, Textile::Formatter
Defined in:
lib/redmine/wiki_formatting.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


139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# File 'lib/redmine/wiki_formatting.rb', line 139

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] == ")" and ((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


161
162
163
164
165
166
167
168
169
170
# File 'lib/redmine/wiki_formatting.rb', line 161

def auto_mailto!(text)
  text.gsub!(/([\w\.!#\$%\-+.\/][email protected][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

172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
# File 'lib/redmine/wiki_formatting.rb', line 172

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:[^"][email protected]\dx\.(bmp|gif|jpg|jpe|jpeg|png)">(.*?)</a>}) do
    "#{$3}"
  end
  html
end