debian-mirror-gitlab/lib/banzai/filter/label_reference_filter.rb

87 lines
2.6 KiB
Ruby
Raw Normal View History

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
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|
2017-08-17 22:00:37 +05:30
yield match, $~[:label_id].to_i, $~[:label_name], $~[:project], $~[:namespace], $~
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|
2017-08-17 22:00:37 +05:30
namespace, project = $~[:namespace], $~[:project]
project_path = full_project_path(namespace, project)
label = find_label(project_path, $~[:label_id], $~[:label_name])
2015-09-11 14:41:01 +05:30
2016-06-02 11:05:42 +05:30
if label
2017-08-17 22:00:37 +05:30
yield match, label.id, project, namespace, $~
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)
2018-03-17 18:26:18 +05:30
project = parent_from_ref(project_ref)
2016-06-02 11:05:42 +05:30
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
2017-09-10 17:25:29 +05:30
h.project_issues_url(project, label_name: label.name, only_path: context[:only_path])
2016-06-02 11:05:42 +05:30
end
def object_link_text(object, matches)
2017-08-17 22:00:37 +05:30
project_path = full_project_path(matches[:namespace], matches[:project])
2018-03-17 18:26:18 +05:30
project_from_ref = from_ref_cached(project_path)
2017-08-17 22:00:37 +05:30
reference = project_from_ref.to_human_reference(project)
label_suffix = " <i>in #{reference}</i>" if reference.present?
2016-11-03 12:29:30 +05:30
2017-08-17 22:00:37 +05:30
LabelsHelper.render_colored_label(object, label_suffix)
2016-11-03 12:29:30 +05:30
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