2015-12-23 02:04:40 +05:30
|
|
|
module Banzai
|
|
|
|
module Filter
|
2015-09-11 14:41:01 +05:30
|
|
|
# HTML filter that replaces label references with links.
|
2016-06-02 11:05:42 +05:30
|
|
|
class LabelReferenceFilter < AbstractReferenceFilter
|
2016-06-16 23:09:34 +05:30
|
|
|
self.reference_type = :label
|
|
|
|
|
2016-06-02 11:05:42 +05:30
|
|
|
def self.object_class
|
|
|
|
Label
|
2015-09-11 14:41:01 +05:30
|
|
|
end
|
|
|
|
|
2016-06-02 11:05:42 +05:30
|
|
|
def find_object(project, id)
|
2016-11-03 12:29:30 +05:30
|
|
|
find_labels(project).find(id)
|
2015-10-24 18:46:33 +05:30
|
|
|
end
|
|
|
|
|
2016-06-02 11:05:42 +05:30
|
|
|
def self.references_in(text, pattern = Label.reference_pattern)
|
2016-08-24 12:49:21 +05:30
|
|
|
unescape_html_entities(text).gsub(pattern) do |match|
|
2016-06-02 11:05:42 +05:30
|
|
|
yield match, $~[:label_id].to_i, $~[:label_name], $~[:project], $~
|
2015-12-23 02:04:40 +05:30
|
|
|
end
|
2015-09-11 14:41:01 +05:30
|
|
|
end
|
|
|
|
|
2016-06-02 11:05:42 +05:30
|
|
|
def references_in(text, pattern = Label.reference_pattern)
|
2016-08-24 12:49:21 +05:30
|
|
|
unescape_html_entities(text).gsub(pattern) do |match|
|
2016-06-02 11:05:42 +05:30
|
|
|
label = find_label($~[:project], $~[:label_id], $~[:label_name])
|
2015-09-11 14:41:01 +05:30
|
|
|
|
2016-06-02 11:05:42 +05:30
|
|
|
if label
|
|
|
|
yield match, label.id, $~[:project], $~
|
2015-09-11 14:41:01 +05:30
|
|
|
else
|
|
|
|
match
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-06-02 11:05:42 +05:30
|
|
|
def find_label(project_ref, label_id, label_name)
|
|
|
|
project = project_from_ref(project_ref)
|
|
|
|
return unless project
|
2015-09-11 14:41:01 +05:30
|
|
|
|
2016-06-02 11:05:42 +05:30
|
|
|
label_params = label_params(label_id, label_name)
|
2016-11-03 12:29:30 +05:30
|
|
|
find_labels(project).find_by(label_params)
|
|
|
|
end
|
|
|
|
|
|
|
|
def find_labels(project)
|
|
|
|
LabelsFinder.new(nil, project_id: project.id).execute(skip_authorization: true)
|
2015-09-11 14:41:01 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
# Parameters to pass to `Label.find_by` based on the given arguments
|
|
|
|
#
|
|
|
|
# id - Integer ID to pass. If present, returns {id: id}
|
|
|
|
# name - String name to pass. If `id` is absent, finds by name without
|
|
|
|
# surrounding quotes.
|
|
|
|
#
|
|
|
|
# Returns a Hash.
|
|
|
|
def label_params(id, name)
|
|
|
|
if name
|
|
|
|
{ name: name.tr('"', '') }
|
|
|
|
else
|
2016-06-02 11:05:42 +05:30
|
|
|
{ id: id.to_i }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def url_for_object(label, project)
|
|
|
|
h = Gitlab::Routing.url_helpers
|
|
|
|
h.namespace_project_issues_url(project.namespace, project, label_name: label.name,
|
|
|
|
only_path: context[:only_path])
|
|
|
|
end
|
|
|
|
|
|
|
|
def object_link_text(object, matches)
|
2016-11-03 12:29:30 +05:30
|
|
|
if same_group?(object) && namespace_match?(matches)
|
|
|
|
render_same_project_label(object)
|
|
|
|
elsif same_project?(object)
|
|
|
|
render_same_project_label(object)
|
2016-06-02 11:05:42 +05:30
|
|
|
else
|
2016-11-03 12:29:30 +05:30
|
|
|
render_cross_project_label(object, matches)
|
2015-09-11 14:41:01 +05:30
|
|
|
end
|
|
|
|
end
|
2016-08-24 12:49:21 +05:30
|
|
|
|
2016-11-03 12:29:30 +05:30
|
|
|
def same_group?(object)
|
|
|
|
object.is_a?(GroupLabel) && object.group == project.group
|
|
|
|
end
|
|
|
|
|
|
|
|
def namespace_match?(matches)
|
|
|
|
matches[:project].blank? || matches[:project] == project.path_with_namespace
|
|
|
|
end
|
|
|
|
|
|
|
|
def same_project?(object)
|
|
|
|
object.is_a?(ProjectLabel) && object.project == project
|
|
|
|
end
|
|
|
|
|
|
|
|
def user
|
|
|
|
context[:current_user] || context[:author]
|
|
|
|
end
|
|
|
|
|
|
|
|
def project
|
|
|
|
context[:project]
|
|
|
|
end
|
|
|
|
|
|
|
|
def render_same_project_label(object)
|
|
|
|
LabelsHelper.render_colored_label(object)
|
|
|
|
end
|
|
|
|
|
|
|
|
def render_cross_project_label(object, matches)
|
|
|
|
source_project =
|
|
|
|
if matches[:project]
|
|
|
|
Project.find_with_namespace(matches[:project])
|
|
|
|
else
|
|
|
|
object.project
|
|
|
|
end
|
|
|
|
|
|
|
|
LabelsHelper.render_colored_cross_project_label(object, source_project)
|
|
|
|
end
|
|
|
|
|
2016-08-24 12:49:21 +05:30
|
|
|
def unescape_html_entities(text)
|
|
|
|
CGI.unescapeHTML(text.to_s)
|
|
|
|
end
|
2016-09-29 09:46:39 +05:30
|
|
|
|
|
|
|
def object_link_title(object)
|
|
|
|
# use title of wrapped element instead
|
|
|
|
nil
|
|
|
|
end
|
2015-09-11 14:41:01 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|