Module: GitlabKramdown::Parser::Reference

Included in:
Kramdown::Parser::GitlabKramdown
Defined in:
lib/gitlab_kramdown/parser/reference.rb

Overview

Special GitLab References

This parser implements any non context-specific reference as described in the GitLab Flavored Markdown reference

Constant Summary collapse

PATH_REGEX_STR =
'[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*'
NAMESPACE_FORMAT_REGEX =
%r{
  (?:#{PATH_REGEX_STR}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])
  (?<!\.git|\.atom)
}x
FULL_NAMESPACE_FORMAT_REGEX =
%r{(#{NAMESPACE_FORMAT_REGEX}/)*#{NAMESPACE_FORMAT_REGEX}}
USER_GROUP_PATTERN =
%r{
  (?<!\w)
  #{Regexp.escape('@')}
  (?<user>#{FULL_NAMESPACE_FORMAT_REGEX})
}x
PROJECT_COMMIT_PATTERN =
%r{
  (?<namespace>#{FULL_NAMESPACE_FORMAT_REGEX})
  #{Regexp.escape('@')}
  (?<commit>[a-z0-9]+)
  (?!\.{3})
}x
PROJECT_COMMIT_DIFF_PATTERN =
%r{
  (?<namespace>#{FULL_NAMESPACE_FORMAT_REGEX})
  #{Regexp.escape('@')}
  (?<commit_source>[a-z0-9]+)
  \.{3}
  (?<commit_target>[a-z0-9]+)
}x
PROJECT_ISSUE_PATTERN =
%r{
  (?<namespace>#{FULL_NAMESPACE_FORMAT_REGEX})
  #{Regexp.escape('#')}
  (?<issue>[1-9][0-9]*)
}x
PROJECT_MERGE_REQUEST_PATTERN =
%r{
  (?<namespace>#{FULL_NAMESPACE_FORMAT_REGEX})
  #{Regexp.escape('!')}
  (?<merge_request>[1-9][0-9]*)
}x
PROJECT_SNIPPET_PATTERN =
%r{
  (?<namespace>#{FULL_NAMESPACE_FORMAT_REGEX})
  #{Regexp.escape('$')}
  (?<snippet>[1-9][0-9]*)
}x
PROJECT_LABEL_PATTERN =
%r{
  (?<namespace>#{FULL_NAMESPACE_FORMAT_REGEX})
  #{Regexp.escape('~')}
  (?<label>
    [A-Za-z0-9_\-\?\.&]+ | # String-based single-word label title, or
    ".+?"                  # String-based multi-word label surrounded in quotes
  )
}x

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(klass) ⇒ Object



69
70
71
72
73
74
75
76
77
# File 'lib/gitlab_kramdown/parser/reference.rb', line 69

def self.included(klass)
  klass.define_parser(:user_group_mention, USER_GROUP_PATTERN)
  klass.define_parser(:commit, PROJECT_COMMIT_PATTERN)
  klass.define_parser(:commit_diff, PROJECT_COMMIT_DIFF_PATTERN)
  klass.define_parser(:issue, PROJECT_ISSUE_PATTERN)
  klass.define_parser(:merge_request, PROJECT_MERGE_REQUEST_PATTERN)
  klass.define_parser(:snippet, PROJECT_SNIPPET_PATTERN)
  klass.define_parser(:label, PROJECT_LABEL_PATTERN)
end

Instance Method Details

#parse_commitObject



90
91
92
93
94
95
96
97
98
99
# File 'lib/gitlab_kramdown/parser/reference.rb', line 90

def parse_commit
  start_line_number = @src.current_line_number
  @src.pos += @src.matched_size

  href = "#{@options[:gitlab_url]}/#{@src[:namespace]}/commit/#{@src[:commit]}"

  el = Kramdown::Element.new(:a, nil, { 'href' => href }, location: start_line_number)
  add_text(@src[0], el)
  @tree.children << el
end

#parse_commit_diffObject



101
102
103
104
105
106
107
108
109
110
111
# File 'lib/gitlab_kramdown/parser/reference.rb', line 101

def parse_commit_diff
  start_line_number = @src.current_line_number
  @src.pos += @src.matched_size

  href = "#{@options[:gitlab_url]}/#{@src[:namespace]}/compare/" \
         "#{@src[:commit_source]}...#{@src[:commit_target]}"

  el = Kramdown::Element.new(:a, nil, { 'href' => href }, location: start_line_number)
  add_text(@src[0], el)
  @tree.children << el
end

#parse_issueObject



113
114
115
116
117
118
119
120
121
122
# File 'lib/gitlab_kramdown/parser/reference.rb', line 113

def parse_issue
  start_line_number = @src.current_line_number
  @src.pos += @src.matched_size

  href = "#{@options[:gitlab_url]}/#{@src[:namespace]}/issues/#{@src[:issue]}"

  el = Kramdown::Element.new(:a, nil, { 'href' => href }, location: start_line_number)
  add_text(@src[0], el)
  @tree.children << el
end

#parse_labelObject



146
147
148
149
150
151
152
153
154
155
156
# File 'lib/gitlab_kramdown/parser/reference.rb', line 146

def parse_label
  start_line_number = @src.current_line_number
  @src.pos += @src.matched_size

  label_param = @src[:label].delete('"').tr(' ', '+')
  href = "#{@options[:gitlab_url]}/#{@src[:namespace]}/issues?label_name=#{label_param}"

  el = Kramdown::Element.new(:a, nil, { 'href' => href }, location: start_line_number)
  add_text(@src[0], el)
  @tree.children << el
end

#parse_merge_requestObject



124
125
126
127
128
129
130
131
132
133
# File 'lib/gitlab_kramdown/parser/reference.rb', line 124

def parse_merge_request
  start_line_number = @src.current_line_number
  @src.pos += @src.matched_size

  href = "#{@options[:gitlab_url]}/#{@src[:namespace]}/merge_requests/#{@src[:merge_request]}"

  el = Kramdown::Element.new(:a, nil, { 'href' => href }, location: start_line_number)
  add_text(@src[0], el)
  @tree.children << el
end

#parse_snippetObject



135
136
137
138
139
140
141
142
143
144
# File 'lib/gitlab_kramdown/parser/reference.rb', line 135

def parse_snippet
  start_line_number = @src.current_line_number
  @src.pos += @src.matched_size

  href = "#{@options[:gitlab_url]}/#{@src[:namespace]}/snippets/#{@src[:snippet]}"

  el = Kramdown::Element.new(:a, nil, { 'href' => href }, location: start_line_number)
  add_text(@src[0], el)
  @tree.children << el
end

#parse_user_group_mentionObject



79
80
81
82
83
84
85
86
87
88
# File 'lib/gitlab_kramdown/parser/reference.rb', line 79

def parse_user_group_mention
  start_line_number = @src.current_line_number
  @src.pos += @src.matched_size

  href = "#{@options[:gitlab_url]}/#{@src[:user]}"

  el = Kramdown::Element.new(:a, nil, { 'href' => href }, location: start_line_number)
  add_text(@src[0], el)
  @tree.children << el
end