]> source.dussan.org Git - redmine.git/commitdiff
More readable regexp for parse_redmine_links (#24382).
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sat, 7 Jan 2017 10:52:40 +0000 (10:52 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sat, 7 Jan 2017 10:52:40 +0000 (10:52 +0000)
Patch by Dmitry Lisichkin.

git-svn-id: http://svn.redmine.org/redmine/trunk@16152 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/helpers/application_helper.rb

index e6078358dd47fb684a0b5b3afab8a1cb45e50b6f..30bd8eb140cb08471154c357286e59c076330451 100644 (file)
@@ -797,8 +797,20 @@ module ApplicationHelper
   #     identifier:version:1.0.0
   #     identifier:source:some/file
   def parse_redmine_links(text, default_project, obj, attr, only_path, options)
-    text.gsub!(%r{<a( [^>]+?)?>(.*?)</a>|([\s\(,\-\[\>]|^)(!)?(([a-z0-9\-_]+):)?(attachment|document|version|forum|news|message|project|commit|source|export)?(((#)|((([a-z0-9\-_]+)\|)?(r)))((\d+)((#note)?-(\d+))?)|(:)([^"\s<>][^\s<>]*?|"[^"]+?"))(?=(?=[[:punct:]][^A-Za-z0-9_/])|,|\s|\]|<|$)}) do |m|
-      tag_content, leading, esc, project_prefix, project_identifier, prefix, repo_prefix, repo_identifier, sep, identifier, comment_suffix, comment_id = $2, $3, $4, $5, $6, $7, $12, $13, $10 || $14 || $20, $16 || $21, $17, $19
+    text.gsub!(LINKS_RE) do |_|
+      tag_content = $~[:tag_content]
+      leading = $~[:leading]
+      esc = $~[:esc]
+      project_prefix = $~[:project_prefix]
+      project_identifier = $~[:project_identifier]
+      prefix = $~[:prefix]
+      repo_prefix = $~[:repo_prefix]
+      repo_identifier = $~[:repo_identifier]
+      sep = $~[:sep1] || $~[:sep2] || $~[:sep3]
+      identifier = $~[:identifier1] || $~[:identifier2]
+      comment_suffix = $~[:comment_suffix]
+      comment_id = $~[:comment_id]
+
       if tag_content
         $&
       else
@@ -933,6 +945,39 @@ module ApplicationHelper
     end
   end
 
+  LINKS_RE =
+      %r{
+            <a( [^>]+?)?>(?<tag_content>.*?)</a>|
+            (?<leading>[\s\(,\-\[\>]|^)
+            (?<esc>!)?
+            (?<project_prefix>(?<project_identifier>[a-z0-9\-_]+):)?
+            (?<prefix>attachment|document|version|forum|news|message|project|commit|source|export)?
+            (
+              (
+                (?<sep1>\#)|
+                (
+                  (?<repo_prefix>(?<repo_identifier>[a-z0-9\-_]+)\|)?
+                  (?<sep2>r)
+                )
+              )
+              (
+                (?<identifier1>\d+)
+                (?<comment_suffix>
+                  (\#note)?
+                  -(?<comment_id>\d+)
+                )?
+              )|
+              (?<sep3>:)
+              (?<identifier2>[^"\s<>][^\s<>]*?|"[^"]+?")
+            )
+            (?=
+              (?=[[:punct:]][^A-Za-z0-9_/])|
+              ,|
+              \s|
+              \]|
+              <|
+              $)
+      }x
   HEADING_RE = /(<h(\d)( [^>]+)?>(.+?)<\/h(\d)>)/i unless const_defined?(:HEADING_RE)
 
   def parse_sections(text, project, obj, attr, only_path, options)