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


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

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


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

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

170
171
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
# File 'lib/redmine/wiki_formatting.rb', line 170

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